pending から authorised、または authorised から waiting へ移ったときに)サーバーがリアルタイムで通知を受け取れます。API をポーリングする代わりにエンドポイントを登録すれば、ステータスが変わるたびに Hello Clever が自動的に POST リクエストを送信します。
Webhook の仕組み
決済のステータスが変わると、Hello Clever は設定されたendpoint_url に対して、取引の現在の状態を示す JSON のペイロードとともに POST リクエストを送信します。受信を確認するため、エンドポイントは HTTP 200 を返す必要があります。返さない場合、Hello Clever は各試行の間に 15 分の間隔を置いて最大3回リトライします。
リトライによって同じペイロードが複数回配信される可能性があるため、Webhook のエンドポイントでは冪等な処理を実装してください。重複排除には取引の識別子を使ってください。「標準のペイロード」では
uuid、「Payment Gateway 3 のペイロード」では transaction_info.uuid です。Webhook の設定
Webhook のエンドポイントは2つの方法で設定できます。 SDK 連携:既定の Webhook の URL を登録するには Hello Clever へご連絡ください。SDK 経由で作成されたすべての決済がその URL へ通知を送信します。 API 連携:決済作成のリクエストにwebhook_notification のオブジェクトを含めます。指定した場合、その決済については既定の Webhook の URL を上書きします。
object
決済作成のリクエストに含める Webhook の設定です。
決済のステータス
Hello Clever は、決済が次のいずれかのステータスに移るたびに Webhook の通知を送信します。決済が
in_dispute のステータスにある場合、異議解決の手続きに証拠を提出するため、Hello Clever のサポートへご連絡ください。Webhook のオブジェクト
Hello Clever が送信するペイロードの構造は2種類あります。どちらが届くかは決済を作成した製品によって決まるため、項目をマッピングする前に、ご利用の連携がどちらに該当するかを確認してください。標準のペイロード
Payment APIs、Multi-Currency Payment APIs、Card APIs はいずれもこの構造で送信します。各 Webhook の POST のボディには次の項目が含まれます。ペイロードの例:カード決済
ペイロードの例:銀行振込
銀行振込や QR の決済方法では、pay_code に 3DS の URL ではなく、顧客が決済を完了するために必要な情報が入ります。
Payment Gateway 3 のペイロード
Payment Gateway 3 は、平坦な取引オブジェクトではなく決済リンクのオブジェクトを送信します。ハンドラーを実装する際は次の違いに注意してください。- 決済のステータスは
transaction_info.statusにあります。最上位にはありません。 - 金額は文字列ではなく JSON の数値です。
- 顧客の情報は最上位の
nameとemailではなく、sender_infoとして届きます。 - 顧客がリンクに対して決済を開始するまで、
transaction_infoはnullです。
ペイロードの例
Payment Gateway 3 の配信の重複排除には
transaction_info.uuid を使ってください。最上位の uuid は決済リンクを識別するもので、1つのリンクから複数の取引が発生する場合があります。オーソリ済みカードのトークン
カード決済がauthorised または waiting のステータスに達すると、Hello Clever は Webhook のペイロードに token のオブジェクトを含めます。このトークンは安全に保管してください。同じ顧客に対して、カード情報の再入力を求めずに将来の決済を作成できます。
Webhook のセキュリティ
Hello Clever は2つのセキュリティの仕組みに対応しており、単独でも併用でも利用できます。Authorization ヘッダー
Webhook の設定でauthorization_header を指定すると、Hello Clever はエンドポイントへのすべての Webhook リクエストの Authorization ヘッダーでその値を送信します。
HTTP Webhook 署名 (HMAC-SHA256)
Hello Clever は各 Webhook のペイロードを HMAC-SHA256 で署名し、その署名をHTTP-WEBHOOK-SIGNATURE のヘッダーで送信します。
1
Webhook Secret Key を確認する
Merchant Portal で Dashboard → Developer → Authentication → Webhook タブへ移動し、Webhook secret key の欄の値をコピーします。
2
想定される署名を計算する
生のリクエストボディ(JSON をパースして再度文字列化しないこと)と Webhook Secret Key を使います。
3
比較して受け入れるか拒否する
署名が一致すれば、ペイロードは正当で改変されていません。異なる場合はリクエストを拒否してください。改ざんされている、または信頼できない送信元から送られた可能性があります。
署名の検証をテストする
正当なリクエストが検証で拒否される場合は、コードを変更する前に、配信された署名と自分の計算結果を手作業で照合してください。1
生のリクエストボディを取得する
リクエストのログを開き、届いたままの生のボディをそのままコピーします。整形はせず、JSON をパースして再度シリアライズしないでください。空白やキーの順序も署名の対象に含まれます。
2
アプリケーションの外で HMAC を計算する
任意の HMAC-SHA256 の計算ツールに生のボディを入力し、鍵には Webhook のシークレットキーを指定します。入力のエンコーディングは UTF-8、出力のエンコーディングは小文字の16進数に設定してください。
3
配信されたヘッダーと比較する
同じリクエストの 一致する場合、署名は正当であり、問題はアプリケーション側の処理にあります。異なる場合は、リクエストが改ざんされたか、別の鍵で署名されています。対象のマーチャントの正しい Webhook のシークレットキーを使っているか確認してください。
http-webhook-signature ヘッダーを確認し、2つの値を比較します。エラー処理とリトライ
エンドポイントが HTTP200 を返さない場合、Hello Clever は各試行の間に 15 分の間隔を置いて、Webhook の呼び出しを最大 3 回リトライします。
リトライを正しく扱うには次のようにしてください。
- 重い処理を行う前に、Webhook を受け取った時点で直ちに
200を返してください。 - タイムアウトを避けるため、イベントは非同期に処理してください(キューを使うなど)。
- 重複した配信を検出して破棄するため、取引の識別子を使ってください。
uuid、Payment Gateway 3 ではtransaction_info.uuidです。
エラーコード
決済が失敗すると、pay_code のオブジェクトに error_code と error_message が含まれます。次の表はすべてのエラーコードの一覧です。
ベストプラクティス
- 処理を行う前に、すべての受信リクエストで
AuthorizationヘッダーまたはHTTP-WEBHOOK-SIGNATUREを検証してください。 - リトライによる副作用の重複を防ぐため、取引の識別子(
uuid、Payment Gateway 3 ではtransaction_info.uuid)を使って冪等性を実装してください。 - リクエストを受け取ったら直ちに
200 OKを返し、ペイロードは非同期に処理してください。 - Webhook のエンドポイントの URL は非公開に保ち、公開の場での共有は避けてください。
- 通信中のペイロードを保護するため、Webhook のエンドポイントには HTTPS を使ってください。
- 開発中は webhook.site や ngrok のようなローカルトンネルを使ってエンドポイントをテストしてください。