Defold IAP 与广告接入:内购流程、Store 验证与广告变现

系统覆盖 Defold 手游变现工程:应用内购(IAP)商品设计、购买流程(发起/支付/回调/发货)、Store 验证与防刷单、订阅与返还商品、广告变现(激励视频/插屏/Banner)、广告 SDK 接入与瀑布流、以及营收设计与合规(年龄分级/隐私/退款)。

引言

免费游戏的收入来自「内购 + 广告」——但变现系统是「信任工程」:玩家付了钱必须拿到货,广告播完了必须给奖励,被刷单/退款也不能崩。本文把 Defold 变现讲透:先讲 IAP 的商品设计(消费型/非消费型/订阅),再讲购买流程(发起 → 支付 → 回调 → 发货)在 Defold 里的实现,然后是 Store 验证与防刷单(收据校验/服务端确认)、订阅与返还商品,接着是广告变现(激励视频/插屏/Banner)与广告 SDK 接入,最后是营收设计与合规(年龄分级/隐私/退款/各国税务)。

前置:/defold-cross-platform-publish/(上架与平台配置)、/defold-save-serialization/(存档与数据)、/defold-script-system-lua/(消息与回调)。商业化设计见 游戏开发专题。


目录


1. 变现的两根柱子:内购与广告

免费手游的营收模型:

IAP(内购):玩家付钱买商品(钻石/皮肤/订阅)
广告:玩家看广告换奖励/开发者赚广告费
组合:付费用户买 IAP、免费用户看广告 → 覆盖全用户

两种模式的定位:

维度IAP广告
收入高(一次几十~几百)低(单次几分~几毛)
体验直接买,爽快打断,看广告换奖励
实现复杂(支付/验证/发货)中等(SDK/回调)
适用重度/付费用户免费/轻度用户

「免费增值(Freemium)」的核心问题:

让免费玩家「愿意看广告」而不是「被逼看广告」
→ 广告是「交换」:看 30s 广告 = 双倍金币/复活/抽卡
→ 付费与广告互不伤害(付费跳过广告、广告不骚扰付费用户)

心智:IAP 与广告互补——付费买爽快、广告换奖励,「看广告 = 交换奖励」是免费增值的黄金公式。


2. IAP 商品设计:消费非消费订阅

IAP 商品三类,对应不同的「发货语义」:

① 消费型(Consumable):
   钻石、金币、复活、道具 → 买一次用一次
   可重复购买

② 非消费型(Non-consumable):
   解锁关卡、去广告、皮肤 → 买一次永久拥有
   不可重复购买(平台会「恢复购买」)

③ 订阅(Subscription):
   月卡、季卡 → 周期性付费
   平台管理续费/取消

商品设计原则:

- 锚定定价:小额商品「显得便宜」(0.99 首充 vs 68 礼包)
- 分层商品:小(冲动)→ 中(常规)→ 大(礼包)
- 首充奖励:第一次充值给额外赠品(驱动首次付费)
- 限时/季节商品:制造稀缺

Defold 商品注册:

- App Store:App Store Connect 注册商品 ID
- Google Play:Play Console 注册商品
- Defold 端:用商品 ID 发起购买(与平台商品对应)

发货语义的要点:

- 消费型:每次购买都要「核销」(平台回调 → 发钻石 → 标记消费)
- 非消费型:购买记录「永久拥有」→ 平台「恢复购买」要支持
- 订阅:发货的是「权益期」,到期校验续费

心智:IAP 三类——消费型重复买、非消费型永久拥有、订阅周期付费;商品分层 + 首充奖励驱动付费,发货语义对应「核销/永久/权益期」。


3. 购买流程:发起支付回调发货

IAP 的标准流程(客户端流程):

① 玩家点「购买钻石包」→ 发起购买请求
② 平台支付(App Store / Google Play 弹窗)
③ 平台回调:购买成功(带交易收据)
④ 客户端验证收据(或发给服务端验证)
⑤ 发货:给玩家钻石 + 标记该交易已处理
⑥ 成功/失败反馈 UI

Defold 的 IAP 实现:

-- 发起购买
local iap = require("modules.iap")
iap.buy("com.example.coins_100", function(self, result)
    if result.status == "success" then
        -- 拿到收据(result.receipt)→ 验证 → 发货
        deliver_coins(100)
    elseif result.status == "cancelled" then
        -- 玩家取消(别当错误,给提示即可)
    else
        -- 失败(网络/平台错误)→ 提示重试
    end
end)

流程的关键工程点:

- 回调必须「幂等」:同一交易多次回调不能重复发货
- 发货前先「查询是否已处理」→ 防重复
- 支付成功但发货失败 → 记录待发货队列(下次启动补发)
- 取消不算错误(弹窗关闭常见)

待发货队列(防丢单):

-- 未发货交易存本地 → 下次启动补发
local pending = load_pending_transactions()
for _, tx in ipairs(pending) do
    if verify_receipt(tx.receipt) then
        deliver(tx.item)
        mark_delivered(tx.id)
    end
end

心智:IAP 流程 = 发起 → 支付 → 回调 → 验证 → 发货——发货必须幂等、失败要进待发货队列补发、取消不是错误。


4. Store 验证与防刷单

「验证收据」是防刷单的第一道防线:

为什么验证:
  - 客户端能伪造「购买成功」回调 → 免费拿货
  - 平台收据(receipt)要「可信验证」才发货

验证方式:
  客户端验证:平台 SDK 提供本地校验(基础)
  服务端验证:把收据发给平台 API 验证(可信、防伪造)
  → 重游戏/高价值商品必须服务端验证

服务端验证流程:

客户端:购买成功 → 收据 → 发给自家服务端
服务端:调平台收据验证 API(App Store / Google Play)
   → 确认有效 + 交易唯一 → 发货指令
   → 记录交易 ID(防重放)
客户端:收到「已验证」→ 发货

防刷单的其他手段:

- 交易 ID 唯一性:同一收据不能发两次货
- 服务端记「已消费」:交易 ID 入库 → 重复请求拒绝
- 恶意退款:平台退款通知 → 服务端撤销已发商品(道具扣回/封禁)
- 越狱/模拟器:检测环境(可选)
-- 服务端验证伪代码(示意)
function verify_and_deliver(receipt):
    if server.has_transaction(receipt.id):
        return "duplicate"                 # 已处理过
    if not platform.verify(receipt):        # 平台 API 验证
        return "invalid"
    server.record_transaction(receipt.id)   # 记交易
    deliver_to_player(receipt.player, receipt.item)
    return "ok"

心智:防刷单 = 收据验证(服务端为可信)+ 交易 ID 幂等 + 退款撤销——客户端回调可伪造,价值高的商品必须走服务端平台验证。


5. 订阅与返还商品

订阅是「周期收入」——需要额外处理:

订阅生命周期:
  购买 → 生效期 → 续费(平台自动) → 玩家取消 → 到期
  平台处理续费,客户端只需「按周期给权益」

订阅的工程要点:

- 订阅状态查询:当前是否有效 / 到期日 / 自动续费状态
- 权益校验:每次进入游戏查订阅状态 → 给/不给权益
- 恢复购买:换设备 → 平台「恢复订阅」→ 客户端重新激活
- 到期处理:权益过期要「平滑降级」(别硬砍功能)

返还商品(Restore Purchases):

- 非消费型商品:换设备后要能「恢复」(平台记录拥有关系)
- 恢复流程:客户端发 restore → 平台返回已购列表 → 逐个补发
- 新设备首启:「恢复购买」按钮是标配
-- 恢复购买
iap.restore(function(self, purchases)
    for _, p in ipairs(purchases) do
        if not self:has_item(p.item_id) then
            self:grant_item(p.item_id)      -- 补发永久商品
        end
    end
end)

心智:订阅 = 周期权益 + 状态查询 + 到期平滑降级;返还商品是「换设备补发永久商品」——恢复购买按钮是新设备标配。


6. 广告变现:激励视频插屏banner

三种主流广告位:

① 激励视频(Rewarded Video):
   玩家主动看(30s)→ 给奖励(双倍金币/复活/抽卡)
   单价最高、体验最可控(玩家「自愿」看)

② 插屏(Interstitial):
   关卡结束/切场景时全屏广告
   单价高但打断性强 → 节制使用(间隔/频控)

③ Banner:
   屏幕角落常驻
   单价低但不打断 → 轻度使用

激励视频的正确用法:

- 「给价值」而非「逼看」:奖励要值得(双倍/复活)
- 看广告 = 玩家的主动选择(别自动弹)
- 频控:同一天别让玩家看太多次(限次)
- 奖励在「看完回调」里发(没看完不给)
-- 激励视频(示意)
local ads = require("modules.ads")
function show_rewarded(self)
    ads.show_rewarded(function(self, result)
        if result.rewarded then
            give_double_coins()          -- 看完才给奖励
        else
            show_message("看完广告才能获得奖励哦")
        end
    end)
end

广告与内购的协作:

- 付费用户「去广告」:买「去广告包」→ 广告关闭
- 广告与付费「不冲突」:付费用户不该被广告骚扰
- 广告位设计别「坑」玩家(误触插屏 = 差评)

心智:广告 = 激励视频(高价值)/插屏(高打扰要节制)/Banner(低价值)——看广告是「交换奖励」、看完才给、频控限次,付费用户去广告不骚扰。


7. 广告 SDK 接入与瀑布流

广告变现的「工程面」:

广告 SDK:
  - 主流聚合:AdMob(Google)、AppLovin、Unity Ads、穿山甲等
  - Defold 通过「原生扩展(Native Extension)」接 SDK
  - 或经 Defold 官方/社区广告扩展

聚合与瀑布流(Mediation):
  - 一个请求 → 多家广告平台竞价/排序 → 最高价的展示
  - 提升 eCPM(每千次展示收入)与填充率

Defold 接广告的路径:

- 官方广告扩展(Defold 有 ads 扩展支持多家)
- 原生扩展:写 Lua ↔ 原生桥接(iOS/Android)
- 配置:SDK Key、应用 ID、测试模式(开发期)

瀑布流配置:
  water fall:价格高的平台先试 → 没填充降级到低价平台
  bidding:实时竞价(各家出价取最高)
  → 配置在聚合平台后台

广告的测试与上线:

- 测试广告位:开发期用测试 ID(不产生真实广告)
- 上线前:真机验证各广告位加载/展示正常
- 指标监控:eCPM、填充率、展示数、误触率
- 频控配置:插屏最小间隔、激励视频每日上限

心智:广告接入 = 原生扩展接 SDK + 聚合平台配瀑布流(提 eCPM/填充率)——测试广告位开发、真机验证上线、指标(eCPM/填充/误触)持续监控。


8. 营收设计:免费增值平衡

营收设计是「玩家心理」工程——平衡付费与免费体验:

免费玩家的体验:
  - 能玩到核心内容(不付费能玩)
  - 付费是「加速/装饰」而非「必须」
  - 广告换奖励让免费玩家「参与变现」而非「被榨取」

付费玩家的体验:
  - 买得值(定价 vs 价值感)
  - 去广告、免打扰
  - 订阅提供「持续价值」(月卡日活激励)

常见的营收设计:

- 钻石双用途:付费买钻石 / 免费玩家看广告得少量
- 体力系统:时间恢复(驱动回访)+ 体力包(付费跳过等待)
- 首充礼包 + 每日签到 + 活动(驱动付费/留存)
- 锚定定价:大礼包「看起来划算」让小包好卖

营收与口碑的平衡:

- 「逼氪」反噬:付费墙过狠 → 差评/流失
- 广告过密 → 卸载
- 好平衡:免费能通关、付费/广告加速、体验不破碎

心智:营收设计 = 付费「加速而非必须」——免费能玩、付费买爽、广告换奖励,逼氪反噬口碑、广告过密卸载,平衡才有长期收入。


9. 合规:年龄隐私退款税务

变现的合规是「生死线」——罚款/下架一次足以致命:

① 年龄分级:
   - 面向儿童(<13)→ COPPA/GDPR-K 严格限制广告与数据
   - 广告 SDK 对儿童有专属合规模式
   - 分级(ESRB/PEGI)影响广告类型

② 隐私:
   - 隐私政策必须公开(谁收集什么、怎么用)
   - 广告 ID/设备 ID 收集要明示
   - GDPR 用户可拒绝追踪(ATT 弹窗)

③ 退款:
   - 平台退款 → 服务端撤销商品
   - 退款政策要文档化
   - 恶意退款(大量退款)→ 风控

④ 税务:
   - 虚拟商品销售税(VAT/销售税,各国不同)
   - 平台代扣(App Store/Google Play 处理)→ 确认到账逻辑
   - 开发者账户信息完整(税务表单)

合规清单:

- 隐私政策链接:应用内/商店页可访问
- 儿童合规:广告 SDK 开「儿童模式」
- 退款处理:撤销商品链路闭环
- 各国要求:海外发行 → 法务咨询(数据/税务/分级)

心智:变现合规 = 年龄分级 + 隐私明示 + 退款撤销 + 税务处理——儿童模式、隐私政策、退款闭环是三个必做项,海外发行咨询法务。


10. 速查表

全篇速查:

主题结论
双柱IAP 买爽快、广告换奖励
商品消费/非消费/订阅三类
流程发起→支付→回调→验证→发货
防刷服务端验证 + 交易幂等
订阅周期权益 + 到期降级
恢复换设备 restore 补发
广告激励视频高价值/插屏节制/Banner低
接入原生扩展 + 瀑布流聚合
平衡免费能玩、付费加速
合规分级 + 隐私 + 退款 + 税务

一句话记忆:变现 = IAP 与广告互补——IAP 三类商品(消费/非消费/订阅),流程「发起→支付→回调→验证→发货」必须幂等、失败进待发货队列;防刷单靠服务端收据验证 + 交易 ID 唯一 + 退款撤销;订阅周期权益、到期平滑降级、恢复购买补发永久商品;广告激励视频高价值、插屏要节制、Banner 低价值,接 SDK 配瀑布流提 eCPM;营收设计付费「加速而非必须」、免费能玩不逼氪;合规分级 + 隐私 + 退款 + 税务四件套——信任是变现的地基,刷单/退款/合规一次没做好就全崩。


延伸阅读

  • /defold-cross-platform-publish/ — Store 上架与平台配置
  • /defold-save-serialization/ — 发货/权益的本地持久化
  • /defold-script-system-lua/ — 消息回调与生命周期
  • /defold-multiplayer-sync/ — 服务端数据与防作弊
  • 游戏开发专题 — 商业指标与免费增值设计
  • 安全专题 — 收据验证与数据安全

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「defold」更多文章

  1. Defold Tilemap 碰撞与关卡设计
  2. Defold 性能分析与调试工具链
  3. Defold Collections、Factories 与动态实例化