【问题标题】:Basic Stripe integration fails to load the payment page基本 Stripe 集成无法加载支付页面
【发布时间】:2019-09-08 12:29:58
【问题描述】:

我正在使用服务器快速入门示例将用户发送到 Stripe 进行付款

https://stripe.com/docs/payments/checkout/server

返回所需的会话 ID,并将其发送给 Stripe。但是付款页面没有加载。

我已将我的 API 密钥换成 XXXXX。

设置PHP显示所有错误,不存在。

三重检查我的代码是否与集成示例匹配(明显需要修改)

检查了我的 Stripe 帐户。

在头部

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

在 PHP 中

require_once('stripe-php-6.31.5/init.php');

\Stripe\Stripe::setApiKey("pk_test_XXXXXXXXXXXXXXXXXXXXXXX");

$object = \Stripe\Checkout\Session::create([
        'success_url' => 'https://www.example.com/success',
        'cancel_url' => 'https://www.example.com/cancel',
        'payment_method_types' => ['card'],
        'line_items' => [[
        'amount' => 500,
        'currency' => 'gbp',
        'name' => 'T-shirt',
        'description' => 'Comfortable cotton t-shirt',
        'images' => ['https://www.example.com/t-shirt.png'],
        'quantity' => 1,
    ]]
]);

$session_id = $object->id;

if ($session_id) {

    echo "<script>
          var stripe = Stripe('pk_test_XXXXXXXXXXXXXXXXXXXXXXX');
          stripe.redirectToCheckout({
          sessionId: '{{" . $session_id . "}}'
          }).then(function (result) {
          });
          </script>";

} else {

    echo 'No Session ID!';

}

Stripe 支付页面应该会加载。

此外,一旦我有了 session_id,javascript 看起来像这样

stripe.redirectToCheckout({
                sessionId: 
'{{cs_KmeIFgWSfN5GW6tP2e5IQ0Vb9EA0q3pWGHZNoDfFKAdcc6kW7DwsM6dAbhQ30}}'
            }).then(function (result) {
                // If `redirectToCheckout` fails due to a browser or network
                // error, display the localized error message to your customer
                // using `result.error.message`.
            });

然后用户会出现这个页面

<!DOCTYPE html>
<html>
<head>
    <title>KP Balance and Purchase</title>
    <script src="https://js.stripe.com/v3/"></script>

    <script>
        <!--
        function checkout(session_id) {

            var stripe = Stripe('pk_test_yLz5iASFgRnotoAQc79miQGz');

            stripe.redirectToCheckout({
                sessionId: '{{cs_KmeIFgWSfN5GW6tP2e5IQ0Vb9EA0q3pWGHZNoDfFKAdcc6kW7DwsM6dAbhQ30}}'
            }).then(function (result) {
                // If `redirectToCheckout` fails due to a browser or network
                // error, display the localized error message to your customer
                // using `result.error.message`.
            });

            }

        //-->
</script>

</head>
<body>

<form>
    <input type="button" onclick="checkout()" value="Buy Now!" />
</form>

</body>
</html>

【问题讨论】:

  • 您的 JavaScript 执行是否正确?如果您在那里回显console.log 呼叫会发生什么?
  • 会发生什么?您的浏览器开发工具显示什么?您链接的 Stripe 文档上的示例代码描述了在 .then() 函数中使用 result.error.message 显示错误消息,添加这可能会显示问题?
  • 执行 javascript 时,浏览器被重定向到 Stripe,在控制台中我现在看到错误“未捕获错误:apiKey 或 pageIdentifier/sessionIdentifier 未设置”,但我的 javascript 确实包含会话身份证。
  • {{CHECKOUT_SESSION_ID}} 通常用于在技术文档中表示“这是一个占位符”,但这并不意味着您应该在实际值中包含大括号。很确定您的 sessionId: '{{cs_KmeI…Q30}}' 实际上应该只是 sessionId: 'cs_KmeI…Q30'
  • 不知道该笑还是该哭。就是这样。非常感谢!

标签: php stripe-payments


【解决方案1】:

此外,一旦我有了 session_id,javascript 看起来像这样

stripe.redirectToCheckout({
                sessionId: '{{cs_KmeIFgWSfN5GW6tP2e5IQ0Vb9EA0q3…kW7DwsM6dAbhQ30}}'

{{CHECKOUT_SESSION_ID}} 在技术文档中通常用于表示“这是一个占位符”,但这并不意味着您应该在实际值中包含大括号。

你的sessionId: '{{cs_KmeI…Q30}}'实际上应该只是sessionId: 'cs_KmeI…Q30'

【讨论】:

    【解决方案2】:

    我已经为此苦苦挣扎了好几天,甚至向 Stripe 提出了帮助请求。我终于让它工作了。

    没有大括号,但也有没有引号只是变量名称您(我们)分配给服务器回复时给定的变量。也就是\Stripe\Checkout\Session::create([..])返回的数组的id

    在您的示例中,它将是 PHP 中的 session_idJS 中的 sessionId。这意味着您的 sessionId: '{{cs_KmeI…Q30}}' 实际上应该只是 sessionId: 'cs_KmeI…Q30'

    Whoopi .. 终于加载了结帐页面! :O)

    编辑:抱歉,14 小时工作日结束。我的眼睛受伤了,我因它们而头疼。大家早上好。

    不希望将实际的硬编码会话 id 值放在单引号中,因为会话是易变的。一旦该会话到期或为不同的付款启动了不同的会话,则使用“examp123le0fID”将不起作用。所以我们想使用一个分配的动态值。该变量不应包含在任何内容中 - 没有花括号,没有引号。

    在初始化支付文件时,我使用 Stripe 返回给我们的数组为会话 ID 创建了一个变量。这是我在 PHP 中所做的,因为这就是我在这部分代码中使用的。然后我在正文部分之后添加了一个脚本,将该值(变量)分配给一个新的 java 变量。紧接着,我添加了一个脚本,将 java 变量传递给包含 Stripe java 重定向代码的 java 文件。在其中,我使用 const 将该变量分配给一个新名称,然后将其传递给重定向代码本身。这可能是很长的路要走。我不擅长 java、Jason、Ajax 等,并且 10 多年没有做任何真正的编程,但重要的是这种方法对我们有用。

    所以在我们的donation.php 文件中我们有:

                               $session = \Stripe\Checkout\Session::create([
                                'payment_method_types' => ['card'],
                                'line_items' => [[
                                  'name' => 'Custom t-shirt',
                                  'description' => 'Your custom designed t-shirt',
                                  'amount' => 5000, /* order.amount */
                                  'currency' => 'usd',
                                  'quantity' => 1,
                                ]],
                                'success_url' => 'https://example.com/success',
                                'cancel_url' => 'https://example.com/cancel',
                              ]);
    
                            $stripeSession = array($session);
                            $sessId = ($stripeSession[0]['id']);
    

    然后在同一文件中的正文结束后立即输入:

    <script type="text/javascript"> var ssId = "<?php echo $sessId ?>";</script> 
    
    <script src="./client.js"></script>
    

    其中 client 是包含 Stripe 重定向代码的 js 文件。在那个文件中,我们有这个:

    const stripe = Stripe('pk_test_UKRcYdXTmraCEZspx8PE7NzB00QZyoUXp3');
    const checkout_Id = (ssId);
    

    以及 Stripe 重定向:

     stripe.redirectToCheckout({
     sessionId: checkout_Id,
       });
    

    然后返回带有付款部分的整页结帐表格。

    【讨论】:

    • 欢迎来到 Stack Overflow,请花点时间解释你的答案。你得到了反对票,因为你的解释不清楚。我花了很长时间来理解和编辑您的答案。另外,请阅读有关How to answer a question 的更多信息。
    • 您能否更清楚地解释此脚本。因为我只是在处理同一个示例,如果我看到这些代码片段,就不知道它是如何工作的。但我相信它可能会起作用。
    • 这是完美的解决方案。非常感谢你!
    猜你喜欢
    • 2012-10-12
    • 2014-11-28
    • 2023-03-03
    • 1970-01-01
    • 2023-04-11
    • 2021-06-13
    • 2019-01-20
    • 2020-02-26
    • 1970-01-01
    相关资源
    最近更新 更多