レストランやお店で商品を購入する場合、クレジットカードでの支払いはその場で確定します。内部的に見ると、次の2つの処理を同時に行っています。
- 与信枠を確保(オーソリ)
- 支払いを確定
与信というのはお金を受け取れる保証と言えます。与信枠はクレジットカード会社が保証しており、その枠の範囲内であればオーソリが成功します。そして、そのオーソリを売り上げ確定することでクレジットカード会社は店舗にお金を払ったり、カード保有者の口座からお金を引き落とします。
では、このオーソリと支払い確定がずれる場合はどんな形があるかというと、例えば予約商品があります。Eコマースサイトの場合、多くは支払い確定を出荷ベースにしています。そのため、いざ商品を出荷するタイミングでクレジットカード決済がエラーになると非常に困ります。かといって注文時に支払いを確定させてしまった場合、商品の入荷が1ヶ月以上先だと先にお金だけ引き落とされます。これは消費者にとってよくありません。他にもここ数年流行っているクラウドファンディングがあります。こちらは出資額が一定以上に達しないとプロジェクトが失敗します。賛同者が集まるまではあくまでも架空の決済状態(与信を確保した状態)でなければいけません。
そこでどちらにも納得のいく仕組みとして、オーソリという形が存在します。オーソリで決済枠を確保できていれば、支払いを確定するタイミングを遅らせることができます。今回はそんな与信を使った支払い方法をPAY.JP APIで実現する方法を紹介します。なお、今回はRubyで行っています。
SDKのインストール
PAY.JPではRuby向けにSDKを提供しています。インストールはRubygemsでできます。
gem install payjp
初期設定
PAY.JPにてアカウントを作成すると、公開鍵と秘密鍵が得られます。この秘密鍵を使ってSDKを初期設定します。
require "payjp" Payjp.api_key = "sk_live_708...e76"
支払いの作成
次に支払いデータを作成します。これはChargeクラスを使います。クレジットカード番号を直接扱うのはPAY.JPでは推奨されないため、クレジットカード番号をトークン化し、さらに顧客と結びつけてあることとします。そちらの実装についてはこちらの記事をご覧ください。
例えば以下は100円の決済を行った場合なのですが、capture=false
としているのがポイントです。これによって支払い処理の確定はせず、オーソリのみを実行します。
charge = Payjp::Charge.create( amount: 100, customer: customer_id, capture: false, currency: 'jpy', )
管理画面では次のように表示されます。この有効期限はデフォルトで7日、最長で60日となっています。
期限を延長する
もし有効期限が足りない場合、さらに延長できます。こちらもデフォルトで7日、最長で60日となっています。
charge.reauth # または charge.reauth(expiry_days: 10)
支払いをキャンセルする
もし商品が出荷できなくなったり、クラウドファンディングで出資が集まらなかった場合は支払いデータをキャンセルしなければなりません。そうしないと枠をずっと確保し続けることになり、消費者のクレジットカード決済に影響が出てしまうでしょう。支払いのキャンセルは refund
メソッドでできます。
後述する支払い確定された処理に対しては amount
オプションを使うことで一部キャンセルも可能です。(オーソリ状態の処理に対して一部キャンセルはできません)
charge.refund # または charge.refund(amount: 20)
支払いを確定する
そして支払いを確定する処理です。これは capture
メソッドを使います。元の金額のまま確定することもできますが、金額を変更することもできます。この時には amount
オプションを指定します。
charge.capture # または charge.capture(amount: 20)
これで支払いが確定し、店舗側は入金されることになります。
このようなフローで与信を使った取引が実現できます。なお、支払い確定であったり、逆にキャンセルは必要になったタイミングで早めに行うのが良いでしょう。キャンセルしないまま放置していると、枠を確保し続けてしまうのでクレジットカード決済が失敗する可能性が高まってしまいます。
なおデビットカードやプリペイドカードでは、与信枠の確保のタイミングで引き落とし処理が発生いたしますので、購入者が利用する際の説明などに留意ください。
以上、ビジネスフローによりますが、与信を使った決済を行う場合の参考にしてください。