購入完了時の処理の実装
購入が完了した時に実行したい処理があります。例えば、ポイントを付与したり、メールの送信などが考えられます。これをどこで実装するか悩みました。最初の選択肢は主に2つありました。
- Checkoutセッション完了時にsuccess_urlで指定したリダイレクト先で同期的に処理をする。
- checkout.session.completedを受け取り処理をする。
1の場合は同期的に処理できるので良いかと思ったのですが、ユーザーがリダイレクト完了前にCheckoutページやブラウザを閉じた場合に、決済完了したにも関わらずリダイレクト後の処理が実行されない可能性が考えられます。そのため、webhookを受け取って処理を実行するやり方が良いそうです。
Checkoutセッション完了後に決済失敗することはあるか?
Checkoutセッションが完了するとsuccess_urlにリダイレクトされますが、その場合でも何かしらの理由で決済が失敗し売上回収できないことはあるのでしょうか?結論としては、支払いが失敗することはないとのことでした。
checkout.session.completed
顧客が支払いを完了したときは、checkout.session.completed
のwebhookを受け取りますがこれは必ずしも決済が完了していることを表しません。例えば、銀行振込の場合は数日後に入金が確認されるかもしれません。
webhook失敗時のリトライ
正常に処理されなかったwebhookは、最大3日間リトライされます。(本番モード)テストモードでは、3回リトライされます。
※ 決済周りの実装は重大なバグを生むことも考えられますので自己責任でお願いいたします。