Laravel проблема с полосой кассира, когда карты 3d secure не перенаправляются на страницу подтверждения - PullRequest
0 голосов
/ 25 мая 2020

Я изо всех сил пытаюсь получить интеграцию Laravel Cashier Strip для работы с картами безопасности 3D. У меня есть go, он настроен, поэтому подписка работает и отображается на моей панели инструментов полосы и все, что попадает в мою локальную базу данных. Но когда я тестирую карты, требующие строгой аутентификации, как 3ds, они получают статус незавершенного на моей панели инструментов.

Я получаю страницу ответа cashier.payment в журнале консоли. но разве Кассир не должен перенаправлять в это окно подтверждения?

Мой код выглядит следующим образом

В моем контроллере подписки у меня есть

public function index() {

    $data = [
        'intent' => auth()->user()->createSetupIntent(),
        // 'plans' => $available_plans
    ];

    return view('artists.subscription')->with($data);
}

public function checkout(Request $request) {
    $user = auth()->user();
    $paymentMethod = $request->payment_method;
    $planId = 'monthly_sub';

    // SCA
    try {
        $subscription = $user->newSubscription('monthly', $planId)->create($paymentMethod);
    } catch (IncompletePayment $exception) {
        return redirect()->route(
            'cashier.payment',
            [$exception->payment->id, 'redirect' => route('front')]
        );        
    }

    // return response(['status' => 'Success']);
}

и в моей полосе js файл У меня есть этот

const stripe = Stripe('stripe_key'); // i have my test key here
const elements = stripe.elements();
const cardElement = elements.create('card',{hidePostalCode: true});
cardElement.mount('#card-element');
const cardHolderName = document.getElementById('card-holder-name');
const cardButton = document.getElementById('card-button');
const clientSecret = cardButton.dataset.secret;

cardButton.addEventListener('click', async (e) => {
    const { setupIntent, error } = await stripe.confirmCardSetup(
        clientSecret, {
            payment_method: {
                card: cardElement,
                billing_details: { name: cardHolderName.value }
            }
        }
    );


    axios.post('checkout', {
      payment_method: setupIntent.payment_method
    }).then(response => { 
      console.log(response.request.responseURL)
   })
   .catch(error => {
     console.log(error.response)
   });

});

Мой вид лезвия -

@extends('layouts.app')

@section('head')
@php 
// dd($intent);
@endphp
<script src="https://js.stripe.com/v3/"></script>
<link href="{{ asset('css/stripe.css') }}" rel="stylesheet">
@endsection

@section('content')

<input id="card-holder-name" type="text">

<!-- Stripe Elements Placeholder -->
<div id="card-element"></div>

<button id="card-button" data-secret="{{ $intent->client_secret }}">
    subscribe
</button>

@endsection

@section('js')

  <script src="{{ asset('js/stripe.js') }}" type="text/javascript"></script>
@endsection

Кажется, все работает, но я просто получаю страницу подтверждения 3ds в качестве ответа в моей консоли. Как мне заставить laravel перенаправить и открыть эту страницу для пользователя?

1 Ответ

0 голосов
/ 25 мая 2020

Я думаю, что проблема заключается в порядке событий, ваш код должен дождаться вызова и завершения 3DS, прежде чем обращаться к вашему коду после того, как результат будет возвращен вам. Используя эту карту регулятора [1], вы сможете проверить это с некоторыми небольшими изменениями, подобными этому (мне пришлось удалить некоторые вещи, но это должна быть ссылка):

stripe.confirmCardSetup(
  "seti_xxx", {
    payment_method: {
      card: card,
      billing_details: { name: "Name" }
    }
  }).then(function(result) {
      // Check the result status here!!

      axios.post('checkout', {
        payment_method: result.setupIntent.payment_method
      }).then(response => { 
        console.log(response.request.responseURL)
      }).catch(error => {
       console.log(error.response)
     });    
    });

Надеюсь, это поможет!

[1] https://stripe.com/docs/testing#regulatory -карточки

...