カードトークン化とは何ですか? tokenId とは何ですか?
トークン化は、ユーザーの生のカード情報を再利用可能な tokenId に置き換えます。
tokenId はお客様側で安全に保管し、ユーザー決済やバックエンドからの引き落としを開始する際に、
カード情報の代わりに使用します。サポートされている tokenType は CARD です。トークンを保持していれば、
ワンタイム決済にも、お客様自身が管理するサブスクリプション型の課金(定期・不定期)にも使用できます。
カードを登録してトークンを取得するにはどうすればよいですか?
標準的なフローでは、生のカードデータがお客様のサーバーを通過しません。- 一意の
tokenRequestId(冪等キー)、お客様のmerchantUserId、tokenType: "CARD"、notifyUrlを指定して/api/v1/tokenization/generateを呼び出します。レスポンスでtokenSessionIdが返されます。 - フロントエンドで Waffo JavaScript SDK(
@waffo/payment-sdk)を初期化し、tokenizationSubmit(tokenSessionId, tokenData)を呼び出します。 SDK はカードデータを暗号化してから Waffo に送信します。カードのexpiryはMM/YYYY(入力時はMM/YYも可)を 受け付けますが、照会と通知では常にMM/YYYYが返されます。 - Waffo は
tokenId、tokenStatus、マスクされたカード情報(maskedCardInfo、cardBin、cardScheme、cardTypeなど)を含むTOKENIZATION_NOTIFICATIONWebhook をnotifyUrlにプッシュします。 /api/v1/tokenization/inquiryを使用して、いつでもトークンの詳細を照会できます。tokenId(1 件を返す)またはmerchantUserId(複数件を返すことがある)で照会します。
/api/v1/tokenization/generate の tokenData オブジェクトに pan、name、expiry、cvv を直接渡すこともできます。
その場合、tokenId は API レスポンスで同期的に返されます。
トークンのライフサイクルはどのようになっていますか?
tokenStatus には 4 つの値があります。
トークンのステータスが変わるか、トークンデータが更新されるたびに
TOKENIZATION_NOTIFICATION を受信します。
処理後は success で応答してください。Waffo が failed または unknown を受信した場合、Waffo は翌日にかけて
バックオフスケジュールで通知を再試行します。スケジュールは
Webhook の再試行 を参照してください。
tokenSessionId と tokenId はどのくらいの期間有効ですか?
2 つの異なる時計があり、固定期間なのはそのうち 1 つだけです。
したがって、有効期限が近いカードは今日登録しても有効期限月の末で使用できなくなるトークンを生成し、
有効期限が遠いカードはプラットフォームの有効期間いっぱい使えるトークンを生成します。
実務上の 2 つの結果:
- トークン自体の有効期限タイムスタンプは
/api/v1/tokenization/inquiryのレスポンスには含まれません。 返されるのはtokenStatusと、トークンデータ内のカードのexpiryです。更新失敗の前にユーザーへ警告したい場合は、 上記のルールを自分で導出するのに十分な情報です。 tokenStatusはトークンが失効した正確な秒ではなく、定期的なスイープによってEXPIREDに移されます。そのため、 計算上の有効期限をわずかに過ぎたトークンが、まだ使用可能と表示されることがあります。有効期限ルールに基づいて スケジュールし、ステータスと注文作成時のエラーコードを最終判断としてください。
同じユーザーが同じカードを 2 回登録すると、tokenId が 2 つできますか?
いいえ。カードトークンは再登録時に重複排除されます。削除されていないトークンに対して次のすべてが一致する場合、
既存の tokenId が返されます — お客様の merchantId(送信している場合は subMerchantId も)、同じ merchantUserId、
同じカード、同じカード名義人、同じ tokenType。
設計時に考慮すべき点:
- 保存カード一覧の重複排除を自分で行う必要はありません。ただし、2 回目の登録は新しいトークンではなく最初のトークンを
返すため、お客様側のストレージは
tokenIdをキーにしてください。 merchantUserIdはキーの一部であるため、同じ物理カードを登録した 2 つの異なるmerchantUserIdは 2 つの異なるtokenIdを受け取ります。結合に使えるユーザー横断のカード識別子は公開されていません。- 同じカードでカード名義人が異なる場合は別の認証情報として扱われ、新しいトークンが生成されます。
/api/v1/tokenization/removeの後、そのトークンは照会から除外され、再利用されることはありません。同じカードを 再登録すると、新しいtokenIdが発行されます。
CIT と MIT の違いは何ですか? それぞれいつ使いますか?
MIT 固有の注意点が 2 つあります。
- CIT は新しく作成したトークンで動作します — 初回決済がカードを検証するものであるため、「verified」状態を待つ必要はありません。
- MIT にはすでに使用可能な保存済み認証情報が必要です。 トークンで決済が一度も成功していない場合(または保存済み認証情報が
無効になっている場合)、MIT の課金は
A0045で拒否されます。実務的には、初回課金を CIT として実行し、以降の課金に MIT を使用します。 threeDsDecisionフィールド(3DS_FORCE/NO_3DS)は、カード / ApplePay / GooglePay の CIT 決済にのみ有効で、MIT では無視されます。
初回決済と後続の課金はどのように組み合わせますか?
- カードを登録し、
tokenIdを取得します(上記参照)。 - トークンが課金可能な状態になるのを待ちます —
TOKENIZATION_NOTIFICATIONを監視するか、/api/v1/tokenization/inquiryを ポーリングします。 - ユーザーが参加する決済では、
userPaymentAccessTokenを指定して CIT 注文を作成します。 - お客様自身が開始する後続の課金では、
merchantInitiatedMode(お客様が管理する固定周期ならscheduled、 イベント駆動の引き落としならunscheduled)を指定して MIT 注文を作成します。
保存済みトークンで課金されず、/order/create が AUTHORIZATION_REQUIRED を返したのはなぜですか?
保存済みトークンに対する CIT は、サーバー側の課金ではないためです。merchantInitiatedMode なしで
userPaymentAccessToken を送信すると、Waffo は注文を作成し、orderStatus: AUTHORIZATION_REQUIRED と
値の入った orderAction を返します。まだお金は動いておらず、カード会員が完了すべきステップが残っています。
これはワンクリック CIT の通常の結果であり、エラーではありません。
対応方法:
orderActionを解析してactionTypeを読み取ります —WEBはユーザーをwebUrlへ、DEEPLINKはdeeplinkUrlへ リダイレクトすることを意味します。- Waffo のホスト型チェックアウトでは、保存済みカードがすでに選択されマスク表示されています。通常、ユーザーが入力する必要が あるのは CVV のみです。その後に 3DS チャレンジが続くことがあります。
AUTHORIZATION_REQUIREDを非最終状態として扱い、結果は決済通知(または注文照会のポーリング)で待ちます。
/order/create が成功を返したか」だけで分岐しないでください。orderStatus で分岐し、orderAction が存在する場合は常に
ユーザーのステップが残っていると想定してください。
顧客が不在の状態で課金する必要がある場合、それこそが
merchantInitiatedMode の用途です。上記の CIT/MIT のセクションを参照してください。
トークンが期限切れになった、または決済が拒否されました。どうすればよいですか?
- 注文作成時の
A0037(ユーザー決済トークンが無効 / 期限切れ)またはA0023(トークンの期限切れにより注文を作成できない): 保存済みトークンは使用できなくなっています。/api/v1/tokenization/removeを呼び出して登録を解除し(tokenId指定、またはmerchantUserIdでユーザーの全トークン)、ユーザーに新しいカードの登録を依頼してください。 - 登録時の
B1002(カードの有効期限切れ)またはB1001(無効なカード情報):カード自体が問題です。ユーザーは有効なカードを 提供する必要があります。 B1005(トークンセッション ID の期限切れ):generateで取得したtokenSessionIdが無効になっています。/api/v1/tokenization/generateを再度呼び出してください。B1003(カード登録上限超過)とB1004(現在の加盟店契約でサポートされていないカードスキーム):これらは契約上の設定に 依存します。Merchant Portal を確認するか、連携サポートにお問い合わせください。
決済中にカードを登録します。トークン化の結果はどこに通知されますか?
Merchant Portal(Settings → Integration)で、API キーに対して専用のトークン化通知 URLを設定してください。Waffo は そのキーで作成された各注文にこの URL のスナップショットを保存し、カード登録の結果はそこに通知されます。- これは独立したチャネルです。決済結果の
notifyUrlは従来どおり決済通知を受け取り続けます。 - 注文作成のパラメーターではありません。注文ごとに上書きすることはできません。
- 設定されていない場合、トークン化通知の動作は変わりません。
ユーザーのデフォルトカードを設定できますか?
はい。注文作成時ではなく、専用のエンドポイントで行います。トークンと希望する操作を指定して/api/v1/saved-payment-methods/config を呼び出します。
デフォルトカードは、顧客がチェックアウトで見る保存済みカード一覧の並び順に使用されます。期限切れのカードは一覧の末尾に移動します。
ユーザーのカードが銀行によって更新されました。保存済みトークンはまだ使えますか?
使えると想定しないでください。Waffo は現在、発行側の更新情報から保存済みカードを自動的に更新することはないため、 再登録を計画してください。- トークンが使用不能になったことを報告するトークン化通知や決済通知を監視し、ユーザーにカードの再登録を促してください。
- ウォレット側または発行側でカードの連携が解除された場合、保存済み認証情報は使用不能になり、再有効化はできません。
- 期限切れのトークンはもう課金できませんが、ユーザーに新しいカード情報を求める前に、
/api/v1/tokenization/removeを 呼び出して登録を解除することは可能です。