はじめに
この記事は G's ACADEMY Advent Calendar 2024 3日目の記事です(予定)。
書いている人はLAB7卒、現在G's ACADEMY FUKUOKAにお世話になっている棚という者です。
記事の要約
- Stripeの決済処理について、2025年1月15日から3Dセキュア認証が段階的に適用されるよ
-
2025年3月末までに3Dセキュア導入が義務付けられているので、何もしないと止まるよ(参考:
ECサイトへの導入が義務化!3Dセキュア2.0(本人認証)とは?) - 嘘、私のアプリ止まっちゃう……???この記事はそんなあなたのための記事です(ただしLaravel Cashier利用前提)。
経緯
2024年11月中旬ごろ、Stripeから以下のようなメールが届きました。
へぇ3Dセキュア導入が必須になるんだなぁ……えっアプリ側の改修が必要になるの?1月15日まで?冬季休暇前までには終わらせないとダメなやつでしょこれ!?と慌てて対策したのが現在です。
対策方法
Laravel Cashierを導入している場合は対策は容易です。
以下のようにchargeメソッドで決済を行っている部分があるとします。
$charge = $user->charge(
$price,
$paymentMethodId, [
"description" => $description,
"currency" => $currency,
]);
これを次のように書き換えてあげればよろしい訳です。
try {
$charge = $user->charge(
$price,
$paymentMethodId, [
"description" => $description,
"currency" => $currency,
]);
} catch (IncompletePayment $exception) {
return redirect()->route(
'cashier.payment',
[$exception->payment->id, 'redirect' => route('home')]
);
}
これは公式ドキュメントのHandling Failed Paymentsの項目を読んでいただくと分かるのですが、要は決済中にIncompletePayment例外(=不完全な支払いの例外)が発生した場合、Cashierが用意した専用の支払い確認ページに飛ばすという処理の追加を行っています。
この専用支払い確認ページでは別途3Dセキュア認証確認のための追加アクションを実行することができ、こちらが完了すると無事決済が通ります。
穏やかなテスト
上記を組み込んだ後、Stripeの方で3Dセキュア認証テストのために用意している番号4000000000003220
を利用し、一連の決済フローを流してみましょう。Stripe管理画面で決済が完了したか確認できれば、ひとまずの対応は済んだと言えるでしょう。
よかった、これで解決ですね……
よくないわよ
実はこれだけだとダメです。
実装すればわかるのですが、「Cashierが用意した専用の支払い確認ページ」というのが曲者で、全て英語です。
また決済に成功しようが中断しようがトップページに飛ぶという処理なのでUI的には最悪、お客さんから大量の苦情が寄せられることでしょう。
次回はその辺りの解消方法を書きたいと思います。このAdvent Calendarの枠が残っていれば……