Skip to content

Commit 899ea65

Browse files
authored
🎨 #3005【小程序/公众号】提供更新access_token的消费接口
1 parent 077f828 commit 899ea65

File tree

6 files changed

+108
-8
lines changed

6 files changed

+108
-8
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package me.chanjar.weixin.common.bean;
2+
3+
import lombok.EqualsAndHashCode;
4+
import lombok.Getter;
5+
import lombok.Setter;
6+
import lombok.ToString;
7+
8+
/**
9+
* token
10+
*
11+
* @author cn
12+
*/
13+
@Getter
14+
@Setter
15+
@ToString(callSuper = true)
16+
@EqualsAndHashCode(callSuper = true)
17+
public class WxAccessTokenEntity extends WxAccessToken {
18+
private String appid;
19+
}

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ protected String extractAccessToken(String resultContent) throws WxErrorExceptio
339339
throw new WxErrorException(error);
340340
}
341341
WxAccessToken accessToken = WxAccessToken.fromJson(resultContent);
342-
config.updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
342+
config.updateAccessTokenProcessor(accessToken.getAccessToken(), accessToken.getExpiresIn());
343343
return accessToken.getAccessToken();
344344
}
345345

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/WxMaConfig.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package cn.binarywang.wx.miniapp.config;
22

33
import me.chanjar.weixin.common.bean.WxAccessToken;
4+
import me.chanjar.weixin.common.bean.WxAccessTokenEntity;
45
import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder;
56

67
import java.util.concurrent.locks.Lock;
8+
import java.util.function.Consumer;
79

810
/**
911
* 小程序配置
@@ -12,6 +14,10 @@
1214
*/
1315
public interface WxMaConfig {
1416

17+
default void setUpdateAccessTokenBefore(Consumer<WxAccessTokenEntity> updateAccessTokenBefore) {
18+
19+
}
20+
1521
/**
1622
* Gets access token.
1723
*
@@ -50,7 +56,9 @@ public interface WxMaConfig {
5056
*
5157
* @param accessToken 要更新的WxAccessToken对象
5258
*/
53-
void updateAccessToken(WxAccessToken accessToken);
59+
default void updateAccessToken(WxAccessToken accessToken) {
60+
updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
61+
}
5462

5563
/**
5664
* 应该是线程安全的
@@ -60,6 +68,20 @@ public interface WxMaConfig {
6068
*/
6169
void updateAccessToken(String accessToken, int expiresInSeconds);
6270

71+
default void updateAccessTokenProcessor(String accessToken, int expiresInSeconds) {
72+
WxAccessTokenEntity wxAccessTokenEntity = new WxAccessTokenEntity();
73+
wxAccessTokenEntity.setAppid(getAppid());
74+
wxAccessTokenEntity.setAccessToken(accessToken);
75+
wxAccessTokenEntity.setExpiresIn(expiresInSeconds);
76+
updateAccessTokenBefore(wxAccessTokenEntity);
77+
updateAccessToken(accessToken, expiresInSeconds);
78+
}
79+
80+
default void updateAccessTokenBefore(WxAccessTokenEntity wxAccessTokenEntity) {
81+
82+
}
83+
84+
6385
/**
6486
* Gets jsapi ticket.
6587
*

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaDefaultConfigImpl.java

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
55
import lombok.AccessLevel;
66
import lombok.Getter;
7-
import me.chanjar.weixin.common.bean.WxAccessToken;
7+
import lombok.Setter;
8+
import me.chanjar.weixin.common.bean.WxAccessTokenEntity;
89
import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder;
910

1011
import java.io.File;
1112
import java.util.concurrent.locks.Lock;
1213
import java.util.concurrent.locks.ReentrantLock;
14+
import java.util.function.Consumer;
1315

1416
/**
1517
* 基于内存的微信配置provider,在实际生产环境中应该将这些配置持久化
@@ -66,6 +68,25 @@ public class WxMaDefaultConfigImpl implements WxMaConfig {
6668
private String apiHostUrl;
6769
private String accessTokenUrl;
6870

71+
/**
72+
* 自定义配置token的消费者
73+
*/
74+
@Setter
75+
private Consumer<WxAccessTokenEntity> updateAccessTokenBefore;
76+
77+
/**
78+
* 开启回调
79+
*/
80+
@Getter(AccessLevel.NONE)
81+
private boolean enableUpdateAccessTokenBefore = true;
82+
83+
/**
84+
* 可临时关闭更新token回调,主要用于其他介质初始化数据时,可不进行回调
85+
*/
86+
public void enableUpdateAccessTokenBefore(boolean enableUpdateAccessTokenBefore) {
87+
this.enableUpdateAccessTokenBefore = enableUpdateAccessTokenBefore;
88+
}
89+
6990
/**
7091
* 会过期的数据提前过期时间,默认预留200秒的时间
7192
*/
@@ -116,17 +137,24 @@ public boolean isAccessTokenExpired() {
116137
return isExpired(this.expiresTime);
117138
}
118139

119-
@Override
120-
public synchronized void updateAccessToken(WxAccessToken accessToken) {
121-
updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
122-
}
140+
// @Override
141+
// public synchronized void updateAccessToken(WxAccessToken accessToken) {
142+
// updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
143+
// }
123144

124145
@Override
125146
public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) {
126147
setAccessToken(accessToken);
127148
setExpiresTime(expiresAheadInMillis(expiresInSeconds));
128149
}
129150

151+
@Override
152+
public void updateAccessTokenBefore(WxAccessTokenEntity wxAccessTokenEntity) {
153+
if (updateAccessTokenBefore != null && enableUpdateAccessTokenBefore) {
154+
updateAccessTokenBefore.accept(wxAccessTokenEntity);
155+
}
156+
}
157+
130158
@Override
131159
public String getJsapiTicket() {
132160
return this.jsapiTicket;

weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public boolean isAccessTokenExpired() {
9191

9292
@Override
9393
public void updateAccessToken(WxAccessToken accessToken) {
94-
redisOps.setValue(this.accessTokenKey, accessToken.getAccessToken(), accessToken.getExpiresIn(), TimeUnit.SECONDS);
94+
updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
9595
}
9696

9797
@Override

weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImplTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
66
import cn.binarywang.wx.miniapp.test.ApiTestModule;
77
import com.google.inject.Inject;
8+
import me.chanjar.weixin.common.bean.WxAccessTokenEntity;
89
import me.chanjar.weixin.common.error.WxError;
910
import me.chanjar.weixin.common.error.WxErrorException;
1011
import me.chanjar.weixin.common.error.WxMpErrorMsgEnum;
@@ -46,6 +47,35 @@ public void testRefreshAccessToken() throws WxErrorException {
4647
assertTrue(StringUtils.isNotBlank(after));
4748
}
4849

50+
51+
private void updateAccessTokenBefore(WxAccessTokenEntity wxAccessTokenEntity) {
52+
System.out.println("token:" + wxAccessTokenEntity.toString());
53+
}
54+
55+
public void testTokenCallBack() throws WxErrorException {
56+
WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
57+
WxMaConfig configStorage = this.wxService.getWxMaConfig();
58+
config.setAppid(configStorage.getAppid());
59+
config.setSecret(configStorage.getSecret());
60+
// //第一种方式
61+
// config.setUpdateAccessTokenBefore(e -> {
62+
// System.out.println("token:" + e.toString());
63+
// });
64+
//第二种方式
65+
config.setUpdateAccessTokenBefore(this::updateAccessTokenBefore);
66+
this.wxService.setWxMaConfig(config);
67+
68+
String before = config.getAccessToken();
69+
this.wxService.getAccessToken(true);
70+
String after = config.getAccessToken();
71+
assertNotEquals(before, after);
72+
assertTrue(StringUtils.isNotBlank(after));
73+
config.enableUpdateAccessTokenBefore(false);
74+
this.wxService.getAccessToken(true);
75+
after = config.getAccessToken();
76+
System.out.println(after);
77+
}
78+
4979
public void testStableRefreshAccessToken() throws WxErrorException {
5080
WxMaConfig configStorage = this.wxMaServiceOkHttp.getWxMaConfig();
5181
configStorage.useStableAccessToken(true);
@@ -56,6 +86,7 @@ public void testStableRefreshAccessToken() throws WxErrorException {
5686
assertTrue(StringUtils.isNotBlank(after));
5787
}
5888

89+
5990
@Test(expectedExceptions = {WxErrorException.class})
6091
public void testGetPaidUnionId() throws WxErrorException {
6192
final String unionId = this.wxService.getPaidUnionId("1", null, "3", "4");

0 commit comments

Comments
 (0)