react-paypal-button-v2 返回错误的订单 ID

Posted

技术标签:

【中文标题】react-paypal-button-v2 返回错误的订单 ID【英文标题】:react-paypal-button-v2 returning the wrong order id 【发布时间】:2021-11-30 03:31:51 【问题描述】:

我试图调试与使用订单 ID(之前存储的)退款 Paypal 订单(在沙盒环境中)相关的问题。每次我尝试退款时,Paypal API 都会返回一个INVALID_RESOURCE_ID 错误,这意味着不存在这样的订单。经过多次调试,我对存储该订单ID时的初始过程做出了启示。以下方法是我检索和存储所述订单 ID 的方式:

    const onApprove = (data, actions) => 
        // Redux method of saving checkout in backend with order ID via using data.orderID
        dispatch(saveCheckout(data.orderID);
        return actions.order.capture();
    

<PayPalButton
   amount=totalPrice
   currency= "AUD"
   createOrder=(data, actions) => createOrder(data, actions)
   onApprove=(data, actions) => onApprove(data, actions)
   options= 
      clientId: "<placeholder>",
      currency: "AUD"
   
/>

我正在使用文档中推荐的 data.orderID,但是,在检查网络选项卡时,显示以下内容:

"id":"5RJ421191B663801G","intent":"CAPTURE","status":"COMPLETED","purchase_units":["reference_id":"default","amount":"currency_code":"AUD","value":"24.00","payee":"email_address":"sb-sg4zd7438633@business.example.com","merchant_id":"EJ7NSJGC6SRXQ","shipping":"name":"full_name":"John Doe","address":"address_line_1":"1 Cheeseman Ave Brighton East","admin_area_2":"Melbourne","admin_area_1":"Victoria","postal_code":"3001","country_code":"AU","payments":"captures":["id":"7A2856455D561633D","status":"COMPLETED","amount":"currency_code":"AUD","value":"24.00","final_capture":true,"seller_protection":"status":"ELIGIBLE","dispute_categories":["ITEM_NOT_RECEIVED","UNAUTHORIZED_TRANSACTION"],"create_time":"2021-10-11T00:40:58Z","update_time":"2021-10-11T00:40:58Z"]],"payer":"name":"given_name":"John","surname":"Doe","email_address":"sb-432azn7439880@personal.example.com","payer_id":"KMEQSKCLCLUZ4","address":"country_code":"AU","create_time":"2021-10-11T00:40:48Z","update_time":"2021-10-11T00:40:58Z","links":["href":"https://api.sandbox.paypal.com/v2/checkout/orders/5RJ421191B663801G","rel":"self","method":"GET"]

onApprove保存的id是5RJ421191B663801G,但是capturesid下还有一个ID是7A2856455D561633D。这是我需要保存的 实际 订单 ID,以便以后进行退款。但是,我正在努力如何检索该值,因为该 id 值似乎只能通过网络看到。通过 onApprove 和 action.order.get() 方法返回的对象只返回第一个“假”id。任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

这是两种不同类型的 ID,订单 ID(仅在买家结帐批准期间使用)和付款/交易 ID(仅在捕获订单之后存在,并且是用于以后的退款或会计目的)

由于您在客户端使用actions.order.capture() 进行捕获,因此您需要在此处添加.then(function(data) ... ) 来处理捕获数据(尤其是data.purchase_units[0].payments.captures[0].id)。这是您用于退款的 ID。


在实际的最佳实践中,如果需要对捕获 ID 执行任何重要操作(例如将其存储在数据库中以供参考),则不应在客户端创建和捕获订单,而是调用服务器将执行数据库写入的端集成。

按照Set up standard payments 指南在您的服务器上创建两条路线,一条用于“创建订单”,一条用于“捕获订单”documented here。两个路由都应该只返回 JSON 数据(没有 html 或文本)。在第二条路线中,当捕获 API 成功时,您应该将其生成的付款详细信息存储在您的数据库中(特别是前面提到的purchase_units[0].payments.captures[0].id,这是 PayPal 交易 ID)并执行任何必要的业务逻辑(例如发送确认电子邮件或预订product) 立即将您的返回 JSON 转发给前端调用者。

将这 2 条路由与前端审批流程配对:https://developer.paypal.com/demo/checkout/#/pattern/server

或者react,使用官方react-paypal-js

【讨论】:

您好,感谢您的帮助。我已听从您的建议,并设法检索所述交易 ID 以进行退款并将其存储在我的后端。但是,当我尝试执行退款时,它现在会给出RESOURCE_NOT_FOUND 错误响应。任何想法为什么会这样? 很可能是错误的帐户凭据

以上是关于react-paypal-button-v2 返回错误的订单 ID的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在后端 Nodejs 中处理付款?

指定货币 SGD 的 PayPal API

React Paypal 按钮意图

如何在 React 和 Flask 中检测过期的 PayPal 订阅?

SQL 查询返回 0 行,而 DB 中返回 2

AudioRecorder.getMinBufferSize() 返回 -2