위챗 공중번호 로그인 권한 수여(로그인 면제 적용)

위챗 권한 수여 로그인은 서비스 번호 앱이 로그인 면제(실질적으로 코드를 통해access token)로 바뀌어도 앱은 로그인 상태이다.본고는 간단하게 위챗 홈페이지의 권한 수여 로그인을 설명한다.
우선, 사용자 홈페이지가 권한을 부여하고, 위챗 인터페이스를 호출하여 코드를 얻는다.그리고 얻은 코드로 위챗 인터페이스를 호출하여 웹 페이지의 권한을 위임받는accesstoken, 이것은 임시 웹 페이지에서 권한을 위임받은accesstoken.code를 통해access 가져오기token 인터페이스, 사용 횟수 제한이 없습니다.이 인터페이스를 호출하면accesstoken과 Openid.웹 페이지 권한 수여 로그인, 즉 로그인 면제를 적용합니다. 우리 회사의 서비스 번호를 사례로 삼아 말씀드리겠습니다.우리 회사의 위챗 서비스 번호는 등록과 로그인 기능이 있기 때문에 우리의 일부 특수한 서비스, 예를 들어 충전과 소비 흐름을 조회하려면 등록과 로그인이 필요하다.사용자가 저희 서비스 번호를 주목한 후 메뉴를 클릭하면 새로운 사용자의 등록을 유도할 수 있습니다.
우리의 위챗 프로젝트는 위챗 메뉴의 링크가 위챗 홈페이지 권한 수여 인터페이스를 통해 포장된 동시에 위챗 로그인 사용자 정보(openid 포함)userVO를session에 저장합니다.사용자가 Google 위챗 서비스 번호에 등록하거나 로그인하면 Openid는 Google 사용자 테이블에 존재합니다.사용자가 등록하거나 로그인한 후에, 우리는 사용자 정보를session에 저장할 것입니다. 1시간 동안session이 시간을 초과하면 자동으로 삭제됩니다.사용자가 위챗 메뉴의 링크를 클릭하면session에userVO가 있는지 판단하고 로그인 상태를 유지하여 자동으로 목표 주소로 이동합니다.사용자 정보가 없으면 웹 페이지 권한 수여 인터페이스에서 얻은code에 따라 위챗 인터페이스를 호출하여accesstoken, 가장 중요한 것은 오픈id입니다.그리고 이openid를 이용하여 사용자 테이블을 조회합니다. 사용자가 존재하면session에 사용자 정보를 저장하고 목표 주소로 이동합니다.Openid에 따라 사용자를 조회할 수 없으면 등록/로그인 페이지로 이동하여 사용자가 등록이나 로그인을 선택하도록 합니다.
위챗 메뉴가 아닌 링크에 대해 웹 페이지 내의 링크도 권한을 부여받아 이동하는 형식을 취한다.사용자 홈페이지 권한 수여, 코드 획득, 인터페이스: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, 즉 우리의 상륙 면제 방법.이 방법에서 얻은 코드로accesstoken (주로 안의 Openid) 을 사용하고, 이어서 Openid를 사용하여 사용자 정보를session에 저장합니다.state에 넣은 목표 주소를 다시 꺼내서 이 주소로 바꾸면 됩니다.
4
/**
	 *    
	 * @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 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";
			}
		}
이상, 위챗 등록, 로그인, 홈페이지 내의 링크, 로그인 권한 수여, 여기에서 모두 설명합니다.

좋은 웹페이지 즐겨찾기