Javascript PayPal智能按钮和REST签出SDK-SyntaxError:JSON输入意外结束或预期传递订单id
我正在尝试用实现PayPal的智能按钮,并使用服务器端调用API 但是,我对它的Javascript PayPal智能按钮和REST签出SDK-SyntaxError:JSON输入意外结束或预期传递订单id,javascript,php,json,paypal,paypal-rest-sdk,Javascript,Php,Json,Paypal,Paypal Rest Sdk,我正在尝试用实现PayPal的智能按钮,并使用服务器端调用API 但是,我对它的createOrder部分有一些问题 JS代码: paypal.Buttons({ style: { size: 'responsive', layout: 'vertical' }, createOrder: function() { return fetch(blm_custom_vars.wp_home + 'classes/paypal/
createOrder
部分有一些问题
JS代码:
paypal.Buttons({
style: {
size: 'responsive',
layout: 'vertical'
},
createOrder: function() {
return fetch(blm_custom_vars.wp_home + 'classes/paypal/paypal-create-order.php', {
method: 'post',
headers: {
'content-type': 'application/json'
}
}).then(function(res) {
return res.json();
}).then(function(data) {
return data.id;
});
},
onApprove: function(data) {
return fetch(blm_custom_vars.wp_home + 'classes/paypal/paypal-capture-order.php', {
method: 'post',
headers: {
'content-type': 'application/json'
},
body: JSON.stringify({
orderID: data.id
})
}).then(function(res) {
return res.json();
}).then(function(details) {
alert('Transaction funds captured from ' + details.payer_given_name);
})
},
}).render('.purchase-modal');
paypal-create-order.PHP中的PHP代码:
现在,当我有$debug=true
时,服务器会输出正确的响应。那里什么也看不见。尽管我必须关闭调试以避免其他JSON错误
因此,一旦我关闭它,我就会得到错误:
SyntaxError:JSON输入意外结束
我想这是因为createOrder脚本返回数据而不是输出数据,所以它是一个空页面?但贝宝就是这么说的
所以我试着把它改成:echo-json\u-encode($response)代码>然后我得到另一个错误:
应传递订单id
在JS中,我最初有以下内容:
}).then(function(data) {
return data.orderID;
});
…但随后意识到createOrder脚本返回的数组引用的是id
,而不是orderID
,因此我将其更改为return data.id代码>但它没有帮助
我在这里做错了什么?只需确保您在回显/返回整个响应,或者至少是带有{“id”:“…”}
您可以在浏览器的“开发工具”网络选项卡中查看发生了什么
因此,从PHP开始,执行以下操作:
echo json_encode($response->result, JSON_PRETTY_PRINT);
…应该可以,但是在$debug=true if块的下面/外面,上面或周围没有任何其他打印行或回显行,因为您必须输出有效的JSON,并且只输出有效的JSON(让执行createOrder获取的JS能够解析它)好的,我看到了问题。由于PayPal提供的示例代码返回了$response
,因此我试图回应这一点,这导致了问题。但将其更改为$response->result
似乎已经解决了这个问题。我假设return$response
可以被这个函数删除/替换?该函数可以返回对象,以防调用者需要使用它
echo json_encode($response->result, JSON_PRETTY_PRINT);