1. WeChat Applet <Br /> Paso 1: Llame a WX.Login para obtener la dirección del documento del código Paso 2: Determine si el usuario autoriza a leer la dirección del documento de información del usuario Paso 3: Llame a WX.GetUserInfo Para leer el Documento de datos del usuario Paso 4: Dado que el Nombre de dominio de fondo del Mini Mini del programa no puede autorizar el nombre de dominio de Wechat, solo podemos llamar al Servidor WECHAT a través de nuestro propio servidor de WeChat a nuestro propio servidor para obtener información sobre el usuario de OBTILE. Por lo tanto, pasaremos el CiencedData y IV obtenidos por WX.Login para obtener código y wx.getuserInfo al fondo a través de la solicitud de WX.Request
Datos devueltos por el servidor:
Mini Código de programa:
// Llamando a la interfaz de inicio de sesión para obtener el código wx.login ({éxito: function (res) {wx.getSetting ({Succes (setRes) {// determina si autorizado if (! Setres.authsetting ['scope.userInfo'] {// autoriza el acceso a wx.authorize ({{{scope.userInfo »{/) wx.getUserInfo({ lang: "zh_CN", success: function (userRes) { //Stack network request wx.request({ url: config.loginWXUrl, data: { code: res.code, encryptedData: userRes.encryptedData, iv: userRes.iv }, header: { "Content-Type": "Application/X-WWW-Form-URLEncoded"}, Método: 'Post', // Servicio de recuperación de servidor: function (resultado) {var data = result.data.Result. //Get user information wx.getUserInfo({ lang: "zh_CN", success: function (userRes) { //Stack network request wx.request({ url: config.loginWXUrl, data: { code: res.code, encryptedData: userRes.encryptedData, iv: userRes.iv }, header: { "Content-Type": "Application/X-WWW-Form-URLEncoded"}, Método: 'Post', Success: Function (Result) {var data = result.data.Result; }) 2. Servidor Java
Obtenga el código de información del usuario de OpenId y decodifique de acuerdo con el código
El paquete jar requerido
<dependency> <groupId>org.codehaus.xfire</groupId> <artifactId>xfire-core</artifactId> <version>1.2.6</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk16</artifactId> <version>1.46</version> </dependency>
/ ** * Obtener información de applet de Wechat * @author Zhy */ public class wxappletUserInfo {private static logger log = logger.getLogger (wxappletuserInfo.class); /** * Obtenga WeChat Applet Session_Key y OpenID * * @author Zhy * @param Código Llame al código devuelto por WeChat Login * @Return */public static jsonObject getSessionKeyOrOpenID (código de cadena) {// WeChat Code Code Value String wxCode = código; ResourceBundle Resource = ResourceBundle.getBundle ("Weixin"); // leer la cadena de archivo de propiedad requestArl = resource.getString ("url"); // Dirección de solicitud https://api.weixin.qq.com/sns/jscode2session map <string, string> requestRParam = new Hashmap <String, String> (); requestUrlParam.put ("appid", recurse.getString ("appid")); // Appid en la configuración del desarrollador requestUrlParam.put ("Secret", Resource.getString ("AppSecret")); // AppSecret requestUrlParam.put ("js_code", wxcode); // El código devuelto por la llamada de applet wx.login requestUrlParam.put ("Grant_type", "Authorization_Code"); // Parámetros predeterminados // Enviar solicitud de publicación para leer y llamar a WeChat https://api.weixin.qq.com/sns/jscode2session Interface para obtener el usuario único de OpenID jsonObject jsonObject = json.parseObject (urlutil.sendPost (requesturl, requesturlparam)); return jsonObject; } /** * Decrypt user sensitive data to obtain user information* * @author zhy * @param sessionKey The key for encrypted signature of data* @param encryptedData Encrypted data including sensitive data* @param iv The initial vector of the encryption algorithm* @return */ public static JSONObject getUserInfo(String encryptedData,String sessionKey,String iv){ // byte de datos cifrado [] databyte = base64.decode (cifradoDDATA); // Key cifrado byte [] keyByte = base64.Decode (sessionKey); // compensar byte [] ivbyte = base64.decode (iv); Pruebe {// Si la clave es menos de 16 bits, entonces compensarla. El contenido en este IF es muy importante int base = 16; if (keyByte.length % base! = 0) {int groups = keyByte.length / base + (keyByte.length % base! = 0? 1: 0); byte [] temp = new byte [grupos * base]; Arrays.fill (temp, (byte) 0); System.ArrayCopy (keyByte, 0, temp, 0, keyByte.length); keyByte = temp; } // Inicializar Security.AddProvider (new BouncycastleProvider ()); Cifrado cifrado = cifrado. SecretKeySpec Spec = new SecretKeSpec (KeyByte, "AES"); Algorithmparameters parámetros = algorithmparameters.getInstance ("aes"); parámetros.init (nuevo IVParameterspec (IVByte)); cipher.init (cipher.decrypt_mode, spec, parámetros); // inicializar byte [] resultByte = cipher.dofinal (databyte); if (null! = resultByte && resultByte.length> 0) {String result = new String (resultByte, "UTF-8"); return json.parseObject (resultado); }} 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 (ilegalblocksizeException e) {log.error (e.getMessage (), e); } catch (BadPaddingException e) {log.error (e.getMessage (), e); } Catch (UnsupportedEncodingException e) {log.error (e.getMessage (), e); } Catch (UnsupportedEncodingException e) {log.error (e.getMessage (), e); } catch (InvalidKeyException e) {log.error (e.getMessage (), e); } Catch (InvalidalgorithMParameterRexception e) {log.error (e.getMessage (), e); } Catch (nosuchProviderRexception e) {log.error (e.getMessage (), e); } return null; }} Código para enviar la solicitud
/ *** Envíe una solicitud a la URL especificada para el método POST** @param URL La URL para enviar la solicitud* @param Parámetro de solicitud parámetro* @return El resultado de respuesta del recurso remoto representado por el nombre*/ UBLIC static String sendPost (url de cadena, map <string,?> ParamMap) {printwriter out = null; BufferedReader en = NULL; Resultado de cadena = ""; String Param = ""; Iterator <String> it = parammap.keySet (). Iterator (); while (it.hasnext ()) {string key = it.next (); param + = key + "=" + parammap.get (key) + "&"; } try {url realUrl = new url (url); // Abra la conexión entre UrlConnection Conn = RealUrl.openconnection (); // Establecer el atributo de solicitud general conn.setRequestProperty ("aceptar", "*/*"); conn.setRequestProperty ("Conexión", "mantener alive"); Conn.setRequestProperty ("Acept-Charset", "UTF-8"); Conn.setRequestProperty ("AGENT DE USUARIO", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); // Para enviar una solicitud de publicación, debe establecer las siguientes dos líneas conn.setDooutput (verdaderas); Conn.setDoInput (verdadero); // Obtenga la secuencia de salida correspondiente al objeto de UrlConnection out = new PrintWriter (conn.getOutputStream ()); // Enviar el parámetro de solicitud out.print (param); // Buffering out.flush () de la secuencia de salida de descarga; // Defina el flujo de entrada de BufferedReader para leer la respuesta de URL en = new BufferedReader (new InputStreamReader (conn.getInputStream (), "UTF-8")); Línea de cadena; while ((line = in.readline ())! = null) {resultado += línea; }} capt (excepción e) {log.error (e.getMessage (), e); } // Use finalmente bloqueos para cerrar la secuencia de salida y la secuencia de entrada finalmente {try {if (out! = Null) {out.close (); } if (in! = null) {in.close (); }} catch (ioException ex) {ex.printStackTrace (); }} Resultado de retorno; }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.