Laravel Cashier Stripe устанавливает capture_method в ручное управление

#php #laravel #stripe-payments #laravel-cashier

#php #laravel #stripe-платежи #laravel-кассир

Вопрос:

https://stripe.com/docs/payments/capture-later

В документации stripe выше говорится, что если вы хотите зафиксировать удержание платежа, установите capture_method на manual, а затем, когда вы будете готовы завершить начисление, отправьте запрос на захват с окончательной суммой.

Я не вижу никакой документации в реализации laravel cashier о том, как это сделать.

однако, когда я смотрю в код, я вижу, что могу передавать параметры, которые объединяются, и я мог бы установить это, я надеюсь?

 trait Billable
{
    /**
     * Make a "one off" charge on the customer for the given amount.
     *
     * @param  int  $amount
     * @param  string  $paymentMethod
     * @param  array  $options
     * @return LaravelCashierPayment
     *
     * @throws LaravelCashierExceptionsPaymentActionRequired
     * @throws LaravelCashierExceptionsPaymentFailure
     */
    public function charge($amount, $paymentMethod, array $options = [])
    {
        $options = array_merge([
            'confirmation_method' => 'automatic',
            'confirm' => true,
            'currency' => $this->preferredCurrency(),
        ], $options);

        $options['amount'] = $amount;
        $options['payment_method'] = $paymentMethod;

        if ($this->stripe_id) {
            $options['customer'] = $this->stripe_id;
        }

        $payment = new Payment(
            StripePaymentIntent::create($options, $this->stripeOptions())
        );

        $payment->validate();

        return $payment;
    }

...

    /**
     * Create a new SetupIntent instance.
     *
     * @param  array  $options
     * @return StripeSetupIntent
     */
    public function createSetupIntent(array $options = [])
    {
        return StripeSetupIntent::create(
            $options, $this->stripeOptions()
        );
    }

 

но, похоже, это устанавливает payment_method, а не capture_method … Я чувствую, что это вызвало бы проблемы, если бы оба были установлены.

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

Кто-нибудь это делал? Скорее, кто-нибудь, читающий это, сделал это сам? и если да, то правильное ли это решение?

Ответ №1:

Хотя Laravel Cashier отлично подходит для запуска модели на основе подписки для вашего приложения, я всегда считал SDK Stripe более полезным, интуитивно понятным и простым в использовании. Их документация потрясающая, я бы предложил использовать сам SDK.

Учитывая это, вы можете продолжать использовать Cashier для всего остального, и для этого конкретного сценария вы можете использовать SDK. Для вашего случая вам нужно будет создать PaymentIntent и, как вы сказали, установить для capture_method значение manual.

Вот пример использования Stripe SDK (если вы используете Cashier, у вас уже есть пакет):

 $stripe = new StripeStripeClient(
  'YOUR_SECRET_KEY'
);

$stripe->paymentIntents->create([
  'amount' => 2000,
  'currency' => 'usd',
  'payment_method_types' => ['card'],
  'capture_method' => 'manual'
]);