質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Stripe

Stripeとは、米国のオンライン決済システム提供企業、及び同社が提供する決裁システムを指します。Webサイトやモバイルアプリにコードを組み込むことでクレジットカードなどの決済サービスが簡潔に追加できます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

5544閲覧

stripe 決済失敗時のエラーハンドリングに関して

HS1111

総合スコア91

Stripe

Stripeとは、米国のオンライン決済システム提供企業、及び同社が提供する決裁システムを指します。Webサイトやモバイルアプリにコードを組み込むことでクレジットカードなどの決済サービスが簡潔に追加できます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2020/06/23 15:37

stripeでサブスクリプション課金の決済処理を記述しているのですが、
利用者側での理由(残高不足)などで決済処理が失敗した場合の
エラーハンドリングに関してどの様に処理すればよいのか分からずに困っております。

\Stripe\Subscription::createメソッドの復帰値(レスポンス)で判定出来ると思っていたのですが、
payment_intent.succeededイベントかcharge.failedイベントをwebhookで受信を待ってから
受注確定処理になるのでしょか?

その場合、\Stripe\Subscription::create発行のプロセスと、webhookのプロセスは別になると思いますが、
ユーザへの成功・失敗のレスポンスはどのように処理すれば良いのでしょか?

断片的で恐縮ですが、ライフサイクルや処理方法に関して事例があれば宜しくお願い致します。

phpのコードは下記となります。

php

1// 1.顧客情報を登録 2$customer = \Stripe\Customer::create($createCustomerParms); 3 4// 2.顧客をプランに登録する 5$_plan = $this->user->getAttribute('StripePlan'); 6$subscription = \Stripe\Subscription::create([ 7 // 先程登録した顧客情報のID 8 'customer' => $customer->id, 9 'items' => [ 10 [ 11 'plan' => $_plan, //支払プランID 12 'tax_rates' => ['txr_xxxxxxxxx'], //本番用税率 13 ], 14 ], 15 'default_payment_method' => $this->request->getParameter('stripe_paymentmethod_id'), 16]); 17 18// 3.後続処理でDBトランザクション処理 19// 4.処理結果レスポンス

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

StripeのSubscriptionのライフサイクルについては
https://stripe.com/docs/billing/subscriptions/overview#subscription-lifecycle
にまとまっています。

まず大前提としてサブスクリプションなので2回目以降の支払いについてはユーザーのアクションベースではなくStripe側に設定された支払いサイクルベースで決済が行われます。

2回目以降の決済で残高不足などで決済に失敗するケースもあるので基本的にはwebhookで支払い失敗を受け取ってメールなりプッシュ通知なりでユーザーに通知する形になるかと思います。

Stripe側で決済成功時・失敗時のメール送信するしくみもあります。 https://stripe.com/docs/billing/subscriptions/overview#emails

ユーザへの成功・失敗の通知方法としては webhook と関係なく、StripeからAPIでSubscriptionの状態を取得して画面上に表示させるのも一つの方法かと思います。

Subscriptionの状態はstatusで取得可能ですが、
https://stripe.com/docs/api/subscriptions/object#subscription_object-status

それぞれの決済失敗理由についてはInvoiceかPaymentの方に入っていたような気がします。

カードの有効期限切れの場合など登録できないカードの場合は

php

1\Stripe\Customer::create

の時点でエラーになったかと思います。(カード情報と一緒に顧客情報を登録する場合)

トライアル無しでSubscriptionを登録する場合に残高不足であれば

php

1\Stripe\Subscription::create

のタイミングでエラーを吐いたような気がしますが(記憶が曖昧ですいません)、トライアル期間を設ける場合にはトライアル終了後に決済されるのでエラーにはなりません。

初回決済時に確実に与信枠を確保したいのであればオーソリーを使って決済できるかどうかを判定する方法も検討してみるといいかと思います。(オーソリーのチャージをキャンセルしてSubscription1回目のチャージを有効にするのか、オーソリーのチャージを有効にしてSubscription1回目のチャージを取り消すのかの手間が発生しそうですが)
参考)
https://tech.kitchhike.com/entry/stripe-authorization

投稿2020/06/26 09:45

neeton

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HS1111

2020/06/26 23:51

有り難う御座います。 まさしくオーソリーが使えそうです。 弊社問題は、初回決済時(Subscription::create)にエラー判定が出来ずに、該当ユーザーをアクティベートした後に、charge.failedのwebhookが飛んできて、事後対応で人的オペレーションが発生していた点です。 実際のstripeダッシュボードのログでは、 1.定期支払いの作成リクエストが完了しました 2020/06/23 14:33:57 200 OK 2.新規支払い pi_aaaaaaaaaaaaaaa (¥2,200) が作成されました 2020/06/23 14:33:57 3.ch_bbbbbbbbbbbbb の ¥2,200 の支払いは失敗しました 2020/06/23 14:34:00 となっており、1.定期支払のレスポンスでエラーをトラップしたかったのですが、3.でしか失敗が判定 出来なかった事に起因してました。 手順0.でオーソリーを追加して対応できそうです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問