我想设置一次性PayPal付款。我从超文本标记语言调用<script data-page-type="checkout" src="https://www.paypal.com/sdk/js?client-id={my client id}¤cy=CZK&commit=true&intent=capture&debug=true"></script>
来显示按钮。
然后,我在客户端javascript中设置它,如下所示
createOrder: function(data, actions) {
return fetch('/.netlify/functions/transactionProcessor?orderAction=create', {
method: 'post',
}).then(function(functionResponse) {
console.log("order created");
return functionResponse.json();
}).then(function(functionResponseJson) {
return functionResponseJson.id;
});
},
当用户单击该按钮时,将调用createOrder。然后,CreateOrder调用此服务器端代码
async function createOrder(client) {
// Call PayPal to set up a transaction.
const request = new paypal.orders.OrdersCreateRequest();
request.prefer('return=minimal');
request.requestBody({
intent: 'CAPTURE',
purchase_units: [{
amount: {
currency_code: 'CZK',
value: '69.99'
}
}]
});
const order = await client.execute(request);
console.log('order successfuly created');
// Return a successful serverResponse to the client with the order ID.
return { statusCode: 200, body: JSON.stringify({ serverResponse: order, id:
order.result.id }) }
}
这样返回的结果是完全正确的。然后,客户端代码通过在其createOrder方法中返回它来处理它-这里发生了错误。
RESOURCE_NOT_FOUND (https://justpaste.it/resource_not_found_paypal_err)
INVALID_RESOURCE_ID (https://justpaste.it/invalid_resource_id_err)
我完全不知道为什么会发生这种情况,我已经试着修复它好几天了。它能在沙盒里工作。
发布于 2021-06-20 14:06:40
您不应该从客户端执行REST API捕获请求。对PayPal的此接口调用只能从服务器执行。
至于为什么它会在live而不是sandbox中出现无效的配置文件ID,可能是因为您忽略了在上述客户端代码中更新clientID+secret。但是,正如前面提到的,机密(以及您使用它获得的身份验证令牌)决不能从客户端使用。它仅用于服务器端API调用。
发布于 2021-06-20 20:14:05
解决了。我不小心在服务器上使用了沙箱环境。逻辑是process.env.SANDBOX ? sandboxEnv : liveEnv
,但是由于某种原因,process.env变量不起作用(Netlify + Netlify dev)。我将其替换为本地const sandbox = false
。
不敢相信我在这上面花了这么多时间。如果我不是那么愚蠢地摆弄它,我永远也找不到它。
https://stackoverflow.com/questions/68049863
复制相似问题