Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails以外の開発一般

Stripe のテスト環境でメールが飛ばずに困った

背景

入退くん では、Charges API を使って利用料金の請求を行っていました。
しかし、Stripe はCharges APIからPayment Intents APIへの移行を推奨しているようですし、決済失敗時に手動で請求書を送るという運用をやめて、Stripe の支払いページで支払いのやり直しができるようにしたいという要望があったので、別のAPIへ移行することとしました。
当初はSubscriptions API の利用を考えていたのですが、入退くんは「後払い」なので、どちらかと言うと「前払い」と相性の良いサブスクリプションと比べるとインボイスの方が実装が少なく済みそうだったので、Invoice API を採用することになりました。

Invoice API に移行するにあたり問題になったのが、顧客へ送られるメールがどう変わるかでした。
請求書のフォーマットが変わる前に、顧客向けにアナウンスをしておきたかったのです。
確認のためテスト環境でメールを送ってみようとしたところ思わぬ苦労をしたので、次の機会に備えて経緯をまとめました。
なお、これは2024年6月から8月にかけてのやりとりの記録であり、今の状況とは違っているかもしれません。
その点をご理解いただきながらお読みいただけるとありがたいです。

確認したいメール

Invoice API では、以下のタイミングで顧客へメールが送信されます。

  • 支払いが失敗した場合。
  • Stripe による請求書の確定後。
  • 請求書の支払い後に領収書を送付する場合。
  • 支払いに 3D セキュアが必要な場合。
  • 登録されているカードの有効期限が近づいている場合。
  • 1 回限りの請求書が支払われていない場合。
  • Invoicing Plus
  • クレジットノートが作成された場合。
  • 返金が行われた場合。
  • サブスクリプションのトライアル期間が間もなく終了する場合。
  • サブスクリプションのキャンセルが行われた場合。
    Customer Emailsより

今回、この中で確認したかったのは「請求書の支払い後に領収書を送付する場合」です。
他にも「支払いに 3D セキュアが必要な場合」と「支払いが失敗した場合」の2つは、テスト環境でテストできるなら特に嬉しいですよね。
本番環境で、毎回3Dセキュアの追加認証を求められるカードを用意するのは大変ですし、決済が失敗するカード(限度額が少ないバーチャルカードなど)を用意するのも多少手間がかかります。

テスト環境でも確認できるはず

Stripe のテスト環境では、制限こそありますがメール送信のテストも可能です。
Customer のメールアドレスに自分(Stripe アカウント)のアドレスを登録しておけば、メールが届くようです。
試しに「インボイス」を作って、ダッシュボードから [請求書を送信]してみます。

「テストの請求書を送付」できました。
メールも無事送信されています。
支払いページのリンクと請求書のPDFが添付されていました。

これで確認完了としたいところなのですが、入退くんでは「請求書の送付」だけではなく 「デフォルトの支払い方法に自動請求(charge_automatically)」でも請求しています。
「デフォルトの支払い方法に自動請求」の場合は、請求書だけでなく領収書も送られるはずです。
アナウンスの中では「次回から請求書と領収書がメールで送られます!」とはっきり書いておきたいので、こちらもテストして確認しておきたいですね。
ダッシュボードでは、[顧客に請求]ボタンを押すと「デフォルトの支払い方法に自動請求」となるようです。
押してみます。

……届かないですね。

何故届かないのか気になりますが、先に「支払いに 3D セキュアが必要な場合」と「支払いが失敗した場合」のテストをしてみます。
これらは支払いが無いと起こらないイベントのはずなので、「デフォルトの支払い方法に自動請求」でテストするしか無いはず。
これも届かないなら何かがおかしい。

テストカードから、それぞれのカードを選んで試してみます。

「3DS が必須」のカードを登録した場合

決済は失敗しました。
ダッシュボードには[リトライ]というラベルが付きます。
メールは届きませんでした。

「関連付けた後の支払い拒否」のカードを登録した場合

決済は失敗、ダッシュボード上も[失敗]というラベルが付いています。
こちらは「支払いが失敗しました」というメールが届きました。(※ Billingの設定に依存します。)
問い合わせ当時は、「関連付けた後の支払い拒否」の場合もメールは届きませんでした。

サポートに聞いてみた

何故メールが飛ばないのかよくわからないので、Stripe のサポートに問い合わせました。

Q1. デフォルトの支払い方法に自動請求(charge_automatically) した際に、請求書と領収書がメールで送られてこないのは何故ですか?

A1. インボイスが確定と同時に支払われたため、"auto_advance"属性の値が"true"から"false"になり、請求書が送信されなくなりました。
“auto_advance”の設定がすでにオフ(値が"false")になっている場合、Stripe は請求書を送信できない仕様でございます。

設定 > Billing > 顧客に送信済みの請求書の管理

「確定済みのインボイスとクレジットノートを顧客に送信」設定により、支払済みの請求書でも自動的にメールにて顧客に送信されることができます。

Q2-1. 「支払いに 3D セキュアが必要な場合。」もメールが来ないのですが、何故ですか?

A2-1. “charge_automatically”の請求書に対して3Dセキュア認証が発生した場合

設定 > Billing > 確認を必要とする支払いの管理

「必要に応じて顧客が支払いを確定できるように、Stripe が提供するリンクを送信する」設定が有効化されている状態であれば、本番環境では顧客に3Dセキュア認証の対応に関する通知メールが送られます。

設定を確認してみる

「確定済みのインボイスとクレジットノートを顧客に送信」

「必要に応じて顧客が支払いを確定できるように、Stripe が提供するリンクを送信する」

両方有効になっていますね。

サポートの方とやりとりした後で気付いたのですが、「支払いが失敗した場合。」にメールを受け取るには

設定 > Billing > 失敗したサブスクリプションの支払いの管理

「カード支払いが失敗した場合にメールを送信」を有効にする必要があるようです。

サブスクリプションの設定に見えますが、インボイスの支払いが失敗した場合にも影響しています。
この設定を有効にすることで、テスト環境でも「関連付けた後の支払い拒否」のカードでは決済失敗のメールが届くようになりました。

設定には問題無さそうです。
しかし、テスト環境では「デフォルトの支払い方法に自動請求」が成功して「請求書の支払い後に領収書を送付する場合。」と、「支払いに 3D セキュアが必要な場合。」のメールは確認できませんでした。

サポートに再確認

改めて質問してみました。

Q2-2. ここにはテスト環境でもメールが送られると書いてありますが、送信されないメールもあるのでしょうか?

A2-2. ご提示のページにも「メールで請求書や領収書を確認したい場合は、Customer オブジェクトにチームのメールアドレスを設定するか、PaymentIntent に receipt_email 属性を設定してください。」のように説明されておりますが、テスト環境ではメール請求書と領収書のみが貴社アカウントのチームメンバーのメールアドレスに送信されます。
通知メールの送信仕様のテストができず、ご不便をおかけして大変恐れ入りますが、何卒ご理解をいただきますと幸いです。

テストできないそうです、ちょっと困りましたね。

どうやってテストすれば良い?

実際の取引を伴わない決済を本番環境でテストすることは、規約違反になる可能性が高いようです。
テスト環境ではテストできず、本番環境でもテストができない。
「支払いに 3D セキュアが必要な場合。」は実際の取引で認証を求められるケースが現れるまで待つしかないのでしょうか。
ちょっと怖いような気もしますが、仕方ないですかね。
移行後の決済では未だ、3Dセキュアが要求された取引は無いのでプログラム側が正常に動作するかはわかりません。(怖い)

結論?

Stripe のテスト環境では、メール送信テストは十分にできませんでした。
「デフォルトの支払い方法に自動請求」が成功した場合にどんなメールについては実際の決済で確認できましたが、「支払いに 3D セキュアが必要な場合。」は未だ確認できていません。
ちなみに、支払い成功時は「請求書」と「領収書」両方のPDFが添付された「領収書メール」が届きました。
成功時のメールは期待通りのものですね。
サポートの方には、テスト環境でメールのテストをしたいという要望を伝えたので、テスト環境が改善されるのを楽しみにまっています。



CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。