WeChat Open Platform Access, site officiel: https://open.weixin.qq.com, vous pouvez obtenir App_id et App_secret après avoir enregistré et ajouté des applications sur le site officiel.
Étape 1: Créez une interface qui hérite de l'automne, WeChatAuthService, comme suit
Interface publique WeChatAuthService étend AuthService {public JSonObject GetUserInfo (String AccessToken, String OpenID);}Étape 2: L'implémentation spécifique de WeChatService est la suivante
@ServicePublic Class WeChatAuthServiceImpl étend DefaultAuthServiceImplt implémente WeChatAuthService {Private Logger Logger = LoggerFactory.getLogger (WECHATAUTHSERVICEIMPL.CLASS); // Demande cette adresse et sautez vers le code QR Login Interface Interface finale privée String String_Url = "https://open.weixin.qq.com/connect/qrconnect?appid=%S&redirect_uri=%S&response_type=code&scope=%S&state=%S#wechat_redirect"; // Obtenez l'URL de l'utilisateur OpenID et Access-Toke Static Final String AccessToke_OpenID_URL = "https://api.weixin.qq.com/sns/oauth2/Access_Token?appid=%S&secret=%S&code=%S&grant_type=authorization_code"; chaîne finale statique privée refresh_token_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%S&grant_type=refresh_token&refresh_token=%S"; chaîne finale statique privée user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=%S&openID=%S&lang=zh_cn"; chaîne finale statique privée app_id = "xxxxxx"; chaîne finale statique privée app_secret = "xxxxxx"; String final statique privé scope = "snsapi_login"; String privé callbackUrl = "https://www.xxx.cn/auth/wechat"; // CALLAGE NAME DOMAIN @Override public String GetAuthorizationUrl () lève UnsupportDenCcodingException {callBackUrl = urlencoder.encode (callbackUrl, "utf-8"); String url = string.format (Authorization_url, app_id, callbackUrl, scope, system.currentTimemillis ()); URL de retour; } @Override public String getAccessToken (String code) {String url = string.format (AccessToke_OpenID_URL, app_id, app_secret, code); UricomponentsBuilder Builder = uricomponentsBuilder.fromHttpurl (URL); Uri uri = builder.build (). Encode (). TOURI (); String 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"); String 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.tojSontring (); } else {Throw New ServiceException ("Le jeton d'accès a échoué, msg =" + resp); }} // Dans l'interface WeChat, Token et OpenID Return, de sorte que cette méthode n'a pas besoin d'être implémentée @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 (). Encode (). TOURI (); String resp = getRestTemplate (). GetForObject (uri, string.class); Logger.Error ("getUserInfo resp =" + resp); if (resp.Contains ("errcode")) {lancez new ServiceException ("Erreur obtenant des informations utilisateur, msg =" + resp); } else {jsonObject data = jsonObject.ParseObject (resp); JsonObject result = new JSONObject (); result.put ("id", data.getString ("UnionId")); result.put ("surnom", data.getString ("surnom")); result.put ("Avatar", data.getString ("HeadimGurl")); Résultat de retour; }} // Le jeton de WeChat n'a qu'une période de validité de 2 heures, et il doit être réapprovisionné de temps à autre, donc le fonctionnaire fournit une méthode pour actualiser et obtenir le jeton selon Refresh_token. Ce projet n'obtient que l'utilisateur // des informations et stocke les informations dans la bibliothèque, donc deux heures sont suffisantes @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 (). Encode (). TOURI (); Responsentity <JSonObject> resp = gestTemplate (). GetForEntity (uri, jsonObject.class); JSONObject JSONObject = resp.getBody (); String Access_token = jsonObject.getString ("Access_token"); return Access_token; }}Étape 3:
Appelé dans Controller, le code est le suivant:
@RequestMapping (value = "/ wxloginPage", méthode = requestMethod.get) public jsonObject wxLogInPage () lève exception {string uri = wechatauthService.getAuthorizationUrl (); return LoginPage (URI); } @RequestMapping (value = "/ weChat") Public void callback (String code, httpservletRequest request, httpservletResponse réponse) lève exception {string result = wechatauthService.getAccessToken (code); JSONObject JSONObject = JSONObject.ParseObject (Result); String Access_token = jsonObject.getString ("Access_token"); String openId = jsonObject.getString ("openId"); // String refresh_token = jsonObject.getString ("refresh_token"); // Enregistrer Access_token à Cookie, expiré pendant deux heures Cookie AccessTokencookie = new Cookie ("AccessToken", Access_token); AccessTokencookie.setMaxage (60 * 2); réponse.addcookie (AccessTokencookie); Cookie OpenIdCooKie = nouveau cookie ("OpenID", OpenID); openIdCooKie.setMaxage (60 * 2); réponse.addcookie (OpenIdcookie); // jugez si l'utilisateur s'est connecté en fonction d'OpenID. KMSSUser User = userService.GetUserByCondition (OpenID); if (user == null) {réponse.sendRedirect (request.getContextPath () + "/student/html/index.min.html#/bind?type="+constants.login_type_wechat); } else {// Si l'utilisateur existe déjà, connectez-vous directement à Response.SenDredirect (request.getContextPath () + "/Student/html/index.min.html#/app/home?open_id=" + openId); }} Étape 4:
Dans la réception JS, demandez d'abord Auth / WxLoginPage, obtenez l'adresse d'autorisation et appelez / auth / weChat après l'autorisation de l'utilisateur, puis effectuez un traitement logique dans cette méthode.
Troubles rencontrés:
1. Lors de la configuration du nom de domaine de rappel dans le site Web officiel de WeChat, vous n'avez pas besoin de protocoles HTTP ou HTTPS. Il vous suffit d'écrire le domaine. Par exemple, http://baidu.com, vous n'avez qu'à remplir baidu.com. Si vous souhaitez passer à un contrôleur sous le projet, tel que baidu.com/auth/wechat, il vous suffit de configurer Baidu.com, et vous n'avez pas besoin de spécifier l'authers / WeChat ultérieur. L'adresse suivante peut être écrite à l'adresse du rappel dans le code. Le code doit être configuré comme https://baidu.com/auth/wechat.
2. Lorsque vous sautez à l'interface de code QR autorisée, vous rencontrerez la situation où le code QR ne peut pas être libéré. Cela est dû à l'adresse de rappel dans le code. Il ne devrait y avoir aucun problème à configurer la méthode dans le code ci-dessus.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.