Веб-хук Stripe Checkout — какое событие прослушивать

Фон:

Я реализовал Полоса в приложении React и вебхук, который успешно прослушивает события.

Вот события, которые вебхук слышит после успешной проверки:

checkout.session.completed
charge.succeeded
payment_method.attached
customer.created
customer.updated
invoice.created
invoice.finalized
customer.subscription.created
invoice.updated
customer.subscription.updated
invoice.paid
invoice.payment_succeeded
payment_intent.succeeded
payment_intent.created

Что я пытаюсь сделать:

Мне нужно сохранить значение в базе данных после того, как клиент успешно создаст подписку. Это значение помогает включить платные функции, поэтому я должен быть уверен, что веб-перехватчик перехватывает все успешные события.


Вопрос:

Могу ли я постоянно полагаться только на одно из этих событий веб-перехватчика, чтобы указать на успех? Если нет, то какие из них важнее всего слушать?

Я думаю, что наиболее важными событиями для моего варианта использования, вероятно, являются checkout.session.completed, charge.succeeded и payment_intent.succeeded, но я не слишком уверен в том, чем они отличаются и могут ли/когда некоторые из них не появиться.

документы указывает:

There are three ways to accept payments on Stripe today:

  • Stripe Checkout
  • Charges API
  • Payment Intents API

и:

  • checkout.session.completed: Occurs when a Checkout Session has been successfully completed.
  • charge.succeeded: Occurs whenever a charge is successful.
  • payment_intent.succeeded: Occurs when a PaymentIntent has successfully completed payment.

Итак, я предполагаю, что каждый из checkout.session.completed, charge.succeeded и payment_intent.succeeded указывает на успех, и причина, по которой все три возвращаются, заключается в том, что они соответствуют трем способам приема платежей в Stripe в настоящее время.

Если это так, могу ли я надежно слушать только checkout.session.completed, чтобы указать на успех?


Другая информация:

stripe listen --forward-to localhost:4242/myWebHook вывод после успешной сессии Checkout:

(фактические значения evt_ заменены для простоты)

2022-05-08   --> checkout.session.completed [evt_123456]
2022-05-08   --> charge.succeeded [evt_123456]
2022-05-08   --> payment_method.attached [evt_123456]
2022-05-08   --> customer.created [evt_123456]
2022-05-08   --> customer.updated [evt_123456]
2022-05-08   --> invoice.created [evt_123456]
2022-05-08   --> invoice.finalized [evt_123456]
2022-05-08   --> customer.subscription.created [evt_123456]
2022-05-08   --> invoice.updated [evt_123456]
2022-05-08   --> customer.subscription.updated [evt_123456]
2022-05-08   --> invoice.paid [evt_123456]
2022-05-08   <--  [200] POST http://localhost:4242/myWebHook [evt_123456]
2022-05-08   <--  [200] POST http://localhost:4242/myWebHook  [evt_123456]
2022-05-08   <--  [200] POST http://localhost:4242/myWebHook  [evt_123456]
2022-05-08   <--  [200] POST http://localhost:4242/myWebHook  [evt_123456]
2022-05-08   <--  [200] POST http://localhost:4242/myWebHook  [evt_123456]
2022-05-08   <--  [200] POST http://localhost:4242/myWebHook  [evt_123456]
2022-05-08   --> invoice.payment_succeeded [evt_123456]
2022-05-08   <--  [200] POST http://localhost:4242/myWebHook  [evt_123456]
2022-05-08   <--  [200] POST http://localhost:4242/myWebHook  [evt_123456]
2022-05-08   <--  [200] POST http://localhost:4242/myWebHook  [evt_123456]
2022-05-08   <--  [200] POST http://localhost:4242/myWebHook  [evt_123456]
2022-05-08   <--  [200] POST http://localhost:4242/myWebHook  [evt_123456]
2022-05-08   <--  [200] POST http://localhost:4242/myWebHook  [evt_123456]
2022-05-08   --> payment_intent.succeeded [evt_123456]
2022-05-08   <--  [200] POST http://localhost:3000/myWebHook  [evt_123456]
2022-05-08   --> payment_intent.created [evt_123456]
2022-05-08   <--  [200] POST http://localhost:3000/myWebHook  [evt_123456]
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

События, которые большинство пользователей обычно прослушивают для успешного создания подписки:

Нет единого правильного ответа, потому что какое событие вы хотели бы прослушать, будет зависеть от множества факторов, например.

  • если событие, которое вы слушаете, содержит необходимую вам информацию
  • для checkout.session.completed, если вы принимаете только карточные платежи (без асинхронных способов оплаты), то да, вы можете полагаться на checkout.session.completed для сохранения значения в базе данных после того, как клиент успешно создаст подписку. Однако, если вы также принимаете асинхронные способы оплаты, вам следует прослушивать и обрабатывать дополнительные события, перечисленные здесь: https://stripe.com/docs/payments/checkout/fulfill-orders#delayed-notification.
  • Некоторые пользователи хотят сохранять все оплаченные счета (в том числе за продление подписки) в свою базу данных. В этом случае может иметь смысл прослушивать событие invoice.paid.

Есть причины не использовать charge.succeeded или payment_intent.succeeded:

  • Если сумма счета = 0, т.е. пробы, не будет создано PaymentIntent/Charge.
  • Если вы пометите счет как оплаченный вне очереди, то PaymentIntent будет отменен, и вы никогда не получите эти два события.

Я бы посоветовал прочитать https://stripe.com/docs/billing/subscriptions/обзор, чтобы лучше понять, как работают подписки.

Другие вопросы по теме