WeChat Open Platform Access, sitio web oficial: https://open.weixin.qq.com, puede obtener APP_ID y APP_SECRET después de registrarse y agregar aplicaciones en el sitio web oficial.
Paso 1: Cree una interfaz que herede AuthService, WechatauthService, de la siguiente manera
interfaz pública wechatauthservice extiende authservice {public jsonObject getUserInfo (String AccessToken, String OpenId);}Paso 2: La implementación específica de WeCatservice es la siguiente
@ServicePublic Class wechatauthServiceImpl extiende defaultAuthServiceImpl implementa wechatauthservice {private logger logger = loggerFactory.getLogger (wechatauthserviceImpl.class); // Solicite esta dirección y salte a la interfaz del código QR Interface private estatic string string_url = "https://open.weixin.qq.com/connect/qrconnect?appid=%S&redirect_uri=%s&response_type=code&scope=%s&state=%S#wechat_redirect"; // Obtenga la URL del usuario OpenId y la cadena final de acceso privado Final String AccessToke_openid_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%up Cadena final estática privada refresh_token_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%S&grant_type=refresh_token&refresh_token=%S"; Cadena final de estática privada user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=%S&openid=%ups&lang=zh_cn"; String final privada estática app_id = "xxxxxx"; cadena final de estática privada app_secret = "xxxxxxx"; privado static final string scope = "snsapi_login"; Cadena privada CallbackUrl = "https://www.xxx.cn/auth/wechat"; // Llamar al nombre de dominio @Override public String getAuthorizationUrl () lanza UnspportedEncodingException {llameBackUrl = urlencoder.encode (callbackUrl, "utf-8"); String url = string.format (autorization_url, app_id, callbackUrl, scope, system.currentTimemillis ()); URL de retorno; } @Override public String getAccessToken (código de cadena) {string url = string.format (accessToke_openid_url, app_id, app_secret, código); URicomponentsBuilder Builder = URicomponentsBuilder.fromHttpurl (URL); Uri uri = builder.build (). Coden (). Touri (); Cadena resp = getResttemplate (). GetForObject (uri, string.class); logger.error ("getAccesStoken resp ="+resp); if (resp.contains ("openId")) {jsonObject jsonObject = jsonObject.ParseObject (resp); String access_token = jsonObject.getString ("access_token"); Cadena OpenID = jsonObject.getString ("OpenId") ;; JsonObject res = new JsonObject (); res.put ("access_token", access_token); res.put ("OpenID", OpenID); res.put ("refresh_token", jsonObject.getString ("refresh_token")); return res.tojSonstring (); } else {tirar nueva servicioException ("Falló el token de acceso, msg ="+resp); }} // En la interfaz WeChat, Token y OpenID Devuelve juntos, por lo que este método no es necesario implementar @Override public String getopenid (String AccessToken) {return null; } @Override public jsonObject getUserInfo (String AccessToken, String OpenId) {String url = String.Format (user_info_url, accessToken, OpenID); URicomponentsBuilder Builder = URicomponentsBuilder.fromHttpurl (URL); Uri uri = builder.build (). Coden (). Touri (); Cadena resp = getResttemplate (). GetForObject (uri, string.class); logger.error ("getUserInfo resp ="+resp); if (resp.contains ("errcode")) {throw new ServiceException ("Error al obtener información del usuario, msg ="+resp); } else {jsonObject data = jsonObject.ParseObject (resp); JsonObject resultado = new JsonObject (); resultado.put ("id", data.getString ("unionId")); resultado.put ("Nickname", data.getString ("Nickname")); result.put ("Avatar", data.getString ("HeadImgurl")); resultado de retorno; }} // El token de WeChat tiene solo un período de validez de 2 horas, y debe rehacer de vez en cuando, por lo que el funcionario proporciona un método para actualizar y obtener el token de acuerdo con Refresh_Token. Este proyecto solo obtiene el usuario // información y almacena la información en la biblioteca, por lo que dos horas son suficientes @Override public String RefreshToken (string refresh_token) {String url = string.format (refresh_token_url, app_id, refresh_token); URicomponentsBuilder Builder = URicomponentsBuilder.fromHttpurl (URL); Uri uri = builder.build (). Coden (). Touri (); ResponseEntity <JsonObject> resp = getRestTemplate (). JsonObject jsonObject = resp.getBody (); String access_token = jsonObject.getString ("access_token"); return access_token; }}Paso 3:
Llamado en el controlador, el código es el siguiente:
@RequestMapping (valor = "/wxloginpage", método = requestmethod.get) public jsonObject wxloginPage () lanza la excepción {String uri = wechatauthservice.getAuthorizationUrl (); return LoginPage (URI); } @RequestMapping (valor = "/wechat") public void Callback (código de cadena, solicitud httpservletRequest, httpServletResponse Respuesta) lanza la excepción {string result = wechatauthservice.getAccessToken (código); JsonObject jsonObject = jsonObject.ParseObject (resultado); String access_token = jsonObject.getString ("access_token"); String OpenID = jsonObject.getString ("OpenID"); // String Refresh_Token = jsonObject.getString ("refresh_token"); // Guardar access_token a cookie, expirado durante dos horas cookie accesstokencookie = new Cookie ("AccessToken", access_token); accesstokencookie.setMaxage (60 *2); Response.AddCookie (AccessTokenCookie); Cookie OpenIdcookie = nueva cookie ("OpenID", OpenID); OpenIdCookie.SetMaxage (60 *2); Response.AddCookie (OpenIdCookie); // juzga si el usuario ha iniciado sesión en función de OpenID. Kmsuser user = Userservice.getuserByCondition (OpenID); if (user == null) {Response.sendedirect (request.getContextPath () + "/student/html/index.min.html#/bind?type="+Constants.login_type_wechat); } else {// Si el usuario ya existe, inicie sesión directamente en respuesta.sendedirect (request.getContextPath () + "/Student/html/index.min.html#/app/home?open_id=" + OpenID); }} Paso 4:
En la recepción JS, primero solicite Auth/WxLogInpage, obtenga la dirección de autorización y llame a la devolución/auth/wechat después de la autorización del usuario, y luego realice un procesamiento lógico en este método.
Problemas encontrados:
1. Al configurar el nombre de dominio de devolución de llamada en el sitio web oficial de WeChat, no necesita algunos protocolos HTTP o HTTPS. Solo necesitas escribir el dominio. Por ejemplo, http://baidu.com, solo necesita completar baidu.com. Si desea saltar a un controlador debajo del proyecto, como baidu.com/auth/wechat, solo necesita configurar baidu.com, y no necesita especificar el Auth/WeChat posterior. La dirección posterior se puede escribir en la dirección de la devolución de llamada en el código. El código debe configurarse como https://baidu.com/auth/wechat.
2. Al saltar a la interfaz de código QR autorizada, encontrará la situación en la que no se puede publicar el código QR. Esto se debe a la dirección de devolución de llamada en el código. No debe haber ningún problema en la configuración del método en el código anterior.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.