在这里原谅我的天真,但我是一个走向现代的老开发者。简而言之,我有一个用ASP编程的旧网站(我知道,我知道)需要使用Square Checkout API进行非常简单的付款处理。因此,我需要向Square发送JSON请求并处理其响应。我创建了一个非常非常简单的JSON请求,使用Javascript将其发送到Square进行测试,但似乎无法处理响应,“null”。我不知道我是否只是没有得到任何回复和/或我的代码在接收JSON返回时是否不正确。就目前而言,我只是尝试接收响应并将其打印到屏幕上,然后再添加代码进行解析,然后根据API文档重定向回Square。我做错了什么? [请注意,我之前已将onload参数包装到request.response但它没有触发。]
我的代码如下。任何和所有的帮助将是真诚的感谢!
谢谢你, -Joe
<html>
<script>
var obj = {
"idempotency_key": "00000000c",
"order":
{
"reference_id": "00000000c",
"line_items":
[{
"name": "My order",
"quantity": "1",
"base_price_money":
{
"amount": 15,
"currency": "USD"
}
}],
"taxes":
[{
"name": "Sales Tax",
"percentage": "8.5"
}]
},
"ask_for_shipping_address": false,
"merchant_support_email": "confused@myownsamplesite.com",
"redirect_url": "https://www.myownsamplesite.com/success.asp"
}
var myJSON = JSON.stringify(obj);
var request = new XMLHttpRequest();
request.open('POST', 'https://connect.squareup.com/v2/locations/{location_ID_removed_for_security}/checkouts', true);
request.setRequestHeader('Authorization', '{auth_token_removed_for_security}');
request.setRequestHeader('Accept','application/json');
request.setRequestHeader('Content-Type','application/json');
request.responseType = "json";
request.send(myJSON);
var returnJSON = request.response;
document.write(returnJSON);
</script>
</html>
答案 0 :(得分:3)
您正在使用异步请求
request.open('POST', URL, true); // <- true means asynchronous
对于异步请求,您还应该定义
req.onreadystatechange = function () {
if (req.readyState == 4) {
if(req.status == 200)
console.log(req.responseText);
else
console.log("Error loading page\n");
}
};
document.write只能在加载html时执行输出。 因此,您的请求可能正常,但您无法看到它。
您也可以尝试(仅用于调试)同步请求
request.open('POST', URL, false);
和console.log在浏览器控制台中查看输出,或 而不是document.write使用此
document.body.innerHTML += returnJSON
答案 1 :(得分:1)
您没有收到回复。
您绝对 从不使用客户端javascript来存储Square或任何API的访问令牌。人们可以检查您网站的来源,然后可以完全访问您帐户的Square API。为了帮助您记住这一点,Square不响应基于客户端javascript的请求。
您应该使用后端语言来生成结帐表单(您可以通过Sasha描述的ajax调用),或者甚至使用无服务器功能来创建结帐,如下所示:https://medium.com/square-corner-blog/super-simple-serverless-ecommerce-68d2792e8285 < / p>