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

         微信授权登录,可以帮助服务号应用实现免登陆(实质上通过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";
			}
		}
          以上,微信注册、登录、网页内的链接,授权登录,到此全部讲完。


  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
Java实现微信公众号的关注登录可以通过调用微信开放平台的接口来实现。首先,需要在微信开放平台注册一个开发者账,并创建一个应用。然后,使用Java开发框架可以通过发送HTTP请求来调用微信开放平台的接口。 在用户登录微信公众号时,首先需要引导用户点击关注按钮,跳转至微信登录授权页面。用户在页面中输入微信和密码,进行登录确认。然后根据微信开放平台提供的接口,获取用户的基本信息。Java中可以使用HttpClient或OkHttp等库来发送HTTP请求,获取用户登录授权凭证access_token。 接下来,通过获取到的access_token,可以调用微信开放平台的接口来获取用户的详细信息,如用户名、头像等。具体调用的接口可以根据微信开放平台的文档进行选择和调用。 最后,将获取到的用户信息保存到数据库中,以便后续使用。在用户再次登录时,可以根据用户的微信来查询数据库中是否已存在该用户的信息,若存在则进行登录操作,若不存在则要求用户重新关注并进行登录授权。 总体来说,Java实现微信公众号的关注登录需要通过调用微信开放平台的接口来获取用户的授权凭证和详细信息,并将信息保存至数据库。在用户登录时,需要检查用户是否已关注并进行相应的登陆授权操作。这样,就可以实现Java微信公众号关注登录的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坚持是一种态度

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值