java微信开发--公众号登录第三方
前言
这几天在研究微信的第三方平台,需求是公众号的管理员扫码授权登录我们的系统,可以对多个公众号进行管理,微信官方这死坑死坑的官方文档,左一锤子右一榔头的,摸索了好几天总算是把想要的东西给弄出来了,今天给大家分享一下,避免大家踩坑!
微信三方平台账号
在进行开发之前需要申请微信第三方账户,这个就不多说了,需要注意的是授权相关的配置,如下:
授权发起页域名只是域名,比如wx.app.com,不需要http等前缀和后缀,授权测试公众号是测试时扫码授权的公众号原始id,在公众平台可以找到,授权事件接收URL是一个java程序,配置在授权发起页域名所在的服务器上,后面会详细说到
消息校验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