通过金额折扣时,贝宝订单v2创建返回422不可处理实体

问题描述

我正在使用PayPal REST SDK客户端JavaScript来create an order,并且具有以下代码

    paypal.Buttons({
    style: {
        size: 'responsive',layout: 'vertical'
    },createOrder: function(data,actions) {
        // This function sets up the details of the transaction,including the amount and line item details.
        return actions.order.create({
            intent: 'CAPTURE',purchase_units: [{
                amount: {
                    currency_code: 'AUD',value: '70.00',breakdown: {
                        discount: {
                            currency_code: 'AUD',value: '5.00'
                        }
                    }
                },description: 'xxxxxxxxxxx'
                // custom_id: '',}]
        });
    },onApprove: function(data,actions) {
        // This function captures the funds from the transaction.
        return actions.order.capture().then(function(details) {
            // This function shows a transaction success message to your buyer.
            alert('Transaction completed by ' + details.payer.name.given_name);
        });
    }
}).render('.purchase-modal');

}

这将返回上述错误和状态代码422 (Unprocessable Entity)

这段代码似乎是问题所在,如果将其删除错误就会消失:

breakdown: {
    discount: {
        currency_code: 'AUD',value: '5.00'
    }
}

我检查了,这似乎有效吗?

在这里做错什么了吗?

解决方法

它有助于从JavaScript控制台或浏览器的“网络”标签中读取整个JSON响应错误消息。

{
   "name":"UNPROCESSABLE_ENTITY","details":[
      {
         "field":"/purchase_units/0/amount/value","value":"70.00","issue":"AMOUNT_MISMATCH","description":"Should equal item_total + tax_total + shipping + handling + insurance - shipping_discount - discount."
      }
   ],"message":"The requested action could not be performed,semantically incorrect,or failed business validation.","debug_id":"3c22979dc723a","links":[
      {
         "href":"https://developer.paypal.com/docs/api/orders/v2/#error-AMOUNT_MISMATCH","rel":"information_link","method":"GET"
      }
   ]
}

请特别注意“说明”中的消息。

因此,您已经有了。如果指定的总值为70,折扣为5,则您需要告诉PayPal在发生“折扣”之前总计为75(!)的东西应用。否则,此“折扣”值本身是没有意义的,PayPal不知道该如何处理,并且出现422无法处理的错误,从而消除了有关情况的任何歧义。


旁注...

您此处未使用“ REST SDK”,因为它专用于服务器端。客户端代码是JavaScript SDK。如果确实要使用兼容的REST API进行服务器端集成(推荐),请在服务器上实现两条路由,一条用于“设置事务”,一条用于“捕获事务”,在此处记录:https://developer.paypal.com/docs/checkout/reference/server-integration/

然后将您的JavaScript代码更改为服务器演示的https://developer.paypal.com/demo/checkout/#/pattern/server,并链接到您的这两个路由