#stripe-payments #webhooks
#stripe-платежи #webhooks
Вопрос:
-
Мой клиент впервые присоединяется к нашему тарифному плану подписки, я создаю транзакцию (называемую START-transaction) и использую Stripe API для создания новой подписки и сохранения возврата объекта подписки в рамках вышеуказанной транзакции.
-
Я также использую webhook для отслеживания событий Stripe. Моя главная цель — обрабатывать повторяющиеся платежи (отправлять уведомления об успешном или неудачном списании и что-то для взаимодействия с клиентом). Я перехватываю событие invoice.payment_succeeded, чтобы определить, что это повторный платеж. Я тоже создаю транзакцию (повторный вызов) и, естественно, сохраняю объект события в транзакции. (основываясь на информации о подписке в event invoice.payment_succceeded, я нахожу транзакцию relative-START и создаю новую транзакцию до тех пор, пока она не ПОВТОРИТСЯ)
И проблема проявляется в том, что при первом создании плана клиентом в моей системе было вызвано 6 событий: customer.created; charge.successful; invoice.created; invoice.payment_succeeded; customer.card.created; customer.subscription.created. Итак, у моего клиента есть 2 транзакции: 1-ЗАПУСК и 1-ПОВТОРЕНИЕ в первый раз.
Вы предлагаете мне какую-либо идею по удалению ПОВТОРНОЙ транзакции?
Спасибо.
Ответ №1:
Похоже, вы хотите иметь возможность определить, относится ли полученное вами invoice.payment_succeeded
событие к первому платежу (который вы уже обработали в своей «НАЧАЛЬНОЙ транзакции») или нет (в этом случае вы хотите обработать его в «ПОВТОРНОЙ транзакции»).).
Самый простой способ сделать это — посмотреть на атрибут объекта request
события. Поскольку первый счет-фактура является прямым следствием вашего запроса на создание подписки, первое invoice.payment_succeeded
событие будет иметь ненулевое значение для request
атрибута. Последующие счета создаются Stripe в фоновом режиме, и поэтому события будут иметь нулевое значение для request
атрибута.
Комментарии:
1. Боже, неужели это так просто???? Ты освещаешь мою жизнь, ха-ха. Я тестирую. Спасибо.
2. Рад, что смог помочь! 🙂
3. Это может быть опасно, поскольку
request
атрибут также может быть установлен для повторяющихся событий. Например, если кто-то нажмет кнопку «Оплатить сейчас» на панели инструментов stripe на странице повторяющегося счета, будет установленrequest
атрибут.4. @adipasquale Нажатие кнопки «Оплатить сейчас» — это то же самое, что вызов stripe.com/docs/api#pay_invoice , то есть вы вручную запускаете платеж по счету. В обоих случаях
request
атрибут будет иметь ненулевое значение, поскольку это запрос вручную. Вы можете проверитьrequest
атрибут дляinvoice.created
события, если хотите проверить, был ли счет создан (не оплачен ) в рамках текущей подписки.5. Так, может
billing_reason
лучше всего охватить все случаи?
Ответ №2:
Вы можете использовать запрос Stripe billing_reason
, чтобы определить, является ли это подпиской в первый раз, повторяющимся платежом или обновленным платежом по счету. Смотрите https://stripe.com/docs/api/invoices/object#invoice_object-billing_reason