Skip to content

【小程序/公众号】提供了更新access_token的消费接口 #3005

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 9 commits into from
May 11, 2023
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
@@ -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