diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxAccessTokenEntity.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxAccessTokenEntity.java new file mode 100644 index 0000000000..fe19817b2b --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/WxAccessTokenEntity.java @@ -0,0 +1,19 @@ +package me.chanjar.weixin.common.bean; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + * token + * + * @author cn + */ +@Getter +@Setter +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class WxAccessTokenEntity extends WxAccessToken { + private String appid; +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java index 2080c227fc..4f15c9f73f 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java @@ -339,7 +339,7 @@ protected String extractAccessToken(String resultContent) throws WxErrorExceptio throw new WxErrorException(error); } WxAccessToken accessToken = WxAccessToken.fromJson(resultContent); - config.updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); + config.updateAccessTokenProcessor(accessToken.getAccessToken(), accessToken.getExpiresIn()); return accessToken.getAccessToken(); } diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/WxMaConfig.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/WxMaConfig.java index 084a42cf34..12e1da07b9 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/WxMaConfig.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/WxMaConfig.java @@ -1,9 +1,11 @@ package cn.binarywang.wx.miniapp.config; import me.chanjar.weixin.common.bean.WxAccessToken; +import me.chanjar.weixin.common.bean.WxAccessTokenEntity; import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; import java.util.concurrent.locks.Lock; +import java.util.function.Consumer; /** * 小程序配置 @@ -12,6 +14,10 @@ */ public interface WxMaConfig { + default void setUpdateAccessTokenBefore(Consumer updateAccessTokenBefore) { + + } + /** * Gets access token. * @@ -50,7 +56,9 @@ public interface WxMaConfig { * * @param accessToken 要更新的WxAccessToken对象 */ - void updateAccessToken(WxAccessToken accessToken); + default void updateAccessToken(WxAccessToken accessToken) { + updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); + } /** * 应该是线程安全的 @@ -60,6 +68,20 @@ public interface WxMaConfig { */ void updateAccessToken(String accessToken, int expiresInSeconds); + default void updateAccessTokenProcessor(String accessToken, int expiresInSeconds) { + WxAccessTokenEntity wxAccessTokenEntity = new WxAccessTokenEntity(); + wxAccessTokenEntity.setAppid(getAppid()); + wxAccessTokenEntity.setAccessToken(accessToken); + wxAccessTokenEntity.setExpiresIn(expiresInSeconds); + updateAccessTokenBefore(wxAccessTokenEntity); + updateAccessToken(accessToken, expiresInSeconds); + } + + default void updateAccessTokenBefore(WxAccessTokenEntity wxAccessTokenEntity) { + + } + + /** * Gets jsapi ticket. * diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaDefaultConfigImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaDefaultConfigImpl.java index f1107739f1..bd9a4e20b0 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaDefaultConfigImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaDefaultConfigImpl.java @@ -4,12 +4,14 @@ import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder; import lombok.AccessLevel; import lombok.Getter; -import me.chanjar.weixin.common.bean.WxAccessToken; +import lombok.Setter; +import me.chanjar.weixin.common.bean.WxAccessTokenEntity; import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder; import java.io.File; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Consumer; /** * 基于内存的微信配置provider,在实际生产环境中应该将这些配置持久化 @@ -66,6 +68,25 @@ public class WxMaDefaultConfigImpl implements WxMaConfig { private String apiHostUrl; private String accessTokenUrl; + /** + * 自定义配置token的消费者 + */ + @Setter + private Consumer updateAccessTokenBefore; + + /** + * 开启回调 + */ + @Getter(AccessLevel.NONE) + private boolean enableUpdateAccessTokenBefore = true; + + /** + * 可临时关闭更新token回调,主要用于其他介质初始化数据时,可不进行回调 + */ + public void enableUpdateAccessTokenBefore(boolean enableUpdateAccessTokenBefore) { + this.enableUpdateAccessTokenBefore = enableUpdateAccessTokenBefore; + } + /** * 会过期的数据提前过期时间,默认预留200秒的时间 */ @@ -116,10 +137,10 @@ public boolean isAccessTokenExpired() { return isExpired(this.expiresTime); } - @Override - public synchronized void updateAccessToken(WxAccessToken accessToken) { - updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); - } +// @Override +// public synchronized void updateAccessToken(WxAccessToken accessToken) { +// updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); +// } @Override public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) { @@ -127,6 +148,13 @@ public synchronized void updateAccessToken(String accessToken, int expiresInSeco setExpiresTime(expiresAheadInMillis(expiresInSeconds)); } + @Override + public void updateAccessTokenBefore(WxAccessTokenEntity wxAccessTokenEntity) { + if (updateAccessTokenBefore != null && enableUpdateAccessTokenBefore) { + updateAccessTokenBefore.accept(wxAccessTokenEntity); + } + } + @Override public String getJsapiTicket() { return this.jsapiTicket; diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImpl.java index 2f8f56ffa2..36d782506f 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImpl.java @@ -91,7 +91,7 @@ public boolean isAccessTokenExpired() { @Override public void updateAccessToken(WxAccessToken accessToken) { - redisOps.setValue(this.accessTokenKey, accessToken.getAccessToken(), accessToken.getExpiresIn(), TimeUnit.SECONDS); + updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); } @Override diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImplTest.java index 85cb706b58..b31dea2dd3 100644 --- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImplTest.java +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImplTest.java @@ -5,6 +5,7 @@ import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; import cn.binarywang.wx.miniapp.test.ApiTestModule; import com.google.inject.Inject; +import me.chanjar.weixin.common.bean.WxAccessTokenEntity; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.error.WxMpErrorMsgEnum; @@ -46,6 +47,35 @@ public void testRefreshAccessToken() throws WxErrorException { assertTrue(StringUtils.isNotBlank(after)); } + + private void updateAccessTokenBefore(WxAccessTokenEntity wxAccessTokenEntity) { + System.out.println("token:" + wxAccessTokenEntity.toString()); + } + + public void testTokenCallBack() throws WxErrorException { + WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl(); + WxMaConfig configStorage = this.wxService.getWxMaConfig(); + config.setAppid(configStorage.getAppid()); + config.setSecret(configStorage.getSecret()); +// //第一种方式 +// config.setUpdateAccessTokenBefore(e -> { +// System.out.println("token:" + e.toString()); +// }); + //第二种方式 + config.setUpdateAccessTokenBefore(this::updateAccessTokenBefore); + this.wxService.setWxMaConfig(config); + + String before = config.getAccessToken(); + this.wxService.getAccessToken(true); + String after = config.getAccessToken(); + assertNotEquals(before, after); + assertTrue(StringUtils.isNotBlank(after)); + config.enableUpdateAccessTokenBefore(false); + this.wxService.getAccessToken(true); + after = config.getAccessToken(); + System.out.println(after); + } + public void testStableRefreshAccessToken() throws WxErrorException { WxMaConfig configStorage = this.wxMaServiceOkHttp.getWxMaConfig(); configStorage.useStableAccessToken(true); @@ -56,6 +86,7 @@ public void testStableRefreshAccessToken() throws WxErrorException { assertTrue(StringUtils.isNotBlank(after)); } + @Test(expectedExceptions = {WxErrorException.class}) public void testGetPaidUnionId() throws WxErrorException { final String unionId = this.wxService.getPaidUnionId("1", null, "3", "4");