我对Stripe的测试环境有关于3D安全流程和订阅的问题。而且我害怕在没有验证或解释问题的情况下将流程推向生产。
我根据文档执行了所有3d安全和订阅过程。
https://stripe.com/docs/sources/three-d-secure/subscriptions
当我通过禁用试用期来激活订阅时,我尝试的所有内容都失败了。
我正在使用需要3d安全的测试卡:4000 0000 0000 3063
我的代码处理:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Source test Stripe</title>
<script src="https://js.stripe.com/v3/"></script>
<style>
.StripeElement {
background-color: white;
height: 40px;
padding: 10px 12px;
border-radius: 4px;
border: 1px solid transparent;
box-shadow: 0 1px 3px 0 #e6ebf1;
-webkit-transition: box-shadow 150ms ease;
transition: box-shadow 150ms ease;
}
.StripeElement--focus {
box-shadow: 0 1px 3px 0 #cfd7df;
}
.StripeElement--invalid {
border-color: #fa755a;
}
.StripeElement--webkit-autofill {
background-color: #fefde5 !important;
}
</style>
</head>
<body>
<h1>create source</h1>
<form action="javascript:charge()" method="post" id="payment-form">
<div class="form-row">
<label for="card-element">
Credit or debit card
</label>
<div id="card-element">
</div>
<div id="card-errors" role="alert"></div>
</div>
<button>Submit Payment</button>
</form>
</body>
<script>
var stripe = Stripe('pk_test_xxxx');
var elements = stripe.elements();
var style = {
base: {
color: '#32325d',
lineHeight: '18px',
fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
fontSmoothing: 'antialiased',
fontSize: '16px',
'::placeholder': {
color: '#aab7c4'
}
},
invalid: {
color: '#fa755a',
iconColor: '#fa755a'
}
};
var card = elements.create('card', {style: style});
card.mount('#card-element');
card.addEventListener('change', function(event) {
var displayError = document.getElementById('card-errors');
if (event.error) {
displayError.textContent = event.error.message;
} else {
displayError.textContent = '';
}
});
var form = document.getElementById('payment-form');
form.addEventListener('submit', function(event) {
event.preventDefault();
var ownerInfo = {
owner: {
name: 'Jenny Rosen',
address: {
line1: 'Nollendorfstraße 27',
city: 'Berlin',
postal_code: '10777',
country: 'DE',
},
email: 'jenny.rosen@example.com'
},
};
stripe.createSource(card, ownerInfo).then(function(result) {
if (result.error) {
var errorElement = document.getElementById('card-errors');
errorElement.textContent = result.error.message;
} else {
console.log(result.source.id)
}
});
});
function charge() {
}
</script>
</html>
我得到了源ID src_xxxxx
我输入了我的PHP脚本:
<?php
require_once('stripe-php/init.php');
Stripe\Stripe::setApiKey(
'sk_test_xxxxx'
);
$sourceId = 'src_xxxxx';
$customer = Stripe\Customer::create([
'description' => 'test desc',
'email' => 'test@test.com',
'source' => $sourceId,
]);
$param = [
"amount" => 2995,
"currency" => 'eur',
"type" => "three_d_secure",
'three_d_secure' => [
'card' => $sourceId
],
"redirect" => [
"return_url" => "http://localhost:8080/stripeProcess2.php?customerId=".$customer->id
],
];
$source = Stripe\Source::create($param);
$customer->sources->create(['source' => $source->id]);
var_dump($source->redirect);
在var_dump中,我得到了重定向网址
我接受3d安全支付,重定向链接执行以下脚本:
<?php
require_once('stripe-php/init.php');
Stripe\Stripe::setApiKey(
'sk_test_xxxx'
);
$source = $_GET['source'];
$customerId = $_GET['customerId'];
$charges = \Stripe\Charge::create(array(
"amount" => 2995,
"currency" => "eur",
'source' => $source,
'customer' => $customerId,
"description" => "Charge for daniel.garcia@example.com"
));
$params = [
'items' => [
[
"plan" => "annual-basic",
]
],
'customer' => $customerId,
'trial_end' => strtotime('+1 day')
];
$sub = \Stripe\Subscription::create($params);
var_dump($sub->id);
使用订阅条带ID,我会立即激活订阅(这会向客户收费)
$subscription = \Stripe\Subscription::retrieve("sub_C7eVRi9WLynMdh");
$subscription->trial_end = "now";
$subscription->save();
在这里,我收到了使用generic_decline代码的付款失败。
我想知道在我的过程中,我是否做错了,如果我需要等到月底为客户充电,或者条纹测试卡无法用于此过程?
提前致谢
答案 0 :(得分:4)
我认为下降的原因是因为测试卡4000000000003063(https://stripe.com/docs/sources/three-d-secure)仅用于单笔付款,并且必须完成3D Secure才能获得成功。 (使用信用卡4000000000003055 - &#34;支持3D Secure但不需要此卡&#34;而是。)
这意味着如果此卡附加到客户,您只能测试初始付款,但不能测试定期付款,因为您无法再次完成3D安全程序。
您需要使用条带默认程序(https://stripe.com/docs/sources/cards)存储原始信用卡来源,以便再次使用此来源进行正在进行的订阅付款。
答案 1 :(得分:0)
创建3DS源时,您需要将客户以及卡传递到three_d_secure哈希中。
$param = [
"amount" => 2995,
"currency" => 'eur',
"type" => "three_d_secure",
'three_d_secure' => [
'card' => $sourceId,
'customer' => $customer->id
],
"redirect" => [
"return_url" => "http://localhost:8080/stripeProcess2.php?
customerId=".$customer->id
],
];
如果没有这个,客户对象就不会链接到成功通过身份验证的3DS源: https://stripe.com/docs/sources/three-d-secure/subscriptions#create-3ds-source
答案 2 :(得分:0)
使用3D安全卡在条带上创建订阅几乎不会引起混淆。使用卡“ 4000000000003063”进行测试时,我可以预先收费,也可以在试用期内创建订阅。但是,当我结束试用期时,它失败并显示错误“卡被拒绝”。这种情况使我怀疑我的代码。
正如@mygov所提到的,似乎测试卡“ ... 3063”不是用于重复发生的付款。为了确认这一点,我使用实际的3D安全卡在实时条带上创建了订阅,并且在试用期结束后付款成功。
此外,在使用3D安全卡的情况下,需要在创建订阅之前向3d安全源收费,但是如果有试用期,则不应立即向客户收取任何费用,我选择向1d收取激活费,然后创建订阅。
希望它能帮助某人。