読者です 読者をやめる 読者になる 読者になる

決済API と Ruby 🍣 時々 Rails

Omise JapanのLead Developerです。OmiseやRubyのことをメインに書きます。

Omise 商用へ移行した時にお伝えしたいこと(トークンとオーソリ)

商用へ移行され、実際に課金をテストされることがあるかと思います。
ここでは、商用へ移行された時に私たちが伝えきれていない?(と個人的には思います)情報を説明したいと思います。

1. 商用モードでのトークン作成って何をしているの?

カードの有効性チェックを行います。
そのため、日本の加盟店では、トークンを作成する時にカードが実際に使えるかを確認するため下記のことを行います。

クレジットカードの場合

  • トークンを作成開始
  • 送信したカードで100円の与信を行い100円の枠を抑える
  • 100円の与信が成功すれば、100円の与信枠を解放し、そのタイミングでの有効性を確認できたとして使えると判断する
  • 100円の与信が成功しなければ、トークン作成がエラーになる

デビットカードの場合

  • トークンを作成開始
  • 送信したカードで100円を本売上する
  • 100円の本売上が成功すれば、100円の返金をし、そのタイミングでの有効性を確認できたとして使えると判断する
  • 100円の本売上が成功しなければ、トークン作成がエラーになる

クレジットカードとデビットカードで言葉が若干違いますが、100円で課金できるかを確認して、そのタイミングでのカードの有効性を確認しています。

ですので、ほんの少しの間だけ100円の与信枠を確保と解放する時間がカードに発生します。
決済の裏事情ですね。。。。

※有効性チェックをオーソリともいいます。

※デビットカードの場合、明細書に100円の出金と返金が履歴に残るようです。
引き落としのギモン|Visaデビット|ジャパンネット銀行

2. そのタイミングでのカードの有効性って?

つまり、カードを使おうとした時に、カードがまだ使える状態かということです。

次の例の場合、課金(Charge)作成の時に失敗することがあります。

  1. 与信枠が残り2000円のカードで、カードを情報をフォームへ入力中
  2. カードフォームへ入力中に、どこかで登録している定期課金で2000円の与信が行われた
  3. カード情報を入力終わり、トークン作成
  4. トークン作成エラー(2. のタイミングで与信枠が足りなく(0円)なっているため)

3. 課金(Charge)作成時のエラーについて

課金(Charge)作成時のエラーについては、現時点では下記のエラーを返しています。
こちらは、日本でもタイでもインドネシアでも、英語が共通語としてChargeオブジェクトの failure_message に入ってきます。
日本語で対応されたい場合は、failure_code の文字列を参照していただき、switch文などでご利用に最適化した日本語に訳したテキストをアプリでご利用されると良いかと思います。

failure_code failure_message いつ発生するか
insufficient_fund “insufficient funds in the account or the card has reached the credit limit” 与信限度枠を超えた時
stolen_or_lost_card “card is stolen or lost” 盗難カード、または紛失カードの場合
failed_processing “failed processing” トランザクション処理のプロセスが失敗した場合
payment_rejected “payment rejected” 何らかの理由により、課金が拒否された場合
invalid_security_code “the security code is invalid” セキュリティコードが無効の場合
failed_fraud_check “failed fraud check” カードが不正だと判定した場合に発生
invalid_account_number “the account number is invalid” 利用できないカード番号の場合

4. 番外編 トークン作成時のステータスコードとレスポンス(Token/Errorオブジェクト)

TokenをOmise.jsで作成する時のつまづきポイントをメモしておきます。

ステータスコートとTokenオブジェクト

Tokenオブジェクトがレスポンスで返ってくる場合、ステータスコードは200が返ってきます。 このレスポンスには注意点がひとつあり、Tokenオブジェクトの中のCardオブジェクトの security_code_check が true になっているかも確認してください。 security_code_check が false の場合、そのTokenを使って課金(Charge)をしても invalid_security_code で課金は失敗します。

ステータスコードとErrorオブジェクト

Errorオブジェクトがレスポンスで返ってくる場合、ステータスコードはエラーの値が返ります。