简体   繁体   English

首次成功付款后,条纹计费订阅不收取“后续费用”

[英]Stripe billing Subscription not charging the “subsequent charges” after initial successful Payment

I have followed this documentation to implement the Stripe Recurring Payments, which is working fine for both non-3d-Secure card and 3d-Secure enabled cards. 我已按照文档实施了“条带定期付款”,这对于非3d-Secure卡和启用3d-Secure的卡都可以正常工作。 For initial payments i get the 3d-Secure Payment authentication Modal from Stripe to authenticate payments using 3D-Secure Test cards. 对于首次付款,我从Stripe获得了3d-Secure Payment身份验证模式,以使用3D-Secure Test卡对付款进行身份验证。

The subscription is created along with invoices that Stripe generates for me. 订阅与Stripe为我生成的发票一起创建。 Everything's seems to be OK, BUT for 3D-Secure Enabled (Stripe Testing Cards) the First Payment goes through successfully but the subsequent payments which i have set interval of 1Day (for testing) are "Failed" by Stripe. 一切似乎都还可以,但是3D-Secure Enabled(条纹测试卡)的第一次付款成功完成,但是我将间隔设置为1天(用于测试)的后续付款被Stripe“失败”了。 From what i understand Stripe requires Customer's Authentication again to continue the Subscription. 据我了解,Stripe需要再次进行客户身份验证才能继续订阅。


In this they said 他们在

When 3D Secure is encountered, configure your billing settings to send a hosted link to your customer to complete the flow. 遇到3D Secure时,请配置您的结算设置,以将托管链接发送给您的客户以完成流程。

That's completely OK, But why they even require the authentication step again if the first payment is succeeded and the subscription is started? 完全可以,但是,如果第一次付款成功并且开始订阅,他们为什么还要再次要求身份验证步骤? I have gone through all the related Docs but found nothing to prevent that. 我已经阅读了所有相关文档,但没有发现任何可以防止这种情况的方法。

What if Customer does not check his/her email to come back to my Application to authenticate the payments? 如果客户不检查他/她的电子邮件以返回我的应用程序以验证付款怎么办? OR 要么

Is there anything wrong with the code? 代码有什么问题吗? By that i mean that Stripe should have saved the Payment Method ie Card Number so it does not require the Customer Authentication on subsequent charges every time the new billing cycle start(monthly/biannually). 我的意思是,Stripe应该已经保存了付款方式(即卡号),因此每次新的计费周期开始时(每月/每半年),都不需要对后续收费的客户身份验证。

I have searched on internet and found and answer saying 我在互联网上搜索并找到并回答说

You are using stripe.createToken which does not support 3ds authentication. 您正在使用不支持3ds身份验证的stripe.createToken。 You need to migrate your client side code to stripe.createPaymentMethod which does support it 您需要将客户端代码迁移到确实支持它的stripe.createPaymentMethod

Is that it? 是吗 Any response is appreciated 任何回应表示赞赏

My Payment.js 我的Payment.js

// set your stripe publishable key
var stripe = Stripe('pk_test_key');
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 cardNumber = elements.create('cardNumber', {
    style: style
});
cardNumber.mount('#cardNumber');
var cardExpiry = elements.create('cardExpiry', {
    style: style
});
cardExpiry.mount('#cardExpiry');
var cardCvc = elements.create('cardCvc', {
    style: style
});
cardCvc.mount('#cardCVC');

var cardholderName = $('#custName').val();
var amount = $('#amount').val();

var cardButton = document.getElementById('makePayment');
cardButton.addEventListener('click', function(ev) {
     // alert();
    ev.preventDefault();




    stripe.createToken(cardNumber).then(function(result) {

    if (result.error) {


    } else {
      //$body.addClass("loading");
      fetch('process.php', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ 
            token_id: result.token.id          
            })
      }).then(function(result) {


        // Handle server response (see Step 3)
        result.json().then(function(json) {
          handleServerResponse(json);
          //alert();
        })
      });
    }
  });
});
function handleServerResponse(response) {
            if (response.error) {
                // Show error from server on payment form
            } else if (response.requires_action) {
                // Use Stripe.js to handle required card action
                var action = response.next_action;
                if (action && action.type == 'redirect_to_url') {
                    window.location = action.redirect_to_url.url;
                }

                handleAction(response);

            } else {
                console.log("3D" + response);
            }
}

        function handleAction(response) {
           var paymentIntentSecret = response.payment_intent_client_secret;
            stripe.handleCardPayment(paymentIntentSecret).then(function(result) {
              if (result.error) {
                // Display error.message in your UI.
              } else {
                // The payment has succeeded. Display a success message.
                alert('Payment succeeded!');
              }
});

}

Process.php Process.php

<?php 

require_once('stripe-php/init.php');   
\Stripe\Stripe::setApiKey('sk_test_key');

$json_str = file_get_contents('php://input');

$json_obj = json_decode($json_str);
 //print_r($json_obj->token_id);die;

  //$intent = null;
try {
    if (isset($json_obj->token_id)) {
     //Create Customer   
    $customer = \Stripe\Customer::create([
    "email" => "test@gmail.com",
    "name" => "Haroon",  
    "source" => $json_obj->token_id,
]);
    //create product
    $product = \Stripe\Product::create([
    'name' => 'Water',
    'type' => 'service',
]);
    //create a plan
    $plan = \Stripe\Plan::create([
      'product' => $product->id,
      'nickname' => 'Water',
      'interval' => 'day',
      'currency' => 'eur',
      'amount' => 1200.00,
    ]);   

    //add subscription to stripe
    $subscription = \Stripe\Subscription::create([

        'customer' => $customer->id,
        'items' => [[
        "plan" => $plan->id],],
        'expand' => ['latest_invoice.payment_intent'],
]);    
}

      $intent = \Stripe\PaymentIntent::retrieve($subscription->latest_invoice->payment_intent->id);

      $subscription = \Stripe\Subscription::retrieve($subscription->id);
    //   $intent->confirm();
    // }
    generatePaymentResponse($intent,$subscription);
  }catch (\Stripe\Error\Base $e) {
    # Display error on client
    echo json_encode([
      'error' => $e->getMessage()
    ]);
  }  

   function generatePaymentResponse($intent,$subscription) {
    if ($intent->status == 'requires_action' && $subscription->status == 'incomplete' &&
        $intent->next_action->type == 'use_stripe_sdk' ) {
        # Tell the client to handle the action

        echo json_encode([
            'requires_action' => true,
            'payment_intent_client_secret' => $intent->client_secret
        ]);
    } else if ($intent->status == 'succeeded' && $subscription->status == 'active') {

        # The payment didn’t need any additional actions and completed!
        # Handle post-payment fulfillment
        echo json_encode([
            'success' => true
        ]);
    } else if ($intent->status == 'requires_payment_method' && $subscription->status == 'incomplete') {
        echo "Subscription failed";

    } else {
        # Invalid status
        http_response_code(500);
        echo json_encode(['error' => 'Invalid PaymentIntent status']);
    }
}

If you are doing this for already exist card then i have done this just before some day . 如果您正在为已经存在的卡执行此操作,那么我将在一天前完成此操作。 Refer this document https://stripe.com/docs/payments/3d-secure . 请参阅此文档https://stripe.com/docs/payments/3d-secure

This suggest that you need to create paymentIntent and need to confirm this payment intent . 这表明您需要创建paymentIntent并需要确认此付款意图。 and also in 3ds there are test card 4242 4242 4242 4242 This card does not require any authentication for 3ds . 在3ds中也有测试卡4242 4242 42424242。该卡不需要3ds的任何身份验证。 Giving below link for test cards 在下面提供测试卡的链接

https://stripe.com/docs/payments/3d-secure/web#three-ds-cards https://stripe.com/docs/payments/3d-secure/web#three-ds-cards

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM