您的位置:首页 > 移动开发 > 微信开发

微信公众号授权登录(应用免登陆)

2017-03-28 14:06 691 查看
         微信授权登录,可以帮助服务号应用实现免登陆(实质上通过code换取access_token),即使换个手机登录微信,应用仍然是登录状态。 本文简单讲下微信网页授权登录。

        首先,用户网页授权,调用微信接口获取code。然后,用得到的code,调用微信接口换取网页授权的access_token,这个获取的是临时的网页授权的access_token。通过code获取access_token接口,没有使用次数限制。调用这个接口,可以获取到access_token和openid。网页授权登录,即应用免登陆,以我们公司的服务号作为案例说一下。我们公司的微信服务号,是有注册和登录功能的,想使用我们的一些特殊服务,例如充值和查询消费流水,就需要注册和登录。用户关注我们服务号后,点击菜单会引导新用户注册。

        我们的微信工程,微信菜单的链接都是经过微信网页授权接口包装的,同时是将微信登录用户信息(包含openid)userVO存入session中。当用户在我们的微信服务号里注册或登录后,openid会存在我们的用户表中。当用户注册或登录后,我们会将用户信息存入session中,1小时候session超时自动清除。当用户点击微信菜单的链接时,会判断session中是否有userVO,有就保持登录状态自动跳转至目标地址。若没有用户信息,则根据网页授权接口获取的code,调用微信接口获取access_token,最重要的是其中的openid。然后,利用此openid查询我们的用户表,用户存在则将用户信息存入session,跳至目标地址。若根据openid查询不到用户,跳转至注册/登录页面,让用户选择注册或登录。

       对于非微信菜单的链接,网页内的链接,也是采取授权跳转的形式。用户网页授权,获取code,接口:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect。例如,用户在某个页面停留超过了1小时,且没有操作动作。这个时候用户session已经清除,用户如果点击页面内的链接,这个时候要实现自动登录并跳转至用户目标地址。我们是用过滤器监控所有的跳转,将我们的免登陆处理方法的链接赋值给redirect_uri,将目标地址赋值给state。这样过滤器捕获到请求后,拼接访问微信网页授权接口,成功后重定向到redirect_uri,即我们的免登陆方法。在这个方法里,用得到的code换取access_token(主要是里面的openid),接着使用openid查询用户信息存入session中。再取出放入state里的目标地址,重定向到此地址即可。

/**
* 去授权
* @return
* @throws UnsupportedEncodingException
*/
public String toAuth() throws UnsupportedEncodingException{
HttpServletRequest request = ServletActionContext.getRequest();
//取得微信网页授权的接口地址
String authorize_url = SystemConstants.getAuthorize_url();
String appid=SystemConstants.APPID;
//回调地址,免登陆处理地址,微信网页授权接口成功会主动会调至改地址
String redirect_uri=WebUtils.getHomeUrl(request)+"/wx/toRedirect.action";
//state,微信接口为开发者留的字段,此时存入目标地址,授权后可以利用此参数跳转至目标地址
String state=(String)request.getAttribute("currentUrl");
if(StringUtils.isNotEmpty(state)){
state=URLEncoder.encode(state,"utf-8");
}
authorize_url=MessageFormat.format(authorize_url, appid,URLEncoder.encode(redirect_uri,"utf-8"),state);
setAuthorize_url(authorize_url);
//success,Struts配置跳转至authorize_url,即执行微信网页授权接口的跳转
return "success";
}

/**
* 回调函数
* @return
* @throws IOException
* @throws ParseException
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public String toRedirect() throws ParseException, IOException{
//授权成功后回调此请求,从request中取出code和state
String code =request.getParameter("code");
String state =request.getParameter("state");
logger.info("code="+code+",state="+state);
if(StringUtils.isNotEmpty(code)){
//code换取access_token接口
AccessToken token = WeixinUtil.codeGetAccessToken(code);
if(token == null) {
throw new IllegalAccessError("无法获得用户授权!");
}
String openId = token.getOpenId();
//授权token存入session
session.setAttribute("token", token);

//weixinUser存入session
WeixinUser weixinUser = WeixinUtil.getUserByOpenid(token.getOpenId());
if(weixinUser.getHeadimgurl()==null){
weixinUser.setHeadimgurl(request.getContextPath()+"/image/mobile/noHeadImage.png");
}
if(null==weixinUser.getNickname()){
weixinUser.setNickname("--");
}
session.setAttribute("WeixinUser", weixinUser);

Map<String, Object> map = null;
try {
//调用接口,获取用户信息
JSONObject jsonObject=WeixinUtil.doGetStr(SystemConstants.wangTingUrl+"do/securityInfo/selectUserByOpenId?appInterface=0&openId=" + openId);
map = (Map) jsonObject;
if(map == null) {
throw new IllegalAccessError("获取不到登录权限,不能访问该链接!");
}
}catch(Exception e){
throw new IllegalAccessError("获取不到登录权限,不能访问该链接!");
}
//确认用户是否绑定过
if("have".equals(map.get("message"))){
Map mapuserMap = jasonToMap(map.get("data").toString());
UserVO user = new UserVO();
String username = new String(URLDecoder.decode(URLDecoder.decode(mapuserMap.get("userName").toString(), "UTF-8"), "UTF-8"));
user.setDisplayName(username);
user.setUserId(mapuserMap.get("userId").toString());
user.setUserPwd(mapuserMap.get("pwd").toString());
user.setMobileNum(mapuserMap.get("mobile").toString());
session.setAttribute("user", user);
}else{
//				response.sendRedirect(request.getContextPath()+"/login/toRegister.action");
return "register";
}
}
          以上,微信注册、登录、网页内的链接,授权登录,到此全部讲完。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐