Unity IAP 5:IAP 4 版本有哪些变化以及如何迁移
Daniel Godley - Unity
Senior Content Marketing Manager
Unity应用内购买 (IAP) 版本 5用单个事件驱动的 StoreController 类取代了IAP 4 的基于接口的架构。迁移需要进行代码更改:IStoreListener 和 IDetailedStoreListener 接口以及 ConfigurationBuilder 将被移除,初始化是异步的,购买将通过生命周期事件进行处理。IAP 5 还支持网页到移动设备的货币化、自定义支付处理器(如 Stripe 和 Coda)以及独立网店。
关于Unity IAP 5,你需要了解什么?
- Unity IAP 5 移除了IAP 4 中所需的 IStoreListener 和 IDetailedStoreListener 接口。
- Unity IAP 5 中的所有购买逻辑都通过一个类运行:UnityIAPServices.StoreController() 会在整个购买生命周期中触发事件。
- IAP 4 中的 ConfigurationBuilder 已被移除。产品定义直接作为 ProductDefinition 对象传递给 FetchProducts(),该对象包含 ID 和产品类型。
- 在IAP 5 中,旧版 ID 类更名为 StoreSpecificIds。
- Unity IAP 5 初始化是异步的,需要先通过 await UnityServices.InitializeAsync() 初始化Unity Gaming Services 。
- IAP 5 中的Apple收据在到达开发者之前会通过 StoreKit 2 自动进行验证。Google Play 验证需要开发者的 Google 许可证密钥,该密钥已使用IAP包中包含的工具进行混淆处理。
- StoreKit 1 支持在IAP 5 中回归,适用于无法升级到 iOS 15.0 的设备(iPhone 6s 之前的设备)。
- 软件包中附带了一个可运行的参考实现:最小编码IAP示例(PaywallManager 脚本),可在Unity包管理器中找到。

Unity IAP 5 引入了重大的架构改进、初始化结构变更以及更清晰的产品获取工作流程。此外,它还为即将到来的高级生态系统功能铺平了道路——包括直接支付提供商(如 Stripe 和 Coda)以及让您更好地定位销售并保留更大份额购买收入的网上商店。无论您是从Unity IAP 4 迁移到IAP 5,还是第一次在Unity游戏引擎中设置移动应用内购买,此分步分解涵盖了完整的实施工作流程。
建筑
Unity IAP 4
具有固定回调的 IStoreListener / IDetailedStoreListener 接口
Unity IAP 5
具有生命周期事件的单个 StoreController 类
商店 ID
Unity IAP 4
新的 ID()
Unity IAP 5
新的 StoreSpecificIds()
产品设置
Unity IAP 4
在初始化之前,将产品打包到 ConfigurationBuilder 中。
Unity IAP 5
任何时候都可以将 ProductDefinition 对象直接传递给 FetchProducts()。
发起购买
Unity IAP 4
调用时传入产品 ID 字符串
Unity IAP 5
PurchaseProduct(product) 方法传入完整的产品对象。
采购处理
Unity IAP 4
通过 IStoreController 进行 ProcessPurchase 回调
Unity IAP 5
OnPurchasePending(Order) 事件,已通过 ConfirmPurchase(pendingOrder) 确认
收据验证(Apple)
Unity IAP 4
手动跨平台验证
Unity IAP 5
已通过 StoreKit 2 预验证
UI购买处理程序
Unity IAP 4
基于产品 ID
Unity IAP 5
保持不变——现有的 UI 处理程序继续运行。
Unity IAP 4
Unity IAP 5
建筑
具有固定回调的 IStoreListener / IDetailedStoreListener 接口
具有生命周期事件的单个 StoreController 类
商店 ID
新的 ID()
新的 StoreSpecificIds()
产品设置
在初始化之前,将产品打包到 ConfigurationBuilder 中。
任何时候都可以将 ProductDefinition 对象直接传递给 FetchProducts()。
发起购买
调用时传入产品 ID 字符串
PurchaseProduct(product) 方法传入完整的产品对象。
采购处理
通过 IStoreController 进行 ProcessPurchase 回调
OnPurchasePending(Order) 事件,已通过 ConfirmPurchase(pendingOrder) 确认
收据验证(Apple)
手动跨平台验证
已通过 StoreKit 2 预验证
UI购买处理程序
基于产品 ID
保持不变——现有的 UI 处理程序继续运行。
如何从Unity IAP 4 迁移到IAP 5
广告活动迁移分为四个步骤:
初始化并连接。初始化Unity Gaming Services,获取 StoreController,订阅其事件,并调用 Connect() 连接到 Google Play 或Apple App Store。使用 OnStoreConnected 和 OnStoreDisconnected 来切换购买界面。
获取产品。从编辑器的IAP产品目录或代码中构建 List(例如,new ProductDefinition("gem_chest_01", ProductType.Consumable)),并将其传递给 FetchProducts()。该商店返回本地化的价格和描述。
获取待处理的订单。调用 FetchPurchases() 来恢复中断或延迟的交易。待处理订单通过 OnPurchasePending 事件到达,但开发者也应该处理 orders.PendingOrders,因为在某些 iOS 版本上可能会错过待处理事件。已确认的非消耗品和订阅服务现在可以重新激活。
购买、授予、确认。调用 PurchaseProduct(product)。在 OnPurchasePending 中,授予商品,验证收据,并调用 ConfirmPurchase(pendingOrder)。在 OnPurchaseFailed 中处理失败——用户取消购买无需显示消息,其他错误应向玩家显示。
Unity IAP 5 购买流程
使用下面的信息图查看Unity IAP5 的完整购买流程,包括新功能、网上商店、产品目录和支付提供商。

升级到IAP 5 时常见的陷阱
- 重复授权:同一订单可能同时出现在 OnPurchasePending 和手动待处理订单传递中。在 HashSet(由 OnPurchasesConfirmed 填充)中跟踪已处理的交易,并在授予权限之前检查它。
- 同时购买:在订单处理过程中禁用购买按钮,以防止重复请求。
- 事件泄露:IAP 5 是事件驱动的——当采购管理器被销毁时,取消订阅所有 StoreController 事件。
- StoreKit 1 暂停购买:在 iOS 15 之前的设备上,未确认的购买可能会阻止玩家重新购买同一产品。建议使用后端系统来跟踪和解决这些购买交易。
服务器端验证
IAP 5 订单的交易 ID 可以发送到Unity Cloud Code 进行服务器端验证,物品通过Unity Economy授予玩家。