TokenUtils - moyq5/weixin-popular GitHub Wiki
授权令牌自动刷新功能使用教程
本文主要介绍授权令牌(access_token)自动刷新功能的使用方法,包括第三方平台授权令牌和公众号授权令牌的刷新。(如有不明,可联系QQ:306026875)
首先提一下主要类:
- TokenStorage 授权令牌存储接口,实现它将授权令牌保存到数据库、缓存、内存等
- TokenUtils 通过它完成授权令牌自动刷新功能的各种配置以及使用
接下来我们来根据需要定义自己的令牌存储实现:
public class AuthorizerStorage implements TokenStorage {
@Override
public RefreshInfo getOverdue() {
// 在这里你需要查询出你平台所有已授权公众号中最需要刷新access_token的原授权令牌信息
// 并把相关信息赋给以AuthorizerRefreshInfo对象
// 如果是第三方平台,你需要返回的是ComponentRefreshInfo对象
AuthorizerRefreshInfo refresh = new AuthorizerRefreshInfo();
/// refresh setters ...
return refresh;
}
@Override
public long nextTime() {
long nextTime = 0;
// 在这里计算出最近一个要发生access_token失效的截止时间点(时间戳:毫秒)
// 并将其返回(即 nextTime)
return nextTime;
}
@Override
public void update(TokenInfo tokenInfo) {
AuthorizerTokenInfo info = (AuthorizerTokenInfo) tokenInfo;
// 如果是第三方平台,则是ComponentTokenInfo info = (ComponentTokenInfo)tokenInfo
// 然后在这里将刚刷新(或者刚授权)成功的授权令牌信息重新保存起来...
}
@Override
public String getAccessToken(TokenType type, String componentAppId,
String authorizerAppId, String openId) {
String accessToken = null;
// 根据参数查询并返回access_token (实际上所有参数你不一定都要用完)
// 当前公众号的实现,所以你也许需要componentAppId和authorizerAppId
// 如果是第三方平台的实现,你需要componentAppId
return accessToken;
}
}
在接受微信第三方平台授权信息地方进行初始化配置:
@Controller
public class ComponentReceiveController {
static {
// 在这里初始化刷新配置
// TokenUtils.setComponentTokenStorage(new ComponentStorage());
TokenUtils.setAuthorizerTokenStorage(new AuthorizerStorage());
}
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public String auth(@RequestBody String postXml, String msg_signature, String signature, String timestamp, String nonce) {
final String result = "success";
// 微信第三方平台推送消息处理...
return result;
}
}
接收公众号授权信息:
@Controller
public class AuthController {
@RequestMapping
@ResponseBody
public String authCode(String auth_code, String expires_in) {
// 第三方平台配置信息
WeixinAppConfig config = WeixinAppConfig.getInstance();
// 第三方平台授权令牌
String accessToken = TokenUtils.getComponentAccessToken(config.getAppId());
// 调用微信API获取公众号授权令牌
ApiQueryAuthResult authResult = ComponentAPI.api_query_auth(accessToken, config.getAppId(), auth_code);
if (!authResult.isSuccess()) {
// 获取授权令牌失败..
return "your error msg";
}
Authorization_info authInfo = authResult.getAuthorization_info();
// 将授权令牌信息保存起来
AuthorizerTokenInfo tokenInfo = new AuthorizerTokenInfo();
tokenInfo.setAccessToken(authInfo.getAuthorizer_access_token());
tokenInfo.setAppId(authInfo.getAuthorizer_appid());
tokenInfo.setExpiresIn(authInfo.getExpires_in());
tokenInfo.setRefreshToken(authInfo.getAuthorizer_refresh_token());
tokenInfo.setType(TokenType.AUTHORIZER);
tokenInfo.setComponentAppId(config.getAppId());
TokenUtils.addAuthorizerTokenInfo(tokenInfo);
return "your success msg";
}
}
另外,在其它地方要用到公众号授权令牌时,这样获取:
String accessToken = TokenUtils.getAuthorizerAccessToken(componentAppId, authorizerAppId)