OAuthTokenCredential不活跃

时间:2015-02-17 15:03:02

标签: java paypal paypal-rest-sdk

我开发了一个网络平台,允许我们的客户(不止一个)使用PayPal REST API接收付款。

正在开发中,一切运行良好,但在生产中,经过一段时间的不活动后,看起来需要重新生成所需的身份验证令牌。

为了处理多个客户,当密钥是customer_id和payment_method_id之间的组合并且值是POJO时,我使用同步的HashMap,包含令牌和创建日期。

令牌是当前的OAuthTokenCredential,由以下代码生成:

Properties p = new Properties();

// Evaluate the right endpoint
if (STATUS_ACTIVE) {
    p.put("service.EndPoint", "https://api.paypal.com");
}
else {
    p.put("service.EndPoint", "https://api.sandbox.paypal.com");
}

p.put("clientID", clientId);
p.put("clientSecret", clientSecret);
p.put("http.ConnectionTimeOut", "5000");
p.put("http.Retry", "1");
p.put("http.ReadTimeOut", "30000");
p.put("http.MaxConnection", "100");
p.put("http.UseProxy", "false");

Payment.initConfig(p);

OAuthTokenCredential tokenGen = new OAuthTokenCredential(
    clientId,
    clientSecret
);

问题是用户无法购买,因此这是我需要快速解决的错误。

我从paypal收到的消息如下:

Error Code 401 with response : Server returned HTTP response code 401 for url https://api.paypal.com/v1/payments/payment

您知道OAuthTokenCredential有效期是否有超时? 我使用junit测试了代码,因此,令牌生成并正确缓存。

现在我有一个5' (300秒)令牌超时。做这件事有最好的做法吗?有什么我错的吗?

非常感谢,Davide。

1 个答案:

答案 0 :(得分:0)

是的,PayPal发布的访问令牌将在一段时间后过期,请参阅How PayPal uses OAuth 2.0。返回有效期,并将访问令牌请求作为参数expires_in(以秒为单位):

{
  "scope": "https://api.paypal.com/v1/payments/.* ...",
  "access_token": "...",
  "token_type": "Bearer",
  "app_id": "...",
  "expires_in": 28800
}

PayPal沙盒环境(如上所述)的典型访问令牌生存时间为8小时,Live环境为15分钟。如果您的实施需要更长的令牌生命周期,您可以联系PayPal的技术支持。

Java REST SDK的OAuthTokenCredentialexposes a method expiresIn(),可用于检查剩余的有效期:值<= 0表示已过期的令牌,可用于在发出请求之前检查当前令牌的有效性(使用此方法时,您应该使用一些缓冲区) 或者,您可以检查401响应状态并在必要时触发重新获取令牌 - 您应始终确保您的实现处理此情况。