通过 SDK 完成购买
获取购买信息并确定玩家购买的商品的购买状态。
阅读时间3 分钟最后更新于 1 天前
Unity IAP 从商店获取购买信息,以便您的应用程序可以识别和满足玩家的购买需求。这样可以确保您的游戏可以根据用户的购买历史记录向用户交付内容或授权,即使用户在应用外部或其他设备上购买了物品也是如此。
购买表示为
OrderOrder获取购买
可以从商店中检索用户进行的购买。但是,消耗品在使用后必须由应用程序进行跟踪,因为商店不会退回已用完的消耗品。对于非消耗品和订阅,商店会在您调用FetchPurchasesCheckEntitlement确定购买状态
您可以通过两种方式确定购买状态:- 使用 确定
Order是Order、PendingOrder、ConfirmedOrder还是DeferredOrder。FailedOrder - 使用 接收
CheckEntitlement,返回EntitlementStatus、EntitledButNotFinished、EntitledUntilConsumed、FullyEntitled或NotEntitled。Unknown
购买属性
属性 | 描述 |
|---|---|
| 购买的唯一标识符。 |
| 购买的商品。 |
| 购买的商品数量。 |
| 用于向商店验证购买的收据数据。 |
购买状态
State | 描述 |
|---|---|
| 购买已付款但尚未完成。 |
| 购买已完成并确认。 |
| 由于错误,购买失败。 |
| 购买正在等待付款。 |
处理购买
进行购买并等待实现时调用OnPurchasePendingOnPurchasePendingOnPurchasePending// Handle restore on initializationprivate async void Start(){ // Setup, e.g. add listeners to your StoreController... m_StoreController.OnPurchasePending += OnPurchasePending; m_StoreController.OnPurchasesFetch += OnPurchasesFetch; await m_StoreController.Connect(); // Fetch previous purchases (includes confirmed orders) m_StoreController.FetchPurchases();}// Handle new purchases and pending transactionsprivate void OnPurchasePending(PendingOrder order){ ProcessPurchase(order);}// Handle fetched purchases (includes previously confirmed orders)private void OnPurchasesFetch(Orders orders){ foreach(在 orders.ConfirmedOrders 中更改 confirmedOrder) { if (confirmedOrder.CartOrdered.Items().FirstOrDefault()?.Product.definition.type != ProductType.Consumable) { // Mark non-consumable and subscription products as entitled on fetch, as they only need to be granted once MarkAsEntitled(confirmedOrder.CartOrdered.Items().FirstOrDefault().Product); } }}// Your ProcessPurchase logicprivate void ProcessPurchase(PendingOrder order){ foreach(var product in order.CartOrdered.Items()) { // Grant product GrantProduct(product); } // Confirm the order to finalize the transaction m_StoreController.ConfirmPurchase(order);}
购买确认和可靠性
Unity IAP 要求您显式确认购买,以确保可靠地完成购买,即使在网络中断或应用程序崩溃期间也是如此。如果购买已付款但未兑现,Unity IAP 会在应用程序下次初始化时将购买内容传递给应用程序。此过程可防止购买流程中断时或在应用程序离线时完成购买时丢失购买。 成功执行购买后,请致电具有相关PendingOrderConfirmPurchase确认购买已保留到云端
如果要将消耗品购买保存到云端,必须在成功保存购买后调用ConfirmPurchasePending恢复购买
允许用户在重新安装应用或切换设备时重新访问以前拥有的商品和订阅。了解 IAP 如何检索权利记录并授予访问权限:- 用户重新安装应用程序时,Unity IAP 会在第一次调用时恢复拥有的商品。
StoreController.FetchPurchases() - IAP 使用包括所有购买(所有状态)的 对象来调用
Orders监听器。OnPurchasesFetched - 如果 设置为
PurchaseService.ProcessPendingOrdersOnPurchasesFetched,则 IAP 会为每个未实现的购买调用true监听器。OnPurchasePending - 同一会话中的后续调用不会触发已在同一会话中看到的订单的
FetchPurchases()。OnPurchasePending
将服务器端验证与 SDK 结合使用
您可以在使用 Unity 应用内购 (IAP) SDK 时调用后端 API。这种混合方法允许您的服务器在您奖励玩家之前直接根据 Unity 的记录验证交易,从而充当授权者。与标准后端 API 方法不同,此方法不需要公开 Webhook 的公共终端,这样可以减少攻击面并简化服务器基础架构。客户端实现
发起购买时,SDK 会返回一个PendingOrderOrderInfo.TransactionId后端身份验证
使用服务帐户中的 Key ID 和 Secret Key 执行令牌交换以接收无状态持有者令牌。有关更多信息,请参阅如何使用无状态令牌验证 API。
请参阅以下令牌交换终端:
POST https://services.api.unity.com/auth/v1/token-exchange?projectId={projectId}&environmentId={envId}
验证订单
后端拥有持有者令牌后,请使用以下请求查询 Unity IAP Order 服务:GET https://iap.services.api.unity.com/v1/projects/{projectId}/environments/{envId}/orders/{orderId}
orderIdTransactionId- 在授予物品之前,必须是
status。paid - 包含底层 Stripe Checkout Session ID(如果需要在 Stripe Dashboard(条带控制面板)中进行交叉引用)。
paymentProviderResourceId
完成并完成订单
请参阅以下工作流程以使用服务器权限完成订单:- 验证状态是否已支付,并且 productSku 与预期商品匹配。
- 使用新授权更新玩家的数据库。
- 后端向客户端返回成功代码后,请使用以下方法之一在 Unity IAP 系统中完成交易:
- 直接使用 API 更新订单
- 使客户端调用 。
m_StoreController.ConfirmPurchase(order)