微信开发平台授权过程

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
      
      
       
       
         > datalist = jwadi.queryComponetVerfyTicket(APP_ID); //如果存在就更新 if(null != datalist && !datalist.isEmpty()) { jwadi.updateComponentVerifyTicket(APP_ID, componentVerifyTicket); }else { //将协议码存储到数据库 jwadi.addComponentVerifyTicket(APP_ID, componentVerifyTicket); } //setup2 获取第三方平台component_access_token this.handlerComponentAccessToken(params); } 
       
     
     
    
    
   
   


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
      
      
       
       > datalist = jwadi.queryComponentAccessToken(APP_ID);
	//如果已经有了componentAccessToken
	if(null != datalist 
			&&!datalist.isEmpty()) {
		//2小时有效期
		String token = datalist.get(0).get("component_access_token")+"";
		String token_date = datalist.get(0).get("cat_updated_at")+"";
		long nowTime = System.currentTimeMillis()/1000;
		//平台token存在
		if(!StringUtil.isempty(token)
				&& !"null".equals(token)) {
			//时间没有过期就不去请求新的平台令牌
			if((nowTime-Long.valueOf(token_date)) < OUT_COMPONENT_ACCESS_TOKEN_TIME ) {
				//setup3 获取预授权码pre_auth_code
				this.handlerPreAuthCode(token,param.get("component_appid")+"");
				return;
			}
		}
	}
	@SuppressWarnings("unchecked")
	JSONObject json = new JSONObject(param);
	json.put("component_appid", param.get("component_appid"));
	json.put("component_appsecret", param.get("component_appsecret"));
	json.put("component_verify_ticket", param.get("component_verify_ticket"));
	String result = new SyncHttp().sendPost(COMPONENT_ACCESS_TOKEN_URL,json.toJSONString());
	json = JSONObject.parseObject(result);
	if(null != json 
			&& !json.isEmpty()) {
		result = json.getString("component_access_token");
		if(!StringUtil.isempty(result)) {
			jwadi.addComponentAccessToken(APP_ID, result);
			//setup3 获取预授权码pre_auth_code
			this.handlerPreAuthCode(result,param.get("component_appid")+"");
		}
	}
}
      
      
 
 

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
      
      
       
       > datalist = jwadi.queryPreAuthCode(APP_ID);
	if(null != datalist 
			&& !datalist.isEmpty()) {
		String token = datalist.get(0).get("pre_auth_code");
		String token_date = datalist.get(0).get("pac_updated_at");
		long nowTime = System.currentTimeMillis()/1000;
		if(!StringUtil.isempty(token)
				&& !"null".equals(token)) {
			//时间没有过期就不去请求新的预授权码
			if((nowTime-Long.valueOf(token_date)) < OUT_PRE_AUTH_CODE_TIME ) {
				return;
			}
		}
	}
	JSONObject json = new JSONObject();
	json.put("component_appid", caid);
	String url = PRE_AUTH_CODE_URL.replace("{component_access_token}", cat);
	String result = new SyncHttp().sendPost(url, json.toJSONString());
	log.e("handlerPreAuthCode---result:"+result, LOG_NAME);
	if(!StringUtil.isempty(result)) {
		json = JSONObject.parseObject(result);
		String preAc = null;
		if(json.isEmpty()) {
			log.e("获取预授权码失败result:"+result, LOG_NAME);
			return;
		}
		preAc = json.getString("pre_auth_code");
		if(!StringUtil.isempty(preAc)) {
			jwadi.addPreAuthCode(APP_ID, preAc);
		}
	}
}
      
      

setup4 获取公众号令牌和刷新令牌以及公众号appid

这一步必须由公众号触发,也就是 在获得预授权码之后,我们可以组装一个授权url,当公众号允许授权之后,微信会回调我们指定的地址,给出授权的公众号令牌和刷新令牌
/**
 * setup4 获取公众号令牌和刷新令牌以及公众号appid
 *,腾讯服务器回调响应方法
 *
0成功,-1接收微信服务器回参异常,-2解析参数异常 */ public int handlerAuthCode(String authCode,String appId,String companyId) { log.e("handlerAuthCode---start", LOG_NAME); ArrayList > datalist = jwadi.queryComponentAccessToken(appId); String cat = ""; if(null == datalist || datalist.isEmpty()) { log.e("获取平台数据失败 appid:"+appId, LOG_NAME); return -1; } cat = datalist.get(0).get("component_access_token"); JSONObject json = new JSONObject(); json.put("component_appid", APP_ID); json.put("authorization_code", authCode); String url = USER_TOKEN_URL.replace("{component_access_token}", cat); String result = new SyncHttp().sendPost(url, json.toJSONString()); log.e("handlerAuthCode---result:"+result, LOG_NAME); if(!StringUtil.isempty(result)) { json = JSONObject.parseObject(result); if(null != json && json.isEmpty()) { log.e("取公众号令牌和刷新令牌以及公众号appid失败result:"+result, LOG_NAME); return -2; } if(!StringUtil.isempty(json.getString("errcode"))) { log.e("获取令牌:"+WeChatErrorCode.getWehcatError( Integer.valueOf(json.getString("errcode"))),LOG_NAME); log.e(json.getString("errmsg"),LOG_NAME); return -3; } json = JSONObject.parseObject(json.get("authorization_info").toString()); if(null == json || json.isEmpty()) { log.e("取公众号令牌和刷新令牌以及公众号appid失败:解析返回参数异常1", LOG_NAME); return -2; } String authorizerAppid = json.get("authorizer_appid")+""; String authorizerAccessToken = json.get("authorizer_access_token")+""; String authorizerRefreshToken = json.get("authorizer_refresh_token")+""; if(StringUtil.isempty(authorizerAppid) || StringUtil.isempty(authorizerAccessToken) || StringUtil.isempty(authorizerRefreshToken)) { log.e("取公众号令牌和刷新令牌以及公众号appid失败:解析返回参数异常2", LOG_NAME); return -2; } //保存授权公众号令牌和刷新令牌 int flag = jwadi.addAuthorizerAccessToken(authorizerAppid , authorizerAccessToken, authorizerRefreshToken); log.e("执行sql结果:"+flag, LOG_NAME); //添加或更新授权公众号信息 handlerAuthorizerInfo(authorizerAppid,companyId); if(flag > 0) { return 0; }else { return -2; } } return -1; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值