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 Express Checkout 的集成(基本集成 checkout.js 版本 4.0.0)
PayPal Rest API Express Checkout 工作流程