Skip to main content
イベントの一覧と「これはどの照会に対応するか」の対応表は Webhook イベントタイプ一覧 にあります。 完全なフィールドのスキーマは API リファレンス にあります。 配信のルール — タイムアウト、受理されるレスポンス、再試行、URL の解決 — は Webhook 配信契約 FAQ にあります。 このページが答えるのはフィールドレベルの疑問 — ハンドラーを書いていて、期待した値が 見つからないときに出てくる疑問です。

外側のエンベロープには何が入っていますか?

ちょうど 2 つのキーです。
トップレベルにタイムスタンプ、通知 ID、バージョン、加盟店 ID はありません。署名はボディ ではなく X-SIGNATURE ヘッダーで運ばれます。したがって eventType でディスパッチし、 それ以外はすべて result から取得してください。

eventType でディスパッチすべきですか、それとも result の中の何かでですか?

eventType でディスパッチしてください。それがどのイベント系統かを示し、したがって result の 形が決まります。result の中のステータスフィールドはその後、何が起きたかを示します。 逆にすると、1 つのイベントタイプが複数のステータスを運ぶケースで壊れます。たとえば決済通知は、 オーソリ段階でも最終状態でも同じ eventType です。 指針はこうです。eventType がパーサーを選び、result のステータスが業務の分岐を選びます。

どのフィールドが自社の注文番号ですか?

どのペイロードも、貴社側と Waffo 側の両方の識別子を運びます。自社のデータベースへの結合キー としては貴社のものを、サポートとのやり取りには Waffo のものを使ってください。 時間を節約する注意点が 3 つあります。
  • paymentRequestId は、そのリクエストのために貴社が生成した冪等性キーでもあります。 だからこそ、異なる金額や通貨で再利用すると A0011 が返ります。refundRequestId と subscriptionRequest についても同じです。
  • チャージバックは、係争対象の注文を originalOrderId と呼びます。 他のすべての ペイロードのように acquiringOrderId とは呼びません。命名のパターンが崩れる唯一の ペイロードであり、Portal の Webhook ログで自社の注文番号からチャージバックを検索しても 見つかりません。 Webhook イベント辞書と一括再送 を参照してください。
  • サブスクリプション課金の決済ペイロードや返金ペイロードは、subscriptionId、period、 subscriptionRequest を持つネストされた subscriptionInfo も運びます。これによって 決済注文を課金期間に紐づけられます。

カードの BIN と下 4 桁はどこにありますか?

トップレベルにはありません。カードの詳細は paymentInfo.payMethodResponse の中にあり、 重要な構造上の点として、payMethodResponse は JSON エンコードされた文字列であり、 ネストされたオブジェクトではありません。中から何かを読み取る前にパースする必要があります。 パースすると、カード関連のキーは次のとおりです。 同じ文字列の中の他のキーは、為替レート、顧客が支払った金額と通貨、決済手段の参照を扱います。 公開されている説明は API リファレンス を参照してください。 いつ値が入るのか? カード系の決済 — カード、およびその下でカードを提示する 2 つの モバイルウォレット製品 — の場合のみです。それ以外の決済手段では、カード関連のキーは 一切現れません。したがって、パーサーはそれらすべてを任意として扱うように書いてください。 cardBin がないのは正常であり、エラーではありません。 firstSix、first6、lastFour、last4、maskedCardNumber、cardNo は、Waffo のどの ペイロードにも存在しないフィールド名です。それらを探しているなら、求めているのは maskCardData、cardBin、cardLast4 です。

照会や通知から userFee を取得できますか?

いいえ。userFee は、加盟店向けのどの照会レスポンスにも通知ペイロードにも存在するフィールド ではありません。 この名前は、ホスト型チェックアウトを経由しない場合に使う orderAction データの説明には登場しますが、 それはそのアクションのペイロードのキーであって、注文のフィールドではありません。注文に対して 実際に返される金額や手数料については 手数料と税の取り扱い を参照してください。

送金には actFeeAmount があります。feeAmount はまだ存在しますか? どちらを使うべきですか?

actFeeAmount を使ってください。加盟店向けの送金ペイロードに feeAmount は存在しません。 actFeeAmount がそれを置き換えており、公開されている契約が運ぶのもこのフィールドです。 2 つの関連フィールドと併せて読んでください。 この関係は記帳にとって重要です。actFeeAmount は feeStatus が DEDUCTED のときは徴収額で あり、feeStatus が RETURNED または NONE のときは 0 です。したがって、 feeStatus を確認せずにゼロの手数料を「無料」と読まないでください。返還された手数料と そもそも徴収されなかった手数料は、どちらもゼロで表示されますが意味が異なります。 命名上の罠が 1 つあります。feeAmount はチャージバックのペイロードにはまだ存在し、 そこではチャージバック手数料を意味します。同じフィールド名で無関係な数量です。両者で デシリアライザーを共有しないでください。 念のため送金の結果フィールドについて。status は IN_PROGRESS、SUCCESS、FAILURE です。 戻し処理は subStatus の FULL_REVERSED または PARTIAL_REVERSED で表現されます。 失敗は failureCode と failureReason を運びます。

顧客が支払った後、同じ口座に返金できるよう、その銀行口座を取得できますか?

いいえ。Payin の通知も注文照会も、顧客の銀行口座番号や口座名義人名を返しません。 それらしく見えるフィールドが 3 つありますが、いずれも違います。 安心できる部分もあります。元の支払手段への返金が重要な決済手段では、返金は貴社が指定する 口座へではなく、元の決済を遡って実行されます。したがってその挙動のために口座番号は必要 ありません。返金に銀行情報が必要な場合は、API がそれを求めます。 返金の資金源 と 決済手段ごとの返金の制限 を参照してください。

未払い、キャンセル、タイムアウトの注文は、ペイロードではどう見えますか?

3 つとも PAYMENT_NOTIFICATION として届き、3 つとも同じ終端ステータスに着地します — ORDER_CLOSE です。キャンセル、期限切れ、失敗を表す個別のステータス値はありません。 受け取りうる注文ステータスの完全な集合は次のとおりです。 キャンセル、タイムアウト、拒否を区別するには orderFailedReason を読んでください。 これも JSON エンコードされた文字列で、 {"orderFailedCode":"...","orderFailedDescription":"..."} という形をしています。 ステータスが ORDER_CLOSE のときにのみ存在します。成功した注文や進行中の注文では 完全に省略されるため、パーサーはデフォルト値を入れるのではなく、存在しないことを許容する 必要があります。 返金ペイロードでの相当物は refundFailedReason、サブスクリプションでは failedReason で、 どちらも同じ JSON 文字列の形です。failReason、errorCode、errorMsg、 channelErrorCode、merchantErrorCode という名前は、これらのペイロードには存在しません。

サブスクリプションの paymentDetails は全履歴ですか? 増え続けますか?

どちらもはいです。そしてこれは、長期の契約者を抱える前に設計しておく価値があります。 paymentDetails は現在の期間までのすべての期間の配列で、期間の昇順に並び、 上限も、ページサイズも、カーソルもありません。何年も続く月次のサブスクリプションでは、 期間ごとに要素が 1 つ増え、ペイロードもそれに伴って大きくなります。 各要素が運ぶのは次のとおりです。 実務上の帰結が 2 つあります。
  • ストリーム処理するかインデックスを作り、丸ごと保持しないでください。 通知のたびに 配列全体を差分比較するのではなく、必要な期間 — 通常は最大の period、またはまだ記録して いないもの — だけを読んでください。
  • paymentDetails[].orderStatus はその期間の注文自身のステータスであって、加盟店表示用の 注文ステータスではありません。 PAY_SUCCESS と ORDER_CLOSE のほかに、請求がまだ 保留中または再試行中の間は INIT、TO_PAY、NEED_RETRY になることがあります。 最終とみなしてよいのは前者の 2 つだけです。
関連する非対称性として、サブスクリプション照会の契約では同じ名前が 2 つの異なる意味を 持ちます。リクエストでは paymentDetails はその配列を要求するフラグ(0 または 1、 既定は 0)であり、レスポンスではその配列そのものです。

サブスクリプションはまだ ACTIVE ですが、ある期間の請求が失敗しました。何が届きますか?

SUBSCRIPTION_PERIOD_CHANGED_NOTIFICATION が届きます。しかも、その期間の再試行が 尽きた後にのみ届きます。途中の失敗した試行では通知はまったく発火しません。その期間の注文は NEED_RETRY になって待機します。 ペイロードが伝える内容は次のとおりです。 理由については期待値を調整してください。これは実際の制約です。トップレベルの failedReason は サブスクリプションの失敗の詳細であって、失敗した期間のものではありません。したがって その期間がなぜ拒否されたのかを確実に説明するものではなく、期間の要素自体は失敗コードを 持ちません。試行ごとの失敗理由を得るには、PAYMENT_NOTIFICATION も購読してください。 これはすべての決済試行で発火し、その試行の orderFailedReason を運びます。これはまさに サブスクリプション通知の選び方のガイド が「最小」と「完全」の組み合わせの間で示している区別です。

更新の再試行が尽きると、サブスクリプションはキャンセルされますか?

どの期間が失敗したかによります。2 つのケースは異なる振る舞いをします。 したがって、更新の再試行の尽きをキャンセルとして扱わないでください。また、期間変更の通知 だけで権利を剥奪しないでください。期間が失敗した後にアクセスを停止すべき製品であれば、 それは期間イベントに対して貴社が実装すべき方針です。Waffo が代わりにサブスクリプションを クローズすることはありません。 再試行は何回か? 単一の数値はありません。再試行の回数と間隔は、貴社の加盟店契約の 更新再試行ストラテジーから来ており、期間の種類 — 日次、週次、月次、四半期、年次、 またはデフォルト — ごとに解決されます。数値を仮定するのではなく、貴社のアカウントに設定された 数値を連携サポートに確認してください。また サブスクリプションの再試行と決済手段 を参照してください。

顧客がウォレットアプリの中でキャンセルしました。どのステータスが届きますか?

subscriptionStatus が USER_CANCELLED の SUBSCRIPTION_STATUS_NOTIFICATION です。 すべてで分岐できるよう、ステータスの完全な集合は次のとおりです。 なお PLATFORM_CANCELLED は、配信されうるにもかかわらず、サブスクリプションのステータス フィールドの公開されている列挙一覧から抜けています。キャンセル系統の一部として扱ってください。 MERCHANT_CANCELLED、USER_CANCELLED、CHANNEL_CANCELLED、PLATFORM_CANCELLED は いずれも「もう課金されない」を意味します。

通知のボディは本当に照会レスポンスと同一ですか?

たいていはそうですが、常にではありません。そして、その例外こそが驚かせるものです。 含意が 2 つあります。
  • 照会レスポンスとの差分でサブスクリプションのハンドラーを作らないでください。 余分な配列は想定どおりでバグではなく、サブスクリプションの Webhook が、比較した照会より 劇的に大きくなりうる理由でもあります。
  • キーの順序が安定していると仮定しないでください。 通知ボディのフィールドの並び順は 何かと一致することを保証されていません。これが問題になるのは、ボディを自分でハッシュ化 または正規化しようとしていた場合だけです。その必要はありません。受信した生のバイト列に 対して X-SIGNATURE を検証してください。 Webhook 署名検証 を参照してください。

すべてのイベントタイプについて、完全で実際のボディの例をもらえますか?

イベントごとの例は、ここではなく API リファレンス で管理されています。各 result は対応する照会のレスポンスであり、API リファレンスは 稼働中の契約から生成されるためです。それが、ずれることのない唯一の写しになります。 それをフィクスチャの元にするときの注意が 2 つあります。
  • 公開されているリファレンスは定期的に再生成されるため、ペイロードに存在するフィールドが しばらくリファレンスに載っていないことがあります。payMethodResponse の中のカード関連の キーと、サブスクリプションのアドオンの詳細が現在の例です。これらは配信されているのに、 一部しか記述されていません。ペイロードはスーパーセットとして扱い、未知のフィールドに 寛容なパーサーにしてください。
  • 本物を捕まえられるなら、ドキュメントからフィクスチャを作らないでください。 サンドボックスでフローを実行し、自社のエンドポイントに届いたものを記録してください。 それは貴社の加盟店設定と貴社の決済手段によるペイロードであり、ハンドラーが実際に 乗り越えなければならないものです。 サンドボックスのシミュレーション制限 FAQ を参照してください。