在生产中使用PAYER_ACTION_REQUIRED捕获Paypal支付总是失败



几个星期前,我们开始发现在没有进行任何更改的情况下,使用旧的Paypal Express集成支付失败。他们没有100%失败,但可能是80%-90%。它似乎是任意失败的。

我们按照新的Checkout集成的升级路径,但仍然看到相同的错误。

最后,我们全力投入到使用Orders v2 API的新标准(不是高级!)结帐集成上,取代了旧的Payments V1 API。但这也没有改变什么。

注:所有的集成(旧的,更新的,新的)在Sandbox中都工作得很好。

但是在生产环境中,几乎每个捕获请求都以PAYER_ACTION_REQUIRED错误失败。

步骤如下:

用户点击paypal结账按钮。

按钮的createOrder()方法调用我们的服务器,我们创建了一个POST到https://api.paypal.com/v2/checkout/orders的订单,响应如下:

{
id: '1KC867444K565180X',
status: 'CREATED',
links: [
{
href: 'https://api.paypal.com/v2/checkout/orders/1KC867444K565180X',
rel: 'self',
method: 'GET'
},
{
href: 'https://www.paypal.com/checkoutnow?token=1KC867444K565180X',
rel: 'approve',
method: 'GET'
},
{
href: 'https://api.paypal.com/v2/checkout/orders/1KC867444K565180X',
rel: 'update',
method: 'PATCH'
},
{
href: 'https://api.paypal.com/v2/checkout/orders/1KC867444K565180X/capture',
rel: 'capture',
method: 'POST'
}
]
}

我们重定向到approveURL(因为按钮应该在前端处理它,对吧?)。因此,我们只需将ID返回给按钮的createOrder()方法。

然后,onApprove()回调用orderId和paymentId再次调用我们的服务器。我们还没有捕获付款。相反,我们将获取详细信息以获取送货地址。计算完运费后,我们对订单进行PATCH。然后,我们再次获取详细信息,并验证所有更改是否已正确应用-这就是这种情况。

注:在创建订单后获取详细信息时(因此在它通过按钮onApprove()回调之后,在捕获之前),没有列出更多的approve链接:

{
id: '1KC867444K565180X',
intent: 'CAPTURE',
status: 'APPROVED',
purchase_units: [
{
//...
}
],
payer: {
//...
},
create_time: '2022-07-14T14:41:16Z',
links: [
{
href: 'https://api.paypal.com/v2/checkout/orders/1KC867444K565180X',
rel: 'self',
method: 'GET'
},
{
href: 'https://api.paypal.com/v2/checkout/orders/1KC867444K565180X',
rel: 'update',
method: 'PATCH'
},
{
href: 'https://api.paypal.com/v2/checkout/orders/1KC867444K565180X/capture',
rel: 'capture',
method: 'POST'
}
]
}

到目前为止,沙盒和产品的行为完全相同。但是当我们现在尝试捕获付款时,沙箱工作正常,但是生产返回如下:

{
name: 'UNPROCESSABLE_ENTITY',
details: [
{
issue: 'PAYER_ACTION_REQUIRED',
description: 'Payer needs to perform the following action before proceeding with payment.'
}
],
message: 'The requested action could not be performed, semantically incorrect, or failed business validation.',
debug_id: '160e81e8cc53f',
links: [
{
href: 'https://developer.paypal.com/docs/api/orders/v2/#error-PAYER_ACTION_REQUIRED',
rel: 'information_link',
method: 'GET'
}
]
}

我们完全不知道如何处理这条消息。文档建议订单需要付款人的操作(例如3DS认证)。将付款人重定向到"rel&; "payer-action"在授权或捕获订单之前,作为响应的一部分返回的HATEOAS链接。"——但是没有这样的联系。另外,订单状态已经是APPROVED了。

任何帮助都将是非常感激的。

这可能与在捕获之前修补订单有关,需要重新批准。


调整此演示中的错误处理代码,以便在问题为PAYER_ACTION_REQUIRED时也调用actions.restart()

,

if (errorDetail && ['INSTRUMENT_DECLINED', 'PAYER_ACTION_REQUIRED'].includes(errorDetail.issue) ) {

或者,你可以使用原始订单创建中的rel:approvehref来代替按钮JS,并重定向到它。

此错误是由于EBA PSD2.0法规。任何订单通过EMEA地区发行的信用卡支付,捕获金额高于创建订单金额,将被拒绝并显示错误代码。以下是PayPal对过度捕获的改变:https://www.paypal.com/ae/smarthelp/article/FAQ4645

最新更新