WeChat Open Plattform Access, offizielle Website: https://open.weixin.qq.com, Sie können app_id und app_secret erhalten, nachdem Sie Anträge auf der offiziellen Website registriert und hinzugefügt haben.
Schritt 1: Erstellen Sie eine Schnittstelle, die den AuthService, WeChatAuthService, wie folgt erbt
Öffentliche Schnittstelle WechatAuthService erweitert AuthService {public JsonObject getUserInfo (String AccessToken, String OpenID);}Schritt 2: Die spezifische Implementierung von WechatService ist wie folgt
@ServicePublic Class WeChatAuthServiceImpl erweitert DefaultAuthServiceImPlements WeChatAuthService {private logger logger = loggerfactory.getLogger (WeChatAuthServiceImpl.class); // diese Adresse anfordern und zum QR -Code -Login -Interface privat -statische State -Stata -Autorisierung_url = springen. "https://open.weixin.qqq.com/connect/qrconnect?appid=%S&redirect_uri=%S&response_type=Code&scope=%S&state=%s#wechat_redirect"; // Holen Sie sich die URL des User OpenID und Access-Toke Private statische String-String-AccessToke_openid_url = "https://api.weixin.qq.com/sns/oAuth2/access_Token?appid=%s&secret=%s&code=%s&grant_type=Authorization_code_code_code"; private statische endgültige String -String refresh_token_url = "https://api.wexin.qq.com/sns/oauth2/refresh_token?appid=%S&grant_type=refresh_Token&refresh_token=%S"; private statische endgültige String user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=%S&openid=%S&lang=ZH_CN"; private statische endgültige String app_id = "xxxxxx"; private statische endgültige String app_secret = "xxxxxxx"; private statische endgültige String scope = "snsapi_login"; private String callbackurl = "https://www.xxx.cn/auth/wechat"; // Domänenname @Override public String getAuthorizationUrl () löscht, die nicht unterstützteCodingException {Callbackurl = urlencoder.encode (Callbackurl, "UTF-8"); String url = string.format (authorization_url, app_id, callbackurl, scope, system.currentTimemillis ()); Return URL; } @Override public String getAccessToken (String -Code) {String url = string.format (accessToke_openid_url, app_id, app_secret, code); UricomponentsBuilder Builder = HaricomponentsBuilder.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.tojonstring (); } else {town serviceException ("Access -Token fehlgeschlagen, msg ="+resp); }} // In der WeChat -Schnittstelle, Token und OpenID return zusammen, so dass diese Methode nicht implementiert werden muss. } @Override public JsonObject getUserInfo (String AccessToken, String OpenID) {String url = string.format (user_info_url, accessToken, openID); UricomponentsBuilder Builder = HaricomponentsBuilder.FromHttpurl (URL); URI URI = builder.build (). Encode (). Touri (); String resp = getRestTemplate (). GetForObject (URI, String.Class); logger.Error ("getUserinfo resp ="+resp); if (resp.contains ("errCode")) {neue serviceException ("Fehler beim Erhalten von Benutzerinformationen, msg ="+resp); } else {jsonObject data = jsonObject.parseObject (resp); JsonObject Ergebnis = new JSONObject (); result.put ("id", data.getString ("UnionId")); result.put ("Spitzname", data.getString ("Spitzname"); result.put ("avatar", data.getString ("Headimgurl")); Rückgabeergebnis; }} // WeChats Token hat nur eine 2-stündige Gültigkeitsdauer und muss von Zeit zu Zeit wieder akquisitiert werden. Daher bietet der Beamte eine Methode zum Aktualisieren und Erhalt des Tokens gemäß refresh_token. Dieses Projekt erhält nur Benutzer // Informationen und speichert die Informationen in der Bibliothek. Zwei Stunden sind so ausreichend @Override public String refreshtoken (String refresh_token) {String url = string.format (requestresh_token_url, app_id, request_token); UricomponentsBuilder Builder = HaricomponentsBuilder.FromHttpurl (URL); URI URI = builder.build (). Encode (). Touri (); Responseentity <JsonObject> resp = getRestTemplate (). GetForentity (URI, jsonObject.class); JsonObject jsonObject = resp.getBody (); String access_token = jsonObject.getString ("access_token"); return access_token; }}Schritt 3:
In Controller berufen, lautet der Code wie folgt:
@RequestMapping (value = "/wxloginpage", method = requestMethod.get) public JSONObject WXLoginPage () löst eine Ausnahme aus {String uri = wechatAuthService.getAuthorizationurl (); Return Loginpage (URI); } @RequestMapping (value = "/wechat") public void callback (String -Code, httpServletRequest -Anforderung, httpServletResponse -Antwort) löst eine Ausnahme aus {String result = wechatAuthService.getAccessToken (Code); JsonObject jsonObject = jsonObject.ParseObject (Ergebnis); String access_token = jsonObject.getString ("access_token"); String openID = jsonObject.getString ("openID"); // String refresh_token = jsonObject.getString ("reAbresh_token"); // Access_Token vor Cookie speichern, abgelaufen für zwei Stunden Cookie AccessTokencookie = New Cookie ("AccessToken", Access_Token); AccessToKencookie.SetMaxage (60 *2); response.addcookie (AccessToKencookie); Cookie OpenIDCookie = New Cookie ("OpenID", OpenID); openIdcookie.setMaxage (60 *2); response.addcookie (openIdcookie); // Beurteilen Sie, ob sich der Benutzer anhand von OpenID angemeldet hat. Kmsuser user = userService.getUserByCondition (OpenID); if (user == null) {response.sendredirect (request.getContextPath () + "/student/html/index.min.html#/bind?type="+Constants.login_type_wechat); } else {// Wenn der Benutzer bereits existiert, melden Sie sich direkt bei response.sendredirect an (request.getContextPath () + "/student/html/index.min.html#/App/home?open_id=" + OpenID); }} Schritt 4:
In der Rezeption JS JS AUTH/WXLOGINPAGE zuerst anfordern, die Autorisierungsadresse erhalten und nach der Benutzerautorisierung zurückrufen und dann in dieser Methode logische Verarbeitung durchführen.
Probleme auftreten:
1. Bei der Konfiguration des Callback -Domain -Namens auf der offiziellen WeChat -Website benötigen Sie keine HTTP- oder HTTPS -Protokolle. Sie müssen nur die Domain schreiben. Beispielsweise müssen Sie nur baidu.com ausfüllen. Wenn Sie zu einem Controller unterhalb des Projekts wie baidu.com/auth/wechat springen möchten, müssen Sie nur Baidu.com konfigurieren, und Sie müssen die nachfolgende Auth/Wechat nicht angeben. Die nachfolgende Adresse kann an die Adresse des Rückrufs im Code geschrieben werden. Der Code sollte als https://baidu.com/auth/wechat konfiguriert werden.
2. Wenn Sie zur autorisierten QR -Codeschnittstelle springen, werden Sie auf die Situation stoßen, in der der QR -Code nicht veröffentlicht werden kann. Dies liegt an der Rückrufadresse im Code. Es sollte kein Problem sein, die Methode im obigen Code zu konfigurieren.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.