条纹支付:保存令牌和客户信息,稍后使用令牌进行付款

34

在Stripe付款中,

首先我们将使用Stripe验证信用卡,然后生成令牌并创建客户。我们将在数据库中保存令牌而不是信用卡信息,稍后我们将基于令牌或客户而不是信用卡信息从客户那里进行付款。

在JavaScript文件中,我们如何处理stripeResponseHandlerfunction stripeResponseHandler(status, response)

因为我们已经使用生成了令牌

Stripe.createToken({
            number: cardNumber,
            cvc: cardCVC,
            exp_month: $('#expiration-month').val(),
            exp_year: $('#expiration-year').val()
        }, stripeResponseHandler);

在付款步骤中,我们如何调用stripeResponseHandler?


请理解需求。

1- 通过验证信用卡信息来保存Token,在这种情况下不涉及任何付款。金额/价格为零(0)。

2- 将此Token保存在您的数据库中,但该令牌仅使用一次,而不是多次。如果稍后使用此Token,它将无法工作。

3- 创建customer将在stripe.com上创建一个客户,并且我们也可以保存在我们的数据库中,但原因是我们不会从我们的站点充值,我们必须登录stripe.com并从该网站充值。当我们从该网站充值时,我们无法在我们的数据库中保存记录。还在创建客户时,我们必须为以后创建一个充值。如果使用此客户端,我们还需要再次输入信用卡。所以这是主要的问题。

4- 我们可以自己创建函数stripeResponseHandler,因为通过stripeResponseHandler可以在stripe.js和stripe服务器上完成卡的验证。


1
每次我们需要通过信用卡信息进行付款时,这个例子 https://stripe.com/docs/tutorials/charges#saving-credit-card-details-for-later ,只会在 stripe.com 中创建一个客户,并使用此用户 ID... 这需要金额,但在我们的情况下,首先我们验证信用卡并保存令牌,然后在 1 天、1 个月或任何时间从该用户帐户中进行付款。 - Shahzad
对于后来者,Stripe有一个新的API用于在此设置未来付款。 - Brian Chan
5个回答

37

建议创建一个客户并保存其客户ID,而不是保存令牌本身。这样您可以在将来的任何时间向客户收费。请参阅我们有关储存卡片详细信息以供日后使用的文档。

在 JavaScript 文件中,我们如何处理 stripeResponseHandler 和函数 stripeResponseHandler(status, response)。

当调用 createToken 时,您需要创建一个函数并将其作为您的 stripeResponseHandler 传递。此函数只需将您的令牌插入到您的表单中并提交即可。这里有一个简单的示例:https://gist.github.com/boucher/1750375


你能在下面回复答案吗? - Shahzad
保存客户ID,我需要扩展Django用户模型吗?还是有更好的推荐方法? - Jesus Almaral - Hackaprende

25
在Stripe中,如果想要将信用卡(或银行账户)保存起来以便以后收取费用,需要先创建一个客户,然后为该客户添加付款来源(信用卡或银行账户)。
一旦您使用某些支付来源创建了客户,您有三种选项来创建收费。
1. 使用默认来源向客户收费:
Stripe::Charge.create(
    amount: 1000,
    currency: 'usd',
    customer: 'cus_xxxx'
)
  • 使用信用卡向客户收费:

  • Stripe::Charge.create(
        amount: 5000,
        currency: 'usd',
        customer: 'cus_xxxx',
        card: 'card_xxxx'
    )
    
  • 使用银行账户向客户收取费用:

  • Stripe::Charge.create(
        amount: 8000,
        currency: 'usd',
        customer: 'cus_xxxx',
        bank_account: 'ba_xxxx'
    )
    

    第二种方法在此处未记录[https://stripe.com/docs/api],它是未记录还是现在不起作用? - Farhan Ghumra
    Stripes官方的@types TypeScript文件已经删除了card属性,因此从现在开始似乎您必须使用选项1或3。 - Matthew Mullin

    8

    不要保存令牌,创建客户对象并仅在本地保存卡片ID。当您进行付款时,可以选择定义要收取费用的卡片(如果将客户ID传递给stripe.charges.create)。在这种情况下,您不必传递令牌。使用此方法,您也无需处理默认卡。

    stripe.charges.create({
    amount: 400,
    currency: "usd",
    card: "card_xxxxx", 
    customer: "cus_xxxxxx", 
    

    请注意:响应会返回customer_id,因此似乎应该从源(令牌)中运行而无需customer_id,然后在付款成功后将其放入您的数据库中... - Andy Hayden

    2
    使用以下代码片段,稍后您可以通过传递capture: true来捕获交易ID的付款。
    token = params[:stripeToken]
        # Charge the user's card:
        charge = Stripe::Charge.create(
          :amount => 1000,
          :currency => "usd",
          :description => "Example charge",
          :capture => false,
          :source => token,
        )
    

    更多详细信息请参考链接,如下所述:

    capture(捕获):- 可选,默认为true 是否立即捕获收费。当为false时,该收费会发出授权(或预授权),并且需要稍后捕获。未捕获的收费在7天后失效。有关更多信息,请参见授权收费和稍后结算。

    我认为它可以解决您面临的问题。


    是的,我已经添加了更多细节来回答。 - Rahul Sharma

    0

    要创建令牌,您首先需要从stripe.com引用stripe.js

       <script src="https://js.stripe.com/v3/"></script>
    

    然后添加以下代码,以添加您的卡片信息并生成令牌。

        var stripe = Stripe('Your stripe publisheable key');
      var elements = stripe.elements;
    
    stripe.createToken(elements[0], additionalData).then(function (result) {
                    example.classList.remove('submitting');
    
                    if (result.token) {
                        // If we received a token, show the token ID.
                        example.querySelector('.token').innerText = result.token.id;
                        example.classList.add('submitted');
                    }
    

    在这里,您将获得一个令牌,这将是创建客户所必需的。使用以下代码创建您的客户。我使用了C#.NET

    StripeConfiguration.SetApiKey("sk_test_JTJYT2SJCb3JjLQQ4I5ShDLD");
    
    var options = new CustomerCreateOptions {
      Description = "Customer for jenny.rosen@example.com",
      SourceToken = "tok_amex"
    };
    
    var service = new CustomerService();
    Customer customer = service.Create(options);
    

    然后,你可以通过从Stripe获得的卡片令牌来为这个用户减价,方法如下:
    StripeConfiguration.SetApiKey("sk_test_JTJYT2SJCb3JjLQQ4I5ShDLD");
    
    var options = new ChargeCreateOptions {
        Amount = 2000,
        Currency = "aud",
        Description = "Charge for jenny.rosen@example.com",
        SourceId = "tok_amex" // obtained with Stripe.js, }; var service = new ChargeService(); Charge charge = service.Create(options);
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接