我已经按照Laravel收银员文档在订阅系统中实现了SCA,
try {
$subscription = $user->newSubscription('default', $planId)
->create($paymentMethod);
} catch (IncompletePayment $exception) {
return redirect()->route(
'cashier.payment',
[$exception->payment->id, 'redirect' => route('home')]
);
}
因此,一旦我的用户输入了姓名和卡的详细信息,如果卡需要双重身份验证,则会弹出一个模式对话框,您必须完成双重身份验证,这会将您重定向到laravel收银员的付款。再次输入姓名和卡详细信息,但是这次用户可以输入其他卡详细信息,所以我的问题是
这种行为对吗?
是否仍然要检查卡是否不同并向客户端显示错误?我尝试过发送一个ajax呼叫来检查卡的详细信息,然后再发送至数据条,但是CSRF令牌不匹配,现在我正在测试,但是在payment.blade.php中,csrf meta为空,我还不知道为什么。 这是Payment.blade中原始的确认付款功能
confirmPayment: function () {
var self = this;
this.paymentProcessing = true;
this.paymentProcessed = false;
this.successMessage = '';
this.errorMessage = '';
stripe.handleCardPayment(
'{{ $payment->clientSecret() }}', this.cardElement, {
payment_method_data: {
billing_details: {name: this.name}
}
}
).then(function (result) {
self.paymentProcessing = false;
if (result.error) {
if (result.error.code === 'parameter_invalid_empty' &&
result.error.param === 'payment_method_data[billing_details][name]') {
self.errorMessage = '{{ __('Please provide your name.') }}';
} else {
self.errorMessage = result.error.message;
}
} else {
self.paymentProcessed = true;
self.successMessage = '{{ __('The payment was successful.') }}';
}
});
}
所以我想做的是在handleCardPayment之前,进行make和ajax调用以检查付款,如下所示:
confirmPayment: function () {
var self = this;
$.ajax({
url: "{{ route('subscriptions.checkPaymentDetails') }}",
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
type: 'post',
dataType: "JSON",
data: {payment: "{{$payment->clientSecret()}}"},
success: function (data) {
},
error: function error(data) {
}
});
但是,尽管我在application.blade.php的标头中加载了我的代码,但pay.blade中的csrf令牌为空
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
或者至少在新卡详细信息有效的情况下,将其标记为新的默认付款方式,否则,下一次我们必须向该客户付款时,我们将不会使用同一张卡。
谢谢!