Как я могу использовать веб-перехватчик Stripe для платежного намерения по подписке, если у меня тоже есть разовые платежи?
Я использую Stripes PHP SDK в приложении с подпиской и единовременной оплатой.
Я отслеживаю следующие события через веб-перехватчик:
// Handle the event
switch ($event->type) {
// Fired for every payment, including subscriptions and one-offs
case 'payment_intent.succeeded':
$payment = $event->data->object;
$this->handleOneOffPaymentSuccess($payment);
break;
// When a one-off payment fails
case 'charge.failed':
$payment = $event->data->object;
$this->handleOneOffPaymentFailed($payment);
break;
case 'payment_intent.payment_failed':
$payment = $event->data->object;
$this->handleOneOffPaymentFailed($payment, 'The payment was not authorized (#Virtuoso-3)');
break;
// Subscription handling
case 'invoice.payment_succeeded':
$payment = $event->data->object;
$this->handleSubscriptionPaymentSuccess($payment);
break;
// Subscription failure
case 'invoice.payment_failed':
$payment = $event->data->object;
$this->handleSubscriptionPaymentFailed($payment);
break;
// ... handle other event types
default:
// Unexpected event type
http_response_code(400);
exit();
}
Когда производится разовый платеж, я получаю payment_intent.succeeded
. Это мои данные метаполя, поэтому я могу отметить товар как купленный. Все хорошо.
Когда я оформляю подписку, я получаю invoice.payment_succeeded
событие. Это мои данные метаполя, поэтому я могу отметить подписку как платную. Тоже все хорошо.
Однако вместе с подпиской я получаю payment_intent.succeeded
событие. Я предполагаю, что это потому, что взяли заряд. Я согласен с этим, но он не содержит никаких данных метаполя с момента создания подписки, поэтому у меня нет возможности отслеживать, для чего это нужно. На данный момент это просто не удается, и это кажется неправильным.
Вот как я создаю подписку:
$subscription = \Stripe\Subscription::create([
'customer' => $payment_method->stripe_customer_id,
'items' => [
[
'plan' => App::environment('production') ? $user->userType->stripe_plan : $user->userType->stripe_plan_test,
],
],
'expand' => ['latest_invoice.payment_intent'],
'metadata' => [
'internal_subscription_id' => $internalSubscription->id,
'user_id' => $user_id,
]
]);
В идеале я бы хотел этого user_id
чтобы быть частью обвинения, тогда я могу просто зарегистрировать его против пользователя и показать ему вместе с их разовыми обвинениями.
Есть идеи, где я ошибаюсь?
1 ответ
У вас есть несколько вариантов:
- Проверить
invoice
Атрибут объекта платежного намерения. Будет установлен идентификатор счета-фактуры, если он связан с оплатой подписки, и нулевым для ваших одноразовых платежей. Примечание: если вы также используете разовые счета-фактуры, вам также необходимо учесть это различие (получите счет-фактуру и проверьтеsubscription
атрибут). - Установите некоторые
metadata
о ваших намерениях разового платежа. Например, установите'metadata' => [ 'onetime' => 'true']
и проверьте это в своем обработчике событий.