PayPal Orders v2 在传递金额折扣时创建返回 422(无法处理的实体)

Posted

技术标签:

【中文标题】PayPal Orders v2 在传递金额折扣时创建返回 422(无法处理的实体)【英文标题】:PayPal Orders v2 create returning 422 (Unprocessable Entity) when passing amount discount 【发布时间】:2021-01-26 05:39:33 【问题描述】:

我正在使用 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'
    

我检查了,这似乎是有效的?

我在这里做错了吗?

【问题讨论】:

偶然发现 this 可能会有所帮助 - 您似乎需要指定:"breakdown": "item_total": "discount": @jibsteroos 是的,我注意到了,但我认为它不是必需的,因为它声明“如果请求包含 purchase_units[].items[].unit_amount 则为必需” - 我没有包括在内,但无论如何我都会试一试:) 【参考方案1】:

它有助于从 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,您需要告诉贝宝在应用这样的“折扣”之前加起来是75(!) 的东西是什么。否则这个“折扣”值本身是没有意义的,PayPal 不知道如何处理它,随后会出现 422 Unprocessable 错误以消除对这种情况的任何歧义。


旁注...

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

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

【讨论】:

啊,谢谢。是的,我没有在控制台中看到 JSON,但你是对的,它在网络选项卡中。关于 REST 也有好处,它都只是捆绑在 REST 部分下,所以请原谅这个错误。

以上是关于PayPal Orders v2 在传递金额折扣时创建返回 422(无法处理的实体)的主要内容,如果未能解决你的问题,请参考以下文章

Rails:Paypal 端点 /v2/checkout/orders 返回 http 401

Paypal 显示一个金额,但收取另一个金额

我在哪里使用其余 API 设置 PayPal 付款的折扣值?

Paypal 以折扣方式将多个商品添加到购物车

PayPal Checkout (Orders v2) 自动填写账单地址

Paypal Express Checkout:应用订单折扣