Antes de tudo, o modo de desenvolvimento das contas corporativas do WeChat é dividido em: modo de edição (modo normal) e modo de desenvolvimento (modo de retorno de chamada) . No modo de edição, você só pode fazer menus personalizados simples e responder automaticamente mensagens. Para realizar outras funções, você deve ativar o modo de desenvolvedor.
1. Modo de edição e modo de desenvolvimento para processar mensagens
1. No modo de edição, todos os processos de negócios são configurados no servidor WeChat e processados por ele.
2. Modo de desenvolvimento, as mensagens são processadas através de servidores de terceiros e, finalmente, as mensagens são enviadas aos usuários através dos servidores WeChat.
O modo de desenvolvimento pode processar mais mensagens do que o modo de edição, portanto, você deve primeiro permitir que o modo de desenvolvimento desenvolva mais funções.
2. O modelo de desenvolvimento é iniciado
No modo de retorno de chamada, as empresas não apenas podem chamar ativamente a interface do número corporativo, mas também receber mensagens ou eventos dos usuários. As informações recebidas são codificadas no formato de dados XML, UTF8, e criptografadas no AES .
1. Depois de ativar o modo de retorno de chamada, os parâmetros devem ser configurados da seguinte forma:
O URL é o servlet a ser acessado, e o token e o codingaeskey são obtidos aleatoriamente, mas devem ser consistentes com o projeto.
2. Verifique a validade do URL
Quando você envia as informações acima, o número da empresa enviará uma solicitação GET para o URL preenchido. A solicitação GET carrega quatro parâmetros. A empresa precisa fazer o processamento do UrlDecode ao obtê -lo , caso contrário, a verificação não será bem -sucedida.
3. Código
CORESERVLET1 CLASSE
public class CoreServlet1 estende httpServlet {private estático final serialversionuid = 4440739483644821986l; String stoken = "weixincourse"; String escorpid = "wxe510946434680dab"; String sencodingaeskey = "djlyzxgkiwresiw2vnv9dsr7hss7uswdfnwa8q1ove1"; Public void Doget (solicitação httpServletRequest, httpServletResponse Response) lança servletexception, ioexception {wxbizmsgcrypt wxcpt; tente {wxcpt = new wxbizmsgcrypt (stoken, sencodingaeskey, escorpido); String sverifymsgsig = request.getParameter ("msg_signature"); String sverifytimestamp = request.getParameter ("timestamp"); String sverifyNonce = request.getParameter ("nonce"); String sverifyechostr = request.getParameter ("ECHOSTR"); String sechostr; SECHOSTR = WXCPT.VERIFYURL (SVERIFICEMSGSIG, SverrifyTimestamp, SVERIFYNONCE, SVERIFECHOSTR); System.out.println ("Verifyurl ECHOSTR:" + Sechostr); PrintWriter out = Response.getWriter (); out.print (Sechostr); out.Close (); out = null; } catch (aesexception e1) {e1.printStackTrace (); }}} Ferramentas:
/*** Código de exemplo para criptografar e descriptografar mensagens enviadas para contas públicas por plataformas públicas. * * @coPyright Copyright (c) 1998-2014 Tencent Inc. * /// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- com.qq.weixin.mp.aes; importar java.nio.charset.charset; importar java.util.arrays; importar java.util.random; importar javax.crypto.cipher; importptax.crypto.spec.ivparamespec; org.apache.commons.codec.binary.base64;/*** fornece uma interface de criptografia e descriptografia (string codificada por UTF8) para receber e empurrar mensagens para a plataforma pública. * <ol> * <li> Resposta de terceiros a mensagens criptografadas à plataforma pública </li> * <li> O terceiro recebe mensagens enviadas pela plataforma pública para verificar a segurança das mensagens e descriptografar as mensagens. </li> * </ol> * Descrição: Exceção java.security.InValidKeyException: Solução para o tamanho da chave ilegal * <ol> * <li> Baixe o arquivo de política de permissão JCE Unlimited no site oficial (o endereço de download do JDK7: * http://www.oracle.com/technetwork/java/javase/downloads/jce-7-wnoad-432124.html </li> * <li> descompacte após o download, você pode ver local_policy.jar, us_export_policy.jar e readme.Te.Tixt <policy.jar, us_export_policy.jar e readme.tar.txxt %JRE_HOME %/LIB/Security Directory para substituir o arquivo original </li> * <li> Se o JDK estiver instalado, coloque os dois arquivos JAR no %JDK_HOME %/JRE/LIB/Security Directory para Substituir o Charset ORIGINAL </li> base64 = novo Base64 (); A exceção */ public wxbizmsgCrypt (string token, string codingaeskey, string corpid) lança aesexception {if (codingaeskey.length ()! = 43) {tire nova aesexception (aesexception.illegalaeskey); } this.token = token; this.corpid = corpid; aeskey = base64.decodeBase64 (codingaeskey + "="); } /*** descriptografar o texto cifrado. ** @param texto O CipherText que precisa ser descriptografado* @Return O PlenoText obtido por descriptografia* @Throws Aesexception AES falhou em descriptografar*/ string descriptografar (texto de string) lança aesexception {byte [] original; tente {// Defina o modo de descriptografia no modo AES CBC Cipher cipher = cipher.getInstance ("AES/CBC/Nopadding"); SecretKeyspec key_spec = new SecretKeyspec (Aeskey, "Aes"); IVParametersPec IV = novo IVParameterspec (Arrays.CopyOfRange (Aeskey, 0, 16)); cipher.init (cipher.decrypt_mode, key_spec, iv); // Use Base64 para decodificar o ciffertexto byte [] criptografado = base64.DecodeBase64 (texto); // descriptografar o original = cifra.Dofinal (criptografado); } catch (Exceção e) {e.printStackTrace (); lançar uma nova aesexception (aesexception.decryptaeSerror); } String xmlContent, de_corpid; tente {// Remova o personagem complemento byte [] bytes = pkcs7encoder.Decode (original); // Strings aleatórios separados de 16 bits, Endianness de rede e byte corporativo [] NetworkOrder = Arrays.copyOfRange (Bytes, 16, 20); int xmllength = RecovernetworkByTesOrder (NetworkOrder); xmlContent = new String (Arrays.copyOfRange (bytes, 20, 20 + xmll comprimento), charset); de_corpid = new String (Arrays.copyofRange (bytes, 20 + xmllength, bytes.length), charset); } catch (Exceção e) {e.printStackTrace (); lançar uma nova aesexception (aesexception.illegalbuffer); } // Caso em que o Corpo é diferente se (! From_Corpid.Equals (Corpid)) {lança nova aesexception (aesexception.validateCorpidError); } retornar xmlContent; } /** * Verifique se a sequência de assinatura do URL * @param msgSignature, correspondendo aos parâmetros de URL MSG_SIGNUTRY * @Param Timestamp Timestamp, correspondente a parâmetros de URL Timestamp * @param nonce string aleatória, correspondente a parâmetros de parâmetros de parâmetros * @param eCHOSTR Random String, correspondentes de Urlst. @alons Aesexception A execução falhou, verifique o código de erro e as informações específicas de erro da exceção */ public string verifyurl (string msgSignature, string timestamp, string nonce, string ecoStr) lança aesexception {string assinatura = sha1.getsha1 (token, timestamp, indice, echostr); if (! Signature.equals (msgSignature)) {lança nova aesexception (aesexception.validatesignatureError); } String resultado = descriptografia (ecostr); resultado de retorno; }} /*** Código de exemplo para criptografar e descriptografar mensagens enviadas para contas públicas por plataformas públicas. * * @coPyright Copyright (c) 1998-2014 Tencent Inc. * /// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ @Param Encrypt CipherText* @return Secure Signature* @Throws Aesexception*/ public static string getsha1 (string token, string timestamp, string nonce, string criprypt) lança aesexception {try {string [] Array = new String [] {TOKen, Timestamp, não -ce,; StringBuffer sb = new StringBuffer (); // String Sort Arrays.sort (Array); for (int i = 0; i <4; i ++) {sb.append (array [i]); } String str = sb.toString (); // SHA1 Signature Generation Messagedigest md = Messagedigest.getInstance ("sha-1"); md.update (str.getBytes ()); byte [] Digest = md.digest (); Stringbuffer hexstr = new stringBuffer (); String shahex = ""; for (int i = 0; i <diger.length; i ++) {shahex = integer.tohexstring (digery [i] e 0xff); if (shahex.length () <2) {hexstr.append (0); } hexstr.append (shahex); } retornar hexstr.toString (); } catch (Exceção e) {e.printStackTrace (); lançar uma nova aesexception (aesexception.computesignatureError); }}} classe pkcs7Encoder {estático charset charset = charset.forname ("utf-8"); estático int block_size = 32;/ *** Exclua o caráter complementado do texto simples descriptografado** @param descriptografou o texto simples descriptografado* @return linearxt após excluir o caractere de preenchimento*/ static byte [] decode (byte [] decripado) {Intad = (int); if (pad <1 || pad> 32) {pad = 0; } return Arrays.copyOfRange (descriptografado, 0, descriptografado.length - pad); }} 3. Resumo
A empresa verifica a solicitação através da parâmetro msg_signature. Se estiver confirmado que a solicitação GET é do número da empresa, o aplicativo corporativo descriptografa o parâmetro ECHOSTR e retorna o texto sem formatação do eCHOSTR como está (citado não pode ser adicionado), a verificação de acesso tem efeito e o modo de retorno de chamada pode ser ativado. Depois de ligar, algumas funções serão implementadas uma após a outra, então fique atento!
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.