Javascript 完全被条状结帐卡住了

Javascript 完全被条状结帐卡住了,javascript,php,stripe-payments,Javascript,Php,Stripe Payments,目标:屏幕上有几个按钮,就像这样- [产品1–20美元] [产品2–35美元] 等等 用户可以选择任意数量的产品。在JavaScript中,我有一个变量amount,当用户选择产品时,该变量会增加产品的成本。所以流程是这样的: 用户选择产品1和产品2-->金额=20+35=55 然后,用户可以按“凭卡支付”按钮启动条带结账模式。填好,付钱,完成 问题:现在,我使用的是定制按钮版本的Checkout,因此我可以按自己的方式设置按钮样式,并将此可变金额输入。因此,该实现非常简单: va

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

[产品1–20美元]

[产品2–35美元]

等等

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

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

然后,用户可以按“凭卡支付”按钮启动条带结账模式。填好,付钱,完成

问题:现在,我使用的是定制按钮版本的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日更新:这是工作代码)


每当我尝试购买时,日志都会显示“Success Error”(成功错误)。所以,我不知道什么是成功错误,但我猜数据被发送到charge.php很好,但卡没有收费。我的Stripe dashboard没有显示任何付款记录,这一事实支持了这一点

我尝试过的:

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。这可能是因为我尝试使用堆栈溢出答案和Stripe文档来设计一个完整的解决方案。我觉得很奇怪,stripeToken没有从我的前端发送过来。因此,我尝试在我负责的tokenid.php中使用tokenid(将
stripeToken
替换为
tokenid
。更改为tokenid不起作用,并带来了安全问题(我宁愿使用符合要求的stripeToken,但我不知道如何实现它)

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

可能值得注意的是,我必须在生产中测试这一点,甚至获得成功。在localhost中,我得到一个500内部服务器错误。不知道为什么,但猜测这与缺少PHP环境或文件结构有关


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

您的
令牌
回调函数检查是否返回字符串
“success”

                success: function(data) {
                    if (data == 'success') {
但是您的
charge.php
文件不会返回
“success”
,而是返回

echo '<h1>Successfully charged [amount]!</h1>';
echo“已成功收取[金额]!”;

echo“充电失败”;
您应该修改
charge.php
文件以返回前端代码所需的数据。因为它是通过AJAX调用的,所以浏览器不会显示它的输出

其他几点意见:

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

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


您的
令牌
回调函数检查是否返回字符串
“success”

                success: function(data) {
                    if (data == 'success') {
但是您的
charge.php
文件不会返回
“success”
,而是返回

echo '<h1>Successfully charged [amount]!</h1>';
echo“已成功收取[金额]!”;

echo“充电失败”;
您应该修改
charge.php
文件以返回前端代码所需的数据。因为它是通过AJAX调用的,所以浏览器不会显示它的输出

其他几点意见:

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

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


谢谢,我到电脑前会试试这个。在这种情况下,是否有更好的方法发送金额?修复了从charge.php传递到前端的字符串。那也不行。我在控制台中记录了要传回的数据,发现了一个空字符串。作为测试,尝试在try catch之外回显字符串,但发现它也没有被传回。这不仅仅是传递字符串的问题,也不是在条带中创建费用。删除文件中除了回音以外的所有内容都有效,所以我很困惑。有什么想法吗?@Sha