为什么我在生产环境中尝试设置 PayPal 付款时不断收到 INVALID_RESOURCE_ID 错误?

问题描述

我想设置一次性 PayPal 付款。我正在从 HTML 调用 <script data-page-type="checkout" src="https://www.paypal.com/sdk/js?client-id={my client id}&currency=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)

我完全不知道为什么会发生这种情况,而且我已经尝试修复它好几天了。它适用于沙盒。

解决方法

您不应该从客户端执行 REST API 捕获请求。这个对 PayPal 的 API 调用只能从服务器执行。

至于为什么在实时而不是沙箱中使用无效的配置文件 ID 出错,您可能忽略了在所述客户端代码中更新 clientID+secret。但是,如前所述,绝不能从客户端使用该机密(以及您通过它获得的身份验证令牌)。它仅用于服务器端 API 调用。

,

解决了。我不小心在服务器上使用了沙箱环境。逻辑是 process.env.SANDBOX ? sandboxEnv : liveEnv,但 process.env 变量由于某种原因不起作用(Netlify + Netlify dev)。我用本地 const sandbox = false 替换了它。

不敢相信我花了这么多时间在这上面。如果我不这么愚蠢地摆弄它,我永远不会发现它。