Как лучше всего обрабатывать новый PaymentIntent в Laravel Cashier?

Если я чего-то не упускаю, я не вижу никакой оболочки Cashier, обеспечивающей создание PaymentIntent, существует ли она?

В то время как Cashier v10 добавил некоторый контент для обработки SCA, он не работает для меня, потому что я обрабатываю платежные данные через элемент font-end, поэтому перенаправление на новый route беспорядочно.

Мне нужно обработать это в соответствии с этим руководством https://stripe.com/docs/payments/payment-intents/migration

Для этого требуется создание PaymentIntent, например:

$intent = \Stripe\PaymentIntent::create([
    'payment_method' => $json_obj->payment_method_id,
    'amount' => 1099,
    'currency' => 'gbp',
    'confirmation_method' => 'manual',
    'confirm' => true,
]);

Я, конечно, могу сделать это прямо из Stripe sdk, как показано здесь, но, учитывая, что я, вероятно, добавлю больше функций, которые, вероятно, будут использовать другие функции Cashier, это сохранит чистоту, чтобы пройти через Cashier для всего.

Могу ли я создать платежное намерение через кассу, или оно было пропущено? Если да, то как? Или мне следует поступить иначе?


person AntG    schedule 20.12.2019    source источник


Ответы (3)


Изучив это дальше, мы пришли к выводу, что

Laravel\Cashier\Billable->charge($amount,$method,$options)

метод делает \Stripe\PaymentIntent::create($options) под прикрытием.

Следует помнить о некоторых вещах:

  • По умолчанию параметры confirmation_method будут установлены на automatic и confirm на true.
  • Будет установлена ​​опция currency и будет использоваться валюта кассира по умолчанию.
  • Параметр amount будет установлен на основе переданного $amount, а параметр payment_method будет установлен на основе переданного $method.
  • Все эти значения могут быть заменены заменами, передав эквивалентное значение в аргументе $options.

И, наконец, если вам требуется SCA (что я сделал), тогда вы должны уловить \Laravel\Cashier\Exceptions\PaymentActionRequired исключение и либо перенаправить на встроенную Cashier страницу для этого, либо обработать его в вашем интерфейсе через ваш запрос API.

person AntG    schedule 30.12.2019

Я не являюсь пользователем кассира, но похоже, что это интерфейс для Stripe Billing, поэтому он в основном обрабатывает примитивы, связанные с биллингом. Насколько я могу судить, он действительно использует PaymentIntents под капотом (для аутентификации платежей по счетам, требующих аутентификации), но не раскрывает создание PaymentIntent напрямую.

В документации по кассе рекомендуется, чтобы ваша интеграция перенаправляла на «страницу оплаты», когда требуется аутентификация: https://laravel.com/docs/5.8/billing#payments-requiring-additional-confirmation (для случаев, когда PaymentIntents находится в состоянии requires_action)

Для непосредственного создания PaymentIntents правильным подходом будет библиотека stripe-php API.

person hmunoz    schedule 20.12.2019
comment
Спасибо за ответ, подход Laravel docs к перенаправлению для меня не работает, потому что я обрабатываю весь процесс через интерфейс с использованием API, поэтому мне нужен подход paymentIntents из документации Stripe. Однако Cashier, похоже, не поддерживает createPaymentIntent, поэтому мой вопрос: есть ли способ сделать это с помощью PaymentIntent? - person AntG; 23.12.2019
comment
С Cashier это не похоже, вместо этого вы можете использовать Stripe-PHP, это позволит вам использовать все ресурсы Stripe, включая создание PaymentIntents: stripe.com/docs/api/payment_intents/create?lang=php - person hmunoz; 23.12.2019

Расширить трейт Laravel \ Cashier \ Billable; и Laravel \ Cashier \ Concerns \ PerformsCharges; и использовать его вместо черты Billable по умолчанию в модели User

<?php

namespace App\Traits\Stripe;

use Laravel\Cashier\Concerns\ManagesCustomer;
use Laravel\Cashier\Concerns\ManagesInvoices;
use Laravel\Cashier\Concerns\ManagesPaymentMethods;
use Laravel\Cashier\Concerns\ManagesSubscriptions;
use App\Traits\Stripe\CustomPerformCharges as PerformsCharges;

trait CustomBillable
{
    use ManagesCustomer;
    use ManagesInvoices;
    use ManagesPaymentMethods;
    use ManagesSubscriptions;
    use PerformsCharges;
}
trait CustomPerformCharges
{
    use PerformsCharges;
  
    public function authorize(int $amount): Payment
    {
        if (!$this->hasStripeId()) {
            throw new BadRequestException(__('User is not a stripe customer'));
        }
        
        $paymentMethod = $this->defaultPaymentMethod();

        $options = [
            'capture_method' => 'manual'
        ];

        return $this->charge($amount, $paymentMethod, $options);
    }


    public function capture(int $amount, string $paymentIntent): void
    {
        $intent = StripePaymentIntent::retrieve($paymentIntent, $this->stripeOptions());
        $intent->capture(['amount_to_capture' => $amount]);
    }
}
person Paolo Vincent    schedule 29.09.2020