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

react-paypal-button-v2 returning the wrong order id

我正在尝试使用订单 ID(之前存储)调试与退款 Paypal 订单(在沙盒环境中)相关的问题。每次我尝试执行退款时,Paypal API 都会 return 一个 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。这是我需要保存的 actual 订单 ID,以便稍后进行退款。但是,我正在为如何检索此值而苦苦挣扎,因为该 id 值似乎只能通过网络可见。通过 onApprove 和 action.order.get() 方法 return 对象仅 return 第一个“假”ID。任何建议将不胜感激。

这是两种不同类型的 ID,订单 ID(仅在买家结账批准期间使用)和 payment/transaction ID(仅在 订单后存在被捕获,并且是任何以后退款或会计目的所需的)

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


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

关注Set up standard payments guide and make 2 routes on your server, one for 'Create Order' and one for 'Capture Order', documented here。两条路线都应该 return 只有 JSON 数据(没有 HTML 或文本)。在第二条路线中,当捕获 API 成功时,您应该将其生成的付款详细信息存储在您的数据库中(特别是前面提到的 purchase_units[0].payments.captures[0].id,它是 PayPal 交易 ID)并执行任何必要的业务逻辑(例如作为发送确认电子邮件或预订产品)立即之前将您的returnJSON转发给前端呼叫者。

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

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