Dans le développement de WeChat, il y a souvent de tels besoins: obtenir des avatars d'utilisateurs, lier des comptes WeChat pour envoyer des messages aux utilisateurs ... alors la condition préalable pour obtenir ces éléments est l'autorisation!
1. Configurez le nom de domaine de rappel sécurisé:
Avant de demander l'autorisation de la page Web de l'utilisateur par WeChat Public Account, les développeurs doivent accéder à l'option de configuration de "Développement - autorisation d'interface - Services Web - Comptes Web - Autorisation Web pour obtenir des informations de base des utilisateurs" dans le site officiel de la plate-forme publique pour modifier le nom de domaine de rappel d'autorisation. Il convient de noter que cela consiste à écrire directement le nom de domaine complet, tel que: www.liangl.cn. Cependant, dans notre développement de H5, nous utilisons généralement des noms de domaine secondaire, tels que: H5.liliangel.cn, qui est également dans les noms de domaine de rappel sécurisés.
2. Autorisation au niveau de l'utilisateur et autorisation silencieuse
1. L'autorisation de la page Web initiée par SNSAPI_BASE est utilisée pour obtenir l'OpenID de l'utilisateur entrant dans la page, et est silencieusement autorisé et a automatiquement sauté sur la page de rappel. Ce que l'utilisateur perçoit, c'est qu'il entre directement dans la page de rappel.
2. Autorisation de la page Web initiée par SNSAPI_USERINFO comme portée est utilisée pour obtenir des informations de base utilisateur. Cependant, cette autorisation nécessite le consentement du manuel de l'utilisateur, et comme l'utilisateur a convenu, il n'est pas nécessaire de y prêter attention et les informations de base de l'utilisateur peuvent être obtenues après l'autorisation.
3. La différence entre l'autorisation Web Access_token et Ordinary Access_token
1. L'autorisation de la page Web de WeChat est implémentée via le mécanisme OAuth2.0. Une fois que l'utilisateur autorise le compte officiel, le compte officiel peut obtenir un appel d'identité d'appel d'interface (autorisation Web Access_token) unique à l'autorisation de la page Web. L'appel d'interface d'autorisation peut être effectué via l'autorisation de la page Web Access_Token, comme l'obtention d'informations de base utilisateur;
2. Pour d'autres interfaces WeChat, des appels Access_token ordinaires sont nécessaires via l'interface "Get Access_token" dans la prise en charge de base.
4. Guide l'utilisateur vers la page d'autorisation pour accepter l'autorisation et obtenir le code
Une fois WeChat mis à jour, la page d'autorisation a également changé. En fait, je suis habitué à la page verte classique ...
JS:
var Center = {init: function () {.......}, enterwxAuthor: function () {var wxuseRinfo = localStorage.getItem ("wxuseRinfo"); if (! wxUserInfo) {var code = Common.getUrlParameter ('code'); if (code) {Common.getWxUserInfo (); Centre.Init (); } else {// pas d'informations utilisateur WeChat, aucune autorisation - >> l'autorisation est requise, passez à la page d'autorisation Window.Location.href = 'https://open.weixin.qq.com/connect/oauth2/Authorize?appid='+ wx_appid +' & redirect_uri = '+ window.location.href + '& réponse_type = code & scope = snsapi_userinfo # wechat_redirect'; }} else {Centre.Init (); }}} $ (document) .ready (function () {Centre.EntterWxAuthor ();}Prenez Scope = SNSAPI_USERINFO comme exemple. Lorsque la page est chargée, entrez la méthode d'autorisation. Tout d'abord, obtenez l'objet WXUSERINFO à partir du cache. S'il existe une explication, entrez directement la méthode d'initialisation. Sinon, déterminez si l'URL contient un code. S'il y a un code, cela signifie que c'est la page après avoir entré le rappel de la page d'autorisation. Échangez ensuite les informations de l'utilisateur via le code. Il n'y a pas de code, c'est-à-dire que l'utilisateur entre dans la page pour la première fois et guide la page d'autorisation. Redirect_uri est l'adresse de la page actuelle.
Méthode GetWxUserInfo:
/ ** * Obtenez les informations de base de l'utilisateur après l'autorisation * / getWxUserInfo: function (par) {var code = Common.getUrlParameter ("Code"); if (par) code = par; $ .ajax ({async: false, data: {code: code}, type: "get", url: wx_root + "wechat / autorisation", succès: function (json) {if (json) {try {// assurez-vous que le wxuseRinfo écrit est correct var data = json.atsse (json); if (data.oped) { localStorage.SetItem ('wxuseRinfo', json); // Écriture de cache - Informations utilisateur-wechat}} catch (e) {// todo: exception}}}}}); },5. Backend Restful-- / WeChat / Authorization, échange des informations utilisateur basées sur le code
/ ** * WeChat Autorisation * @param code expire après utilisation * * @return Informations de base de l'utilisateur * @throws ioException * / @RequestMapping (value = "/ Authorization", méthode = requestMethod.get) public void Authorizationweixin (@RequestParam String Code, httpServerTrequest Request, httpserReResponse Apwiste) lance iOXEXECT {requête, httpserReResponse Action) lance ioException {requête, httpserReSponse Apwiste) lance iOXEXECT {requête, HttpserReResponse Action) lance IOXEXECT request.SetcharAtterencoding ("UTF-8"); Response.SetcharAtterencoding ("UTF-8"); Printwriter out = réponse.getWriter (); Logger.info ("Restful of Authorization Paramètres Code: {}", code); try {String rs = weCHATService.getoAuthAccessToken (code); out.write (RS); Logger.info ("Resful of Authorization est réussi.", RS); } catch (exception e) {logger.error ("Restful of Authorization est une erreur.", E); } enfin {out.close (); }}Il y a un Access_token autorisé ici. N'oubliez pas: ACCEPS_TOKINE AUTORISÉ n'est pas Global Access_token, et il nécessite l'utilisation du cache. J'utilise Redis ici. Je ne dirai pas grand-chose sur la configuration spécifique et je rédige un article de blog de configuration connexe plus tard. Bien sûr, vous pouvez également utiliser ehcache. Il y a une introduction détaillée à la configuration d'Ehcahe dans mon premier blog.
/ ** * Obtenez des jetons autorisés basés sur le code uniquement disponibles lors de l'autorisation, différent de Global Access_tokens * @param code * @return * @throws ioException * @throws ClientProtoCoLexception * / public String getoAuthAccessToken (Code de chaîne) lance ClientProtoCOLOCOxception, ioException {String data = redideservice.get ("weixin_sq_caccess");); String rs_access_token = null; String RS_OpenID = NULL; String url = wx_oauth_access_token_url + "? Appid =" + wx_appid + "& secret =" + wx_appSecret + "& code =" + code + "& Grant_Type = Authorization_Code"; if (stringUtils.isempty (data)) {synchronisé (this) {// expiré, string hs = apiService.doget (url); JSONObject JSON = JSONObject.ParseObject (HS); String refresh_token = json.getString ("refresh_token"); String refresh_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid="+wx_appid+"&grant_type=refresh_token&refresh_token="+refresh_token; String R_HS = APISERVICE.DOGET (Refresh_Url); JSONObject r_json = jsonObject.ParseObject (r_hs); String r_access_token = r_json.getString ("Access_token"); String r_expires_in = r_json.getString ("exires_in"); rs_openID = r_json.getString ("openId"); rs_access_token = r_access_token; redesservice.set ("weixin_sq_access_token", r_access_token, Integer.parseint (r_expires_in) - 3600); Logger.info ("Set SQ Access_Token sur Redis est réussi.Parameters Time: {}, Realtime", Integer.Parseint (R_Expires_in), Integer.Parseint (R_Expires_in) - 3600); }} else {// non expiré String HS = APISERVICE.DOGET (URL); JSONObject JSON = JSONObject.ParseObject (HS); rs_access_token = json.getString ("Access_token"); RS_OpenID = JSON.getString ("OpenID"); Logger.info ("Get SQ Access_Token de Redis est réussi.RS_ACCESS_TOKINE: {}, RS_OpenID: {}", RS_ACCESS_TOKIN, RS_OPENID); } return getoAuthUserInfo (rs_access_token, rs_openID); } / ** * Obtenez des informations utilisateur basées sur un jeton autorisé * @param access_token * @param openId * @return * / public String getoAutserRinfo (String Access_Token, String OpenID) {String url = "https://api."+ access_token +" + "+ openId +" + "& lang = zh_cn"; try {String hs = apiService.DoGet (URL); // Enregistrer les informations de l'utilisateur SaveweixinUser (HS); retourner hs; } catch (ioException e) {logger.error ("Restful of Authorization est une erreur.", E); } return null; }J'étais pressé et le nom du code était désordonné. Comme vous pouvez le voir, j'ai utilisé une méthode de synchronisation pour obtenir la clé du cache comme weixin_sq_access_token. Si les instructions sont récupérées, j'appellerai directement l'interface fournie par WeChat via HTTPClient et renverrai la chaîne d'informations utilisateur à l'extrémité frontale. S'il n'est pas récupéré, cela signifie qu'il n'est pas ou a expiré. Actualisez ensuite l'accès_token selon Refresh_token et écrivez le cache. Étant donné que Access_token a une courte période de validité, j'ai réglé le temps d'expiration du cache ici pour réduire le temps accordé par WeChat d'une autre heure. En regardant le code, j'ai trouvé que la logique ci-dessus est un peu de problème. L'écriture comme celle-ci entraînera la première acquisition ou le non-cache pour actualiser l'accès_token pour la première acquisition, ce qui n'affectera pas l'utilisation pour le moment. Je ferai l'optimisation et modifierai le TODO plus tard.
6: Enregistrer les informations de l'utilisateur
Habituellement, après l'autorisation, nous enregistrerons les informations de l'utilisateur dans la table de la base de données, OpenID comme seule clé principale, et la clé étrangère associera notre propre table utilisateur. De cette façon, peu importe les activités que nous voulons mener à bien à l'avenir ou faire des statistiques de données opérationnelles, nous avons une association avec le compte public WeChat. Il convient de noter que le Headimgurl que nous avons obtenu est une adresse URL fournie par WeChat. Lorsque l'utilisateur modifie l'avatar, l'adresse d'origine peut être invalide, il est donc préférable d'enregistrer l'image sur le serveur local, puis d'enregistrer l'URL de l'adresse locale!
La valeur renvoyée par WeChat:
Lien de référence:
Document officiel de la plate-forme publique de WeChat: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842&token=&lang=zh_cn
Outil de débogage de l'interface en ligne: http://mp.weixin.qq.com/debug
Aucun compte officiel avantages: application de compte de test http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
Ce qui précède est tout le contenu de cet article. J'espère que le contenu de cet article sera d'une aide à l'étude ou au travail de chacun. J'espère également soutenir plus Wulin.com!