java微信开发--公众号登录第三方

前言

这几天在研究微信的第三方平台,需求是公众号的管理员扫码授权登录我们的系统,可以对多个公众号进行管理,微信官方这死坑死坑的官方文档,左一锤子右一榔头的,摸索了好几天总算是把想要的东西给弄出来了,今天给大家分享一下,避免大家踩坑!

微信三方平台账号

在进行开发之前需要申请微信第三方账户,这个就不多说了,需要注意的是授权相关的配置,如下:
授权发起页域名只是域名,比如wx.app.com,不需要http等前缀和后缀,授权测试公众号是测试时扫码授权的公众号原始id,在公众平台可以找到,授权事件接收URL是一个java程序,配置在授权发起页域名所在的服务器上,后面会详细说到
授权发起页域名只是域名,比如wx.app.com,不需要http等前缀和后缀,授权测试公众号是测试时扫码授权的公众号原始id,在公众平台可以找到,授权事件接收URL是一个java程序,配置在授权发起页域名所在的服务器上,后面会详细说到
消息校验token和key就不多说了,
消息校验token和key就不多说了,消息与时间接收URL是非常重要的,用户扫码成功后微信会将用户code传到这个接口,公众号开发域名与授权发起页域名一致就可以了,这里有个下载校验文件,将这个文件下载,放在服务器上nginx配置的根目录就可以了,也就是静态页面访问的路径(直接通过域名访问到的html的路径)。

开始编码

开始编码之前首先我们要知道有几步操作需要做,以下是微信官方的内容
在这里插入图片描述
左边的菜单就是我们开发的步骤
1.获取验证票据
2.根据验证票据获取令牌
3.根据令牌获取预授权码
4.引导用户授权登录
用户扫码授权就是这几步就行了,然后我们一步步来说

第一步、获取验证票据

获取验证票据我们要知道不是我们主动去请求微信,而是微信官方会每隔十分钟请求一次我们的授权事件接收URL,也就是我们上面配置的URL,这个地址配置很简单,reqestMapping与我们后台配置的一致的就行。

/**
	 * 授权事件接收
	 * 
	 * @param request
	 * @param response
	 * @throws IOException
	 * @throws AesException
	 * @throws DocumentException
	 */
	@RequestMapping(value = "/event/authorize")
	public void acceptAuthorizeEvent(HttpServletRequest request, HttpServletResponse response) throws Exception {
   
		String nonce = request.getParameter("nonce");
		String timestamp = request.getParameter("timestamp");
		String signature = request.getParameter("signature");
		String msgSignature = request.getParameter("msg_signature");

		String encodingAesKey = "××××";// 第三方平台组件加密密钥
		String token = "××××";//后台配置的token
		String appId = "××××";//第三方平台的AppId

		if (!StringUtils.isNotBlank(msgSignature))
			return;// 微信推送给第三方开放平台的消息一定是加过密的,无消息加密无法解密消息
		StringBuilder sb = new StringBuilder();
		BufferedReader in = request.getReader();
		String line;
		while ((line = in.readLine()) != null) {
   
			sb.append(line);
		}
		String xml = sb.toString();
		xml = xml.replaceAll("AppId", "ToUserName");
		// LogUtil.info("第三方平台全网发布-----------------------原始 Xml="+xml);
		// String app = getAuthorizerAppidFromXml(xml);//
		// 此时加密的xml数据中ToUserName是非加密的,解析xml获取即可
		// LogUtil.info("第三方平台全网发布-------------appid----------getAuthorizerAppidFromXml(xml)-----------appId="+appId);
		WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
		xml = pc.decryptMsg(msgSignature, timestamp, nonce, xml);

		Map<String, String> map = xmlToMap(xml);
		String ComponentVerifyTicket = map.get("ComponentVerifyTicket");
		//这里看你们自己怎么处理,这里获取到的就是验证票据,我是选择存储到数据库中
		Temp t = new Temp(0, ComponentVerifyTicket);
		tempService.updateTemp(t);

		output(response, "success"); // 输出响应的内容。
	}

最后获取到了验证票据,存到数据库或者Redis或者文件随你们自己。
最后给微信官方返回success即可。
WXBizMsgCrypt是微信官方的sdk
下面是用到的两个方法,算是工具

/**
	 * 工具类:回复微信服务器"文本消息"
	 * 
	 * @param response
	 * @param returnvaleue
	 */
	public void output(HttpServletResponse response, String returnvaleue) {
   
		try {
   
			PrintWriter pw = response.getWriter();
			pw.write(returnvaleue);
			// System.out.println("****************returnvaleue***************="+returnvaleue);
			pw.flush();
		} catch (IOException e) {
   
			e.printStackTrace();
		}
	}

	public static Map<String, String> xmlToMap(String strXML) throws Exception {
   
		try {
   
			Map<String, String
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值