PAYMENT-SIGNATURE の送信方法を中心にお読みください。エージェント側のやり取りに加盟店の API キーは不要です。
2 つの統合モード
モード 1:加盟店ホスト型 402
加盟店サーバー自身が x402 server として動作します。エージェントに 402 challenge を返し、署名を受け取り、
order/create で署名を Waffo に引き渡して決済します。エージェントを自社 API 上に留めたい、x402 プロトコルの詳細を自前で実装できる加盟店に適しています。モード 2:Waffo ホスト型 402
加盟店は注文を作成し、Waffo が返すホスト型 URL をエージェントに渡すだけです。402 challenge、署名の受け取り、決済はすべて Waffo キャッシャーが行います。x402 プロトコルの詳細に触れず迅速にリリースしたい加盟店に適しています。
order/create エンドポイントを共用します。区別はただ一つ、リクエストの x402Info に paymentSignatureHeader を含むかどうかです。署名ありはモード 1、署名なしはモード 2 になります。
前提条件
x402 決済の受け入れには、Waffo 導入チームを通じて以下 2 点の開通が必要です。
- 加盟店契約で CRYPTO / USDC 決済プロダクトを有効化する
- Waffo 側でオンチェーン受取パラメータを設定する
wallet/inquiry と order/create はエラーコード A0010(加盟店契約で許可されていない操作)を返します。現在のサポート範囲
オンチェーン受取パラメータの取得
モード 1 で 402 challenge を構築する前に、POST /api/v1/wallet/inquiry で受取パラメータを取得します。このエンドポイントは照会のみで、注文の作成も金額の検証も行いません。
| フィールド | 説明 |
|---|---|
network | CAIP-2 ネットワーク識別子。サンドボックスは Base Sepolia eip155:84532、本番は Base メインネット eip155:8453 を返します |
asset | USDC トークンのコントラクトアドレス(環境とネットワークにより異なり、本番の Base メインネットは 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913) |
payTo | Waffo プラットフォームの受取アドレス。Waffo がオンチェーンで受け取り、契約に基づいて加盟店に精算します |
3 つのフィールドはいずれも Waffo の設定値です。challenge の構築にはそのまま使用してください。
payTo を自社のウォレットアドレスに置き換えてはいけません。エージェントの署名内の受取アドレスと金額は、決済前にオンチェーンで厳密に検証されます。モード 1:加盟店ホスト型 402
加盟店側で行うことは 4 つです。wallet/inquiryでnetwork/asset/payToを取得し、価格設定に基づいて 402 challenge を構築(金額はアトミック単位、schemeはexact固定)してエージェントに返す- エージェントの再送リクエストヘッダー
PAYMENT-SIGNATUREから署名を取り出し、そのままorder/createのx402Info.paymentSignatureHeaderに設定する(デコードして再構築しない) - 同期レスポンスの
orderStatusで提供可否を判定する:PAY_SUCCESSは提供、PAY_IN_PROGRESSは Webhook またはorder/inquiryの最終ステータスを待つ、ORDER_CLOSEは拒否 - 提供時にレスポンスの
x402Info.x402ResponseをPAYMENT-RESPONSEヘッダーとしてエージェントに返す。これが x402 準拠の決済レシートです
goodsInfo、orderRequestedAt など)は通常のワンタイム決済の注文作成と同一です。API Reference を参照してください。
paymentSignatureHeader は base64 エンコードされた x402 PaymentPayload です。デコード後の構造は以下のとおりです(エージェント側の x402 SDK が生成するため、加盟店が構築する必要はありません)。
x402Response は base64 エンコードされた決済レシート(x402 SettlementResponse)で、orderStatus = PAY_SUCCESS の場合のみ返されます。デコード後:
transaction はオンチェーンのトランザクションハッシュで、照合とオンチェーン検証に使用できます。payer はエージェントの支払いウォレットアドレスです。
モード 2:Waffo ホスト型 402
加盟店側で行うことは 3 つです。order/createにx402Info: { "x402Request": true }(署名なし)とsuccessRedirectUrl/failedRedirectUrlを設定する- レスポンスの
orderAction(JSON 文字列)を解析してwebUrlを取り出し、エージェントを 302 リダイレクトする。以降の 402 challenge、署名の受け取り、決済はすべて Waffo キャッシャー側で行われます - Webhook または
order/inquiryが返すorderStatusに基づいてリソースを提供する
webUrl にアクセスすると HTTP 402 を受け取ります。challenge はレスポンスボディにあります(x402 プロトコルでは challenge はボディに置かれ、専用のレスポンスヘッダーはありません)。
PAYMENT-SIGNATURE リクエストヘッダー(x402 仕様の X-PAYMENT に相当)に設定します。加盟店の認証情報は一切不要です。
successRedirectUrl または failedRedirectUrl に戻します。ホスト型 URL はブラウザアクセス(チェックアウトページを表示)と x402 クライアントアクセス(プロトコルレスポンスを返す)の両方に対応しています。
決済成功後、Webhook 通知と order/inquiry レスポンスには x402Info.x402Response(構造はモード 1 と同一)が付加されます。それ以外の通知構造は通常の注文と同じです。Webhook イベントタイプを参照してください。
モード比較
| 項目 | モード 1:加盟店ホスト型 402 | モード 2:Waffo ホスト型 402 |
|---|---|---|
| x402 server の役割(402 の発行、署名の受領) | 加盟店サーバー | Waffo キャッシャー |
| x402 プロトコル詳細の実装が必要か | 必要(challenge 構築、署名ヘッダーの解析) | 不要 |
order/create に署名を含むか | 含む(x402Info.paymentSignatureHeader) | 含まない |
| 注文作成レスポンス | 最終ステータスまたは PAY_IN_PROGRESS を直接返す | AUTHORIZATION_REQUIRED + ホスト型 URL |
| リダイレクト | なし(エージェントは終始加盟店 API と通信) | 加盟店 302 → キャッシャー 302 で戻る |
| リソース提供の判定基準 | 同期レスポンス / Webhook / inquiry の orderStatus | Webhook / inquiry の orderStatus |
| 適した加盟店 | x402 サービスを自前で構築し深くカスタマイズしたい場合 | プロトコル詳細に触れず迅速にリリースしたい場合 |
PAY_IN_PROGRESS、AUTHORIZATION_REQUIRED など)は他の決済手段と共通です。決済ライフサイクルを参照してください。
金額と小数位(2 層の単位)
同一の取引に 2 層の金額表現があります。混同しないでください。| 層 | フィールド | 表現方式 | 例(9.99 USDC) |
|---|---|---|---|
| Waffo API 層 | orderAmount | String、小数 2 桁まで | "9.99" |
| オンチェーン / x402 プロトコル層 | value、maxAmountRequired | String、アトミック単位の整数(USDC のオンチェーン精度は 6 桁) | "9990000" |
orderAmount を指します。402 challenge と EIP-3009 署名内の金額は常にアトミック単位です。モード 1 では両層の金額が同一の値を表す必要があり、不一致の場合は決済検証で失敗します。
エラーコード
x402 は Waffo の既存の外部エラーコードを再利用します。msg に具体的な理由が示されます。
| コード | 意味 | x402 での主な発生原因 |
|---|---|---|
A0003 | パラメータ検証失敗 | challenge / 署名の scheme が exact でない。paymentRequestId の欠落 |
A0007 | サポートされない取引通貨 | orderCurrency が USDC でない。または利用可能な同一通貨 USDC 契約がない |
A0010 | 加盟店契約で許可されていない操作 | CRYPTO/USDC 決済プロダクトが未開通、またはオンチェーン受取パラメータが未設定 |
よくある質問
サンドボックス環境はどのチェーンを使いますか?
サンドボックス環境はどのチェーンを使いますか?
サンドボックスは Base Sepolia テストネット(
eip155:84532)で、USDC コントラクトアドレスは 0x036CbD53842c5426634e7929541eC2318f3dCF7e です。本番は Base メインネット(eip155:8453)で、USDC コントラクトアドレスは 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 です。どちらの環境でも network / asset / payTo は wallet/inquiry の実際の返り値に従ってください。他の通貨やネットワークはサポートされますか?
他の通貨やネットワークはサポートされますか?
現在は USDC + Base ネットワークのみです。
orderCurrency に他の通貨を指定すると A0007 が返ります。1 回の承認で複数回請求できますか?
1 回の承認で複数回請求できますか?
できません。x402 の
exact scheme は EIP-3009 transferWithAuthorization に基づいており、その nonce は USDC コントラクト側で 1 回のみ消費されます。署名は一度決済されると無効になり、再送信はオンチェーンで直接失敗します。サブスクリプション型や従量制の複数回請求は x402 の対象範囲外です。orderStatus が PAY_IN_PROGRESS のとき、先にリソースを提供してもよいですか?
orderStatus が PAY_IN_PROGRESS のとき、先にリソースを提供してもよいですか?
いけません。
PAY_IN_PROGRESS はオンチェーン処理中を意味するだけで、最終的に成功も失敗もあり得ます。リソースを提供できるのは orderStatus = PAY_SUCCESS のみで、最終ステータスは Webhook または order/inquiry で確定します。402 challenge はレスポンスヘッダーとボディのどちらにありますか?
402 challenge はレスポンスヘッダーとボディのどちらにありますか?
レスポンスボディ(JSON)にあります。challenge を運ぶヘッダーはありません。x402 のやり取りにおける唯一のプロトコルリクエストヘッダーは、エージェントが署名を送信する
PAYMENT-SIGNATURE(x402 仕様の X-PAYMENT に相当)です。決済レシートは x402Info.x402Response フィールドで返され、仕様の X-PAYMENT-RESPONSE に相当します。「AI 統合ツール(waffo-integrate)」と同じものですか?
「AI 統合ツール(waffo-integrate)」と同じものですか?
違います。AI 統合ツールは AI コーディングツールで Waffo SDK の統合コードを生成するものです。本ページは AI エージェントが支払い側としてステーブルコインで加盟店のサービスを購入する仕組みです。併用できますが、解決する課題は異なります。
関連ドキュメント
- 決済ライフサイクル:注文ステートマシンと最終ステータスの確定
- 通貨と金額:金額フォーマットと小数位ルール
- 冪等性:
paymentRequestIdの冪等性セマンティクス - Webhook 概要:署名検証とリトライポリシー
- API Reference:
order/create、order/inquiry、wallet/inquiryの完全なフィールド定義