Laravel出现Stripe.js错误


Stripe.js error with Laravel

我似乎对Stripe.js有问题,我正在使用Laravel作为出纳的框架。

我使用stripe.js,这样我就不会通过服务器传递和信用卡数据,也不会存储任何数据。到目前为止,浏览器似乎出现了问题。让我进一步解释一下,Chrome可以工作,Firefox和Internet Explorer不可以。

在Chrome上:当前提交字段时,表单的行为与预期一致。当您按下提交按钮时,它将显示卡片错误。例如,卡号、过期月份等(它会验证它)。

在Firefox和IE上:该表格不会进行验证,而是说:

A network error has occurred, and you have not been charged. Please try again.

并且会自动提交表格,而不会告知卡号是否被接受等。此外,当你提交表格时,它会直接进入Laravel错误页面,上面写着:

Missing required param: card

我认为这意味着stripe.js没有被完全使用,也许表单没有注意到自定义js。

Stripe.js

$(document).ready(function() {
    Stripe.setPublishableKey('pk_test_HdoLAxfuWl53vjchF01fMphS');
    $('#subscription-form button').on('click', function() {
        var form                    = $('#subscription-form');
        var submit                  = form.find('button');
        var submitInitialText       = submit.text();
        submit.attr('disabled', 'disabled').text('Just one moment...');
        Stripe.card.createToken(form, function(status, response) {
            var token;
            if(response.error) {
                form.find('.stripe-errors').text(response.error.message).show();
                submit.removeAttr('disabled');
                submit.text(submitInitialText);
                return false;
            } else {
                token = response.id;
                form.append($('<input type="hidden" name="token">').val(token));
                form.submit();
            }
        });
    });
});

你可以在上试用该应用程序http://account.mcjoin.us最好告诉我可能的问题。永远,谢谢你的帮助!

我的问题的解决方案非常明显;Internet Explorer和Firefox没有贬值e.preventDefault();

这可能令人困惑,但让我解释一下。在Chrome上,e.preventDefault()是不必要的,它所做的是阻止默认的表单函数。在Internet Explorer或Firefox上,如果不存在,Javascript将无法"劫持"表单并执行它需要执行的操作。因此,添加e.preventDefault()将使表单没有默认交互。

现在让我们进一步研究代码,这里是stripe.js:

$(document).ready(function() {
    Stripe.setPublishableKey('pk_live_DdMQOXgak0v4yS0yH7vnsHqu');
    $('#subscription-form button').on('click', function(e) {
        var form = $('#subscription-form');
        var submit = form.find('button');
        var submitInitialText = submit.text();
        submit.attr('disabled', 'disabled').text('Just one moment...');
        e.preventDefault();
        Stripe.card.createToken(form, function(status, response) {
            var token;
            if(response.error) {
                form.find('.stripe-errors').text(response.error.message).show();
                submit.removeAttr('disabled');
                submit.text(submitInitialText);
            } else {
                token = response.id;
                form.append($('<input type="hidden" name="token">').val(token));
                form.submit();
            }
        });
    });
});

就是这样!就这么简单!

我看了一下您的页面,但它需要身份验证。我怀疑你得到这个结果是因为有一个只发生在Firefox和IE上的JavaScript错误,阻止了Stripe.js代码的工作。我会查看错误控制台。删除页面上可能存在的所有其他JavaScript并重新测试也将证实这一理论。

我还会更新你的服务器端代码,这样在没有代币的情况下就不会进行收费尝试。

干杯,拉里

PS我在Stripe从事支持工作。