javascript - 升級到 stripe.js 版本 3 後,我如何知道 3D Secure 2 認證是否有效
我已經更新了一個網站,使其使用最新的 stripe-php(6.39.0),現在它載入的是 stripe.js 版本 3。我已經對我的代碼做了所有必要的更改,因此我的信用卡欄位現在使用 Stripe Elements 顯示。測試交易運作正常,我也已經更新了正式網站並接受真實付款。
我進行這次更新的原因是因為 Stripe 通知我,我需要升級網站,以便其 Stripe 整合能夠與強化客戶認證(SCA)配合,這在歐盟自 2019 年 9 月起是必要的。
Stripe 有不同的信用卡測試號碼,你可以用來測試在處理付款時會出現的各種情況。這些號碼可以在這裡找到:https://stripe.com/docs/testing#cards
4000000000003220 模擬了一個需要完成 3D Secure 2 認證的交易。但當我使用這個代碼時,Stripe 拒絕了付款並返回訊息:
「您的卡片被拒絕。此交易需要驗證。請檢查您的卡片資料並再試一次。」
這是否意味著 3D Secure 2 正在運作還是沒有運作?
在現實世界中,它會打開一個由客戶的卡片發行機構提供的介面視窗。所以我不確定我的整合是否有效。如前所述,支付正在被接受,但我需要準備好在九月需要強客戶身份驗證時使用。
答案#1
看起來你在 JavaScript 部分有整合問題。對於簡單的付款(以下範例不適用於訂閱),你必須這樣實作:
首先,你必須創建一個付款意圖(文檔在此:https://stripe.com/docs/api/payment_intents/create):
\Stripe\PaymentIntent::create([
"amount" => 2000,
"currency" => "usd",
"payment_method_types" => ["card"],
]);
一旦您的 PaymentIntent 回應返回,您將會擁有一個 client_secret 金鑰(文件在這裡:https://stripe.com/docs/api/payment_intents/object)。您可以看到您的支付狀態為 "requires_payment_method"
{
"id": "pi_1Dasb62eZvKYlo2CPsLtD0kn",
"object": "payment_intent",
"amount": 1000,
"amount_capturable": 0,
"amount_received": 0,
...
"client_secret": "pi_1Dasb62eZvKYlo2CPsLtD0kn_secret_6aR6iII8CYaFCrwygLBnJW8js",
...
"status": "requires_payment_method",
...
}
在你的伺服器端,你必須保存這個物件。你現在可以使用之前的 client_secret 金鑰來顯示你的付款表單的 JS 部分(文件在這裡:https://stripe.com/docs/payments/payment-intents/verifying-status)。其概念是你必須在點擊提交按鈕時調用 JS 函數,但不要提交!等待回應後再提交。使用一些 jQuery 這應該是這樣的:
var $mySubmitButton = $('#my-submit-button'),
$myPaymentForm = $('#my-payment-form'),
clientSecret = $cardButton.data('client-secret'); // put your client-secret somewhere
$mySubmitButton.on('click', function(e) {
e.preventDefault();
// Disable button to disallow multiple click
$(this).attr("disabled", true);
stripe.handleCardPayment(
clientSecret,
{
payment_method: clientMethod, // if you have a clientMethod
}
).then(function(result) {
if (result.error) {
// show error message
// then enable button
$mySubmitButton.attr("disabled", false);
} else {
// Submit form
$myPaymentForm.submit();
}
});
});
如果一切順利,當你點擊提交按鈕時,你將會看到一個測試用的 3D 安全彈出視窗,裡面有「成功」或「失敗」安全測試的選項。如果你點擊成功按鈕,你的表單將被提交,並且你必須等待 webhook 「charged.success」來確認交易。
一旦收到,請更改您的伺服器物件狀態並通知使用者有關交易的資訊。
在我的情況下,一旦表單提交,我會顯示加載器,並通過每秒的 Ajax 調用來檢查我的付款意圖狀態是否已更改(通過 webhook)。對於你的測試環境,你可以使用 http://requestbin.net 和 Postman。
注意:本頁面提及的某些卡片可能無法正常使用(您無法添加它們)https://stripe.com/docs/testing#cards(第 3D 安全測試卡號和代碼部分)。已向他們的客服確認。
如果您使用已保存的卡,您只能使用這些卡進行測試:https://stripe.com/docs/payments/cards/charging-saved-cards#testing
