微信公众号授权登录(应用免登陆)
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里的目标地址,重定向到此地址即可。
首先,用户网页授权,调用微信接口获取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"; } }以上,微信注册、登录、网页内的链接,授权登录,到此全部讲完。
相关文章推荐
- Android应用第三方授权登录 之 【腾讯微博】
- 新浪微博 & QQ登录 登陆授权 V1.0
- Android应用实现QQ授权登录
- 06_NoSQL数据库之Redis数据库:Redis的高级应用之登录授权和主从复制
- 06_NoSQL数据库之Redis数据库:Redis的高级应用之登录授权和主从复制
- 为什么登陆不上WIN 7系统的电脑?提示无权限,登陆失败,未授权用户在计算机上请求登录
- 淘宝账号基于OAuth2.0的登录验证授权登陆第三方网站
- ios 第三方授权登陆 应用不存在、回不了家了问题
- 【Android应用开发详解】实现第三方授权登录、分享以及获取用户资料
- 微信公众号授权登录 url中添加%E2%80%8b
- 新浪微博 & QQ登录 登陆授权 V1.0
- 【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料
- 腾讯微博应用授权隐式登陆实现
- Android应用实现QQ授权登录
- 用的友盟安卓社会化组件,然后客户端安装了微博4.2,做的应用用友盟的新浪授权登陆 提示:sso package or sign error。
- 关于远程桌面登陆提示“连接被拒绝,因为没有授权此用户账号进行远程登录”
- 【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料
- 【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料
- IOS应用 第三方登录授权与分享
- 腾讯QQ第三方登陆,登录授权失败110406❓