【问题标题】:Paypal Checkout client integration - Problem with returning order id promisePaypal Checkout 客户端集成 - 返回订单 ID 承诺的问题
【发布时间】:2020-10-21 03:08:36
【问题描述】:

我在集成 paypals 支付网关时遇到问题。我使用 javascript 作为客户端,python 作为后端和 checkouts v2 api。

在后端创建订单没有问题,但是在等待我的服务器响应时,createOrder 函数会引发错误:

unhandled_error 
Object { err: "Expected an order id to be passed\nLe/</<@https://www.sandbox.paypal.com/smart/buttons?style.layout=vertical&style.color=blue&style.shape=rect&style.tagline=false&components.0=buttons&locale.country=NO&locale.lang=no&sdkMeta=eyJ1cmwiOiJodHRwczovL3d3dy5wYXlwYWwuY29tL3Nkay9qcz9jbGllbnQtaWQ9QWJmSjNNSG5oMkFIU1ZwdXl4eW5lLXBCbHdJZkNsLXpyVXc1dzFiX29TVUloZU01LXNMaDNfSWhuTnZkNUhYSW5wcXVFdm5MZG1LN0xOZ1gmZGlzYWJsZS1mdW5kaW5nPWNyZWRpdCxjYXJkIiwiYXR0cnMiOnt9fQ&clientID=AbfJ3MHnh2AHSVpuyxyne-pBlwIfCl-zrUw5w1b_oSUIheM5-sLh3_IhnNvd5HXInpquEvnLdmK7LNgX&sessionID=e2ea737589_mtc6mtu6mdi&buttonSessionID=de4bfb3626_mtc6mjm6mtk&env=sandbox&fundingEligibility=eyJwYXlwYWwiOnsiZWxpZ2libGUiOnRydWV9LCJjYXJkIjp7ImVsaWdpYmxlIjpmYWxzZSwiYnJhbmRlZCI6dHJ1ZSwidmVuZG9ycyI6eyJ2aXNhIjp7ImVsaWdpYmxlIjp0cnVlfSwibWFzdGVyY2FyZCI6eyJlbGlnaWJsZSI6dHJ1ZX0sImFtZXgiOnsiZWxpZ2libGUiOnRydWV9LCJkaXNjb3ZlciI6eyJlbGlnaWJsZSI6ZmFsc2V9LCJoaXBlciI6eyJlbGlnaWJsZSI6ZmFsc2V9LCJlbG8iOnsiZWxpZ2libGUiOmZhbHNlfSwiamNiIjp7ImVsaWdpYmxlIjpmYWxzZX19…", timestamp: "1593537805136", referer: "www.sandbox.paypal.com", sessionID: "e2ea737589_mtc6mtu6mdi", env: "sandbox", buttonSessionID: "de4bfb3626_mtc6mjm6mtk" }
Error: Expected an order id to be passed 
Error: Expected an order id to be passed 
12V21085461823829  // ticks in a few seconds later

Console screenshot

问题似乎是 createOrder 在引发错误之前没有等待承诺,或者承诺没有以正确的方式给出。类似的东西。无论如何这里是客户端代码:

paypal.Buttons({
    
    // button styling removed for clarity

    createOrder: function() {
        // purchase information 
        var data =  {
            'track_id': vm.selectedTrack.id,
            'lease_id': vm.selectedLease.id,
        }
        
        // post req to api with lease and track ids 
        // create payment on server side
        fetch('http://localhost:5000/api/paypal/create-purchase', {
            method: 'post',
            headers: {
                'content-type': 'application/json'
            },
            body: JSON.stringify(data),
        }).then(function(res) {
            return res.json();
        }).then(function(data) {
            console.log(data.order_id)
            return data.order_id
        })
    }
// conatiner element to render buttons in
}).render('#paypal-button');

和服务器端:

@app.route('/api/paypal/create-purchase', methods=['POST'])
def paypal_create_purchase():

    # cart validation removed for clarity

    # create paypal purchase

    environment = SandboxEnvironment(client_id=app.config['PAYPAL_PUBLIC'], client_secret=app.config['PAYPAL_PRIVATE'])
    client = PayPalHttpClient(environment)

    paypal_request = OrdersCreateRequest()
    paypal_request.prefer('return=representation')
    paypal_request.request_body (
        {
            "intent": "CAPTURE",
            "purchase_units": [
                {
                    "amount": {
                        "currency_code": "USD",
                        "value": lease.price
                    }
                }
            ]
        }
    )
    try:
        # Call API with your client and get a response for your call
        response = client.execute(paypal_request)
        order = response.result
        print(order.id)

    except IOError as ioe:
        print (ioe)
        if isinstance(ioe, HttpError):
            # Something went wrong server-side
            print(ioe.status_code)

    # note that it is the same key as on the client
    return jsonify(success=True,order_id=order.id)
    

我发现了这个similar thread,但我不认为错误的来源与该线程中的相同(客户端上的 json 密钥不正确)

另请参阅提供此代码的相关page in the docs

createOrder: function() {
    return fetch('/my-server/create-paypal-transaction', {
        method: 'post',
        headers: {
            'content-type': 'application/json'
        }
    }).then(function(res) {
        return res.json();
    }).then(function(data) {
        return data.orderID; // Use the same key name for order ID on the client and server
    });
}

【问题讨论】:

    标签: javascript python-3.x paypal promise fetch


    【解决方案1】:

    该死,就在我输入帖子的最后一部分时,我注意到了错误。在我的 fetch 调用之前缺少 return。会把这个留给有同样错误的其他人。

    【讨论】:

    • 丢失退货很常见。 StackOverflow 充满了问题所在。
    • 由你决定。我只是轻轻地朝那个方向轻推你。 :-)
    • 我也犯了同样的愚蠢错误。返回返回创建方法并且还返回 axios 帖子。谢谢...
    猜你喜欢
    • 2018-01-05
    • 2019-03-21
    • 2018-04-20
    • 2015-09-10
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多