Jfinal-weixin 1.8 微信公众号token被刷新

大家好,咨询一个问题,目前项目中,使用的Jfinal-weixin 1.8作为微信公众开发,当使用不同电脑登录后台,给微信端发送模板时,会刷新token,导致旧token在5分钟后失效,而微信端的请求还是在使用旧的token调用。

后台调用发送模板方法,

//获取微信公众号配置
ApiConfig apiConfig = WxApiConfigUtil.getConfig(section);
ApiConfigKit.setThreadLocalApiConfig(apiConfig);
//获取accessToken
String accessToken = AccessTokenApi.getAccessToken().getAccessToken();

而微信端相关操作时,使用上面同样获取token的方法时,得到存储在缓存中的token,却还是旧token

AccessToken result = (AccessToken)accessTokenCache.get(appId);

5分钟后,旧token失效,微信端使用token的地方就出问题了。

这种情况,在本地开发时没有发生,而是在生产环境中发生,生产环境使用centos6.5及tomcat 8.5.40通过日志排查发现的,自我排查,不存在多个项目调用一个token的情况,烦请大佬们帮忙看看,已困扰一周毫无进展。

评论区

JFinal

2020-04-03 10:53

当有多个地方同时使用同一个微信公众号的 appId 去申请 token 时,当前申请的 token 会立即让前一个申请的 token 失效

也就是说:同一公众号(appId), 同一时刻,只有一个 token 有效,其它 token 会立即失败

所以开发的时候一定要注意这种情况

jfinal weixin 特意为这种请求做了一个 LocalTestTokenCache.java 用来支持服务器部署 + 本地开发共用同一个公众号的组件:
https://gitee.com/jfinal/jfinal-weixin/blob/master/src/main/java/com/jfinal/weixin/sdk/cache/LocalTestTokenCache.java

使用的时候,在本地开发的项目中配置:
if (isLocalDev) {
String onLineTokenUrl = "http://localhost/weixin/api/getToken";
ApiConfigKit.setAccessTokenCache(new LocalTestTokenCache(onLineTokenUrl));
}

上述代码中的 onLineTokenUrl 是远程生产环境中用于获取 token 值的一个 controller 的 action ,用来为本地开发提供 token 值

这个方案的大致逻辑就是:
1:只让生产环境的公众号去统一请求微信公众号的 token 值
2:其它任何地方,只是去获取生产环境下公众号请求到的这个 token ,达成一个共享的态势

看一下 jfinal weixin 官方配置:
https://gitee.com/jfinal/jfinal-weixin/blob/master/src/main/java/com/jfinal/weixin/demo/WeixinConfig.java

注意看里头被注掉的这行代码是关键:
ApiConfigKit.setAccessTokenCache(new LocalTestTokenCache(onLineTokenUrl));

onizukayao

2020-04-03 12:30

@JFinal 谢谢你的回复,我现在的情况不是本地与生产这样条件下发生的,而是只在生产环境中,使用不同电脑登录,当先登录的一方推送微信模板时,首先获取缓存的token,进而使用HttpUtils.post发送模板消息,可当后登录的一方,同样执行推送模板操作时,会获取新的token,应该是调用了jfinal-weixin1.8 类AccessTokenApi中的getAccessToken()方法中
String appId = ApiConfigKit.getApiConfig().getAppId();
AccessToken result = (AccessToken)accessTokenCache.get(appId);
根据result 判断是否执行AccessTokenApi.refreshAccessToken(),都是在同一个项目中,后者发送模板时没有获取和使用缓存中的token,而且重新获取了,这是如何造成的呢?是因为ApiConfigKit.setThreadLocalApiConfig(apiConfig);使用localthread来操作配置文件的原因吗?

JFinal

2020-04-03 17:06

@onizukayao 这个问题估计是你的理解有误,本地与生产环境本质上是一样的

你需要单步调试找到原因

单步调试有两种方法,任选下面其中一种:
1:直接远程调试生产环境的项目:
https://jfinal.com/feedback/5106
https://jfinal.com/share/1528

2:项目部团到本地,利用某种机制让微信服务器可以与本地通信,例如可利用反向隧道:
https://my.oschina.net/jfinal/blog/336861

onizukayao

2020-04-09 16:44

@JFinal 谢谢,我想再咨询一下,如果想使用redis作为存储access_token代码需要如何改写,推荐一个链接,万分感谢

JFinal

2020-04-09 17:13

@onizukayao ApiConfigKit.setAccessTokenCache(new RedisAccessTokenCache());

小小猫老板

2023-07-11 11:37

@JFinal 请问小程序开发的话,这个要怎么弄?WxaConfigKit 没看到有 setAccessTokenCache

热门反馈

扫码入社