Skip to content

设置token过期时加锁,mp支持分布式锁 #1488

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 4, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,17 @@ private <T, E> T executeInternal(RequestExecutor<T, E> executor, String uri, E d
|| error.getErrorCode() == ERR_42001
|| error.getErrorCode() == ERR_40014) {
// 强制设置WxMaConfig的access token过期了,这样在下一次请求里就会刷新access token
this.getWxMaConfig().expireAccessToken();
Lock lock = this.getWxMaConfig().getAccessTokenLock();
lock.lock();
try {
if(StringUtils.equals(this.getWxMaConfig().getAccessToken(), accessToken)){
this.getWxMaConfig().expireAccessToken();
}
} catch (Exception ex){
this.getWxMaConfig().expireAccessToken();
}finally {
lock.unlock();
}
if (this.getWxMaConfig().autoRefreshToken()) {
return this.execute(executor, uri, data);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,17 @@ protected <T, E> T executeInternal(RequestExecutor<T, E> executor, String uri, E
*/
if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) {
// 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token
this.getWxMpConfigStorage().expireAccessToken();
Lock lock = this.getWxMpConfigStorage().getAccessTokenLock();
lock.lock();
try{
if(StringUtils.equals(this.getWxMpConfigStorage().getAccessToken(), accessToken)){
this.getWxMpConfigStorage().expireAccessToken();
}
} catch (Exception ex){
this.getWxMpConfigStorage().expireAccessToken();
} finally {
lock.unlock();
}
if (this.getWxMpConfigStorage().autoRefreshToken()) {
return this.execute(executor, uri, data);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package me.chanjar.weixin.mp.config.impl;

import me.chanjar.weixin.common.util.locks.JedisDistributedLock;
import me.chanjar.weixin.mp.enums.TicketType;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
* 基于Redis的微信配置provider.
*
Expand All @@ -17,13 +21,15 @@
@SuppressWarnings("hiding")
public class WxMpRedisConfigImpl extends WxMpDefaultConfigImpl {
private static final String ACCESS_TOKEN_KEY = "wx:access_token:";
private static final String LOCK_KEY = "wx:lock:";

/**
* 使用连接池保证线程安全.
*/
private final JedisPool jedisPool;

private String accessTokenKey;
private String lockKey;

public WxMpRedisConfigImpl(JedisPool jedisPool) {
this.jedisPool = jedisPool;
Expand All @@ -36,6 +42,11 @@ public WxMpRedisConfigImpl(JedisPool jedisPool) {
public void setAppId(String appId) {
super.setAppId(appId);
this.accessTokenKey = ACCESS_TOKEN_KEY.concat(appId);
this.lockKey = ACCESS_TOKEN_KEY.concat(appId).concat(":");
accessTokenLock = new JedisDistributedLock(jedisPool, lockKey.concat("accessTokenLock"));
jsapiTicketLock = new JedisDistributedLock(jedisPool, lockKey.concat("jsapiTicketLock"));
sdkTicketLock = new JedisDistributedLock(jedisPool, lockKey.concat("sdkTicketLock"));
cardApiTicketLock = new JedisDistributedLock(jedisPool, lockKey.concat("cardApiTicketLock"));
}

private String getTicketRedisKey(TicketType type) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,18 @@ public String post(String uri, String postData, String accessTokenKey) throws Wx
*/
if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) {
// 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token
this.getWxOpenConfigStorage().expireComponentAccessToken();
Lock lock = this.getWxOpenConfigStorage().getComponentAccessTokenLock();
lock.lock();
try {
if (StringUtils.equals(componentAccessToken, this.getWxOpenConfigStorage().getComponentAccessToken()){
this.getWxOpenConfigStorage().expireComponentAccessToken();
}
} catch (Exception ex) {
this.getWxOpenConfigStorage().expireComponentAccessToken();
}finally {
lock.unlock();
}

if (this.getWxOpenConfigStorage().autoRefreshToken()) {
return this.post(uri, postData, accessTokenKey);
}
Expand Down Expand Up @@ -188,7 +199,17 @@ public String get(String uri, String accessTokenKey) throws WxErrorException {
*/
if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) {
// 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token
this.getWxOpenConfigStorage().expireComponentAccessToken();
Lock lock = this.getWxOpenConfigStorage().getComponentAccessTokenLock();
lock.lock();
try {
if (StringUtils.equals(componentAccessToken, this.getWxOpenConfigStorage().getComponentAccessToken()){
this.getWxOpenConfigStorage().expireComponentAccessToken();
}
} catch (Exception ex) {
this.getWxOpenConfigStorage().expireComponentAccessToken();
}finally {
lock.unlock();
}
if (this.getWxOpenConfigStorage().autoRefreshToken()) {
return this.get(uri, accessTokenKey);
}
Expand Down