1

我正在从 Changes API 迁移到 PaymentIntent API。我成功设置代码。

但我很想知道,每次我加载页面条带时,都会在条带仪表板上创建一个显示为“未完成”付款状态的付款意图,并且在单击所有详细信息的付款按钮后,此状态变为“成功状态

PHP 代码

 $customer = \Stripe\Customer::create(array(
                'email' => $_SESSION['userEmail']
            ));
    $intent = \Stripe\PaymentIntent::create([
    'amount' => $varTotalPrice,
    'currency' => 'eur',
    'customer' => $customer->id,
    'payment_method_types' => ['card'],
    'description' => $arrCreditResult['creditTitle']
    ]);

如您所知,这为我提供了在 js 脚本中使用的client_secret密钥。

JS代码

<script type="text/javascript">
            var stripe = Stripe('<?php echo $pubkey; ?>');
            var elements = stripe.elements();
            var payBtnHtml = document.getElementById("submit").innerHTML;
            var card = elements.create('card', {
                style: {
                    base: {
                        iconColor: '#666EE8',
                        color: '#31325F',
                        lineHeight: '40px',
                        fontWeight: 600,
                        fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
                        fontSize: '15px',
                        '::placeholder': {
                            color: '#31325F',
                            fontWeight:300,
                            fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
                            fontSize: '15px'
                        }
                    }
                }
            });
            card.mount('#card-element');
            
            var cardholderName = document.querySelector('input[name=cardholder-name]');            
            var form = document.getElementById('payment-form');
            var clientSecret = document.getElementById('payment-form').getAttribute("data-secret");

            card.on('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(ev) {
                ev.preventDefault();
                document.getElementById("submit").disabled = true;
                document.getElementById("submit").innerHTML = WAIT;
                stripe.confirmCardPayment(clientSecret, {
                    payment_method: {
                        card: card,
                        billing_details: {
                            name: cardholderName.value
                        }
                    }
                }).then(function(result) {
                    if (result.error) {
                        // Show error to your customer (e.g., insufficient funds)
                        document.getElementById("submit").disabled = false;
                        console.log(result.error.message);
                    } else {
                        // The payment has been processed!
                        if (result.paymentIntent.status === 'succeeded') {
                            document.getElementById("submit").disabled = false;
                            document.getElementById("payBtn").innerHTML=payBtnHtml
                            alert("paymemt done");
                            debug(result);
                            return false;
                            // Show a success message to your customer
                            // There's a risk of the customer closing the window before callback
                            // execution. Set up a webhook or plugin to listen for the
                            // payment_intent.succeeded event that handles any business critical
                            // post-payment actions.
                        }
                    }
                });
            });


        </script>

我只想在用户点击支付按钮时创建条带支付。与收费 API 相同。

4

2 回答 2

0

您可以重构代码以仅在需要时创建付款意图。步骤如下:

  1. 每次页面加载时停止创建付款意图并删除该data-secret属性。
  2. 在您的服务器上创建一个 URL,该 URL 将按需创建一个支付意图并返回其客户端密码(通常它将以 JSON 格式返回此信息)。
  3. 在您的 JavaScript 中,当您的客户按下付款按钮时,获取创建付款意图的 URL。在响应中使用客户端密码而不是值data-secret来完成支付。
于 2020-12-05T23:37:51.457 回答
0

特别感谢@justinMichael 的建议

经过一番努力,我在这里找到了一个可行的解决方案:-

https://github.com/stripe-samples/accept-a-card-payment

在这里,我使用“没有 webhooks”的方法:-

https://github.com/stripe-samples/accept-a-card-payment/tree/master/without-webhooks/server/php

这很容易实现,只需要做些小改动。

  1. 更改条带键。

  2. 如果要重命名文件夹,请检查 stripe.js 中的文件路径。在这里,他们使用 fetch("stripe-key.php") 获取密钥和其他内容

  3. 根据要求在 pay.php 文件中进行更改。

您可能需要一些更有用的链接:-

  1. https://stripe.com/docs/js/appendix/supported_locales
  2. https://stripe.com/docs/api/errors/handling
  3. https://stripe.com/docs/api/metadata
于 2020-12-28T07:15:05.130 回答