Skip to content

Commit

Permalink
🎨 #3005【小程序/公众号】提供更新access_token的消费接口
Browse files Browse the repository at this point in the history
  • Loading branch information
FreeOfYou authored May 11, 2023
1 parent 077f828 commit 899ea65
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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;

/**
* 小程序配置
Expand All @@ -12,6 +14,10 @@
*/
public interface WxMaConfig {

default void setUpdateAccessTokenBefore(Consumer<WxAccessTokenEntity> updateAccessTokenBefore) {

}

/**
* Gets access token.
*
Expand Down Expand Up @@ -50,7 +56,9 @@ public interface WxMaConfig {
*
* @param accessToken 要更新的WxAccessToken对象
*/
void updateAccessToken(WxAccessToken accessToken);
default void updateAccessToken(WxAccessToken accessToken) {
updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn());
}

/**
* 应该是线程安全的
Expand All @@ -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.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,在实际生产环境中应该将这些配置持久化
Expand Down Expand Up @@ -66,6 +68,25 @@ public class WxMaDefaultConfigImpl implements WxMaConfig {
private String apiHostUrl;
private String accessTokenUrl;

/**
* 自定义配置token的消费者
*/
@Setter
private Consumer<WxAccessTokenEntity> updateAccessTokenBefore;

/**
* 开启回调
*/
@Getter(AccessLevel.NONE)
private boolean enableUpdateAccessTokenBefore = true;

/**
* 可临时关闭更新token回调,主要用于其他介质初始化数据时,可不进行回调
*/
public void enableUpdateAccessTokenBefore(boolean enableUpdateAccessTokenBefore) {
this.enableUpdateAccessTokenBefore = enableUpdateAccessTokenBefore;
}

/**
* 会过期的数据提前过期时间,默认预留200秒的时间
*/
Expand Down Expand Up @@ -116,17 +137,24 @@ 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) {
setAccessToken(accessToken);
setExpiresTime(expiresAheadInMillis(expiresInSeconds));
}

@Override
public void updateAccessTokenBefore(WxAccessTokenEntity wxAccessTokenEntity) {
if (updateAccessTokenBefore != null && enableUpdateAccessTokenBefore) {
updateAccessTokenBefore.accept(wxAccessTokenEntity);
}
}

@Override
public String getJsapiTicket() {
return this.jsapiTicket;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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");
Expand Down

0 comments on commit 899ea65

Please sign in to comment.