为什么paypal支付本地好使已发到线上就出问题?发布过了几个小时就调不了paypal的支付接口了,报错:com.paypal.base.HttpConnection - Response code: 401 Error response: {"error":"invalid_token","error_description":"Access Token not found in cache"},我严重怀疑是调用api的token过期了,因为我把项目重新发布一次又好了,但是过了8小时还是会报这个错,我用的是官方的sdk,难道paypal的官方sdk不会自动维护token吗?我自己加上了等token过期前五分钟刷新token的逻辑还加了缓存,但是仍然没用,不清楚是为什么,下面是我管理paypal的配置类:
@Configuration
@EnableScheduling
public class PayPalConfig {
@Resource
private Environment env;
@Bean
public Map<String, String> paypalSdkConfig() {
return Map.of("mode", env.getProperty("spring.pay.paypal.mode"));
}
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("payPalTokenCache");
}
@Caching(
cacheable = @Cacheable(value = "payPalTokenCache", key = "'token'"),
put = @CachePut(value = "payPalTokenCache", key = "'token'")
)
@Bean
public OAuthTokenCredential authTokenCredential() {
return new OAuthTokenCredential(
env.getProperty("spring.pay.paypal.clientId"),
env.getProperty("spring.pay.paypal.clientSecret"),
paypalSdkConfig()
);
}
@Bean
public APIContext apiContext() throws PayPalRESTException {
String accessToken = getValidAccessToken();
APIContext apiContext = new APIContext(accessToken);
apiContext.setConfigurationMap(paypalSdkConfig());
return apiContext;
}
public String getValidAccessToken() {
OAuthTokenCredential tokenCredential = authTokenCredential();
String accessToken = tokenCredential.getAccessToken();
// 检查Token是否即将过期
if (isTokenExpired(tokenCredential.getExpiresIn())) {
return refreshAccessToken(tokenCredential);
}
return accessToken;
}
@CachePut(value = "payPalTokenCache", key = "'token'")
public String refreshAccessToken(OAuthTokenCredential tokenCredential) {
return tokenCredential.getAccessToken();
}
public boolean isTokenExpired(long expiresIn) {
// 获取当前时间(毫秒)
long currentTimeMillis = System.currentTimeMillis();
// 将expiresIn从秒转换为毫秒,并加上Token的生成时间
long tokenExpirationTimeMillis = (expiresIn * 1000) + currentTimeMillis;
// 计算Token到期前剩余的时间
long timeRemainingMillis = tokenExpirationTimeMillis - currentTimeMillis;
// 如果剩余时间小于等于5分钟,则认为Token已过期
return timeRemainingMillis <= 5 * 60 * 1000;
}
}