Stripe-PHP 7.37
SubscriptionSchedule等を利用して、予約注文をした際に、初回の決済時にコケないかどうかチェック(オーソリ)する方法
Stripeは単発決済のやり方が複数あるので、単発決済を使ったオーソリにもいくつかあります(2通り?)
・Chargeを使ったもの
・PaymentIntentを使ったもの
Chargeは単純で古いAPIですが、残してるようです。(どっちが良いかについては下記に書いてます)
###オーソリ
Chargeでは、パラメータ「capture」に「false」をセットする
PaymentIntentでは、パラメータ「capture_method」に「manual」をセットする
そうすれば、Chargeであれば、パラメータのamountやtoken(カード情報のトークン)が問題ないかチェックしてくれます。
$stripe->charges->create([
'amount' => {{ YOUR_AMOUNT }},
'currency' => 'jpy',
'source' => {{ YOUR_CARD_TOKEN }},
'capture' => false,],
//["stripe_account" => {{ YOUR_CONNECTED_ACCOUNT_ID }}] // for direct charge
);
PaymentIntentであれば、パラメータのamountやcustomerにdefault_sourceが問題ないかチェックしてくれます。(payment_methodにsourceのIDを記載することで、sourceを評価することもできます)
$stripe->paymentIntents->create([
'amount' => {{ YOUR_AMOUNT }},
'currency' => 'jpy',
//'payment_method' => {{ YOUR_SOURCE_ID }}, // if you want to check a specific source.
'description' => 'authorization charge',
'customer' => {{ YOUR_CUSTOMER_ID }},
'confirm' => true,
'capture_method' => 'manual'],
//["stripe_account" => {{ YOUR_CONNECTED_ACCOUNT_ID }}] // for direct charge
);
※Chargeのsourceはtokenのようなのでsourceのidを渡すとエラーを吐きます。
※PaymentIntentのpayment methodはsourceのidを渡しますが、紐づくcustomerも同時に渡す必要があります。
###キャンセル
公式ドキュメント的にはPaymentIntentを使って欲しいのか、PaymentIntentしかわかりやすいところに説明がないですが、Chargeでもできるようです。
・PaymentIntentはPaymentIntentをCancelすれば良い。
$stripe->paymentIntents->cancel(
{{ YOUR_PAYMENT_INTENT_ID }},
[],
//["stripe_account" => {{ YOUR_CONNECTED_ACCOUNT_ID }}] // for direct charge
);
・Chargeはrefundすれば良い。(stripeのダッシュボードで未キャプチャの支払いに大してキャンセルを実行するとrefundしているようです)
$stripe->refunds->create([
{{ YOUR_CHARGE_ID }},
[],
//["stripe_account" => {{ YOUR_CONNECTED_ACCOUNT_ID }}] // for direct charge
);
###キャプチャとは
オーソリと言う概念は、わりと他の日系決済代行会社でもあるのでピンとくる人が多いと思いますが、キャプチャは私もあまり知らなかったのですが、端的に言うと「キャプチャする = 売り上げ請求する」と言うことみたいですね
https://support.stripe.com/questions/jp-does-stripe-support-authorize-and-capture
###オーソリでChargeとPaymentIntentどちらを使うべきか?
「ChargeのAPIが古いということもあり、新しい方のPaymentIntentを使うべき」
というわけではない、Charge APIはDeprecatedではないようです。
Strong Customer Authenticationと呼ばれる欧州で導入されている。顧客認証とかに対応しているとかの問題であったりなので、多分どっちでもいい。
https://stripe.com/docs/payments/payment-intents/migration/charges
Chargeは直接tokenで認証を行うので、顧客に紐づける前のカード状態確認が簡単にできるのが特徴なのかな?
(PaymentIntentはSourceオブジェクトでもリクエスト可能だが、Customer IDもリクエストに含めるべしと言われたので、無理?)
ちなみに顧客に紐づける前にチェックしたい理由は、顧客に紐づけたらすぐに執行されてしまうSubscription失敗状態などが考えられる。(変なカード紐づけて執行されるのを避けたい場合)
↑tokenは一回しか使えないので、オーソリして、本決済をおなじtokenですることができないため、上記はできないことがわかった。ChargeとPaymentIntent本当にどっちでも良さそう。
###参考
https://teratail.com/questions/272376
https://tech.kitchhike.com/entry/stripe-authorization