1. WeChat Applet <br /> Étape 1: Appelez WX.Login pour obtenir l'adresse du document du code Étape 2: Déterminez si l'utilisateur autorise à lire l'adresse du document d'informations utilisateur Étape 3: Appelez WX.GetUserRinfo pour lire l'adresse du document de données utilisateur Étape 4: Étant donné que le nom de domaine autorisé par le programme mini par notre propre serveur ne peut pas autoriser les informations sur le domaine de l'utilisateur. Par conséquent, nous passerons le EncryptedData et IV obtenus par wx.login pour obtenir du code et wx.getUserInfo à l'arrière-plan via WX.Request Demande
Données renvoyées par le serveur:
Mini code de programme:
// Appel de l'interface de connexion pour obtenir le code wx.login ({Success: function (res) {wx.getSetting ({Success (setRes) {// détermine si autorisé if (! SetRes.authSetting ['scope.userinfo']) {// Autoriser l'access de wx.authorize ({Scope: Scope. wx.getUserInfo ({lang: "zh_cn", succès: function (userres) {// la demande de réseau de pile wx.request ({url: config.loginwxurl, data: {code: res.code, encryptedData: userres.encrypteddata, iv: userres.iv}, headder: "contenu -ype, iv: userres.iv}, headder:" Content -ype, " "Application / X-WWW-FORM-URLENCEDED"}, Méthode: 'Post', // Succès de récupération du serveur: Fonction (Résultat) {Var Data = Result.Data.Result; // Obtenez des informations utilisateur wx.getUserInfo ({lang: "zh_cn", Success: function (userres) {// stack nework request wx.request ({url: config.loginwxurl, data: {code: res.code, encrypteddata: userres.encrypteddata, iv: userres.iv}, {{userres. "Type de contenu": "Application / X-WWW-Form-Urlencomed"}, Méthode: 'Post', Success: Function (Result) {Var Data = Result.Data.Result; }}})}}) 2. Server Java
Obtenir le code d'informations utilisateur OpenID et décoder en fonction du code
Le package de pot requis
<dependency> <proupId> org.codehaus.xfire </rompuprid> <letifactive> xfire-core </ artifactid> <version> 1.2.6 </ version> </dependency> <petendency> <proupId> org.bouncycastle </prouprid> <ptetifactid> bcprov-jdk16 </ artifactid>
/ ** * Obtenez les informations de l'applet WeChat * @author zhy * / classe publique wxappleUserInfo {private static logger log = logger.getLogger (wxappleUserIrinfo.class); / ** * Obtenez WeChat Applet Session_Key et OpenID * * @author zhy * @param code appelez le code renvoyé par wechat Login * @return * / public static jsonObject getSesseyKeyorOpenID (String Code) {// wechat ligin code varing string wxcode = code; ResourceBundle Resource = ResourceBundle.getBundle ("Weixin"); // Lire la chaîne de fichiers de propriété requestUrl = Resource.getString ("url"); // Demande l'adresse https://api.weixin.qq.com/sns/jscode2Session Map <String, String> requestUrlParam = new HashMap <String, String> (); requestUrlparam.put ("appid", ressource.getString ("appid")); // AppID dans les paramètres du développeur requestUrlParam.put ("secret", Resource.getString ("AppSecret")); // appSecret requestUrlParam.put ("js_code", wxcode); // Le code renvoyé par l'applet Call wx.login requestUrlparam.put ("Grant_type", "Authorization_code"); // Paramètres par défaut // Envoi de la demande de post pour lire et appeler WeChat https://api.weixin.qq.com/sns/jscode2Session pour obtenir l'identifiant unique de l'utilisateur OpenID JSONOBject JSONOBject = JSON.ParseObject (Urlutil.sendPost (Dequerl, DequerlParam)); return jsonObject; } / ** * Decrypt les données sensibles aux utilisateurs pour obtenir des informations utilisateur * * @Author Zhy * @param SessionKey La clé pour la signature cryptée des données * @param EncryptedData Données cryptées, y compris les données sensibles * @param iv, le vecteur initial de l'algorithme d'encryption * @return * / public staticKey GETUSERINFOFO (String Encrède, StringKey, StringKey, GetUseRINFOFO (String EncrdedData StringKey, StringKey GETUSEUNFOFO (String EncrdedData StringKey, STRINGKEKEK iv) {// Données cryptées octet [] databyte = base64.decode (EncryptedData); // key crypté octet [] keyByte = base64.decode (sessionKey); // octet décalé [] ivbyte = base64.decode (iv); Essayez {// si la clé est inférieure à 16 bits, compensez-le. Le contenu dans ce domaine est très important Int Base = 16; if (keyByte.length% base! = 0) {int groupes = keyByte.length / base + (keyByte.Length% base! = 0? 1: 0); octet [] temp = nouveau octet [groupes * base]; Arrays.filt (temp, (octet) 0); System.ArrayCopy (KeyByte, 0, Temp, 0, KeyByte.Length); keyByte = temp; } // Initialize Security.AddProvider (nouveau BouncycastLeprovider ()); Cipher Cipher = Cipher.getInstance ("AES / CBC / PKCS7PADDING", "BC"); SecretKeyspec Spec = new SecretKeyspec (KeyByte, "AES"); AlgorithMParameters Paramètres = algorithMParameters.getInstance ("AES"); Paramètres.Init (New IvParameterspec (IVBYTE)); cipher.init (cipher.decrypt_mode, spec, paramètres); // initialiser l'octet [] resultByte = cipher.dofinal (databyte); if (null! = resultByte && resultByte.length> 0) {String result = new String (resultByte, "utf-8"); return JSON.ParseObject (résultat); }} catch (NosuchalgorithMexception e) {log.Error (e.getMessage (), e); } catch (nosuchpaddingException e) {log.Error (e.getMessage (), e); } catch (invalidParametersPecException e) {log.Error (e.getMessage (), e); } catch (illégalBlockSizeException e) {log.Error (e.getMessage (), e); } catch (badpaddingException e) {log.Error (e.getMessage (), e); } catch (UnportEnCcodingException e) {log.Error (e.getMessage (), e); } catch (UnportEnCcodingException e) {log.Error (e.getMessage (), e); } catch (invalidKeyException e) {log.Error (e.getMessage (), e); } catch (invalidalgorithMParameTereXception e) {log.Error (e.getMessage (), e); } catch (NosuchProvideRexception e) {log.Error (e.getMessage (), e); } return null; }} Code pour envoyer la demande
/ ** * Envoyez une demande à l'URL spécifiée pour la méthode POST * * @param URL L'URL pour envoyer la demande * @param Paramètre de la demande de paramètre * @return Le résultat de la réponse distante représentée par le nom * / Ublic Static String SendPost (URL de chaîne, map <String ,?> Parammap) {imprimer outwriter out = null; BufferedReader dans = null; Résultat de chaîne = ""; String param = ""; Iterator <string> it = parammap.KeySet (). Iterator (); while (it.hasnext ()) {string key = it.next (); param + = key + "=" + parammap.get (key) + "&"; } essayez {url realUrl = new URL (URL); // Ouvrez la connexion entre UrlConnection Conn = realUrl.OpenConnection (); // Définissez l'attribut général de la demande Conn.SetRequestProperty ("accepter", "* / *"); Conn.SetRequestProperty ("Connexion", "Keep-Alive"); Conn.SetRequestProperty ("Accept-Charset", "UTF-8"); Conn.SetRequestProperty ("User-Agent", "Mozilla / 4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); // Pour envoyer une demande de poste, vous devez définir les deux lignes suivantes Conn.SetDoOutput (true); Conn.SetDoInput (true); // obtient le flux de sortie correspondant à l'objet UrlConnection OUT = new printwriter (conn.getOutputStream ()); // Envoyez le paramètre de demande Out.print (param); // tamponner out.flush () du flux de sortie de flux; // Définissez le flux d'entrée BufferedReader pour lire la réponse URL dans = new BufferedReader (new InputStreamReader (Conn.getInputStream (), "UTF-8")); Ligne de chaîne; while ((line = in.readline ())! = null) {result + = line; }} catch (exception e) {log.error (e.getMessage (), e); } // Utiliser les blocs enfin pour fermer le flux de sortie et le flux d'entrée enfin {try {if (out! = Null) {out.close (); } if (in! = null) {in.close (); }} catch (ioException ex) {ex.printStackTrace (); }} Retour Résultat; }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.