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

问题描述

我的网络应用程序受到重复支付交易的影响。它使用 Payflow Pro JAVA SDK 调用 PayPal Gateway 来处理用户通过 PayPal 的付款。

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

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

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 文档之后,我得到了问题的答案。 在我与 PayPal 集成的情况下,独特的 INV NUM 方法不起作用。 为了解决问题,我需要为交易生成并设置唯一的 Req Id。有关 X-VPS-REQUEST-ID 标头的更多详细信息是 here。 PayPal 将收到的请求 ID 存储在请求表中,因此当您发送新交易时,它会检查之前是否使用过此类请求 ID,如果是,则将交易视为重复交易并返回原始交易的响应:

重要提示:如果您使用以前使用过的 X-VPS-REQUEST-ID,服务器忽略新数据并返回 对与该相关联的原始交易的响应 X-VPS-REQUEST-ID。

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

注意:让支付供应商承担责任只是防止重复的额外措施,不应被视为问题的主要解决方案。这就是为什么我必须在致电支付供应商并以适当方式处理之前重新设计我的支付工作流程以确定重复交易。