重试后Paypal ExpressCheckout与java SDK失败,但客户需要付费

时间:2018-06-05 20:23:03

标签: paypal express-checkout

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

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

我们正在应用首先通过PayPalAPIInterfaceServiceService.setExpressCheckout创建付款令牌的标准方式,然后将客户重定向到Paypal,并通过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还会记录“重试No:1 ......”和“重试No: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用户身上。

1 个答案:

答案 0 :(得分:0)

我不确定这种sdk集成,但PayPal只对一个EC令牌进行一次付款。后续尝试对同一EC令牌进行充电将失败。

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

了解调用GetExpressCheckoutDetails的EC-Token状态的其他方式调用以了解EC令牌的状态。参考文档: https://developer.paypal.com/docs/classic/api/merchant/GetExpressCheckoutDetails_API_Operation_NVP/