通过后端 API 完成购买
实现您自己的后端,监听购买事件并跟踪玩家的权利。
阅读时间7 分钟最后更新于 20 天前
如果您的游戏使用服务器授权,请实现一个执行以下操作的后端系统:
- 验证 Webhook 事件 (JWT)。
- 解析事件。
- 根据事件类型更新系统中的授权或清单。
- 将订单标记为已完成。
- 返回事件响应。
验证 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
Webhook 事件形状
Unity IAP 将来自所有受支持的支付提供商的事件标准化为这种一致的格式。请参阅以下示例文件:请参阅 Webhook 事件中的以下字段:{ "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 }}
事件类型
Unity IAP 发送以下 Webhook 事件类型:order.paid
当玩家成功完成购买时,Unity IAP 会发送order.paidorder.updated
Unity IAP 会在每次更新订单时发送order.updated- 标记为已完成的顺序。
- 正在处理的退款。
- 其他顺序修改。
data.totalrefundedAmountMicrosorder.revoked
当订单状态更改为revokedorder.revoked通过 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 终端返回非2xx