setup1 处理微信推送component_verify_ticket协议
在微信开放平台注册第三方并配置响应授权响应地址,响应地址可以是任意能响应的controller,将参数解析(解密参数)、获取流数据(xml带解析加密串)
/**
* 处理响应事件,平台授权入口
*/
public void handlerVerifyTicket(String msgSignature,String timeStamp,String nonce,String postData) {
log.e("handlerVerifyTicket---start", LOG_NAME);
WXBizMsgCrypt wxcpt;
try {
wxcpt = new WXBizMsgCrypt(OPEN_TOKEN,ENCODING_AES_KEY, APP_ID);
String decryptMsg = wxcpt.decryptMsg(msgSignature,timeStamp,nonce,postData);
//xmlUtil主要用来提取解析的xml数据到一个map对象中
Map
dmsg = XmlUtil.extract(decryptMsg);
String authorizerAppid = dmsg.get("AuthorizerAppid");
if(null == dmsg || dmsg.isEmpty()) {
new Exception("解析xml出现异常");
return;
}
String infoType = dmsg.get("InfoType");
//微信推送component_verify_ticket协议
if(WeChatCode.COMPONENT_VERIFY_TICKET.equals(infoType)) {
if(null == dmsg
|| !dmsg.containsKey("ComponentVerifyTicket")) {
log.e("没有获取到ComponentVerifyTicket", LOG_NAME);
return;
}
VerifyTicket(dmsg);
}
//授权成功通知
else if(WeChatCode.AUTHORIZED.equals(infoType)) {
log.e("授权成功通知",LOG_NAME);
//暂时这里更新授权信息会出问题,因为授权成功只会在第一次授权成功是通知,已经移至setup4的时候处理
// if(!StringUtil.isempty(authorizerAppid)) {
// handlerAuthorizerInfo(authorizerAppid);
// }
}
//取消授权通知
else if(WeChatCode.UNAUTHORIZED.equals(infoType)) {
log.e("取消授权通知",LOG_NAME);
if(!StringUtil.isempty(authorizerAppid)) {
//测试的时候关闭删除,方便对比数据
//删除数据库中的授权数据
jwadi.delAuthorizerAccessToken(authorizerAppid);
//删除redis中token
Redis.getRedis().delKeyFromJedis(WeChatAuthorization.REDIS_KEY+authorizerAppid);
}
}
//授权更新通知
else if(WeChatCode.UPDATEAUTHORIZED.equals(infoType)) {
log.e("授权更新通知",LOG_NAME);
String authorizerCode = dmsg.get("AuthorizationCode");
//调用更新数据库方法,更新数据库中的token或redis(有配置redis的话)
updateAuthorizerAccessToken(authorizerAppid,authorizerCode);
}
else {
new Exception("未知事件响应类型InfoType:"+infoType);
}
}catch (Exception e) {
log.e("事件处理异常:"+e.getMessage(), LOG_NAME);
StackTraceElement[] ste = e.getStackTrace();
for(int i = 0;i < ste.length;i++) {
log.e(e.getStackTrace()[i], LOG_NAME);
}
}
}/**
* setup1 处理微信推送component_verify_ticket
*/
private void VerifyTicket(Map
dmsg) {
//收到协议之后获取ComponentAccess
String componentVerifyTicket = dmsg.get("ComponentVerifyTicket");
if(StringUtil.isempty(componentVerifyTicket)) {
log.e("获取componentVerifyTicket异常:"+dmsg, LOG_NAME);
return;
}
Map
params = new HashMap<>();
params.put("component_appid", APP_ID);
params.put("component_appsecret", APP_SECRET);
params.put("component_verify_ticket", componentVerifyTicket);
ArrayList
setup2 获取第三方平台component_access_token
在第一步获得verify_ticket验证之后,就可以通过组装参数调用获取平台令牌的接口获得平台token
/**
* setup2 获取第三方平台component_access_token
*/
@SuppressWarnings("rawtypes")
private void handlerComponentAccessToken(Map param) {
log.e("handlerComponentAccessToken---start", LOG_NAME);
ArrayList
setup3 获取预授权码pre_auth_code
在第二步获得component_access_token之后,就可以组装参数调用获取平台获取预授权码接口
/**
* setup3 获取预授权码pre_auth_code
* @param cat component_access_token
* @param caid component_appid
*/
private void handlerPreAuthCode(String cat,String caid) {
log.e("handlerPreAuthCode---start", LOG_NAME);
ArrayList
setup4 获取公众号令牌和刷新令牌以及公众号appid
这一步必须由公众号触发,也就是 在获得预授权码之后,我们可以组装一个授权url,当公众号允许授权之后,微信会回调我们指定的地址,给出授权的公众号令牌和刷新令牌
/**
* setup4 获取公众号令牌和刷新令牌以及公众号appid
*,腾讯服务器回调响应方法
*
0成功,-1接收微信服务器回参异常,-2解析参数异常
*/
public int handlerAuthCode(String authCode,String appId,String companyId) {
log.e("handlerAuthCode---start", LOG_NAME);
ArrayList