Laravel Cashier — «У этого клиента нет подключенного источника платежа или способа оплаты по умолчанию».

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

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

Вопрос:

Я использую версию Laravel 5.8 и версию Cashier 10.7.1

Я хочу запустить подписку пользователя и взимать с него ежемесячную плату при регистрации.

Поэтому я пишу в RegisterController.php

 public function register(Request $request)
    {
        $this->validator($request->all())->validate();


        DB::beginTransaction();

        event(new Registered($user = $this->create($request->all())));
        
        try {
            $newSubscription = $user->newSubscription('Standard Plan', 'price_1HJmedAuGtYRVrPxN9PNSPKi')->create($request->payment_method, ['email' => $user->email]);
        } catch ( IncompletePayment $exception ){
            DB::rollback();
            return redirect()->back()->with(['error_message' => $exception->getMessage()]);
        }

        DB::commit();

        $this->guard()->login($user);

        return $this->registered($request, $user)
                        ?: redirect($this->redirectPath());
    }
  

также я добавляю в register.blade.php файл:

 <div class="flex flex-wrap mb-6">
                            <label for="card-element" class="block text-gray-700 text-sm font-bold mb-2">
                                Credit Card Info
                            </label>
                            <div id="card-element" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"></div>
                            <div id="card-errors" class="text-red-400 text-bold mt-2 text-sm font-medium"></div>
                        </div>
  

и:

 <script src="https://js.stripe.com/v3/"></script>

    <script>
        const stripe = Stripe('pk_test_somekeysomekeyasdasd');
        console.log(stripe);
        const elements = stripe.elements();
        const cardElement = elements.create('card');
        cardElement.mount('#card-element');
        const cardHolderName = document.getElementById('name');
        const cardButton = document.getElementById('card-button');
        const clientSecret = cardButton.dataset.secret;
        let validCard = false;
        const cardError = document.getElementById('card-errors');
        cardElement.addEventListener('change', function(event) {
            
            if (event.error) {
                validCard = false;
                cardError.textContent = event.error.message;
            } else {
                validCard = true;
                cardError.textContent = '';
            }
        });
        var form = document.getElementById('signup-form');
        form.addEventListener('submit', async (e) => {
            event.preventDefault();
            const { paymentMethod, error } = await stripe.createPaymentMethod(
                'card', cardElement, {
                    billing_details: { name: cardHolderName.value }
                }
            );
            if (error) {
                // Display "error.message" to the user...
                console.log(error);
            } else {
                // The card has been verified successfully...
                var hiddenInput = document.createElement('input');
                hiddenInput.setAttribute('type', 'hidden');
                hiddenInput.setAttribute('name', 'payment_method');
                hiddenInput.setAttribute('value', paymentMethod.id);
                form.appendChild(hiddenInput);
                // Submit the form
                form.submit();
            }
        });
    
    </script>
  

Когда я пытаюсь зарегистрировать нового пользователя и произвести тестовый платеж, используя реквизиты CC 4242 4242 4242 4242, я получаю сообщение об ошибке:

Stripe Exception InvalidRequestException У этого клиента нет подключенного источника оплаты или способа оплаты по умолчанию.

В чем проблема? Как я могу это исправить?

Ответ №1:

После того, как вы создали способ оплаты, вам необходимо прикрепить его к клиенту:

 $stripe->paymentMethods->attach(
  'pm_123',
  ['customer' => 'cus_abc']
);