2016-11-23 26 views
2

3回の支払いが失敗した後に自動的にストライプサブスクリプションがキャンセルされ、キャンセルされたサブスクリプションを記録するcustomer.subscription.deleted webhookがあります。サブスクリプションが自動的にキャンセルされるかどうかを検出する

支払い拒否の理由でストライプでサブスクリプションがキャンセルされた場合や、ストライプダッシュボードで手動でキャンセルされた場合や、アプリケーションからのAPIリクエストによりキャンセルされた場合、customer.subscription.deleted webhookで検出する方法はありますか?

答えて

3

ダッシュボード自体がAPIを使用するため、最後の2つのケースを区別することはできません。

ただし、自動キャンセルと手動キャンセルを区別できます。 customer.subscription.deletedイベントの本文のrequest属性を見てください。

支払いが多すぎると購読が自動的にキャンセルされた場合は、requestにはNULL値が設定されます。

また、APIまたはダッシュボードでサブスクリプションがキャンセルされた場合、requestはnull以外の値を持ちます。つまり、subscription cancelation requestのリクエストID("req_...")です。

EDIT:ヨニRabinovitchが指摘したように(falseがデフォルト値であるとして、あるいは全くat_period_endパラメータ)サブスクリプションがat_period_end=falseでキャンセルされた場合、上記が真です。

サブスクリプションがat_period_end=trueでキャンセルされた場合は、その後、customer.subscription.updatedイベントは、(サブスクリプションのcancel_at_period_end属性は今、真であるという事実を反映するために)すぐに解雇されるだろう、とそのイベントのrequestは、サブスクリプションの取り消し要求の要求IDを持っているでしょう。

ただし、請求期間の終了時にサブスクリプションが実際にキャンセルされたときに送信されるcustomer.subscription.deletedイベントは、支払いが失敗したあとの自動キャンセルの場合と同じようにrequest=nullになります。

+0

素晴らしい!ありがとうございます。 "要求"属性は私の仕事を完了させるでしょう。ありがとう。 – user3204760

+0

私は、cancel_at_period_endがサブスクリプションでtrueに設定されているため、サブスクリプションがその期間の終わりに自動的に取り消された場合、customer.subscription.deletedイベントのrequest属性がnullであることがわかります。したがって、「要求」属性をチェックするだけでは、支払いが失敗したためにサブスクリプションがキャンセルされたと判断できないようです。 –

+0

@YoniRabinovitchあなたは間違いなしです。私はこの場合に何が起こるかを指定するために私の答えを編集しました。 – Ywain

0

請求期間の終了時にサブスクリプションをキャンセルすると、customer.subscription.updatedイベントがすぐにトリガーされます。そのイベントは、サブスクリプションcancel_at_period_endの値が変更されたことを反映しています。期間終了時にサブスクリプションが実際にキャンセルされると、customer.subcription.deletedイベントが発生します。

関連する問題