通过后端 API 完成购买
实现您自己的后端,监听购买事件并跟踪玩家的权利。
阅读时间7 分钟最后更新于 1 个月前
如果您的游戏使用服务器授权,请实现一个执行以下操作的后端系统:
- 验证 Webhook 事件 (JWT)。
- 解析事件。
- 根据事件类型更新系统中的授权或清单。
- 将订单标记为已完成。
- 返回事件响应。
这样可以确保您的系统与 Unity IAP 保持同步。
验证 Webhook 事件 (JWT)
为了启用验证,Unity IAP 使用 JSON Web Token (JWT) 对 Webhook 请求进行签名。在后端验证此令牌的以下信息以确保事件真实可靠:
- Authorization 标头
- "signature":使用私钥签名。获取并缓存 **JWKS(公钥)**以验证:
https://services.api.unity.com/webhooks/.well-known/jwks.json - 发行商:
https://services.api.unity.com/webhooks/ - 受众声明(数组):(Unity Project Id)、
upid(Environment Id)envId - 令牌到期:确保(到期)未通过。
exp
大多数语言的库可用于验证 JWT。
Webhook 事件形状
Unity IAP 将来自所有受支持的支付提供商的事件标准化为这种一致的格式。请参阅以下示例文件:
{ "id": "018d5e5e-5e5e-7e5e-5e5e-5e5e5e5e5e5e", "version": "1.0.0", "eventType": "order.paid", "time":"2024-01-15T14:30:00Z", "projectId":"018d5e5e-1111-7e5e-5e5e-111111111111", "environmentId":"018d5e5e-2222-7e5e-5e5e-222222222222", "dataType": "order", "data": { "id": "018d5e5e-3333-7e5e-5e5e-333333333333", "playerId": "player_12345", "paymentProvider": "stripe", "paymentProviderResourceId": "cs_test_a1b2c3d4e5f6", "url": "https://checkout.stripe.com/pay/cs_test_a1b2c3d4e5f6", "lineItems": [ { "sku": "com.game.coins_100", "productType":“消耗品”, "price": { "amountMicros":"25270591" "currency":"USD" } } ], "total": { "amountMicros":"25270591" "currency":"USD", "refundedAmountMicros":0 }, "status": "paid", "customReferenceId": "order_xyz_789", "metadata": { "campaign": "summer_sale", "platform": "iOS" }, "createdAt":"2024-01-15T14:25:00Z", "updatedAt":"2024-01-15T14:30:00Z", "paidAt":"2024-01-15T14:30:00Z", "fulfilledAt": null }}
请参阅 Webhook 事件中的以下字段:
事件类型
Unity IAP 发送以下 Webhook 事件类型:
order.paid
当玩家成功完成购买时,Unity IAP 会发送 事件。收到此事件后,请向玩家授予他们购买的权利或货币,并将订单标记为已执行。
order.paidorder.updated
Unity IAP 会在每次更新订单时发送 事件。这包括以下更改:
order.updated- 标记为已完成的顺序。
- 正在处理的退款。
- 其他顺序修改。
data.totalrefundedAmountMicros退款由开发者发起。例如,您可以通过付款提供商的后台向玩家发放退款。
Unity IAP 在发生退款时不会自动撤销授权。如果要在退款时撤销授权,可以监听此事件并在您自己的授权系统中进行处理。
order.revoked
当订单状态更改为 时,Unity IAP 会发送 事件。收到此事件后,撤销玩家在最初购买时获得的权利或货币。
revokedorder.revoked按存储容量使用计费由玩家发起。例如,玩家可能会通过信用卡公司或银行对收费提出异议。
当按存储容量使用计费争议结束并且玩家赢得争议时,Unity IAP 会自动撤销订单并发送此事件。与退款不同,Unity IAP 会撤销退款授权。
通过 API 将订单标记为已完成
在后端授予授权后,使用 Orders API 将订单标记为已完成。这会更新时间戳并确保正确跟踪订单状态。
fulfilledAt身份验证
要调用这些终端,需要使用以下方法之一进行身份验证:
- 服务帐户在 Unity Dashboard(Unity 后台)中创建一个服务帐户,并用它来验证后端服务器。有关更多信息,请参阅服务帐户身份验证。
- Cloud Code从 Cloud Code 脚本或模块调用终端,该脚本或模块可以代表项目进行身份验证。有关更多信息,请参阅使用 Cloud Code 模块实现购买。
获取顺序
调用 终端以检索订单。
GETGET https://iap.services.api.unity.com/v1/projects/{projectId}/environments/{environmentId}/orders/{orderId}
订单状态
状态 | 描述 |
|---|---|
| 订单已创建,但尚未完成付款。可以转换到 |
| 付款已收到并由付款提供商确认。可以转换到 |
| 订单已完成,玩家已获得奖励。 |
| 订单失败。这是终端状态。 |
| 订单已撤销。这是终端状态。 |
| 订单在付款前已取消。这是终端状态。 |
响应正文示例
GETPATCH{ "id": "018d5e5e-3333-7e5e-5e5e-333333333333", "projectId":"018d5e5e-1111-7e5e-5e5e-111111111111", "environmentId":"018d5e5e-2222-7e5e-5e5e-222222222222", "playerId": "player_12345", "paymentProvider": "stripe", "paymentProviderResourceId": "cs_test_12345", "url": "https://checkout.stripe.com/pay/cs_test_12345", "lineItems": [ { "sku": "com.game.coins_100", "productType":“消耗品” } ], "status": "paid", "fulfilledAt": null, "revokedAt": null, "customReferenceId": "order_xyz_789", "metadata": { "campaign": "summer_sale" }, "createdAt":"2024-01-15T14:25:00Z", "updatedAt":"2024-01-15T14:30:00Z"}
更新订单
调用 终端以更新订单的状态:
PATCHPATCH https://iap.services.api.unity.com/v1/projects/{projectId}/environments/{environmentId}/orders/{orderId}
请求正文
{ "status": "fulfilled"}
请参阅 IAP Client API 文档以了解 HTTP 响应状态代码。
返回事件响应
您需要返回事件响应来指示处理事件的成功或失败。
- "response": 指示事件处理成功。
- 非响应:指示失败。Unity IAP 将根据重播策略重播事件。
2xx
事件重放行为
当您的 Webhook 终端返回非 响应时,Unity IAP 会自动重试事件的传递。确保 Webhook 处理程序幂等,以免重放的事件导致重复授权。
2xx后续步骤
本页面是使用 IAP 设置直接到消费者 (D2C) 付款提供商的工作流程的一部分。要继续此工作流程,请选择以下选项之一: