# ウェブフック # 概要 ウェブフックは、システムで発生するイベントに関する通知です。特定のイベントが発生すると、エクソーラはHTTPリクエストを送信し、イベントデータがアプリケーション に送信されます。通常、これはJSON形式のPOSTリクエストです。 イベントの例: - アイテムカタログとのユーザーインタラクション - 注文の決済またはキャンセル 設定されたイベントが発生すると、エクソーラはウェブフック経由でシステムにそれを通知します。その結果、次のようなアクションを実行できます: - ユーザーの残高を補充する - 支払いを返金する - ユーザーアカウントから新しいアイテムをクレジットまたはデビットする - サブスクリプションの提供を開始する - 詐欺の疑いがある場合にユーザーをブロックする 支払い処理ウェブフックのワークフローの例: ![支払い処理ウェブフック](https://cdn.xsolla.net/developers/current/images/api_docs/webhooks-general.svg)

注意

使用されるソリューションとその統合のタイプに応じて、ウェブフックのセットとインタラクションのシーケンスは、提供された例とは異なる場合があります。

エクソーラウェブフック統合のビデオガイド:
エクソーラ製品およびソリューションを使用する場合のウェブフック設定:
製品/ソリューション 必須/任意 ウェブフックは何に使用されますか
決済ソリューション 必須
  • ユーザー検証。
  • 支払いが成功した場合や支払いが返金された場合に、トランザクションの詳細情報を受け取ります。
  • ユーザーに購入したアイテムを付与し、注文がキャンセルされた場合にアイテムを差し引きます。
インゲームストア 必須
  • ユーザー検証。
  • 支払いが成功した場合や支払いが返金された場合に、トランザクションの詳細情報を受け取ります。
  • ユーザーに購入したアイテムを付与し、注文がキャンセルされた場合にアイテムを差し引きます。
ゲーム販売 任意 ゲームキーの販売では、ユーザーの検証やアイテムの付与は必要ありません。支払いや注文キャンセルなどのイベントに関する情報を受け取りたい場合は、ウェブフックを接続することができます。
ウェブフックを接続する場合は、すべての受信した必要なウェブフックを処理することが重要です。
サブスクリプション 任意 サブスクリプションの作成、更新、またはキャンセルに関する情報を受け取ります。または、API経由で情報をリクエストすることもできます。
ウェブショップ 必須
  • ユーザー検証。
  • 支払いが成功した場合や支払いが返金された場合に、トランザクションの詳細情報を受け取ります。
  • ユーザーに購入したアイテムを付与し、注文がキャンセルされた場合にアイテムを差し引きます。
  • ユーザー認証、ユーザーIDによる認証を使用する場合。または、エクソーラログイン経由でユーザー認証を使用することもできます。
デジタル配信ソリューション 必須
  • ユーザー検証。
  • エクソーラ側のトランザクションIDをシステムのトランザクションIDにリンクします。
  • 注文に追加のトランザクションパラメータを転送します。
  • ユーザーに購入したアイテムを付与し、注文がキャンセルされた場合にアイテムを差し引きます。

ウェブフックの設定に関する詳細情報は、デジタル配信ソリューションのドキュメンテーションを参照してください。

ログイン 任意

イベント情報の受信:

  • ユーザー登録/認証
  • ユーザーメールアドレスの確認
  • ユーザーのソーシャルメディアアカウントをリンクする

ウェブフックの設定の詳細については、ログインのドキュメンテーションを参照してください。

# 必須なウェブフックのリスト ウェブフックの操作が必要な製品やソリューションを使用している場合、パブリッシャーアカウントでウェブフックを有効化してテストし、その処理をセットアップします。特定のイベントが発生する時、ウェブフックが順次送信されます。したがって、1つのウェブフックを処理しない 場合、その後のウェブフックは送信されません。必要なウェブフックのリストは以下の通りです。 ## インゲームストアと決済ソリューション エクソーラ側では、サイトでアイテムを購入して返品する際に2 つのウェブフック送信オプションが設定されています。支払いと取引データ、および購入したアイテムに関する情報は、個別に提供することも、1つのウェブフックにまとめるこ ともできます。 まとめたウェブフックで情報を受け取ります: 2025年1月22日以降にパブリッシャーアカウントに登録した場合は、注文支払い完了(`order_paid`)と注文キャンセル(`order_canceled`)ウェブフックですべての情報を受け取ります。この場合、支払い(`payment`)と返金(`refund`)ウェブフックを処理する必要はありません。 個別のウェブフックで情報を受け取ります: 2025年1月22日以前にパブリッシャーアカウントに登録した場合は、以下のウェブフックを受け取ります: - 支払い (`payment` ) そして返金 (`refund` )に支払いデータと取引の詳細に関する情報が記載されます。 - 購入したアイテムに関する情報を含む注文支払い完了(`order_paid`)と注文キャンセル(`order_canceled`)。 すべての受信ウェブフックを処理する必要があります。まとめたウェブフックを受信する新しいオプションに切り替えるには、カスタマーサクセスマネージャーにご連絡いただく か、csm@xsolla.comまで電子メールをお送りください。 インゲームストアと決済管理の完全な運用のためには、主要なウェブフックの処理を実装する必要があります。 まとめたウェブフックを受信する場合
ウェブフック名とタイプ 説明
ユーザー検証 > ユーザー検証user_validation ユーザーがゲームに登録されていることを確認するために、支払いプロセスのさまざまな段階で送信されます。
ゲームサービス > まとめたウェブフック > 注文支払い完了order_paid 支払いデータ、取引の詳細、購入されたアイテムに関する情報が含まれます。ウェブフックからのデータを使用して、ユーザーにアイテムを追加します。
ゲームサービス > まとめたウェブフック > 注文キャンセルorder_canceled キャンセルされた支払のデータ、取引の詳細、および購入したアイテムに関する情報が含まれています。ウェブフックからのデータを使用して、購入されたアイテムを削除します。
個別のウェブフックを受信する場合
ウェブフック名とタイプ 説明
ユーザー検証 > ユーザー検証user_validation ユーザーがゲームに登録されていることを確認するために、支払いプロセスのさまざまな段階で送信されます。
決済ソリューション > 支払いpayment 支払いデータと取引の詳細が含まれています。
ゲームサービス> 個別のウェブフック> 注文支払い完了order_paid 購入したアイテムに関する情報が含まれています。ウェブフックからのデータを使用して、ユーザーにアイテムを追加します。
決済ソリューション > 返金refund 支払いデータと取引の詳細が含まれています。
ゲームサービス > 個別のウェブフック > 注文キャンセルorder_canceled 購入したアイテムとキャンセルされたトランザクションのIDに関する情報が含まれます。ウェブフックのデータを使用して、購入したアイテムを削除します。
アイテムカタログの個人用設定がアプリケーション側で実装されている場合は、パートナー側でのカタログ個人用設定ウェブフックの処理を設定します。

注意

実際の支払いを受け取るには、ライセンス契約に署名し、以下のウェブフック処理を実装するだけです:

## サブスクリプション サブスクリプションプランを自動的に管理するには、主要なウェブフックの処理を実装する必要があります: - ユーザーの検証(`user_validation`) — 決済プロセスのさまざまな段階で送信され、ユーザーがゲームに登録されていることを確認します。 - 決済(`payment`) — 注文が支払われたときに送信され、決済データとトランザクションの詳細が含まれます。 - 作成されたサブスクリプション(`create_subscription`) — 決済ウェブフックが正常に処理されたとき、またはユーザーが試用期間付きのサブスクリプ ションを購入したときに送信されます。これは購入したサブスクリプションの詳細とユーザーデータを含んでいます。ウェブフックデータを使用して、ユーザーにサブスクリプシ ョンを追加します。 - 更新されたサブスクリプション(`update_subscription`) — サブスクリプションが更新または変更されたとき、決済ウェブフックが正常に 処理されたときに送信されます。購入したサブスクリプションの詳細とユーザーデータが含まれます。ウェブフックデータを使用して、ユーザーのサブスクリプションを延長する か、サブスクリプションパラメータを変更します。 - 返金(`refund`) — 注文がキャンセルされたときに送信され、キャンセルされた決済データとトランザクションの詳細が含まれます。 - キャンセルされたサブスクリプション(`cancel_subscription`) — 返金ウェブフックが正常に処理されたとき、またはサブスクリプションが別の理由でキャンセ ルされたときに送信されます。サブスクリプションとユーザーデータに関する情報を含んでいます。ウェブフックデータを使用して、ユーザーから購入したサブスクリプションを 差し引きます。 # パブリッシャーアカウントでウェブフックをセットアップする ## 一般設定 ウェブフックの受信を有効にするには: 1. パブリッシャーアカウントのプロジェクトで、プロジェクト設定 > ウェブフックセクションに移動します。 2. ウェブフックサーバーフィールドには、ウェブフックを受信したいサーバーのURLを `https://example.com` 形式で指定します。ウェブフックをテストするツールで見つけたURLを指定することもできます。

注意。

データ転送にはHTTPSプロトコルが使用されます。HTTPプロトコルはサポートされていません。

3. プロジェクトのウェブフックに署名するための秘密鍵は、デフォルトで生成されます。新しい秘密鍵を生成したい場合は、更新アイコンをクリックします。 4. 「ウェブフックを有効にする」をクリックします。 ![Enable webhooks](https://cdn.xsolla.net/developers/current/images/api_docs/enable.png)

注意

ウェブフックをテストするには、webhook.siteのような専用のウェブサイトか、ngrokのようなプラットフォームを選択できます。

注意

異なるURLに同時にウェブフックを送信することはできません。パブリッシャーアカウントでは、まずテスト用のURLを指定し、それを実際のURLに置き換えることができます。

ウェブフックの受信を無効にするには: 1. パブリッシャーアカウントのプロジェクトで、プロジェクト設定 > ウェブフックセクションに移動します。 2. 「ウェブフックを無効にする」をクリックします。 ## 詳細設定 ウェブフックについては決済ソリューションとストアセクションでは、詳細設定が利用できます。「ウェブフックを取得」ボタンをクリックする と、自動的に一般設定ブロックの下に表示されます。

注意

詳細設定が表示されない場合は、一般設定でウェブフック受信が接続されていることを確認し、テスト > 決済ソリューションとストアタブにいることを確認してください。

このセクションでは、ウェブフックでの追加情報の受信を設定できます。これを行うには、対応するスイッチをアクティブポジションに設定します。各権限の行は、設定の変更に よって影響を受けるウェブフックを示します。
トグル 説明
保存された決済アカウントに関する情報を表示する 保存された決済方法に関する情報は、payment_accountカスタムオブジェクト。
保存された決済方法による取引に関する情報を表示する

情報は、ウェブフックの以下のカスタムパラメータに渡されます:

  • saved_payment_method:
    • 0 — 保存された決済方法は使用されませんでした
    • 1 — 決済方法は現在の支払い時に保存されました
    • 2 — 保存された決済方法は使用されませんでした
  • payment_type:
    • 1 — 一回払い
    • 2 — 定期支払い
注文オブジェクトをウェブフックに追加する 注文に関する情報は、決済ウェブフックのorderオブジェクトに渡されます。
機密データは含まず、必要なユーザーパラメータのみを送信する

ウェブフックでは、ユーザーに関する次の情報のみが渡されます:

  • ID
カスタムパラメータを送信する カスタムトークンパラメータに関する情報は、ウェブフックで渡されます。
カードのBINとサフィックスを表示する

ウェブフックには、銀行カード番号に関する以下の情報が渡されます:

  • card_binパラメータの最初の6桁
  • card_suffixパラメータの最後の4桁
カードブランドを表示する 決済に使用したカードのブランド。例えば、MastercardやVisaなど。
![高度な設定](https://cdn.xsolla.net/developers/current/images/api_docs/advanced-settings-upd.png) # パブリッシャーアカウントでウェブフックをテストする ウェブフックをテストすると、ユーザー側とエクソーラ側の両方でプロジェクトが正しく設定されていることを確認できます。 ウェブフックが正常にセットアップした場合、ウェブフック設定セクションの下にウェブフックのテストセクションが表示されます。 ![ウェブフックのテストセクション](https://cdn.xsolla.net/developers/current/images/api_docs/testing.png) パブリッシャーアカウントのテストセクションは、ウェブフック受信オプションによって異なります。 まとめたウェブフックを受信する場合
ウェブフックテストのタブ名 ウェブフック名とタイプ
決済ソリューションとストア ユーザー検証 > ユーザー検証user_validation
ゲームサービス > まとめたウェブフック > 注文支払い完了order_paid
ゲームサービス > まとめたウェブフック > 注文キャンセルorder_canceled
サブスクリプション ユーザー検証 > ユーザー検証user_validation
決済ソリューション > 支払いpayment
個別のウェブフックを受信する場合
ウェブフックテストのタブ名 ウェブフック名とタイプ
ストア ゲームサービス> 個別のウェブフック> 注文支払い完了order_paid
ゲームサービス > 個別のウェブフック > 注文キャンセルorder_canceled
決済ソリューション ユーザー検証 > ユーザー検証user_validation
決済ソリューション > 支払いpayment
サブスクリプション ユーザー検証 > ユーザー検証user_validation
決済ソリューション > 支払いpayment

注意

テストセクションにテストがパスしていないという警告が表示された場合は、ウェブフックリスナーのウェブフック応答設定を確認します。テストでのエラーの理由はテスト結果に示されます。

例:

テストには、専門サイトwebhook.siteを使用します。

無効な署名に対する応答のテスト」セクションにエラーが表示されます。

エクソーラが間違った署名を持つウェブフックを送信し、ハンドラーがINVALID_SIGNATUREエラーコードを指定する4xx HTTPコードで応答することを期待しているために発生します。

webhook.siteは、署名が間違ったウェブフックを含むすべてのウェブフックに応答して200 HTTPコードを送信します。期待される4xx HTTPコードが得られないため、テスト結果にエラーが表示されます。

![テストエラー](https://cdn.xsolla.net/developers/current/images/api_docs/test-error.png) まとめたウェブフックを使用したシナリオのテストプロセスを以下に説明します。 ## 決済ソリューションとストア 「決済ソリューションとストア」タブでは、次のウェブフックをテストできます: - ユーザー検証(`user_validation`) - 注文の支払いが完了しました(`order_paid`) - 注文キャンセル(`order_canceled`) テストするには: 1. ウェブフックのテストセクションで、「決済ソリューションとストア」タブに移動します。 2. ドロップダウンメニューで、アイテムのタイプを選択します。選択したタイプのアイテムがパブリッシャーアカウントに設定されていない場合は、以下をクリックします: * 接続 – このタイプのアイテムを含むモジュールが接続されていない場合 * 構成 – 以前にモジュールを接続したが、セットアップを完了していない場合
ボタンをクリックすると、選択したアイテムのタイプに対応するパブリッシャーアカウントのセク ションにリダイレクトされます。アイテムを作成したら、ウェブフックのテストセクションに戻り、次のステップに進みます。 3. 必要なフィールドに入力します:
  1. ドロップダウンリストからアイテムのSKUを選択し、数量を指定します。同じタイプのアイテムを複数選択するには、「 + 」をクリックして新しい行に追加します。
  2. ユーザーID — テスト時には、文字と数字の任意の組み合わせを使用できます。
  3. パブリックユーザーID — ユーザーに知られているID(メールアドレスやニックネームなど)。このフィールドは、プロジェクトで「ペイステーション > 設定」でパブリックユーザーIDが有効になっている場合に表示されます。
  4. エクソーラ注文IDフィールドに任意の値を入力します。
  5. エクソーラ請求書ID — エクソーラ側のトランザクションID。テスト時には任意の数値を使用できます。
  6. 請求書ID — ゲーム側のトランザクションID。 テスト時には、文字と数字の任意の組み合わせを使用できます。これは支払いを成功させるために必要なパラメータではありませんが、これを渡すことで、ゲーム側のトランザク ションIDをエクソーラ側のトランザクション ID にリンクできます。
  7. 金額 — 支払い金額。テスト時には任意の数値を使用できます。
  8. 通貨 — ドロップダウンリストから通貨を選択します。
4. 「ウェブフックをテスト」をクリックします。 指定されたデータを含むユーザー検証注文支払い完了および注文キャンセルウェブフックが、指定されたURLに送信されます。各ウェブフックタイプのテスト結果は、「ウェブフックをテス ト」ボタンの下に表示されます。 プロジェクトでパブリックユーザー IDが有効になっている場合は、ユーザー検索チェックの結果も表示されます。 各ウェブフックについて、成功したシナリオとエラーが発生したシナリオの両方の処理を設定する必要があります。 ![支払いテストセクション](https://cdn.xsolla.net/developers/current/images/api_docs/payments-tab.png) ## サブスクリプション 「サブスクリプション」タブでは、次のウェブフックをテストできます: - ユーザー検証(`user_validation`) - 決済(`payment`)

注意

パブリッシャーアカウントでは、基本的なユーザー検証および支払いウェブフックのみをテストできます。他のウェブフックタイプをテストするには、次の場所に移動します:

注意

ウェブフックをテストするには、パブリッシャーアカウント > サブスクリプション > サブスクリプションプランセクションで、少なくとも1つのサブスクリプションプランが作成されている必要があります。

テストするには:
  1. テストセクションで、サブスクリプションタブに移動します。
  2. 必要なフィールドに入力します:
    1. ユーザーID — テスト時には、文字と数字を任意に組み合わせて使用できます。
    2. エクソーラインボイスID — エクソーラ側のトランザクションID。テスト時には、任意の数値を使用できます。
    3. パブリックユーザーID — メールアドレスやニックネームなど、ユーザーに知られているID。このフィールドは、「ペイステーション > 設定 > 追加設定」セクションでプロジェクトのパブリックユーザーIDが有効になっている場合に表示されます。
    4. 通貨— ドロップダウンリストから通貨を選択します。
    5. プランID — サブスクリプションプラン。ドロップダウンリストからプランを選択します。
    6. サブスクリプション製品 — ドロップダウンリストから製品を選択します(任意)。
    7. 金額- 支払金額。テスト時には、任意の数値を使用できます。
    8. インボイスID — ゲーム側のトランザクションID。テスト時には、文字と数字を任意に組み合わせて使用できます。これは決済を成功させるために必要なパラメータではありませんが、エクソー ラ側のトランザクションIDとあなた側のトランザクションIDをリンクさせるために渡すことができます。
    9. 試用期間試用期間 のないサブスクリプションの購入をテストする、またはサブスクリプションの更新をテストするには、値0を指定します。
  3. ウェブフックをテストする」をクリックします。
指定したURLに、データが入力されたウェブフックを受け取ります。各ウェブフックのテスト結果は、成功したシナリオとエラーが発生したシナリオの両方で、「ウェブ フックをテストする」ボタンの下に表示されます。 # ウェブフックリスナー ウェブフックリスナーは、指定されたURLアドレスでウェブフックを受信し、署名を生成しエクソーラウェブフックサーバーに応答を送信することができるプログラムコードです。

注意

Pay Station PHP SDKライブラリには、ウェブフックを処理するための既製のクラスが含まれています。

アプリケーション側で、以下のIPアドレスからのウェブフックの受信を実装してください: - `185.30.20.0/24` - `185.30.21.0/24` - `185.30.22.0/24` - `185.30.23.0/24` - `34.102.38.178` - `34.94.43.207` - `35.236.73.234` - `34.94.69.44` - `34.102.22.197` もし「ログイン」製品を統合している場合、以下のIPアドレスからのウェブフックの処理も追加してください: - `34.94.0.85` - `34.94.14.95` - `34.94.25.33` - `34.94.115.185` - `34.94.154.26` - `34.94.173.132` - `34.102.48.30` - `35.235.99.248` - `35.236.32.131` - `35.236.35.100` - `35.236.117.164` 制限: - アプリケーションのデータベースに同じIDで成功したトランザクションが複数存在することは許可されていません。 - ウェブフックリスナーがデータベースにすでに存在するIDを持つウェブフックを受信した場合、このトランザクションの以前の処理結果を返す必要があります。ユーザーに重複 した購入をクレジットし、データベースに重複したレコードを作成することは推奨されません。 ## 署名の生成 安全なデータ転送を確保するには、ウェブフックが実際にエクソーラサーバーから送信され、転送中に改ざんされていないことを確認する必要があります。これを行うには、受信 したリクエスト本文のペイロードに基づいて独自の署名を生成し、それを着信リクエストの`authorization`ヘッダーで提供される署名と比較してください。両方 の署名が一致する場合、そのウェブフックは正規のものであり、安全に処理できます。 検証ステップ: 1. 着信ウェブフックリクエストの`authorization`ヘッダーから署名を取得します。ヘッダーの形式は`Signature `です。 2. ウェブフックのリクエスト本文をJSON形式で取得してください。

注意

JSONペイロードは、受信したものをそのまま使用してください。ペイロード をパースしたり再エンコードしたりしないでください。フォーマットが変更され、署名検証が失敗する原因となります。

3. 比較用に独自の署名を生成します:
  1. JSONペイロードとプロジェクトの秘密鍵を連結します。秘密鍵は文字列の末尾に追加してください。
  2. 結果の文字列にSHA-1暗号ハッシュ関数を適用します。結果は小文字の16進数文字列になります。
4. 生成した署名を`authorization`ヘッダーからの署名と比較してください。両者が一致すれば、ウェブフックは信頼できるものです。 以下に、署名生成の実装例を各種プログラミング言語で示します: C#、C++、Go、PHP、Node.js。 ### ウェブフック(HTTP)の例: ```http POST /your_uri HTTP/1.1 host: your.host accept: application/json content-type: application/json content-length: 165 authorization: Signature 52eac2713985e212351610d008e7e14fae46f902 { "notification_type":"user_validation", "user":{ "ip":"127.0.0.1", "phone":"18777976552", "email":"email@example.com", "id":1234567, "name":"Xsolla User", "country":"US" } } ``` ### ウェブフック(curl)の例: ```bash curl -v 'https://your.hostname/your/uri' \ -X POST \ -H 'authorization: Signature 52eac2713985e212351610d008e7e14fae46f902' \ -d '{ "notification_type": "user_validation", "user": { "ip": "127.0.0.1", "phone": "18777976552", "email": "email@example.com", "id": 1234567, "name": "Xsolla User", "country": "US" } }' ``` ### C#で署名生成の実装例(一般サンプル):

このコードサンプルは、.NET Framework 4.0以降、および.NET Coreやその他の最新の.NETバージョンと互換性があります。署名検証には、タイミング攻撃を防ぐために、ConstantTimeEqualsメソッドによる定数時間比較が使用されています。

```csharp using System; using System.Security.Cryptography; using System.Text; public static class XsollaWebhookSignature { public static string ComputeSha1(string jsonBody, string secretKey) { // Concatenation of the JSON from the request body and the project's secret key string dataToSign = jsonBody + secretKey; using (SHA1 sha1 = SHA1.Create()) { byte[] hashBytes = sha1.ComputeHash(Encoding.UTF8.GetBytes(dataToSign)); // Convert hash bytes to lowercase hexadecimal string var hexString = new StringBuilder(hashBytes.Length * 2); foreach (byte b in hashBytes) { hexString.Append(b.ToString("x2")); } return hexString.ToString(); } } public static bool VerifySignature(string jsonBody, string secretKey, string receivedSignature) { string computedSignature = ComputeSha1(jsonBody, secretKey); string receivedSignatureLower = receivedSignature.ToLower(); // Use constant-time comparison to prevent timing attacks return ConstantTimeEquals(computedSignature, receivedSignatureLower); } private static bool ConstantTimeEquals(string a, string b) { if (a.Length != b.Length) { return false; } int result = 0; for (int i = 0; i < a.Length; i++) { result |= a[i] ^ b[i]; } return result == 0; } } ``` ### C#による署名生成の実装例(.NET 5.0以降):

Convert.ToHexStringメソッドを使用するには、.NET 5.0 以降が必要です。

.NET 7.0以降をお持ちの場合は、 CryptographicOperations.FixedTimeEqualsメソッドの代わりにConstantTimeEqualsを使用することもできます。

```csharp // For .NET 5.0 and later, you can use the more concise Convert.ToHexString method: using System; using System.Security.Cryptography; using System.Text; public static class XsollaWebhookSignature { public static string ComputeSha1(string jsonBody, string secretKey) { string dataToSign = jsonBody + secretKey; using var sha1 = SHA1.Create(); byte[] hashBytes = sha1.ComputeHash(Encoding.UTF8.GetBytes(dataToSign)); return Convert.ToHexString(hashBytes).ToLower(); } public static bool VerifySignature(string jsonBody, string secretKey, string receivedSignature) { string computedSignature = ComputeSha1(jsonBody, secretKey); string receivedSignatureLower = receivedSignature.ToLower(); // Use constant-time comparison to prevent timing attacks return ConstantTimeEquals(computedSignature, receivedSignatureLower); } private static bool ConstantTimeEquals(string a, string b) { if (a.Length != b.Length) { return false; } int result = 0; for (int i = 0; i < a.Length; i++) { result |= a[i] ^ b[i]; } return result == 0; } } ``` ### C#による署名生成の実装例(.NET 7.0以降):

.NET 7.0以降をお持ちの場合は、CryptographicOperations.FixedTimeEqualsメソッドを使用できます。

```csharp // For .NET 7.0+, you can use the built-in CryptographicOperations.FixedTimeEquals: using System.Security.Cryptography; public static bool VerifySignature(string jsonBody, string secretKey, string receivedSignature) { string computedSignature = ComputeSha1(jsonBody, secretKey); byte[] computedBytes = Encoding.UTF8.GetBytes(computedSignature); byte[] receivedBytes = Encoding.UTF8.GetBytes(receivedSignature.ToLower()); return CryptographicOperations.FixedTimeEquals(computedBytes, receivedBytes); } ``` ### C++での署名生成の実装例: ```c++ #include #include #include #include class XsollaWebhookSignature { public: static std::string computeSha1(const std::string& jsonBody, const std::string& secretKey) { // Concatenation of the JSON from the request body and the project's secret key std::string dataToSign = jsonBody + secretKey; unsigned char digest[SHA_DIGEST_LENGTH]; // Create SHA1 hash SHA1(reinterpret_cast(dataToSign.c_str()), dataToSign.length(), digest); // Convert to lowercase hexadecimal string std::ostringstream hexStream; hexStream << std::hex << std::setfill('0'); for (int i = 0; i < SHA_DIGEST_LENGTH; ++i) { hexStream << std::setw(2) << static_cast(digest[i]); } return hexStream.str(); } static bool verifySignature(const std::string& jsonBody, const std::string& secretKey, const std::string& receivedSignature) { std::string computedSignature = computeSha1(jsonBody, secretKey); // Timing-safe comparison if (computedSignature.length() != receivedSignature.length()) { return false; } volatile unsigned char result = 0; for (size_t i = 0; i < computedSignature.length(); ++i) { result |= (computedSignature[i] ^ receivedSignature[i]); } return result == 0; } }; ``` ### Goでの署名生成の実装例: ```go package main import ( "crypto/sha1" "crypto/subtle" "encoding/hex" "strings" ) type XsollaWebhookSignature struct{} func (x *XsollaWebhookSignature) ComputeSha1(jsonBody, secretKey string) string { // Concatenation of the JSON from the request body and the project's secret key dataToSign := jsonBody + secretKey // Create SHA1 hash h := sha1.New() h.Write([]byte(dataToSign)) signature := h.Sum(nil) // Convert to lowercase hexadecimal string return strings.ToLower(hex.EncodeToString(signature)) } func (x *XsollaWebhookSignature) VerifySignature(jsonBody, secretKey, receivedSignature string) bool { computedSignature := x.ComputeSha1(jsonBody, secretKey) receivedSignatureLower := strings.ToLower(receivedSignature) // Use constant time comparison to prevent timing attacks return subtle.ConstantTimeCompare([]byte(computedSignature), []byte(receivedSignatureLower)) == 1 } ``` ### PHPでの署名生成の実装例: ```php ``` ### Node.jsでの署名生成の実装例: ```js const crypto = require('crypto'); class XsollaWebhookSignature { // IMPORTANT: jsonBody must be the raw JSON string exactly as received from Xsolla static computeSha1(jsonBody, secretKey) { // Concatenation of the JSON from the request body and the project's secret key const dataToSign = jsonBody + secretKey; // Create SHA1 hash const hash = crypto.createHash('sha1'); hash.update(dataToSign, 'utf8'); // Convert to lowercase hexadecimal string return hash.digest('hex').toLowerCase(); } static verifySignature(jsonBody, secretKey, receivedSignature) { const computedSignature = this.computeSha1(jsonBody, secretKey); const cleanReceivedSignature = receivedSignature.toLowerCase(); // Check if signatures have the same length before using timingSafeEqual if (computedSignature.length !== cleanReceivedSignature.length) { return false; } try { return crypto.timingSafeEqual( Buffer.from(computedSignature, 'hex'), Buffer.from(cleanReceivedSignature, 'hex') ); } catch (error) { // Return false if there's any error (e.g., invalid hex characters) return false; } } } ``` ## ウェブフックへの応答の送信 ウェブフックの受信を確認するには、サーバーは以下を返す必要があります: * 成功した応答の場合は、`200`、`201`、または`204`HTTPコード。 * `400`HTTPコードは問題の説明を含む、指定されたユーザーが見つからないか、無効な署名が渡 された場合に送信されます。ウェブフックハンドラーは、サーバーで一時的な問題が発生した場合に`5xx`HTTPコードを返すこともあります。 エクソーラサーバーが 注文支払い完了注文キャンセルへのレスポンスを受け取らなかった場合、または`5xx`コードのレスポンスを受け取った場合、ウェブフックは以下の スケジュールに従って再送されます: * 5分間隔で2回の試行 * 15分間隔で7回の試行 * 60分間隔で10回の試行 ウェブフックの送信は、最初の送信から12時間以内に最大20回まで試行されます。 決済返金ウェブフックの再試行ロジックは、対応するウェーブフックページに記載されています。

注意

以下の条件がすべて満たされている場合でも、支払いはユーザーに返金されます:

  • 返金はエクソーラによって開始されました。
  • ウェーブフックに対する応答として、4xxステータスコードが返された、またはすべての再試行後に応答がなかった、あるいは5xxステータスコードが返された場合。

エクソーラサーバーがユーザー認証ウェブフックへの応答を受信しなかった場合、または`400`または`5xx`のコードで応答を受信した場合、ユーザー認証ウェブフックは再送信されません。この場合、ユーザーにはエラーが表示され、支払い注文支払い完了ウェブフックは送信されません。 # エラー HTTPコード400のエラーコード:
コード メッセージ
INVALID_USER 無効なユーザー
INVALID_PARAMETER 無効なパラメータ
INVALID_SIGNATURE 無効な署名
INCORRECT_AMOUNT 不正確な金額
INCORRECT_INVOICE 不正確なインボイス
``` HTTP/1.1 400 Bad Request { "error":{ "code":"INVALID_USER", "message":"Invalid user" } } ``` # ウェブフックリスト

注意

通知タイプはnotification_typeパラメータで送信されます。

ウェブフック 通知タイプ 説明
ユーザー検証 user_validation ユーザーがゲーム内に存在するかどうかを確認するために送信されます。
ユーザー検索 user_search パブリックユーザーIDに基づいてユーザー情報を取得するために送信されます。
決済 payment ユーザーが決済を完了した場合に送信されます。
返金 refund 何らかの理由で決済をキャンセルする必要がある場合に送信されます。
一部返金 partial_refund 何らかの理由で決済を一部キャンセルする必要がある場合に送信されます。
支払いが拒否されました ps_declined 支払いが決済システムによって拒否されたときに送信されます。
AFSが拒否したトランザクション afs_reject AFSチェック中にトランザクションが拒否された場合に送信されます。
AFSが更新したトランザクション afs_black_list AFSブロックリストが更新される場合に送信されます。
作成されたサブスクリプション create_subscription ユーザーがサブスクリプションを作成する場合に送信されます。
更新されたサブスクリプション update_subscription サブスクリプションが更新または変更された場合に送信されます。
キャンセルされたサブスクリプション cancel_subscription サブスクリプションがキャンセルされた場合に送信されます。
非更新サブスクリプション non_renewal_subscription ステータスが非更新に設定される場合に送信されます。
決済アカウントを追加する payment_account_add ユーザーが支払いアカウントを追加または保存した場合に送信されます。
決済アカウントを削除する payment_account_remove ユーザーが保存済みアカウントから決済アカウントを削除する場合に送信されます。
ウェブショップでのユーザー検証 - ウェブショップのサイトから送信され、ゲーム内にユーザーが存在するかどうかを確認します。
パートナー側でのカタログ個人用設定 partner_side_catalog ユーザーがストアと直接交信する時に送信されます。
注文支払い完了 order_paid 注文が支払われたときに送信されます。
注文キャンセル order_canceled 注文がキャンセルされたときに送信されます。
紛争 dispute 新しい紛争手続きが開かれたときに送信されます。
Version: 1.0 ## Servers ``` https://api.xsolla.com/merchant/v2 ``` ## Download OpenAPI description [ウェブフック](https://developers.xsolla.com/_bundle/@l10n/ja/webhooks/index.yaml) ## ユーザー検証 ### ユーザーの検索 - [POST user-search](https://developers.xsolla.com/ja/webhooks/user-validation/user-search.md): Public User IDは、User ID(Public User IDはメールアドレス、画面名など)とは異なり、ユーザを一意に識別し、ユーザーに知られているパラメータです。エクソーラは、ゲームストアの外(例えば現金キオスクなど)で購入する場合、user_searchタイプのウェブフックを送信します。 ### ユーザー検証 - [POST user-validation](https://developers.xsolla.com/ja/webhooks/user-validation/user-validation.md): エクソーラはユーザーがゲームに登録されていることを確認するために、user_validationタイプのウェブフックをウェブフックURLに送信します。このリ クエストは支払いプロセスの一部として複数回送信されます: * ユーザーが決済UIで決済方法を選択する場合 * ユーザーが決済フォームにデータを入力する場合(例: 銀行カードのデータやPayPal経由で支払う場合の郵便番号) * ユーザーが今すぐ支払うをクリックして決済を続行する場合 * 支払処理が完了し、取引状況がdoneに変更された場合 このリクエストは、任意の決済方法で支払いを行う際に送信されます。 パブリッシャーアカウントにウェブフックURLを保存すると、ウェブフックで詳細情報を受信する権限を与えることができます。これを行うには、パブリッシャーアカウントの 「プロジェクト設定> ; ウェブフック> 詳細設定」セクションで必要なトグルを「アクティブ」に設定します。 注意 2025年1月22日以前にパブリッシャーアカウントに登録した場合は、「プロジェクト設定>ウェブフック>テスト>決済ソリューション>詳細設定」セクションでトグルを見つけます。 トグル 説明 機密データは含まず、必要なユーザーパラメータのみを送信する ウェブフックでは、ユーザーに関する次の情報のみが渡されます:ID国 カスタムパラメータを送信する カスタムトークンパラメータに関する情報は、ウェブフックで渡されます。 ### ウェブショップでのユーザー検証 - [POST user-validation-in-webshop](https://developers.xsolla.com/ja/webhooks/user-validation/user-validation-in-webshop.md): ユーザーがゲームに存在するかどうかを確認するために、エクソーラはウェブショップサイトからウェブフックを送信します。ウェブフックは以下のIPアドレスからに送信されます: 34.102.38.178。 注意 ウェブフックはウェブショップ内でユーザーの検証にのみ使用されます。サイトビルダーでウェブフックを構成する詳細については、こちらの説明を参照してください。 ## 決済ソリューション ### 決済アカウントを追加する - [POST add-payment-account](https://developers.xsolla.com/ja/webhooks/payments/add-payment-account.md): ユーザーがゲーム内で何かを購入するときに決済アカウントを追加したり、決済アカウントを保存したりするたびに、エクソーラは「payment_account_add」タイプのウェブフックをウェブフックURLに送信します。このウェブフックを受信するには、カスタマーサクセスマネージャーにご連絡いただくか、csm@xsolla.comまで電子メールでお問い合わせください。 ### 一部返金 - [POST partial-refund](https://developers.xsolla.com/ja/webhooks/payments/partial-refund.md): 一部返金が行われた場合、エクソーラはpartial_refundタイプのウェブフックのウェブフックURLにキャンセルされたトランザクションの詳細を送信します 。返金プロセスの一部の詳細は、これらの説明を参照してください。 パブリッシャーアカウントにウェブフックURLを保存すると、ウェブフックで詳細情報を受信する権限を与えることができます。これを行うには、パブリッシャーアカウントの プロジェクト設定> ; ウェブフック> 詳細設定 セクションで次のトグルを「アクティブ」に設定します。 注意 2025年1月22日以前にパブリッシャーアカウントに登録した場合は、「プロジェクト設定>ウェブフック>テスト>決済ソリューション>詳細設定」セクションでトグルを見つけます。 トグル 説明 保存された決済方法による取引に関する情報を表示する 情報は、パラメータの以下のカスタムパラメータに渡されます:saved_payment_method:0 — 保存された決済方法は使用されませんでした1 — 決済方法は現在の支払い時に保存されました2 — 保存された決済方法は使用されませんでしたpayment_type:1 — 一回払い2 — 定期支払い 返金コード: コード 理由 説明 1 Cancellation by the user request / the game request パブリッシャーアカウントからキャンセルが開始されました。 3 Integration error エクソラとゲームの統合に関する問題推奨事項:ブロックリストにユーザーを追加しません。 5 Test payment テストトランザクション後にキャンセル処理が実行されます。推奨事項:ブロックリストにユーザーを追加しません。 7 Fraud notification from PS 決済システムで支払いが拒否されました。決済システムで不正の可能性が検出されました。推奨事項:ユーザーをブロックリストに追加してください。 9 Cancellation by the user request ユーザは何らかの理由でゲームや購入に満足していませんでした。推奨事項:ブロックリストにユーザーを追加しません。 10 Cancellation by the game request ゲームによってキャンセルが要求されました。推奨事項:ブロックリストにユーザーを追加しません。 ### 支払い - [POST payment](https://developers.xsolla.com/ja/webhooks/payments/payment.md): ユーザーが支払いを完了すると、エクソーラはpaymentタイプのウェブフックで決済詳細をウェブフックURLに送信します。 予想される応答コードについては、Responsesセクションでは、他の応答コードも使用できます: 応答コード 説明 200、201、204 成功応答。 4xx エラーが発生しました。たとえば、指定されたユーザーが見つからない場合や、無効な署名が渡された場合などです。 5xx 一時的なサーバーエラーです。この応答を受信すると、エクソーラはウェブフックの送信を自動的に再試行し、リスナーが受信を確認するまで試行間隔を徐々に長くします。最大再試行回数は48時間で12回です。 パブリッシャーアカウン トでウェブフックURLを保存すると、ウェブフックで追加情報を受信するように設定することもできます。 注意 2025年1月22日以前にパブリッシャーアカウントに登録した場合は、プロジェクトで設定 > ウェブフック > テスト > 決済ソリューション > 詳細設定セクションでトグルを見つけます。 トグル 説明 保存された決済アカウントに関する情報を表示する 保存された決済方法に関する情報は、payment_accountカスタムオブジェクト。 保存された決済方法による取引に関する情報を表示する 情報は、ウェブフックの以下のカスタムパラメータに渡されます:saved_payment_method:0 — 保存された決済方法は使用されませんでした1 — 決済方法は現在の支払い時に保存されました2 — 保存された決済方法は使用されませんでしたpayment_type:1 — 一回払い2 — 定期支払い 注文オブジェクトをウェブフックに追加する 注文に関する情報は、決済ウェブフックのorderオブジェクトに渡されます。 機密データは含まず、必要なユーザーパラメータのみを送信する ウェブフックでは、ユーザーに関する次の情報のみが渡されます:ID国 カードのBINとサフィックスを表示する ウェブフックには、銀行カード番号に関する以下の情報が渡されます:card_binパラメータの最初の6桁card_suffixパラメータの最後の4桁 カードブランドを表示する 決済に使用したカードのブランド。例えば、MastercardやVisaなど。 お知らせ ウェブフックで送信されるフィールドのセットは、以下によって異なります:パブリッシャーアカウントで構成された詳細設定エクソーラ側で構成されたカスタム設定ご質問がある場合は、カスタマーサクセスマネージャーを連絡して、またはcsm@xsolla.comまで電子メールを送信してお問い合わせください。 ### 支払いが拒否されました - [POST payment-declined](https://developers.xsolla.com/ja/webhooks/payments/payment-declined.md): 決済システムによってトランザクションが拒否された場合、エクソーラは設定されたウェブフックURLに、ps_declinedタイプのウェブフックでトランザクショ ンの詳細を送信します。このウェブフックは認証または支払い処理の段階で送信されます。この場合、payment\ order_paidウェブフックは送信されません。 決済システムで支払いが拒否される一般的な理由: * カードの認証が失敗した(例:技術的なエラーや銀行からの応答がないため、決済システムが認証プロセスを完了できなかった場合)または認証が拒否された(例:銀行からの応 答があったものの、残高不足やカード情報の誤りなどにより取引を拒否した場合)。 * 3-Dセキュア認証が失敗した、完了しなかった、またはユーザーの確認がタイムアウトした場合。 * 決済処理業者または加盟店契約銀行が一時的に利用不能である、あるいは口座閉鎖や無効なカード番号といった不可逆的なエラーによる確定的な拒否(ハードディクライン)が返 された場合。根本的な問題に対処せずに再試行しても、取引の成功にはつながりません。 以下と混同しないでください: * 不正決済防止による拒否は、afs_rejectウェブフックで報告されます。 * 成功した支払い後の全額返金および一部返金(refundおよびpartial_refundウェブフックで報告されます)。 注意 ps_declinedウェブフックを受け取るには、担当のカスタマーサクセスマネージャーにご連絡いただくか、csm@xsolla.comまでメールでお問い合わせください。 ### 払い戻し - [POST refund](https://developers.xsolla.com/ja/webhooks/payments/refund.md): 支払いがキャンセルされると、エクソーラはキャンセルされた取引の詳細を、refundタイプのウェブフックとしてウェブフックURLに送信します。 ウェブフックの再試行メカニズムは、誰が返金を開始したかによって異なります: * 返金がお客様側で開始された場合、ウェブフックは再送されません。ウェブフックへの応答に関係なく、支払いはユーザーに返金されます。 * 返金がサードパーティ(例:決済システム、またはエクソーラカスタマーサポートチームなど)によって開始され、かつウェブフックへの応答として5xxステータスコード が返された場合、ウェブフックは間隔を空けながら再送されます。最大再試行回数は、最初の試行から48時間以内に12回です。 返金プロセスに関する詳細な情報は、こちらの説明.をご参照ください。 注意 以下の条件がすべて満たされている場合でも、支払いはユーザーに返金されます:返金はエクソーラによって開始されました。ウェーブフックに対する応答として、4xxステータスコードが返された、またはすべての再試行後に応答がなかった、あるいは5xxステータスコードが返された場合。 パブリッシャーアカウン トでウェブフックURLを保存すると、ウェブフックで追加情報を受信するように設定することもできます。 注意 2025年1月22日以前にパブリッシャーアカウントに登録した場合は、プロジェクトで設定 > ウェブフック > テスト > 決済ソリューション > 詳細設定セクションでトグルを見つけます。 トグル 説明 保存された決済方法による取引に関する情報を表示する 情報は、ウェブフックの以下のカスタムパラメータに渡されます:saved_payment_method:0 — 保存された決済方法は使用されませんでした1 — 決済方法は現在の支払い時に保存されました2 — 保存された決済方法は使用されませんでしたpayment_type:1 — 一回払い2 — 定期支払い 返金コード: コード 理由 説明 1 Cancellation by the user request / the game request パブリッシャーアカウントからキャンセルが開始されました。 2 Chargeback トランザクションのチャージバックが要求されました。 3 Integration error エクソラとゲームの統合に関する問題推奨事項:ブロックリストにユーザーを追加しません。 4 Potential fraud 不正の疑いがあります。推奨事項: ユーザーをブロックリストに追加してください。 5 Test payment テストトランザクション後にキャンセル処理が実行されます。推奨事項:ブロックリストにユーザーを追加しません。 6 User invoice expired 請求書の期限が切れました(後払いモデルで使用)。 7 Fraud notification from PS 決済システムで支払いが拒否されました。決済システムで不正の可能性が検出されました。推奨事項:ユーザーをブロックリストに追加してください。 8 Cancellation by the PS request 決済システムによってキャンセルが要求されました。推奨事項:ブロックリストにユーザーを追加しません。 9 Cancellation by the user request ユーザは何らかの理由でゲームや購入に満足していませんでした。推奨事項:ブロックリストにユーザーを追加しません。 10 Cancellation by the game request ゲームによってキャンセルが要求されました。推奨事項:ブロックリストにユーザーを追加しません。 11 Account holder called to report fraud アカウント所有者がトランザクションを行わなかったと述べています。 12 Friendly fraud フレンドリー詐欺が報告されました。 13 Duplicate 同じインボイスのトランザクションが重複しています。 ### 決済アカウントを削除する - [POST remove-payment-account](https://developers.xsolla.com/ja/webhooks/payments/remove-payment-account.md): ユーザーが保存アカウントから決済アカウントを削除すると、エクソーラは payment_account_removeタイプのウェブフックをウェブフックURLに送信します。このウェブフックを受信するには、カスタマーサクセスマネージャーにご連絡いただくか、csm@xsolla.comまで電子メールでお問い合わせください。 ## まとめたウェブフック ### 注文キャンセル(支払いと取引の詳細を含む) - [POST order-cancellation](https://developers.xsolla.com/ja/webhooks/combined-webhooks/order-cancellation.md): ユーザー、パートナー、またはシステムによって支払いがキャンセルされた場合、エクソーラは指定されたURLにorder_canceledウ ェーブフックを送信します。このウェーブフックには、キャンセルされたアイテムと決済データに関する情報と、キャンセルされた注文の詳細が含まれています。 支払いが成功しなかった場合、ウェブフックは送信されません。例: * 決済UIは開かれましたが、ユーザーが注文の支払いを行われません * 決済UIが開かれましたが、支払いの実行中にエラーが発生しました 推奨されるウェーブフックの処理時間は3秒以内です。 ### 注文支払い完了(支払いおよび取引の詳細を含む) - [POST successful-order-payment](https://developers.xsolla.com/ja/webhooks/combined-webhooks/successful-order-payment.md): エクソーラはユーザーが注文の支払いに成功すると、指定したURLにorder_paidウェブフックを送信します。 order_paidウェブフックには、購入したアイテム、支払いデータ、取引の詳細に関する情報が含まれています。 支払いが成功しなかった場合、order_paidウェブフックは送信されません: * 決済フォームは開かれましたが、ユーザーは注文の支払いをしていません * 決済フォームが開かれましたが、支払い中にエラーが発生しました order_paidウェブフックの処理時間は3秒未満にすることをお勧めします。 お知らせ ウェブフックで送信されるフィールドのセットは、次の設定によって異なります:パブリッシャーアカウントの「プロジェクト設定>ウェブフック>詳細設定」セクションで構成されたウェブフックエクソーラ側で構成されたウェブフックご不明な点がございましたら、カスタマーサクセスマネージャーに連絡して、またはcsm@xsolla.comまでお問い合わせください。 予想される回答は、「応答」セクションに記載されています。他の応答コードを使用できます。応答コードと自動返金機能の接続に応じて、エクソーラ側のウェブ フック処理ロジックは以下のようになります: 応答コード 自動返金は無効になっています(デフォルト) 自動返金が有効になっています 400、401、402、403、404、409、422、415 操作なし ユーザーへの自動返金 200、201、204 操作なし 操作なし 別のコードまたはウェブフックへの応答なし 指定された時間間隔内に複数のウェブフックが送信されます。5分間隔で2回、15分間隔で7回、60分間隔で10回試行されます。 指定された時間間隔内に複数のウェブフックが送信されます。5分間隔で2回、15分間隔で7回、60分間隔で10回試行されます。すべてのウェブフックが送信されても正常な応答が受信されない場合、ユーザーに自動返金が発行されます。 自動返金機能を接続するには、カスタマーサクセスマネージャーにお問い合わせいただくか、csm@xsolla.comまで電子メールをお送りください。 ## 個別のウェブフック ### 注文キャンセル(支払いおよび取引の詳細なし) - [POST order-cancellation-separate](https://developers.xsolla.com/ja/webhooks/separate-webhooks/order-cancellation-separate.md): ユーザー、パートナー、またはシステムによって支払いがキャンセルされた場合、エクソーラは指定されたURLにorder_canceledウ ェーブフックを送信します。このウェーブフックには、キャンセルされたアイテムに関する情報と、キャンセルされた注文の詳細が含まれています。 支払いが成功しなかった場合、ウェブフックは送信されません。例: * 決済UIは開かれましたが、ユーザーが注文の支払いを行われません * 決済UIが開かれましたが、支払いの実行中にエラーが発生しました 推奨されるウェーブフックの処理時間は3秒以内です。 ### 注文支払い完了(支払いおよび取引の詳細なし) - [POST successful-order-payment-separate](https://developers.xsolla.com/ja/webhooks/separate-webhooks/successful-order-payment-separate.md): エクソーラは、次の条件が満たされると、指定されたURLにorder_paidウェブフックを送信します: 1. ユーザーは注文の支払いに成功しました。 2. エクソーラは、決済ウェブフックの正常な処理に関する応答を受け取りました。 order_paidウェブフックには、購入したアイテムとトランザクションの詳細に関する情報が含まれています。 次の場合、order_paidウェブフックは送信されません: * 決済が失敗しました。例: * 決済フォームは開かれましたが、ユーザーは注文の支払いをしていません * 決済フォームが開かれましたが、支払い中にエラーが発生しました * 決済ウェブフックの正常な処理に関する応答が受信されていません。 order_paidウェブフックの処理時間は3秒未満にすることをお勧めします。 予想される回答は、「応答」セクションに記載されています。他の応答コードを使用できます。応答コードと自動返金機能の接続に応じて、エクソーラ側のウェブ フック処理ロジックは以下のようになります: 応答コード 自動返金は無効になっています(デフォルト) 自動返金が有効になっています 400、401、402、403、404、409、422、415 操作なし ユーザーへの自動返金 200、201、204 操作なし 操作なし 別のコードまたはウェブフックへの応答なし 指定された時間間隔内に複数のウェブフックが送信されます。5分間隔で2回、15分間隔で7回、60分間隔で10回試行されます。 指定された時間間隔内に複数のウェブフックが送信されます。5分間隔で2回、15分間隔で7回、60分間隔で10回試行されます。すべてのウェブフックが送信されても正常な応答が受信されない場合、ユーザーに自動返金が発行されます。 自動返金機能を接続するには、カスタマーサクセスマネージャーにお問い合わせいただくか、csm@xsolla.comまで電子メールをお送りください。 ## 個人用設定ウェブフック ### パートナー側でのカタログ個人用設定 - [POST personalized-partner-catalog](https://developers.xsolla.com/ja/webhooks/personalization/personalized-partner-catalog.md): エクソラは、ユーザーがストアと対話するときに、ユーザーとプロジェクトのパラメータを含む partner_side_catalogウェブフックをウェブフックURLに送信します。 応答として、ユーザが利用可能なitem_idまたはアイテムSKUのリストを返します。この場合、特定のユーザーが特定の商品を指定回数購入 できるという情報を含めることも可能です。この機能により、ユーザーがカートに追加して購入できる商品の数やタイプを制御することができます。 partner_side_catalogウェブフックの処理時間は3秒未満にすることをお勧めします。 ## 不正決済防止 ### 不正決済防止ブロックリストの更新 - [POST afs-rejected-blocklist](https://developers.xsolla.com/ja/webhooks/anti-fraud/afs-rejected-blocklist.md): 不不正決済防止システムのブロックリストが更新(パラメータを追加または削除)される場合、エクソーラはafs_black_listタイプのウェブフックをウェブフックURLに送信します。引数の追加はエクソーラ側で、または要求に応じて自動的に行われます。パラメータは要求時にのみ削除できます。このウェブフックを受信するには、カスタマーサクセスマネージャーにご連絡いただくか、csm@xsolla.comまで電子メールでお問い合わせください。 ### 不正決済防止システムによりトランザクションが拒否されました - [POST afs-rejected-transaction](https://developers.xsolla.com/ja/webhooks/anti-fraud/afs-rejected-transaction.md): 不正決済防止システムのチェック中にトランザクションが拒否された場合、エクソーラはウェブフックのトランザクションの詳細を「afs_reject」タイプでウェブ フックURLに送信します。このウェブフックを受信するには、カスタマーサクセスマネージャーにご連絡いただくか、csm@xsolla.comまで電子メールでお問い合わせください。 パブリッシャーアカウントにウェブフックURLを保存すると、ウェブフックで詳細情報を受信する権限を与えることができます。これを行うには、パブリッシャーアカウントの プロジェクト設定> ; ウェブフック> 詳細設定 セクションで次のトグルを「アクティブ」に設定します。 注意 2025年1月22日以前にパブリッシャーアカウントに登録した場合は、「プロジェクト設定>ウェブフック>テスト>決済ソリューション>詳細設定」セクションでトグルを見つけます。 トグル 説明 保存された決済方法による取引に関する情報を表示する 情報は、パラメータの以下のカスタムパラメータに渡されます:saved_payment_method:0 — 保存された決済方法は使用されませんでした1 — 決済方法は現在の支払い時に保存されました2 — 保存された決済方法は使用されませんでしたpayment_type:1 — 一回払い2 — 定期支払い ### 異議申立 - [POST dispute](https://developers.xsolla.com/ja/webhooks/anti-fraud/dispute.md): 新しい異議申立が行われ、または異議申立のステータスが変更された時、エクソーラは「dispute」タイプのウェブフックをウェブフックURLに送信します。このウェブフックを受信するには、カスタマーサクセスマネージャーにご連絡いただくか、csm@xsolla.comまで電子メールでお問い合わせください。 ## サブスクリプション ### キャンセルされたサブスクリプション - [POST canceled-subscription](https://developers.xsolla.com/ja/webhooks/subscriptions/canceled-subscription.md): サブスクリプションがキャンセルされる場合、エクソーラは「cancel_subscription」タイプのウェブフックをウェブフックURLに送信します。 ### 作成されたサブスクリプション - [POST created-subscription](https://developers.xsolla.com/ja/webhooks/subscriptions/created-subscription.md): ユーザーがサブスクリプションを作成すると、エクソーラはcreate_subscriptionタイプのウェブフックをウェブフックURLに送信します。 ### 非更新のサブスクリプション - [POST nonrenewing-subscription](https://developers.xsolla.com/ja/webhooks/subscriptions/nonrenewing-subscription.md): サブスクリプションステータスが非更新に設定されている場合、エクソーラはnon_renewal_subscriptionタイプのウェブフックをウェブフックURLに送信します。このウェブフックを受信するには、カスタマーサクセスマネージャーにご連絡いただくか、csm@xsolla.comまで電子メールでお問い合わせください。 ### 更新されたサブスクリプション - [POST updated-subscription](https://developers.xsolla.com/ja/webhooks/subscriptions/updated-subscription.md): サブスクリプションのパラメータ(plan_id、date_next_charge)が変更された場合、そしてサブスクリプションが更新される時に、エクソーラはupdate_subscriptionタイプのウェブフックをウェブフックURLに送信します。