触发 Stripe SCA 重定向以进行身份验证
Trigger Stripe SCA redirection for authentication
我有这个条带文件StripePayment.php
<?php
require_once 'vendor/autoload.php';
use \Stripe\Stripe;
use \Stripe\Customer;
use \Stripe\ApiOperations\Create;
use \Stripe\Charge;
class StripePayment
{
private $apiKey;
private $stripeService;
public function __construct()
{
require_once "config.php";
$this->apiKey = STRIPE_SECRET_KEY;
$this->stripeService = new \Stripe\Stripe();
$this->stripeService->setVerifySslCerts(false);
$this->stripeService->setApiKey($this->apiKey);
}
public function addCustomer($customerDetailsAry)
{
$customer = new Customer();
$customerDetails = $customer->create($customerDetailsAry);
return $customerDetails;
}
public function chargeAmountFromCard($cardDetails)
{
$customerDetailsAry = array(
'email' => $cardDetails['email'],
'source' => $cardDetails['token']
);
$customerResult = $this->addCustomer($customerDetailsAry);
$charge = new Charge();
$cardDetailsAry = array(
'customer' => $customerResult->id,
'amount' => $cardDetails['amount']*100 ,
'currency' => $cardDetails['currency_code'],
'description' => $cardDetails['item_name'],
'metadata' => array(
'order_id' => $cardDetails['item_number']
)
);
$result = $charge->create($cardDetailsAry);
return $result->jsonSerialize();
}
}
我也是这样充值的
<?php
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
require_once "config.php";
if (!empty($_POST["token"])) {
require_once 'StripePayment.php';
$stripePayment = new StripePayment();
$stripeResponse = $stripePayment->chargeAmountFromCard($_POST);
require_once "DBController.php";
$dbController = new DBController();
$amount = $stripeResponse["amount"] /100;
$param_type = 'ssdssss';
$param_value_array = array(
$_POST['email'],
$_POST['item_number'],
$amount,
$stripeResponse["currency"],
$stripeResponse["balance_transaction"],
$stripeResponse["status"],
json_encode($stripeResponse)
);
此代码可以为卡充值,但不能为需要 3D/SCA 的卡充值,即欧洲卡。
我的问题是,有没有一种方法可以请求 stripe 将用户重定向到发卡银行进行身份验证,以便用户可以授权交易?
我的条纹表单代码如下所示
<form id="frmStripePayment" action=""
method="post">
<div class="field-row">
<label>Card Holder Name</label> <span
id="card-holder-name-info" class="info"></span><br>
<input type="text" id="name" name="name"
class="demoInputBox">
</div>
<div class="field-row">
<label>Email</label> <span id="email-info"
class="info"></span><br> <input type="text"
id="email" name="email" class="demoInputBox">
</div>
<div class="field-row">
<label>Card Number</label> <span
id="card-number-info" class="info"></span><br> <input
type="text" id="card-number" name="card-number"
class="demoInputBox">
</div>
<div class="field-row">
<div class="contact-row column-right">
<label>Expiry Month / Year</label> <span
id="userEmail-info" class="info"></span><br>
<select name="month" id="month"
class="demoSelectBox">
<option value="02">02</option>
<option value="03">03</option>
<option value="04">04</option>
<option value="05">05</option>
<option value="06">06</option>
<option value="07">07</option>
<option value="08">08</option>
<option value="08">08</option>
<option value="08">08</option>
<option value="09">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select> <select name="year" id="year"
class="demoSelectBox">
<option value="21">2021</option>
<option value="22">2022</option>
<option value="23">2023</option>
<option value="24">2024</option>
<option value="25">2025</option>
<option value="26">2026</option>
<option value="27">2027</option>
<option value="28">2028</option>
<option value="29">2029</option>
<option value="30">2030</option>
</select>
</div>
<div class="contact-row cvv-box">
<label>CVC</label> <span id="cvv-info"
class="info"></span><br> <input type="text"
name="cvc" id="cvc"
class="demoInputBox cvv-input">
</div>
</div>
<div>
<input type="submit" name="pay_now" value="Submit"
id="submit-btn" class="btnAction"
onClick="stripePay(event);">
<div id="loader">
<img alt="loader" src="LoaderIcon.gif">
</div>
</div>
<input type='hidden' name='amount' value='1100'> <input
type='hidden' name='currency_code' value='USD'> <input
type='hidden' name='item_name' value='Solidroof Product'>
<input type='hidden' name='item_number'
value='SCA#Test'>
</form>
<script>
function cardValidation () {
var valid = true;
var name = $('#name').val();
var email = $('#email').val();
var cardNumber = $('#card-number').val();
var month = $('#month').val();
var year = $('#year').val();
var cvc = $('#cvc').val();
$("#error-message").html("").hide();
if (name.trim() == "") {
valid = false;
}
if (email.trim() == "") {
valid = false;
}
if (cardNumber.trim() == "") {
valid = false;
}
if (month.trim() == "") {
valid = false;
}
if (year.trim() == "") {
valid = false;
}
if (cvc.trim() == "") {
valid = false;
}
if(valid == false) {
$("#error-message").html("All Fields are required").show();
}
return valid;
}
//set your publishable key
Stripe.setPublishableKey("<?php echo STRIPE_PUBLISHABLE_KEY; ?>");
//callback to handle the response from stripe
function stripeResponseHandler(status, response) {
if (response.error) {
//enable the submit button
$("#submit-btn").show();
$( "#loader" ).css("display", "none");
//display the errors on the form
$("#error-message").html(response.error.message).show();
} else {
//get token id
var token = response['id'];
//insert the token into the form
$("#frmStripePayment").append("<input type='hidden' name='token' value='" + token + "' />");
//submit form to the server
$("#frmStripePayment").submit();
}
}
function stripePay(e) {
e.preventDefault();
var valid = cardValidation();
if(valid == true) {
$("#submit-btn").hide();
$( "#loader" ).css("display", "inline-block");
Stripe.createToken({
number: $('#card-number').val(),
cvc: $('#cvc').val(),
exp_month: $('#month').val(),
exp_year: $('#year').val()
}, stripeResponseHandler);
//submit from callback
return false;
}
}
</script>
根据有关如何手动要求将用户重定向到银行 url 以进行进一步身份验证的文档 https://stripe.com/docs/payments/3d-secure#manual-three-ds
next_action: {
type: 'redirect_to_url',
redirect_to_url: {
url: 'https://hooks.stripe.com/...',
return_url: 'https://example.com'
}
}
stripe sdk 是否自动知道要重定向到的银行 url 或谁提供该信息?
银行托管的身份验证 URL 通过 redirect_to_url.url
重定向处理,或者在 confirmCardPayment
中使用 Stripe 的支付意向 API 时自动管理 confirmCardPayment
=19=] v3 (migration guide)。如果您使用 confirmCardPayment
,您自己根本不需要管理重定向。这是支持 3D Secure 的推荐方法。
您可以 support 3DS using the Sources API,但这已被弃用,不再推荐。
将return_url指定为return_url:window。location.href会返回到支付开始的页面。
我有这个条带文件StripePayment.php
<?php
require_once 'vendor/autoload.php';
use \Stripe\Stripe;
use \Stripe\Customer;
use \Stripe\ApiOperations\Create;
use \Stripe\Charge;
class StripePayment
{
private $apiKey;
private $stripeService;
public function __construct()
{
require_once "config.php";
$this->apiKey = STRIPE_SECRET_KEY;
$this->stripeService = new \Stripe\Stripe();
$this->stripeService->setVerifySslCerts(false);
$this->stripeService->setApiKey($this->apiKey);
}
public function addCustomer($customerDetailsAry)
{
$customer = new Customer();
$customerDetails = $customer->create($customerDetailsAry);
return $customerDetails;
}
public function chargeAmountFromCard($cardDetails)
{
$customerDetailsAry = array(
'email' => $cardDetails['email'],
'source' => $cardDetails['token']
);
$customerResult = $this->addCustomer($customerDetailsAry);
$charge = new Charge();
$cardDetailsAry = array(
'customer' => $customerResult->id,
'amount' => $cardDetails['amount']*100 ,
'currency' => $cardDetails['currency_code'],
'description' => $cardDetails['item_name'],
'metadata' => array(
'order_id' => $cardDetails['item_number']
)
);
$result = $charge->create($cardDetailsAry);
return $result->jsonSerialize();
}
}
我也是这样充值的
<?php
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
require_once "config.php";
if (!empty($_POST["token"])) {
require_once 'StripePayment.php';
$stripePayment = new StripePayment();
$stripeResponse = $stripePayment->chargeAmountFromCard($_POST);
require_once "DBController.php";
$dbController = new DBController();
$amount = $stripeResponse["amount"] /100;
$param_type = 'ssdssss';
$param_value_array = array(
$_POST['email'],
$_POST['item_number'],
$amount,
$stripeResponse["currency"],
$stripeResponse["balance_transaction"],
$stripeResponse["status"],
json_encode($stripeResponse)
);
此代码可以为卡充值,但不能为需要 3D/SCA 的卡充值,即欧洲卡。
我的问题是,有没有一种方法可以请求 stripe 将用户重定向到发卡银行进行身份验证,以便用户可以授权交易?
我的条纹表单代码如下所示
<form id="frmStripePayment" action=""
method="post">
<div class="field-row">
<label>Card Holder Name</label> <span
id="card-holder-name-info" class="info"></span><br>
<input type="text" id="name" name="name"
class="demoInputBox">
</div>
<div class="field-row">
<label>Email</label> <span id="email-info"
class="info"></span><br> <input type="text"
id="email" name="email" class="demoInputBox">
</div>
<div class="field-row">
<label>Card Number</label> <span
id="card-number-info" class="info"></span><br> <input
type="text" id="card-number" name="card-number"
class="demoInputBox">
</div>
<div class="field-row">
<div class="contact-row column-right">
<label>Expiry Month / Year</label> <span
id="userEmail-info" class="info"></span><br>
<select name="month" id="month"
class="demoSelectBox">
<option value="02">02</option>
<option value="03">03</option>
<option value="04">04</option>
<option value="05">05</option>
<option value="06">06</option>
<option value="07">07</option>
<option value="08">08</option>
<option value="08">08</option>
<option value="08">08</option>
<option value="09">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select> <select name="year" id="year"
class="demoSelectBox">
<option value="21">2021</option>
<option value="22">2022</option>
<option value="23">2023</option>
<option value="24">2024</option>
<option value="25">2025</option>
<option value="26">2026</option>
<option value="27">2027</option>
<option value="28">2028</option>
<option value="29">2029</option>
<option value="30">2030</option>
</select>
</div>
<div class="contact-row cvv-box">
<label>CVC</label> <span id="cvv-info"
class="info"></span><br> <input type="text"
name="cvc" id="cvc"
class="demoInputBox cvv-input">
</div>
</div>
<div>
<input type="submit" name="pay_now" value="Submit"
id="submit-btn" class="btnAction"
onClick="stripePay(event);">
<div id="loader">
<img alt="loader" src="LoaderIcon.gif">
</div>
</div>
<input type='hidden' name='amount' value='1100'> <input
type='hidden' name='currency_code' value='USD'> <input
type='hidden' name='item_name' value='Solidroof Product'>
<input type='hidden' name='item_number'
value='SCA#Test'>
</form>
<script>
function cardValidation () {
var valid = true;
var name = $('#name').val();
var email = $('#email').val();
var cardNumber = $('#card-number').val();
var month = $('#month').val();
var year = $('#year').val();
var cvc = $('#cvc').val();
$("#error-message").html("").hide();
if (name.trim() == "") {
valid = false;
}
if (email.trim() == "") {
valid = false;
}
if (cardNumber.trim() == "") {
valid = false;
}
if (month.trim() == "") {
valid = false;
}
if (year.trim() == "") {
valid = false;
}
if (cvc.trim() == "") {
valid = false;
}
if(valid == false) {
$("#error-message").html("All Fields are required").show();
}
return valid;
}
//set your publishable key
Stripe.setPublishableKey("<?php echo STRIPE_PUBLISHABLE_KEY; ?>");
//callback to handle the response from stripe
function stripeResponseHandler(status, response) {
if (response.error) {
//enable the submit button
$("#submit-btn").show();
$( "#loader" ).css("display", "none");
//display the errors on the form
$("#error-message").html(response.error.message).show();
} else {
//get token id
var token = response['id'];
//insert the token into the form
$("#frmStripePayment").append("<input type='hidden' name='token' value='" + token + "' />");
//submit form to the server
$("#frmStripePayment").submit();
}
}
function stripePay(e) {
e.preventDefault();
var valid = cardValidation();
if(valid == true) {
$("#submit-btn").hide();
$( "#loader" ).css("display", "inline-block");
Stripe.createToken({
number: $('#card-number').val(),
cvc: $('#cvc').val(),
exp_month: $('#month').val(),
exp_year: $('#year').val()
}, stripeResponseHandler);
//submit from callback
return false;
}
}
</script>
根据有关如何手动要求将用户重定向到银行 url 以进行进一步身份验证的文档 https://stripe.com/docs/payments/3d-secure#manual-three-ds
next_action: {
type: 'redirect_to_url',
redirect_to_url: {
url: 'https://hooks.stripe.com/...',
return_url: 'https://example.com'
}
}
stripe sdk 是否自动知道要重定向到的银行 url 或谁提供该信息?
银行托管的身份验证 URL 通过 redirect_to_url.url
重定向处理,或者在 confirmCardPayment
中使用 Stripe 的支付意向 API 时自动管理 confirmCardPayment
=19=] v3 (migration guide)。如果您使用 confirmCardPayment
,您自己根本不需要管理重定向。这是支持 3D Secure 的推荐方法。
您可以 support 3DS using the Sources API,但这已被弃用,不再推荐。
将return_url指定为return_url:window。location.href会返回到支付开始的页面。