Как я могу использовать веб-перехватчик 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 ответ

У вас есть несколько вариантов:

  1. Проверить invoice Атрибут объекта платежного намерения. Будет установлен идентификатор счета-фактуры, если он связан с оплатой подписки, и нулевым для ваших одноразовых платежей. Примечание: если вы также используете разовые счета-фактуры, вам также необходимо учесть это различие (получите счет-фактуру и проверьтеsubscription атрибут).
  2. Установите некоторые metadataо ваших намерениях разового платежа. Например, установите'metadata' => [ 'onetime' => 'true'] и проверьте это в своем обработчике событий.
Другие вопросы по тегам