1. Appleto WeChat <Br /> Etapa 1: Ligue para o WX.Login para obter o endereço do documento do código Etapa 2: Determine se o usuário autoriza a ler o endereço do documento de informações do usuário Etapa 3: Ligue para o WX.GetUserInfo para ler o Documento de Dados do Usuário, Etapa 4: Como o Mini Program Antegrated Doman Name não pode autorizar o nome do Wechat para o nome do Domínio, só podemos chamar o Wech. Portanto, passaremos pelo criptografado e iv obtidos pelo wx.login para obter código e wx.getUserinfo para o fundo através do WX.Request Solicy
Dados retornados pelo servidor:
Mini Código do Programa:
// chamando a interface de login para obter o código wx.login ({success: function (res) {wx.getSetting ({succcess (setres) {// determina se a autorização if (! Setres.authsetting ['scope.Userinfo']) {// Acesso a wx.athorize ({{{{{{ wx.getUserInfo ({lang: "zh_cn", success: function (userres) {// Solicitação de rede de pilha wx.request ({url: config.loginwxurl, data: {code: res.code, useddata: userRes.ErSeTataTATATATA, IV.P.PRYSTPTATTATRATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATA: {code: {code:) "APLICAÇÃO/X-WWW-FORM-URLECOMENTO"}, Método: 'POST', // Sucesso de recuperação do lado do servidor: FUNCH (resultado) {Var Data = Result.Data.Result; {// Obtenha informações do usuário wx.getUserinfo ({lang: "zh_cn", success: function (userRes) {// PACK NETWORK SOITE WX.REQUEST ({url: config.logInwxurl, dados: {code: res.code, EncryptedData: userReRESSTERL, dados: {code: res.code, EncryptData: userReRESSTEDSTERL, "Content-Type": "Aplicativo/x-www-forma-urina"}, método: 'post', sucesso: function (resultado) {var data = resultado.data.result; }}})}}) 2. Servidor Java
Obtenha o OpenID e decodifique o código de informações do usuário de acordo com o código
O pacote de jar exigido
<Depencency> <PuerpID> org.codehaus.xfire </groupid> <TRATIFACTID> xfire-core </artifactId> <versão> 1.2.6 </version> </dependency> <ipendency> <pProvV> org.bouncycastle </groupid> <tifactId> <pProvrVerSerSsiSshs Version> </siSERSSERSSERSBELIGH> BCPROV> Version.BounCastle </Groupid> <Tifactid> BcProv-Jdk16
/ ** * Obtenha informações do applet weChat * @author zhy */ public class wxappletuserinfo {private static logger log = logger.getLogger (wxappletuserinfo.class); /** * Obtenha WeChat Applet session_key e OpenID * * @Author Zhy * @param Código Ligue para o código retornado pelo WeChat Login * @return */public static jsonObject getSessionKeyoropenId (código da string) {// Wechat Login Code Valor String string WXCode = código; ResourceBundle Resource = ResourceBundle.getBundle ("weixin"); // Leia o arquivo da propriedade string requesturl = Resource.getString ("url"); // Endereço de solicitação https://api.weixin.qq.com/sns/jscode2Session Mapa <String, String> requestURLParam = new Hashmap <String, String> (); requesturlparam.put ("Appid", Resource.getString ("Appid")); // Appid nas configurações do desenvolvedor RequestUrlParam.put ("secret", Resource.getString ("AppSecret")); // appSecret requesturlparam.put ("js_code", wxcode); // o código retornado pela chamada do applet wx.login requesturlparam.put ("Grant_type", "Authorization_Code"); // Parâmetros padrão // Envie uma solicitação de postagem para ler e ligar para o WeChat https://api.weixin.qq.com/sns/jscode2session Interface para obter o usuário OpenID Identificador exclusivo JsonObject JsonObject = json.parseObject (urlutil.sendPost (requesturl, solicitação retornar 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 dados criptografado [] banco de dados = base64.Decode (EncryPtedData); // byte de chave criptografado [] keybyte = base64.decode (sessionKey); // Offset byte [] ivbyte = base64.Decode (IV); Tente {// Se a chave for inferior a 16 bits, compense -a. O conteúdo disso se for muito importante int base = 16; if (keybyte.length % base! = 0) {int grupos = keybyte.length / base + (keybyte.length % base! = 0? 1: 0); byte [] temp = novo byte [grupos * base]; Arrays.fill (temp, (byte) 0); System.ArrayCopy (Keybyte, 0, Temp, 0, keybyte.length); keybyte = temp; } // Initialize Security.addProvider (new BouncycastleProvider ()); Cifra cifra = cipher.getInstance ("AES/CBC/PKCS7Padding", "BC"); SecretKeyspec Spec = New SecretKeyspec (KeyByte, "AES"); Parâmetros algorithmparameters = algorithmparameters.getInstance ("aes"); parâmetros.init (novo IVParametersPec (IVBYTE)); cipher.init (cipher.decrypt_mode, spec, parâmetros); // inicialize byte [] resultbyte = cipher.dofinal (banco de dados); if (null! = ResultByte && ResultByte.Length> 0) {String result = new String (ResultByte, "UTF-8"); retornar 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 (invalidalgorithmparameterexception e) {log.error (e.getMessage (), e); } catch (nosuchproviderxception e) {log.error (e.getMessage (), e); } retornar nulo; }} Código para enviar o pedido
/ *** Envie uma solicitação para o URL especificado para o método de postagem** @param URL O URL para enviar a solicitação* @param param parameter* @returgar o resultado da resposta do recurso remoto representado pelo nome*/ ublic static string sendPost (string url, map <string,? BufferredReader in = null; String result = ""; String param = ""; Iterator <string> it = parammap.keyset (). Iterator (); while (it.hasnext ()) {string key = it.Next (); param + = key + "=" + parammap.get (key) + "&"; } tente {url realurl = new URL (url); // Abra a conexão entre urlConnection Conn = realUrl.Openconnection (); // Defina o atributo de solicitação geral Conn.SetRequestProperty ("Aceitar", "*/*"); Conn.SetRequestProperty ("Connection", "Keep-Alive"); Conn.SetRequestProperty ("Acep-Charset", "UTF-8"); Conn.SetRequestProperty ("User-Agent", "Mozilla/4.0 (compatível; MSIE 6.0; Windows NT 5.1; Sv1)"); // Para enviar uma solicitação de postagem, você deve definir as duas linhas a seguir Conn.SetDoOutput (true); Conn.SetDoinput (true); // Obtenha o fluxo de saída correspondente ao objeto URLConnection out = new PrintWriter (Conn.getOutputStream ()); // Envie o parâmetro de solicitação para fora.print (param); // buffering out.flush () do fluxo de saída de descarga; // Defina o fluxo de entrada do BufferReader para ler a resposta do URL em = new BufferredReader (new InputStreamReader (Conn.getInputStream (), "UTF-8"); Linha de string; while ((line = in.readline ())! = null) {resultado += line; }} catch (Exceção e) {log.error (e.getMessage (), e); } // Use finalmente blocos para fechar o fluxo de saída e o fluxo de entrada finalmente {tente {if (out! = Null) {out.close (); } if (in! = null) {in.close (); }} catch (ioexception ex) {ex.printStackTrace (); }} Retornar resultado; }O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.