Paypal ExpressCheckout与java SDK在重试后失败,但会向客户收取费用

Paypal ExpressCheckout与java SDK在重试后失败,但会向客户收取费用,paypal,express-checkout,Paypal,Express Checkout,我负责Paypal支付在市场业务中的集成,我有一个严重的问题,我希望任何人都有经验 我们在merchantsdk版本2.15.122中使用Java中的ExpressCheckout。我知道这不是最新的集成方式,但仍应正常工作 我们采用的标准方法是,首先通过PayPalAPIInterfaceServiceService.setExpressCheckout创建支付令牌,然后将客户重定向到PayPala,然后通过PayPalAPIInterfaceServiceService.doExpressC

我负责Paypal支付在市场业务中的集成,我有一个严重的问题,我希望任何人都有经验

我们在merchantsdk版本2.15.122中使用Java中的ExpressCheckout。我知道这不是最新的集成方式,但仍应正常工作

我们采用的标准方法是,首先通过PayPalAPIInterfaceServiceService.setExpressCheckout创建支付令牌,然后将客户重定向到PayPala,然后通过PayPalAPIInterfaceServiceService.doExpressCheckoutPayment实际执行支付

我不确定实现代码在这里是否有用,因为它已经运行了好几个月,但是几天前一些令人不安的错误开始出现。 我们有多种情况,其中似乎存在某种连接或响应时间问题,导致请求重试。我们在日志中看到执行最终doExpressCheckoutPayment时的读取超时,如下所示:

Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.read(InputRecord.java:503)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:940)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:735)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:347)
at com.paypal.core.HttpConnection.execute(HttpConnection.java:91)
…paypal sdk还记录了“重试次数:1…”和“重试次数:2…”,因此它似乎会重试两次。最后,付款似乎失败,出现以下错误:

com.paypal.exception.HttpErrorException: retry fails..  check log for more information
at com.paypal.core.HttpConnection.execute(HttpConnection.java:144)
at com.paypal.core.APIService.makeRequestUsing(APIService.java:177)
at com.paypal.core.BaseService.call(BaseService.java:265)
at urn.ebay.api.PayPalAPI.PayPalAPIInterfaceServiceService.doExpressCheckoutPayment(PayPalAPIInterfaceServiceService.java:1513)
at urn.ebay.api.PayPalAPI.PayPalAPIInterfaceServiceService.doExpressCheckoutPayment(PayPalAPIInterfaceServiceService.java:1465)
不幸的是,一些愤怒的客户联系了我们,他们似乎在这些重试中收取了费用。有些客户甚至收取两次费用,即每次重试一次

是否有人有过此类错误的经验,并能提供一些正确处理这些错误的见解

提前感谢您的帮助

更新
正如回答中正确指出的那样,Paypal只对单个代币收取一次费用,由于客户在我们的平台上看到支付失败,并多次遇到相同的问题,因此,由于客户的重试,会发生双重费用。因此,多重收费不是一个问题,但我仍然想知道如何正确处理这一问题,或者它是否也会发生在其他Paypal用户身上。

我不确定这种sdk集成,但Paypal只在一个EC令牌上进行一次支付。后续尝试对同一EC令牌收费将失败

当客户抱怨多次收费时,您是否可以检查是否为用例生成了多个EC令牌

另一种了解EC令牌状态的方法是调用GetExpressCheckoutDetails调用了解EC令牌的状态。参考文件:

谢谢!是的,我已经按照您提到的方式检查了付款详细信息,并且收到了成功消息。我们现在将实施一个解决方案,在此类支付失败后检查支付结果,以检测到这一点,但它不应该是这样的。。。关于多重收费,您是对的,客户每次尝试只收取一次费用,但实际上他们尝试了多次,并多次遇到这种情况。我会更新我的问题。