【发布时间】:2016-03-28 07:57:18
【问题描述】:
我正在使用 Stripe Checkout.js 创建付款。我正在创建一个处理程序,成功时会向服务器发送一个令牌:
let handler = StripeCheckout.configure({
key: 'my_key',
image: 'image.png',
locale: 'auto',
token: token => {
console.log(token.id);
// ... send token to server
}
});
然后我使用处理程序创建一个令牌:
handler.open({
name: 'Test',
description: 'test',
billingAddress: false,
currency: 'eur',
amount: '1200',
});
这个处理程序触发测试 checkout.js 弹出窗口,我填写并点击支付。成功结束,表示按钮显示为绿色。
但是在按钮显示绿色的那一刻和令牌打印到控制台的那一刻(在处理程序成功回调上)之间,会抛出一个错误:
例外:TypeError:将循环结构转换为 JSON
堆栈跟踪的主要部分是这样的:
TypeError: Converting circular structure to JSON
at Object.stringify (native)
at Object.stringify (http://localhost:5000/dist/client/bundle.js:46294:29)
at RPC.sendMessage (https://checkout.stripe.com/checkout.js:1:18068)
at RPC.sendMessage (https://checkout.stripe.com/checkout.js:1:16180)
at https://checkout.stripe.com/checkout.js:1:17137
at RPC.ready (https://checkout.stripe.com/checkout.js:1:17416)
at RPC.invoke (https://checkout.stripe.com/checkout.js:1:17084)
at RPC.invoke (https://checkout.stripe.com/checkout.js:1:16180)
at RPC.processMessage (https://checkout.stripe.com/checkout.js:1:18899)
at RPC.processMessage (https://checkout.stripe.com/checkout.js:1:16180)
通过检查代码,我们发现问题出在此处:
RPC.prototype.sendMessage = function(method, args) {
var err, id, message, _ref;
if (args == null ) {
args = []
}
id = ++this.rpcID;
if (typeof args[args.length - 1] === "function") {
this.callbacks[id] = args.pop()
}
message = JSON.stringify({
method: method,
args: args,
id: id
});
Checkout.js 似乎创建了一个消息对象,恰好有一个循环引用,然后它尝试在其上调用 JSON.stringify,从而导致错误。
这个错误不是致命的,并且付款已经完成,但是您知道这可能是什么以及如何解决它吗?
或者是否有已知的解决方法。
请注意,根据MDN docs,在将对象传递给postMessage之前调用stringify可能是不必要的。
postMessage 根据this 使用支持循环引用的序列化机制。
【问题讨论】:
-
所以你正在对一些引用自身的对象进行字符串化。只需在没有这些引用的情况下对其进行字符串化。
args是什么? -
stringify 在条带结帐代码上,而不是在应用程序代码上。我已经向 Stripe 报告了这个问题,但在这里发布了这个问题,因为也许有人知道解决方法。此外,由于 Angular 2 处于测试阶段,您永远不会知道
-
你试过用 JSON.stringify 调试这段代码吗?
-
我也有同样的问题,但是付款没有显示在仪表板上。您的交易是否显示在仪表板上?
-
是的,至少在测试仪表板上是这样。我还没有尝试过真正的交易。我也试过用 Chrome 和 Firefox,但没有用其他浏览器