Paypal Checkout 客户端集成 - 返回订单 ID 承诺的问题

Posted

技术标签:

【中文标题】Paypal Checkout 客户端集成 - 返回订单 ID 承诺的问题【英文标题】:Paypal Checkout client integration - Problem with returning order id promise 【发布时间】: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
    );

【问题讨论】:

【参考方案1】:

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

【讨论】:

丢失退货很常见。 *** 充满了问题所在。 由你决定。我只是轻轻地朝那个方向轻推你。 :-) 我也犯了同样的愚蠢错误。返回返回创建方法并且还返回 axios 帖子。谢谢...

以上是关于Paypal Checkout 客户端集成 - 返回订单 ID 承诺的问题的主要内容,如果未能解决你的问题,请参考以下文章

Paypal Express Checkout 付款仍处于待处理状态,然后到期。确认返回 PENDINGREASON=order。

从 Paypal 客户端 REST 集成按钮返回客户信息

卡住了 Paypal Express Checkout 的集成(基本集成 checkout.js 版本 4.0.0)

PayPal Rest API Express Checkout 工作流程

Paypal 的 Express Checkout 上下文集成

为 PayPal 客户端 REST 集成传递项目名称