Skip to content
moyq5 edited this page Aug 5, 2016 · 1 revision

授权令牌自动刷新功能使用教程

本文主要介绍授权令牌(access_token)自动刷新功能的使用方法,包括第三方平台授权令牌和公众号授权令牌的刷新。(如有不明,可联系QQ:306026875)

首先提一下主要类:

  1. TokenStorage 授权令牌存储接口,实现它将授权令牌保存到数据库、缓存、内存等
  2. 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)

API 列表

其它

Clone this wiki locally