繁体   English   中英

完全坚持 Stripe Checkout

[英]Completely stuck with Stripe Checkout

目标:屏幕上有几个按钮,就像这样——

[产品 1 – 20 美元]

[产品 2 – 35 美元]

等等...

用户可以选择任意数量的产品。 在 JavaScript 中,我有一个可变amount ,当用户选择它时,它会随着产品成本的增加而增加。 所以流程是这样的:

用户选择产品 1 和 2 --> 数量 = 20 + 35 = 55

然后,用户可以按下 Pay with Card 按钮来启动 Stripe Checkout 模式。 填写,付款,完成。

问题:现在,我正在使用 Checkout 的自定义按钮版本,因此我可以按照自己的方式设置按钮样式并将此变量放入。因此,该实现非常简单:

       var handler = StripeCheckout.configure({
            key: 'pk_test_XXXXXX',
            image: 'assets/logo-stripe.png',
            locale: 'auto',
            token: function(token, args) {
                // Use the token to create the charge with a server-side script.
                // You can access the token ID with `token.id`
                $.ajax({
                    url: 'php/charge.php',
                    type: 'post',
                    data: {tokenid: token.id, email: token.email, amount: amount},
                    success: function(data) {
                        if (data == 'success') {
                            console.log("Card successfully charged!");
                        }
                        else if (data == 'failure') {
                            console.log("Card error");
                        } else {
                            console.log("Other error");
                        }
                    },
                    error: function(data) {
                        console.log("AJAX error!");
                        console.log(data);
                    }
                });
            }
        });

        $('#pay-button').on('click', function(e) {
            if (amount == 0) {
                $('#pay-button').addClass('animated shake'); // Animates the button and refuses to open the modal if user didn't select any products
                $('#pay-button').one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', removeAnimation);
            } else {
                handler.open({
                    name: 'Company, Inc.',
                    description: "Description",
                    amount: amount // Here's the variable
                });
                e.preventDefault();
            }
        });

        // Close Checkout on page navigation
        $(window).on('popstate', function() {
            handler.close();
        });

这就是 JavaScript 逻辑。 我省略了对 checkout.js 的调用,因为这对这个问题没有任何影响。

从前端的角度来看,这是桃子。 现在是标记化并实际为卡充电。 这就是事情开始出现问题的地方。 如果您查看令牌处理,我正在尝试将电子邮件、金额和令牌数据发布到 charge.php。 基于我没有从控制台收到任何关于此的错误的事实,我认为这是有效的。

在charge.php中,我有这个: (4月20日更新:这是工作代码)

<?php
  require_once('stripe-php/init.php');

  // Set secret key
  \Stripe\Stripe::setApiKey("sk_test_XXXXXXX");

  // Get the credit card details submitted by the form
  $token = $_POST['tokenid'];

  // Create the charge on Stripe's servers - this will charge the user's card
  try {
    $customer = \Stripe\Customer::create(array(
      'email' => $_POST['email'],
      'source'  => $token
    ));

    $charge = \Stripe\Charge::create(array(
      "amount" => $_POST['amount'],
      "currency" => "usd",
      "customer" => $customer->id
      ));

    echo "success";
  } catch(\Stripe\Error\Card $e) {
    // The card has been declined
    echo "failure";
  }

?>

每当我尝试购买时,日志都会显示“成功错误”。 我大致遵循此处提供的代码 – 如何使用通过 AJAX 发送到 php 的结帐令牌创建条带费用 所以,我不知道成功错误是什么,但我的猜测是数据被发送到charge.php 很好,但卡没有被收费。 我的 Stripe 仪表板不显示任何付款记录这一事实支持了这一点。

我尝试过的:

1) 我认为错误可能是我的 config.php。 我没有使用 Composer(因为我不知道那是什么,也不知道如何开始使用它),所以我从 stripe-php 调用 init.php。 根据 Stripe 自己的文档,这是 Composer 的可接受替代方案。

这是 config.php:

 
 
 
 
  
  
  <?php require_once('php/stripe-php/init.php'); $stripe = array( secret_key => getenv('sk_test_XXXXXX'), publishable_key => getenv('pk_test_XXXXXX') ); \\Stripe\\Stripe::setApiKey($stripe['secret_key']); ?>
 
 
 

不再使用config.php,全部合并成charge.php

2) 在我的POST 调用中,我传递了一个tokenid,但在我的charge.php 中,我使用了stripeToken。 这可能是因为我尝试使用 Stack Overflow 答案和 Stripe 文档来制定完整的解决方案。 我认为没有从我的前端发送 stripeToken 很奇怪。 所以,我想在我的charge.php使用tokenid(更换stripeTokentokenid 。改为tokenid没有工作,并提出安全问题(我宁愿坚持到顺应stripeToken,但我不知道如何实现它) .

3)我担心将金额变量发送到charge.php。 我不希望用户在他们的控制台中更改它,但是如果我不发送它,我不知道如何进行可变定价。 我需要可变定价,因为用户正在选择具有不同价格的多种产品(请参阅:目标)。 所以,这对我来说是另一个难题。

可能值得注意的是,我必须在生产中对此进行测试才能获得成功错误。 在本地主机中,我收到 500 内部服务器错误。 不知道为什么,但猜测与缺乏PHP环境或文件结构有关。

任何帮助将不胜感激! 谢谢你。

您的token回调函数检查是否返回字符串"success"

                success: function(data) {
                    if (data == 'success') {

但是你的charge.php文件没有返回"success" ,它返回

echo '<h1>Successfully charged [amount]!</h1>';

或者

echo '<h1>Charge failed</h1>';

您应该修改您的charge.php文件以返回您的前端代码预期的数据。 由于它是通过 AJAX 调用的,因此浏览器不会显示其输出。

其他几点说明:

  • 您应该在try/catch子句中移动客户创建调用( \\Stripe\\Customer::create(...) )。 使用卡令牌创建客户时,Stripe 将检查卡是否有效,如果不是,则返回卡错误

  • 除了客户应该自己明确选择金额(例如接受客户指定的捐赠)的情况之外,您不应依赖客户浏览器发送的金额,因为更改它非常容易。

暂无
暂无

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

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