Registro del proceso de inicio de sesión de autorización de WeChat

El proceso general:

El inicio de sesión autorizado de WeChat se puede dividir en cuatro tipos:
1. Inicio de sesión autorizado en el terminal móvil;
2. Inicio de sesión autorizado en el lado de la aplicación del sitio web (solo se admite el inicio de sesión con código de escaneo. Si se trata de un acceso de teléfono móvil, entonces se requieren dos teléfonos móviles para completar la operación. No es posible tomar una captura de pantalla y escanear nuevamente. Sí, intenté activar WeChat en el navegador móvil para obtener autorización y descubrí que no hay una aplicación universal. Solo las páginas web de JD.com y Xiaomi tienen un inicio de sesión de autorización de WeChat integrado, que puede tener una interfaz separada u otros procesos y métodos interactivos);
3. Cuenta oficial , Mini programa autorizado para iniciar sesión;

4. Plataforma de terceros (sin usar)

1. Proceso de autorización de la cuenta oficial y código fuente (estas herramientas se pueden encontrar en el SDK)

1. El servidor cliente proporciona una interfaz de autorización (este lugar proporciona la dirección de devolución de llamada para que WeChat acceda al servidor cliente. Tenga en cuenta que esta dirección debe configurarse en la "Autorización web" en la plataforma pública):

	@RequestMapping(value = "/")
	public String login(){
    
    
//		String backUrl = "http://surenguangbo.com/suren/callBack";
		String backUrl = "http://xxx.com/sur-api/web";
		String url = "https://open.weixin.qq.com/connect/oauth2/authorize?"
				+ "appid="+ WXLogin.APPID
				+ "&redirect_uri="+URLEncoder.encode(backUrl)
				+ "&response_type=code"
				+ "&scope=snsapi_userinfo"
				+ "&state=STATE#wechat_redirect";
		return "redirect:"+url;
	}

2. Obtenga el código directamente aquí y solicite a WeChat que obtenga la información del cliente y openid y lo entregue a la página H5. La desventaja de este método solo puede ser el openid en forma de solicitud de obtención, empalmando detrás;

@RequestMapping(value="web")
	public String callBack(HttpServletRequest request) throws ClientProtocolException, IOException{
    
    
		String code = request.getParameter("code");
		// 获取openid
		String url  = "https://api.weixin.qq.com/sns/oauth2/access_token"
				+ "?appid="+WXLogin.APPID
				+ "&secret="+WXLogin.APPSECRET
				+ "&code="+code
				+ "&grant_type=authorization_code";
		JSONObject wxuser = WXLogin.doGetjson(url); 	 
		
		  String openid = wxuser.getString("openid");
		  System.out.println(openid);
		  String token = wxuser.getString("access_token");
		  System.out.println(token);
		  // 获取微信昵称、头像等用户信息
		  String infoUrl = "https://api.weixin.qq.com/sns/userinfo" 
		  		+ "?access_token="+token
		  		+ "&openid="+openid
		  		+ "&lang=zh_CN";
		  JSONObject userinfo = WXLogin.doGetjson(infoUrl); 
		  /*
		   * {"city":"新乡","country":"中国",
		   * "headimgurl":"http://wx.qlogo.cn/mmopen/j2wX8eqnnnhd0Ie6WeosMYuWibO0zoKPsmPbtJzqB6UCiaN3bic8zkkcGqyZWoiamzWqTDVM8OV58JB30ibv1NPboAiaj6g3eTwYnr/0",
		   * "language":"zh_CN",
		   * "nickname":"sup",
		   * "openid":"oUWMrwX2009ZBdhqlKi-rD0OeMSI",
		   * "privilege":[],
		   * "province":"河南",
		   * "sex":1}
		   */
//		  	获取用户的信息后,创建用户, 先判断用户是否存在,   不存在的话  创建,  存在的话省略 :
		  
		  String name = userinfo.getString("nickname");
		  String photo = userinfo.getString("headimgurl");
		  String openidUser = userinfo.getString("openid");
		  String id = null;
		  String userName = "";
		  List<TSurenUser> userList = tSurenUserService.selectOneUser(openid);
		  if(userList != null && userList.size() > 0){
    
    
			   userName = WXLogin.filterEmoji(name, "1");
			  // 该用户存在的话, 更新下头像和名称;
			  userList.get(0).setPhoto(photo);
			  userList.get(0).setUsername(userName);
			  boolean b = tSurenUserService.updateUserNameAndPhoto(userList.get(0));

		  }else{
    
    
			  if(StringUtils.isNotBlank(openidUser) && StringUtils.isNotBlank(name) && StringUtils.isNotBlank(photo) ){
    
    
				   userName = WXLogin.filterEmoji(name, "1");
				  TSurenUser user = new TSurenUser();
				  user.setOpenid(openidUser);
				  user.setPhoto(photo);
				  user.setUsername(userName);
				 boolean b = tSurenUserService.saveUser(user);
			  }
		  }

		  return "redirect:http://xxx.com/sur/index.html?openid="+openidUser;

	}

PD: Esta interfaz se puede dividir en dos interfaces, una devuelve el código a H5 y la otra consulta el ID de apertura del usuario actual y la información del usuario según el código;

II. Inicio de sesión de autorización de la aplicación del sitio web:
1. Al igual que el proceso de autorización de la cuenta oficial , el código se agrega directamente aquí; pero hay varios problemas a los que se debe prestar atención:
(1) El inicio de sesión de autorización de la aplicación del sitio web se realiza en la "Plataforma abierta de WeChat" para la configuración de parámetros;
(2) ) Necesita solicitar solicitudes, cierta información corporativa e información de la aplicación del sitio web;
(3) Debe solicitar las calificaciones de desarrollador para tener permisos de interfaz. Debe certificarse una vez al año. La tarifa de certificación en China continental es de 300 yuanes. La solicitud de certificación en la plataforma pública también cuesta , Puede que no sea necesario cobrar repetidamente;
(4) Si la plataforma abierta no está vinculada a la cuenta oficial, entonces el openid obtenido por el mismo usuario es diferente, y hay un unionid que parece ser el mismo, y no hay una investigación específica en el futuro. Interesado Se puede probar; (La
cuenta oficial de WeChat debe estar vinculada a la plataforma abierta para garantizar que el openid del mismo usuario sea el mismo;) (5) El appId y AppSecret de la plataforma abierta son diferentes, y hay dos conjuntos;
(6) La dirección del primer paso para obtener el código es diferente, principalmente scope = snsapi_login

 unionid	用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。
//---------------- web 微信授权登陆
	@RequestMapping(value = "/webLogin")
	public String webLogin(){
    
    
		String backUrl = "http://xxx.com/sur/callBackWeb";
		String url = "https://open.weixin.qq.com/connect/qrconnect?"
				+ "appid="+ WXLogin.WEBAPPID
				+ "&redirect_uri="+URLEncoder.encode(backUrl)
				+ "&response_type=code"
				+ "&scope=snsapi_login";
		return "redirect:"+url;
	}

	/**
	 *  web端的回调地址
	 * @param request
	 * @return
	 * @throws ClientProtocolException
	 * @throws IOException
	 */
	@RequestMapping(value="callBackWeb")
	public String callBackWeb(HttpServletRequest request, HttpServletResponse response) throws ClientProtocolException, IOException, ServletException {
    
    
		String code = request.getParameter("code");
		  return "redirect:http://xxx.com/index.html?code="+code+"#/buy";
	}

	/**
	 * 获取openid
	 * @param request
	 * @param vo
	 * @param response
	 * @return
	 * @throws IOException
	 */
    @RequestMapping(value="getOpenId")
    @ResponseBody
    public Result getOpenId(HttpServletRequest request, @RequestBody IndexVO vo,  HttpServletResponse response) throws IOException {
    
    
//        String code = request.getParameter("code");
        String code = request.getParameter("code");
        if(StringUtils.isBlank(code) || "null".equals(code)){
    
    
			code = vo.getCode();
				if(StringUtils.isBlank(code) || "null".equals(code)){
    
    
					return Result.error("未接收到code");
				}
        }

		String url  = "https://api.weixin.qq.com/sns/oauth2/access_token"
				+ "?appid="+WXLogin.WEBAPPID
				+ "&secret="+WXLogin.WEBAPPSECRET
				+ "&code="+code
				+ "&grant_type=authorization_code";
		JSONObject wxuser = WXLogin.doGetjson(url);

		String openid = wxuser.getString("openid");
		System.out.println(openid);
		String token = wxuser.getString("access_token");
		System.out.println(token);
		String infoUrl = "https://api.weixin.qq.com/sns/userinfo"
				+ "?access_token="+token
				+ "&openid="+openid
				+ "&lang=zh_CN";
		JSONObject userinfo = WXLogin.doGetjson(infoUrl);
		/*
		 * {"city":"新乡","country":"中国",
		 * "headimgurl":"http://wx.qlogo.cn/mmopen/j2wX8eqnnnhd0Ie6WeosMYuWibO0zoKPsmPbtJzqB6UCiaN3bic8zkkcGqyZWoiamzWqTDVM8OV58JB30ibv1NPboAiaj6g3eTwYnr/0",
		 * "language":"zh_CN",
		 * "nickname":"supe",
		 * "openid":"oUWMrwX2009ZBdhqlKi-rD0OeMSI",
		 * "privilege":[],
		 * "province":"河南",
		 * "sex":1}
		 */
//		  	获取用户的信息后,创建用户, 先判断用户是否存在,   不存在的话  创建,  存在的话省略 :

		String name = userinfo.getString("nickname");
		String photo = userinfo.getString("headimgurl");
		String openidUser = userinfo.getString("openid");
		String id = null;
		String userName = "";
		List<TSurenUser> userList = tSurenUserService.selectOneUser(openid);
		if(userList != null && userList.size() > 0){
    
    
			userName = WXLogin.filterEmoji(name, "1");
			// 该用户存在的话, 更新下头像和名称;
			userList.get(0).setPhoto(photo);
			userList.get(0).setUsername(userName);
			boolean b = tSurenUserService.updateUserNameAndPhoto(userList.get(0));
		}else{
    
    
			if(StringUtils.isNotBlank(openidUser) && StringUtils.isNotBlank(name) && StringUtils.isNotBlank(photo) ){
    
    
				userName = WXLogin.filterEmoji(name, "1");
				TSurenUser user = new TSurenUser();
				user.setOpenid(openidUser);
				user.setPhoto(photo);
				user.setUsername(userName);
				boolean b = tSurenUserService.saveUser(user);
			}
		}
		response.addHeader("openidWeb",openidUser);
		return Result.resData();
    }
//---------------- web 微信授权登陆

Hasta ahora, el proceso de autorización de los dos métodos es en realidad similar, pero los detalles necesitan atención;

Supongo que te gusta

Origin blog.csdn.net/qq_37521174/article/details/106335095
Recomendado
Clasificación