Невозможно отправить токен в Stripe с помощью Laravel

#javascript #php #laravel #stripe-payments

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

Вопрос:

Ошибка, которую я получаю, когда пытаюсь оформить заказ после ввода данных карты:

Недопустимый исходный объект: должен быть словарем или непустой строкой. Смотрите Документы API по адресу https://stripe.com/docs ‘

Здесь я беру всю информацию о карте:

 <form method="post" action="{{route('checkout')}}" enctype="multipart/form-data" id="checkout-form">
@csrf
<div class="col-sm-3">
   <div class="form-group">
       <label>Card Number*</label>
            <input type="text" class="form-control" name="card-number" id="card-number" placeholder="4111 1111 1111 1111"> </div>
</div>
<div class="col-sm-3">
      <div class="form-group">
           <label>Card CVC*</label>
               <input type="text" class="form-control" name="card-cvc" id="card-cvc" placeholder="111"> </div>
</div>
<div class="col-sm-3">
     <div class="form-group">
          <label>Card Expiry Month*</label>
               <input type="text" class="form-control" name="card-month" id="card-month" placeholder="12"> </div>
 </div>
 <div class="col-sm-3">
      <div class="form-group">
           <label>Card Expiry Year*</label>
           <input type="text" class="form-control" name="card-expiry-year" id="card-expiry-year" placeholder="2020"> </div>
 </div>
 <div class="col-sm-6">
      <div class="form-group">
           <label>Card Name*</label>
           <input type="text" class="form-control" name="card-name" id="card-name" placeholder="John"> </div>
 </div>
</form>
 

Я отправляю токен через скрипт:

 <script>
var stripe = Stripe('test_key');

var $form = $('#checkout-form');

$form.submit(function (event) {
    $('charge-error').addClass('hidden');
    $form.find('button').prop('disabled' , true);
    Stripe.card.createToken({
        number: $('.card-number').val(),
        cvc: $('.card-cvc').val(),
        exp_month: $('.card-expiry-month').val(),
        exp_year: $('.card-expiry-year').val(),
        name: $('.card-name').val(),

    }, stripeResponseHandler);
    return false;
});

function stripeResponseHandler(status, response) {

    var $form = $('#checkout-form');

    if (response.error){
        $('.charge-error').removeClass('hidden');
        $('.charge-error').text(response.error.message);
        $form.find('button').prop('disabled', false);
    } else {
        var token = response.id;
        $form.append($('<input type="hidden" name="stripeToken" />').val(token));

        //Submit the form:
        $form.get(0).submit();
    }
}
 

и это функция контроллера:

 $stripe = new StripeStripeClient('secret_test_key');
    try {
        $charge = $stripe->charges->create([
                "amount" => 6800,
                "currency" => "usd",
                "source" => $request->input('stripeToken'),
                "description" => "Charge for test@expamle.com"
            ]
        );
    } catch (Exception $e) {
        return redirect()->route('checkout')->with('error', $e->getMessage());
    }
 

Если заменить «source» => $request-> input(‘stripeToken’) на «source» => «visa», то код работает нормально.

Почему я получаю эту ошибку? Пожалуйста, помогите.

Комментарии:

1. я думаю, что stripe v3 обновлен, теперь вы должны использовать так laravel.com/docs/8.x/billing#payment-methods

Ответ №1:

Если вы используете Stripe.js v2 вам нужно установить публикуемый ключ следующим образом:

 Stripe.setPublishableKey('pk_test_xxx');
 

не то, что вы сейчас делаете:

 var stripe = Stripe('test_key');
 

(см https://stripe.com/docs/stripe-js/v2#setting-publishable-key )

Комментарии:

1. Я использовал Stripe.setpublishable_key, но в консоли появляется ошибка, что это не функция.

2. Ах, тогда вы, должно быть, уже используете v3. Затем вам нужно изменить Stripe.card.createToken , чтобы использовать версию v3 ( stripe.com/docs/js/tokens_sources/create_token?type=cardElement ). Здесь есть руководство по миграции: stripe.com/docs/stripe-js/elements /…

Ответ №2:

В строке, где у вас есть "source" => $request->input('stripeToken') , попробуйте распечатать этот ввод перед выполнением зарядки, чтобы увидеть, действительно ли значение существует или находится в допустимом формате. Если значение отсутствует, убедитесь, что переменная, которую вы назвали token, назначенная скрытому полю, на самом деле имеет правильное значение.

Комментарии:

1. Я попытался напечатать эту переменную, и она пуста. Я не знаю, в чем ошибка.

2. Да. Я знал, что он должен быть пустым, так что это проблема, с которой связана stripe. Теперь проверьте, действительно ли значение, которое вы передаете скрытому полю в скрипте js, является правильным.

3. Я попытался распечатать токен var в консоли с помощью скрипта. но он ничего не показывает. Response.id это не работает.