Payflow Pro:阻止重复的发票 ID 不起作用

Payflow Pro: blocking duplicate invoice IDs does not work

我的网络应用程序存在重复支付交易问题。它使用 Payflow Pro JAVA SDK 调用 PayPal 网关以通过 PayPal 处理用户付款。

作为短期解决方案,我们决定按照此 article 中的建议通过 INV NUM,以便 PayPal 可以跟踪它并拒绝具有相同发票 ID 和相应错误代码的交易和消息。

在测试修复时,我仍然收到 statusCode 0 和重复交易的交易消息 APPROVED。然而,对于重复交易,DUPLICATE 标志设置为真,我认为这将其标识为重复交易,但我不明白这是否意味着交易未成功处理,这意味着用户没有被第二次收费。
发票生成方法如下所示:

Invoice inv = new Invoice();

/* Set Amount. */
Currency amt = new Currency(pip.getFeeAmount(), "USD");
inv.setAmt(amt);
inv.setPoNum(poNum);
// INV NUM e.g.: 988755aa8aeb262a506ec01
inv.setInvNum(pip.getInvNum());
BrowserInfo bi = new BrowserInfo();
bi.setButtonSource(buttonSource);
inv.setBrowserInfo(bi);
return inv;

谁能告诉我为什么它不起作用?

在与 PayPal 技术支持聊天并深入研究 PayPal 文档之后,我得到了问题的答案。 独特的 INV NUM 方法在我与 PayPal 集成的情况下不起作用。 为了解决问题,我需要为交易生成并设置唯一的 Req Id。关于 X-VPS-REQUEST-ID header 的更多详细信息是 here。 PayPal 将收到的请求 ID 存储在请求 table 中,因此当您发送新交易时,它会检查之前是否使用过该请求 ID,如果是,那么它将把该交易视为重复交易并且 return 您对原交易的回复:

Important: If you send in a NEW transaction with a previously used X-VPS-REQUEST-ID, the server ignores the new data and returns the response to the original transaction associated with that X-VPS-REQUEST-ID.

重复交易的标志 DUPLICATE 将设置为 1。 这种行为需要我处理其他情况,例如,当原始交易因卡到期日期无效而失败时,第二笔交易以有效到期日期发送。在这种情况下,我必须生成新的请求 ID,否则我仍然会收到来自原始事务的失败响应。

注意:让付款供应商承担责任只是防止重复的额外措施,不应被视为解决问题的主要方法。这就是为什么我必须重新调整我的支付工作流程以确定重复交易,然后再致电支付供应商并以正确的方式处理它。