#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 это не работает.