見出し画像

Stripeで銀行振込を実現する

これはStripe Advent Calendar 2018 17日目のエントリーです。

前回東京で開催されたJP_Stripesでは「Stripeで実現する銀行振込」として話をさせていただきました。

その具体的な実装例について説明します。なおここで紹介している銀行振込ですが、現状日本での銀行振込対応の機能があるわけではなく実際には「インボイスで送付」の機能を流用してStripe外での支払い処理として取り扱っています。

Customerの作成

Customerを作成する際には、shippingのパラメータもあわせて送ることで、請求書や領収書の送付先住所として使用することができます。なおこれはあくまで請求書・領収書のPDFによる書類に表記されるだけで、この住所に書類が郵送されるとかではありません。

具体的な実装例はこんな感じになります。

Map<String, Object> customerParams = new HashMap<String, Object>();
Map<String, Object> shippingMap = new HashMap<String, Object>();

Map<String, Object> addressMap = new HashMap<String, Object>();
addressMap.put("postal_code", "123-4567");
addressMap.put("country", "JP");
addressMap.put("state", "東京都");
addressMap.put("line1", "千代田区1-1-1");
shippingMap.put("address", addressMap);

shippingMap.put("name","テスト株式会社")
shippingMap.put("phone", "+813-1234-5678");
customerParams.put("shipping", shippingMap);

customerParams.put("email", "jenny.rosen@example.com");
customerParams.put("description", "Customer for jenny.rosen@example.com");

Customer.create(customerParams);

stateには都道府県名を日本語で渡すことが可能です。電話番号については+81をつけた形に変換しておくのが良さそうです。住所については line2 まで設定可能ですが、空文字を渡すことはできません。

Subscriptionの作成

Subscription作成時には「billing」として「send_invoice」を送ることで「インボイスで送付」扱いとなります。

同時に「days_until_due」オプションをあわせて送ることで銀行振込の場合の支払い期限を遅くすることが可能です。

Map<String, Object> item = new HashMap<String, Object>();
item.put("plan", "emerald-company-234");

Map<String, Object> items = new HashMap<String, Object>();
items.put("0", item);

Map<String, Object> params = new HashMap<String, Object>();
params.put("customer", "cus_XXXXXXXXX");
params.put("items", items);

params.put("billing", "send_invoice");
params.put("days_until_due", 90);

Subscription.create(params);

これらのパラメータは、例えば差額請求だけを個別のInvoiceを作成して対応する際にも同じパラメータをつけることで「インボイスで送付」扱いとなります。

また、銀行振込からクレジットカード払いに変更があった際には、「billing」のみ「charge_automatically」に変更してupdateすれば、自動的に支払期日のパラメータは「0」になるためわざわざパラメータとして送る必要はありません。

Invoice.pay

支払いがあった際には「paid_out_of_band」を渡すことでStripe外で決済が完了した状態にできます。

具体的には以下のようになります。

Map<String, Object> invoiceParams = new HashMap<String, Object>();
Invoice invoice = Invoice.retrieve("in_XXXXX");
invoiceParams.put("paid_out_of_band", true);
invoice.pay(invoiceParams);

APIを叩いた時点で入金完了となるため、実際の入金日から入金を確認した日までの間にずれがあった場合、および請求金額と入金額にずれがあった場合、には運用上何らかの対応が必要になります。(metadataに入金日・入金額を入れておくことであとから追跡しやすくなるかと思います)

差額発生時

差額が発生した際にはCustomerのaccount_balanceに対して差額分をセットし直します。

ここでセットすることで次回のInvoice作成時に差額分が調整された金額での請求が作成されるようになります。

     Map<String, Object> params = new HashMap<String, Object>();
     Customer customer = Customer.retrieve("cus_XXXXX");
     params.put(
       "account_balance",
       customer.getAccountBalance() + XXXXXX);
     customer.update(params);

Stripeで銀行振込を対応する流れは以上となります。

Stripe上で銀行振込も管理できるようにすることで、普段はクレジットカードで決済をするものの今月はクレジットカードの更新があるため銀行振込で支払う、といったケースにも対応がしやすくなるかと思います。

この記事が気に入ったらサポートをしてみませんか?