バックエンドAPIによる購入の履行
購入イベントをリッスンし、プレイヤーのエンタイトルメントを追跡する独自のバックエンドを実装します。
読み終わるまでの所要時間 4 分最終更新 8日前
ゲームでサーバー権限エンタイトルメントを使用する場合は、以下の実行するバックエンドシステムを実装します。
- Webhook イベント (JWT) を検証します。
- イベントを解析します。
- イベントタイプに基づいて、システム内のエンタイトルメントまたはインベントリを更新します。
- 注文を履行済みとしてマークします。
- イベント反応を返します。
Webhook イベントの検証 (JWT)
検証を有効にするために、Unity Iap は JSON ウェブ Token (JWT) でウェブフックリクエストに署名します。バックエンドでこのトークンの以下の情報を確認し、イベントが本物であることを確認します。- Authorization ヘッダー
- SIGNATURE秘密鍵で署名されています。検証する **JWKS(公開鍵)**を取得してキャッシュします:
https://services.api.unity.com/webhooks/.well-known/jwks.json - Issuer:
https://services.api.unity.com/webhooks/ - オーディエンスクレーム(配列):(Unity プロジェクト ID)、
upid(環境 ID)envId - トークンの有効期限:(有効期限)が経過していないことを確認します。
exp
Webhook イベント形状
Unity Iap は、サポートされているすべての支払いプロバイダーからのイベントをこの一貫した形式に正規化します。以下の例を参照してください。Webhook イベントの以下のフィールドを参照してください。{ "id": "018d5e5e-5e5e-7e5e-5e5e-5e5e5e5e5e5e", "version": "25270591" "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":"Consumable", "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
Unity Iap は、オーダー状態がrevokedorder.revokedAPIによる注文の履行のマーク
バックエンドでエンタイトルメントを付与したら、Orders API を使用して注文を履行済みとしてマークします。これにより、fulfilledAtAuthentication
これらのエンドポイントを呼び出しには、以下のいずれかの方法で認証する必要があります。- サービスアカウントUnity Dashboard でサービスアカウントを作成し、それを使用してバックエンドサーバーを認証します。詳細については、サービスアカウント認証 を参照してください。
- Cloud Codeプロジェクトの代わりに認証できる Cloud Code スクリプトまたはモジュールからエンドポイントを呼び出します。詳細については、「 Use a Cloud Code module to fulfill Purchases 」を参照してください。
順序の取得
GETGET https://iap.services.api.unity.com/v1/projects/{projectId}/environments/{environmentId}/orders/{orderId}
注文状況
status | 説明 |
|---|---|
| 注文は作成されましたが、支払いは完了していません。 |
| 支払いが受領され、支払いプロバイダーによって確認されました。 |
| 注文が満たされ、プレイヤーが報酬を受領しました。 |
| 注文が失敗しました。これは端末状態です。 |
| 命令は取り消されたこれは端末状態です。 |
| 支払い前に注文がキャンセルされました。これは端末状態です。 |
反応ボディの例
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":"Consumable" } ], "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"}
HTTP 反応状態コードについては、IAP Client API のドキュメントを参照してください。
イベント反応を返す
イベント処理の成功または失敗を示すイベント反応を返す必要があります。- "response": []イベント処理が成功したことを示します。
- 非反応:失敗を示します。Unity Iap はリプレイ ポリシーに従ってイベントを再生します。
2xx
イベントリプレイ動作
Webhook エンドポイントが2xx