条带3d安全订阅失败

时间:2018-01-12 14:09:58

标签: php stripe-payments

我对Stripe的测试环境有关于3D安全流程和订阅的问题。而且我害怕在没有验证或解释问题的情况下将流程推向生产。

我根据文档执行了所有3d安全和订阅过程。

https://stripe.com/docs/sources/three-d-secure/subscriptions

当我通过禁用试用期来激活订阅时,我尝试的所有内容都失败了。

enter image description here

我正在使用需要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代码的付款失败。

我想知道在我的过程中,我是否做错了,如果我需要等到月底为客户充电,或者条纹测试卡无法用于此过程?

提前致谢

3 个答案:

答案 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收取激活费,然后创建订阅。

希望它能帮助某人。