首先你们要看下微信的API文档。json
微信网页受权,获取用户的微信官方API文档地址:https://open.weixin.qq.com/api
点击资源中心,查看微信登陆文档微信
三次握手
微信认证流程(我本身简称三次握手):
一、用户赞成受权,获取code
二、经过code换取网页受权access_token,用户openId等信息
三、经过access_token和用户的openId获取该用户的用户信息app
第三方微信接口登陆流程图:dom
用户扫描二维码jsp
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirectspa
redirect_uri是用户容许受权后,将会重定向到redirect_uri的网址上,而且带上code和state参数code
redirect_uri?code=CODE&state=STATE
若用户禁止受权,则重定向后不会带上code参数,仅会带上state参数blog
redirect_uri?state=STATE
/** * 微信引导页进入的方法 * @return */ @RequestMapping("/loginByWeiXin") public String loginByWeiXin(HttpServletRequest request, Map<String, Object> map) { // 获取code和state 2 个参数 String code = request.getParameter("code"); String state = request.getParameter("state"); System.out.println("code -------" + code + ", state ------- " + state); if(code != null && !"".equals(code)) { // 受权成功, 获取用户token和openID OAuthInfo authInfo = WeiXinUtil.getAccess_token(code); String openid = authInfo.getOpenid(); String access_token = authInfo.getAccess_token(); if(access_token == null) { // Code 使用过 异常 System.out.println("Code 使用过 异常....."); return "redirect:" + 跳转的路径; } // 查询微信号是否绑定第三方平台 SysUser sysUser = weiXinService.getUserByWeiXinID(openid); if(sysUser == null) { //获取随机字符串长度是57的 String randomStr = StringUtil.getRandomString(57); request.getSession().setAttribute(openid, randomStr); // 还没有绑定帐号 System.out.println("还没有绑定帐号....."); return "redirect:/index.jsp?openid=" + openid + "&state=" + randomStr; } userController.doSomeLoginWorkToHomePage(sysUser.getMcid(), map); // 登陆成功 return "homePage"; } // 未受权 return "redirect:" + 路径; }
根据code获取token(实体类OAuthInfo封装微信返回来的用户信息)token
public static OAuthInfo getAccess_token(String code){ String authUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code "; authUrl= authUrl.replace("APPID", Param.APPID); authUrl = authUrl.replace("SECRET", Param.SECRET); authUrl = authUrl.replace("CODE", code); String jsonString = HTTPRequestUtil.sendPost(authUrl,""); System.out.println("jsonString: " + jsonString); OAuthInfo auth = null; try { auth = (OAuthInfo) JacksonUtil.parseJSONToObject(OAuthInfo.class, jsonString); } catch (Exception e) { e.printStackTrace(); } return auth; }
返回的用户信息格式:
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE", "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" //客户受权后才会有这个字段 }