【问题标题】:Paypal ExpressCheckout with java SDK fails after retries, however customer is charged使用 java SDK 的 Paypal ExpressCheckout 重试后失败,但向客户收费
【发布时间】:2018-11-15 10:19:01
【问题描述】:

我负责市场业务中的 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还记录了“Retry No : 1 ...”和“Retry 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 用户是否也会发生这种情况。

【问题讨论】:

    标签: paypal express-checkout


    【解决方案1】:

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

    当客户抱怨多次收费时,您能否检查是否有针对该用例生成的多个 EC 令牌?

    通过调用 GetExpressCheckoutDetails 来了解 EC-Token 状态的其他方法。参考文档: https://developer.paypal.com/docs/classic/api/merchant/GetExpressCheckoutDetails_API_Operation_NVP/

    【讨论】:

    • 谢谢!是的,我已经按照您提到的方式检查了付款详情,并且收到了 SUCCESS 消息。我们现在将实施一种解决方法,以在此类付款失败后检查付款结果以检测到这一点,但它不应该是那样......关于多次收费,你是对的,客户每次尝试只收取一次费用,但是他们实际上多次尝试并多次遇到这种情况。我会更新我的问题。
    猜你喜欢
    • 2014-12-20
    • 2020-12-10
    • 2016-10-09
    • 1970-01-01
    • 2011-10-29
    • 2013-02-24
    • 2020-04-30
    • 2011-01-24
    • 2020-11-08
    相关资源
    最近更新 更多