Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Payflow Pro:阻止重复发票ID不起作用_Java_Paypal_Payment Gateway_Paypal Sandbox - Fatal编程技术网

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

Java Payflow Pro:阻止重复发票ID不起作用,java,paypal,payment-gateway,paypal-sandbox,Java,Paypal,Payment Gateway,Paypal Sandbox,我的web应用程序存在重复支付交易。它用来打电话到PayPal网关,通过PayPal处理用户付款 作为一个短期解决方案,我们决定按照本文的建议传递INV NUM,以便PayPal可以跟踪它并拒绝具有相同发票ID的交易,以及相应的错误代码和消息 在测试修复程序时,我仍然获得重复事务的statusCode0和事务消息APPROVED。但是,对于重复交易,duplicate标志设置为true,我相信这会将其标识为重复交易,但我不明白这是否意味着交易未成功处理,意味着用户未再次收费。 发票生成方法如下所

我的web应用程序存在重复支付交易。它用来打电话到PayPal网关,通过PayPal处理用户付款

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

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

重复事务将把标志
duplicate
设置为
1
。 这种行为要求我处理额外的情况,例如,当原始交易因无效的卡过期日期而失败,并且第二笔交易以有效的过期日期发送时。在这种情况下,我必须生成新的req ID,否则我仍然会从原始事务中得到失败的响应

注意:将责任推给支付供应商只是针对重复的额外措施,不应被视为问题的主要解决方案。这就是为什么我必须重新设计我的支付工作流程,以确定重复交易,然后再打电话给支付供应商,并以适当的方式处理它