Como receber e responder às mensagens da API de desenvolvimento do WeChat, apresentarei você abaixo
1. Explicação
* Este exemplo foi desenvolvido e demonstrado de acordo com o documento de desenvolvimento do WeChat: http://mp.weixin.qq.com/wiki/home/index.html versão mais recente (03/05/2016 17:34:36).
* Plataforma de edição: myeclipse10.7+win32+jdk1.7+tomcat7.0
* Servidor: Alibaba Cloud Windows Server 2008 64bits
* Requisitos da plataforma: Método de anotação de uso do servlet, requisitos da plataforma: j2ee6.0+, jdk6.0+, tomcat7.0+
* A demonstração se concentra mais na análise da API.
* Por uma questão de instruções de teste, cada caso de teste é independente e não depende de outros métodos. Não considere muito a embalagem.
* A demonstração é realizada o máximo possível de acordo com os requisitos da API. Objetivo: Entenda como o documento é usado e alcance o efeito de aprender com um exemplo e aplicá -lo a outros.
* Requisitos de conhecimento: Fundação Java Solid, Entendendo o conhecimento de comunicação de rede HTTP, tendo entendimento suficiente de Javaweb, JSON Análise
* Esta parte do código -fonte da demonstração será fornecida no final de cada artigo. Depois de analisar a API, todos os códigos de origem da demonstração serão fornecidos na forma de um pacote de código -fonte.
* Hora atual: 03/04/2016 17:32:57, desta vez prevalecerá.
2. Documentar o gerenciamento original de mensagens de texto (resumo)
• Endereço do documento: http://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html
• Gerenciamento de mensagens
◦
◦
◦Senda mensagem de resposta passiva da mensagem
◦ Segure a criptografia de mensagem e descriptografia quando a resposta passiva
Mensagem Mensagem de serviço de mensagens de mensagens
◦Senda a interface de massagem de mensagem
◦Senda a interface de mensagem de mapléte de mensagem
◦Senda especificações de operação de mensagem de mensagem de mensagem
◦ Obtenha configuração de resposta automática para conta oficial
3. Compreensão do documento
• receber mensagens
◦O documento explica o seguinte: Quando um usuário comum do WeChat envia uma mensagem para uma conta pública, o servidor WeChat empacotará os dados XML da mensagem de postagem para o URL preenchido pelo desenvolvedor.
◦ Compreendendo: o servidor WeChat retorna a mensagem enviada pelo usuário para req na forma de um fluxo de postagem. Quando queremos receber a mensagem enviada pelo usuário, podemos obtê -la através do req.getInputStream (). Obviamente, podemos executar a análise necessária com base no formato XML da mensagem de retorno no documento.
◦
concluir:
/** Nesta parte, recebemos as informações enviadas pelo usuário e a analisamos <k, v> para exibir* /// analisar as informações enviadas pelo usuário. InputStream is = req.getInputStream (); // Obtenha o fluxo de solicitação // Armazene o resultado analisado no hashmap mapa <string, string> map = new hashmap <string, string> (); // parse xml, parse o resultado de retorno obtido nas informações de texto que somos usados para saxreadersEader = sAxReader (); xml] document docum = null; try {document = reader.read (is);} catch (documentException e1) {// TODO BLOCO DE CATAGEM AUTO-GONERATO E1.printStackTrace ();} // obtém xml elemento raiz root root = documentrootElement (); (Element E: elementList) map.put (e.getName (), e.getText ()); // Conjunto de saída de teste <String> keySet = map.keyyset (); // Após a saída da saída do teste, as informações enviadas pelo usuário são enviadas pelo usuário; para (String Key: Keyset) {System.out.println (key + ":" + map.get (key));} system.out.println (tag + ": final para analisar as informações enviadas pelo usuário"); • Envie uma mensagem
◦O documento explica isso: quando um usuário envia uma mensagem para a conta oficial (ou quando um evento é pressionado por uma operação específica do usuário), uma solicitação de postagem será gerada. O desenvolvedor pode retornar uma estrutura XML específica no pacote de resposta (GET) para responder à mensagem (agora suporta o texto da resposta, fotos, fotos, texto, voz, vídeo e música). Estritamente falando, enviar mensagens de resposta passiva não é realmente uma interface, mas uma resposta a uma mensagem enviada a um servidor WeChat.
◦ Compreensão: Quando um usuário envia uma solicitação, uma solicitação de postagem será gerada e podemos responder às mensagens através da resposição. No entanto, o conteúdo da resposta possui requisitos estritos de formato. Somente quando os requisitos de formato forem atendidos, o WeChat Server processará e o retornará ao usuário. Ao visualizar o módulo "Gerenciamento de mensagens" do documento, podemos ver que existem várias mensagens no WeChat e cada tipo de mensagem tem seus próprios requisitos de formato específico. Devemos seguir os requisitos para retornar informações específicas ao usuário normalmente. Tentamos responder aos usuários com informações de texto e mensagens gráficas no formato necessário do documento. Foco: Construa os parâmetros necessários de acordo com os requisitos do documento. NOTA ESPECIAL: Os parâmetros são sensíveis ao maiúsculas.
◦Impline 1-Ryply to Normand Text Mensagens:
// Exemplo 1: Envie uma mensagem de texto normal, verifique o formato XML do documento sobre a "mensagem de texto da resposta" // Etapa 1: Construa os parâmetros necessários textMsg textMsg = new textmsg (); textmsg.setTouserName (map.get ("fromUsename"); textmsg.setFromUserName (map.get ("touserrne")); textmsg.setCreateTime (new Date (). gettime ()); // tempo de criação de mensagens (número inteiro) textmsg.setmsgtype ("text"); Formato XML reconhecido por WeChat [Baidu: XStream Bean to XML] xStream xStream = new XStream (); xStream.alias ("xml", textmsg.getclass ()/ string textmsg2xml = xstream.toxml (textmsg); system.out.prIntlnnnnnnnnnnnn (string the tutterx); Informações do formato XML para o servidor WeChat, e o servidor a encaminha para o usuário printwriter printWriter = resp.getWriter (); printWriter.print (textMsg2xml); ◦Impline 2-Ryply para a mensagem de texto:
// Exemplo 2, envie mensagens gráficas e de texto. Verifique o formato XML do documento "Responder à mensagem de texto" // Etapa 1: Construa os parâmetros exigidos pelas respostas à lista de mensagens de texto <Teclary> Artigos = novo ArrayList <Artigo> (); Artigo A = novo Artigo () A.Settitle ("Eu sou o título da imagem"); AfensetL ("WW WW.Baid.Baid.Com; A.SetPicurl ("http://b.hiphotos.baidu.com/image/pic/item/08f790529822720ea5d058ba7ccb0a46f21fab50.jpg"; picandTextmsg = new PicandTextmsg (); PicandTextMsg.setTouserName (map.get ("FromuSerName")); // Envie e receba a mensagem "Usuário" apenas o oposto PicandTextMsg.setCromEstime (map.get ("touserName)); (Inteiro) picandTextmsg.setmsgtype ("notícias"); // tipo gráfico e texto Mensagem picandTextmsg.setArticleCount (1); picandTextmsg.setArticles (artigos); // O segundo passo é converter as informações construídas no formato XML reconhecido por WeChat [Baidu: XStream Bean para Xml] xStream xStream = new XStream (); XStream.alias ("xml", picAndTexTMSg.CotSg (); picandTextmsg2xml = xStream.toxml (picandTextMSG); System.out.println (picandTextMSG2xml); // O terceiro passo é enviar as informações de formato de impressão do Xml para o servidor WeChat, e o servidor encaminhe para o usuário PrintWriter = resp.getwriter (); Todos os códigos de origem da operação nesta parte podem ser usados diretamente
• coreServlet.java (incluindo acesso ao servidor, recebendo mensagens de envio do usuário, respondendo a mensagens de texto comuns e respondendo a mensagens gráficas. Jarros de terceiros: DOM4J, XSTEAM)
pacote com.gist.servlet; importar java.io.ioException; importar java.io.inputStream; importar java.io.printwriter; importar java.security.Messagedigest; import java.Security.NosuchalGorithMexception; import.Util.ilArraylist; Importraylist; java.util.hashmap; importar java.util.list; importar java.util.map; importar java.util.set; importar javax.servlet.servletexception; import javax.servlet.annotation.webServlet; import javax.servlet.http.httlet.https.httsk.htpsks.https.httskstps.webServlet; import Javax.Servlet.http.htp.https.httslets; javax.servlet.http.httpServletReQuest; importar javax.servlet.http.httpServletResponse; importar org.dom4j.document; import org.dom4j.documentException; import org.dom4j.lement; import.dom4j.io.document; com.gist.bean.picandTextmsg; import com.thoughtworks.xstream.xstream;/** * @author gao yuan </n> E-mail: [email protected] </n> blog http://blog.csdn.net/wgysf */@WebServlet ("/coreServlet") CORESERVLE DE CLASSE PÚBLICA Estende o httpServlet {private estático final serialversionuid = 1L; String tag = "coreServlet"; / * * Etapa 2: Verifique se a validade do endereço do servidor após o desenvolvedor enviar as informações, o servidor WeChat enviará uma solicitação GET para o URL do endereço do servidor preenchido. * A solicitação GET carrega quatro parâmetros: assinatura, registro de data e hora, nonce, ecos * O desenvolvedor verifica a solicitação verificando a assinatura (existe um método de verificação abaixo). Se você confirmar que a solicitação GET é do servidor WeChat, retorne o conteúdo do parâmetro ECHOSTR como está. *, o acesso entrará em vigor e se tornará um desenvolvedor com sucesso; caso contrário, o acesso falhará. * * O processo de criptografia/verificação é o seguinte: 1. Ordem do dicionário de classificação de token, registro de data e hora e nonce 2. * Splique as três cordas de parâmetros em uma string para a criptografia sha1 3. O strings Após o desenvolvedor obtém o que o relatório */ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. variáveis para formar seqüências. O método é formar uma sequência de uma ordem pequena a grande em ordem alfabética ou na ordem de números pequenos e grandes. */ @Override Protected Void Doget (httpServletRequest Req, httpServletResponse resp) lança servletexception, ioexception {// set coding req.setcharacterencoding ("utf-8"); resp.setContentType ("html/text; charset = utf-8"); resp.Setcharacterencoding ("UTF-8"); // Obtenha o fluxo de saída PrintWriter PrintWriter = resp.getWriter (); // Defina um token global, o desenvolvedor o define. A API explica isso: o token pode ser preenchido à vontade pelo desenvolvedor, // usado como uma assinatura de geração (o token será comparado com o token contido no URL da interface para verificar a segurança) string token = "wgyScsf"; // De acordo com a descrição da API, obtenha os quatro parâmetros acima, String Signature = req.getParameter ("Signature"); String timestamp = req.getParameter ("Timestamp"); String nonce = req.getParameter ("nonce"); String ecostr = req.getParameter ("ECHOSTR"); // // temp: impressão temporária, assista à situação do parâmetro de retorno // system.out.println (tag + ": assinatura:" + assinatura + ", registro de data e hora:" // + timestamp + ", nonce:" + nonce + ", ecostr:" + ecoStr); // Acesso de acordo com o "processo de criptografia/verificação" mencionado pela API. There are three steps in total // Step 1: Sort dictionary order of token, timestamp, nonce three parameters String[] parms = new String[] { token, timestamp, nonce };// Put the strings that need to be sorted dictionary in the array Arrays.sort(parms);// Sort dictionary order according to API requirements // Step 2: Splice the three parameter strings into a string for sha1 Encryption // Splique the String String parmsstring = ""; // Observe que não pode = nulo aqui. for (int i = 0; i <parms.length; i ++) {parmsstring+= parms [i]; } // sha1 string de criptografia mparms = null; // Resultado criptografado Messagedigest digery = null; tente {Digest = java.security.messagedigest.getInstance ("sha"); } catch (nosuchalgorithMexception e) {// TODO BLOCO DE CATAGEM AUTOGERATION E.PRINTSTACKTRACE (); } digest.update (parmsString.getBytes ()); byte Messagedigest [] = DIGEST.Digest (); // Crie String Hex StringBuffer hexstring = new StringBuffer (); // Converta a matriz de bytes em número hexadecimal para (int i = 0; i <Messagedigest.Length; i ++) {String Shahex = Integer.ToHexString (Messagedigest [i] e 0xff); if (shahex.length () <2) {hexstring.append (0); } hexstring.append (shahex); } mParms = hexstring.toString (); // Resultado da criptografia/ * * Requisitos da API: Se você confirmar que a solicitação GET vem do servidor WeChat, retorne o conteúdo do parâmetro ECHOSTR como ele é e o acesso terá efeito e se tornará um desenvolvedor com sucesso. Caso contrário, o acesso falhará. */ // Etapa 3: O desenvolvedor obtém a sequência criptografada e pode compará -la com a assinatura para identificar que a solicitação vem do acesso bem -sucedido do WeChat. // System.out.println (tag + ":" + mParms + "--->" + assinatura); if (mParms.equals (assinatura)) {// System.out.println (tag + ":" + mparms + "---->" + assinatura); printwriter.write (ecostr); } else {// access falhou, não há necessidade de escrever de volta // system.out.println (tag + "access falhou"); }} / * * Verifique o documento da API para enviar e receber mensagens e pressionar basicamente o mesmo formato de mensagem. Como no seguinte formato: <xml> * <TouserName> <! [CDATA [touser]]> </tousername> * </fromusername> <! [CDATA [DOUSER]] </setetime] <! <CENTENT> <! [CDATA [este é um teste]]> </content> * <Sgid> 1234567890123456 </msgid> </xml> Então, podemos executar processamento unificado. * / / * * Vamos primeiro obter o fluxo de entrada e ver as informações no fluxo de entrada. Ao testar o fluxo de impressão, podemos ver que sempre que o usuário solicita, recebemos uma solicitação REQ. O formato de solicitação está no formato XML, que é explicado no documento. * / / * * Observe que o req.getInputStream () só pode ser recuperado uma vez e só pode ser lido uma vez. Se você quiser lê -lo várias vezes, precisa encontrar outra maneira. Por simplicidade, * somos apenas req.getInputStream () uma vez e não imprimimos mais as informações do fluxo de saída. Imprima diretamente as informações analisadas. */ @Override Protect DoPost Protected (httpServletRequest req, httpServletResponse resp) lança servletexception, ioexception {// set coding req.setcharacterencoding ("utf-8"); resp.setContentType ("html/text; charset = utf-8"); resp.Setcharacterencoding ("UTF-8"); /** Nesta parte, recebemos as informações enviadas pelo usuário e a analisamos <k, v> para exibir*/ // analisamos as informações enviadas pelo usuário inputStream is = req.getInputStream (); // Obtenha o fluxo de solicitação // armazenar os resultados analisados no hashmap map <string, string> map = new Hashmap <string, string> (); // passa XML, analisando o resultado de retorno obtido XML nas informações de texto que somos usados no saxreader reader = new saxreader (); // jar de terceiros: dom4j [Baidu: SaxReader analisando o documento XML] Document = NULL; tente {document = reader.read (is); } catch (documentException e1) {// TODO GATO GENERATO AUTOMENTADO BLOCO E1.PRINTSTACKTRACE (); } // obtenha o elemento raiz xml root = document.getrootelement (); // Obtenha todos os nós filhos da lista de elementos raiz <lement> elementList = root.Elements (); // atravessa todos os nós filhos para (elemento e: elementList) map.put (e.getName (), e.getText ()); // Conjunto de saída de teste <String> keySet = map.keyset (); // Mensagem de saída de teste enviada pelo usuário após o sistema de análise.out.println (tag + ": Inicie a analisar as informações enviadas pelo usuário"); for (String Key: Keyset) {System.out.println (key + ":" + map.get (key)); } System.out.println (tag + ": Fim da análise das informações enviadas pelo usuário"); / * * Nesta parte, tentamos responder informações de texto e mensagens gráficas ao usuário de acordo com o formato necessário do documento. Foco: Construa os parâmetros necessários de acordo com os requisitos do documento. NOTA ESPECIAL: Os parâmetros são sensíveis ao maiúsculas. */ // // Exemplo 1: Envie uma mensagem de texto normal, verifique o formato XML do documento sobre "Mensagem de texto de resposta" // // Etapa 1: Construa os parâmetros necessários de acordo com as informações de texto da resposta // textmsg textMsg = new textMsg (); // textmsg.setTouserName (map.get ("FromUserName")); // Envie e receba a mensagem "Usuário" exatamente o oposto // textmsg.setFromUserName (map.get ("touserName")); // textmsg.setCreateTime (new Date (). getTime ()); // Tempo de criação da mensagem (número inteiro) // textmsg.setmsgtype ("text"); // tipo de texto message // textmsg.setContent ("Eu sou a resposta do servidor ao usuário"); // // // // // // A segunda etapa é converter as informações construídas no formato XML reconhecido pelo WeChat [Baidu: xstream Bean para xml] // xstream xStream = new XStream (); // xstream.alias ("xml", textmsg.getclass ()); // string textMsg2xml = xstream.toxml (textMsg); // system.out.println (textMsg2xml); // // // // // // // A terceira etapa é enviar as informações de formato do XML para o servidor WeChat, e o servidor a encaminhar para o usuário // printwriter printWriter = resp.getWriter (); // printWriter.print (textMsg2xml); // // Exemplo 2, envie mensagens gráficas e de texto. Verifique o documento sobre o formato XML de "Responder à mensagem de texto" // Etapa 1: Construa os parâmetros necessários de acordo com as respostas à lista de mensagens de texto <Teclary> Artigos = new ArrayList <Artigo> (); Artigo A = novo artigo (); A.Settitle ("Eu sou o título da imagem"); a.seturl ("www.baidu.com"); // Este endereço está depois de clicar na imagem e saltar a.etpicurl ("http://b.hiphotos.baidu.com/image/pic/item/08f79052982720a5d058Ba7b0a46f292982720a5d058Ba7BA A.SetDescription ("Eu sou a descrição da imagem"); artigos.add (a); PicandTextmsg picandTextMSG = new PicandTextMsg (); picandTextmsg.setTouserName (map.get ("FromUserName")); // Envie e receba a mensagem "Usuário" exatamente o oposto PicandTextMSG.SetFromUserName (map.get ("tousername")); picandTextmsg.setCreateTime (new Date (). getTime ()); // Tempo de criação de mensagens (número inteiro) picandTextmsg.setmsgtype ("notícias"); // Mensagem do tipo gráfico picandTextmsg.setarticles (artigos); // A segunda etapa é converter as informações construídas no formato XML reconhecido pelo WeChat [Baidu: XStream Bean para XML] xstream xStream = new XStream (); xstream.alias ("xml", picandTextmsg.getclass ()); xstream.alias ("item", a.getclass ()); String picandTextmsg2xml = xstream.toxml (picandTextMSG); System.out.println (picandTextMSG2XML); // A terceira etapa é enviar as informações do formato do XML para o servidor WeChat, e o servidor a encaminhe para o usuário printwriter printWriter = resp.getWriter (); printWriter.print (picandTextMSG2XML); }}
• testmsg.java (mensagem de texto normal)
pacote com.gist.bean;/** * @author gao yuan </n> E-mail: [email protected] </n> blog http://blog.csdn.net/wgyscsf </n> * Período de escrita 2016-4-4 2h09:27 pm */textms {public Class {Public Class {Public Class. string privada do nome dosen; Createtime privado longo; msgtype de string privada; @Override public string tostring () {return "textmsg [touserrneName =" + tousername + ", fromUserName =" + FromUSerName + ", createTime =" + createTime + ", msgtype =" + msgtype + ", content =" + content + "]";; } conteúdo privado da string; public textMsg (string touserName, string fromUserName, longo createTime, string msgtype, string content) {super (); Toumerername = tousername; FromUserName = FromUrName; CreateTime = CreateTime; Msgtype = msgtype; Content = content; } public textMsg () {super (); } public string gettouserName () {return touserName; } public void SettouserName (string touserName) {tousername = touserrne; } public string getFromUserName () {return fromUserName; } public void setFromUserName (String FromUserName) {FromUSerName = FromuSerName; } public long getCreateTime () {return createTime; } public void setCreateTime (Long CreateTime) {createTime = createTime; } public string getMsgtype () {return msgtype; } public void setmsgType (string msgtype) {msgtype = msgtype; } public string getContent () {return content; } public void setContent (String content) {content = Content; }}
• Artigo.java (Artigo Bean dentro da mensagem de texto)
pacote com.gist.bean;/** * @author gao yuan </n> E-mail: [email protected] </n> blog http://blog.csdn.net/wgyscsf </n> * escrita em 2016-4-4-4-4-4-4-477:08 @Override public string tostring () {return "item [title =" + title + ", description =" + description + ", picurl =" + picurl + ", url =" + url + "]"; } public string gettitle () {return título; } public void Settitle (título da string) {title = title; } public string getDescription () {return description; } public void SetDescription (String description) {Descrição = Descrição; } public string getPicurl () {return picurl; } public void Setpicurl (string picurl) {picurl = picurl; } public string geturl () {return url; } public void Seturl (String url) {url = url; } descrição da sequência privada; Private String Picurl; url de sequência privada;}
• PicandTextmsg.java (mensagem de texto gráfico)
pacote com.gist.bean; importar java.util.list;/** * @author gao yuan </n> E-mail: [email protected] </n> blog http:/mblog.csdn.net/wgysf </n> string privada do nome dosen; Createtime privado longo; msgtype de string privada; Private int articleCount; Lista privada <Artigo> Artigos; @Override public string tostring () {return "picandTextmsg [tousername =" + tousername + ", deusername =" + dousername + ", createTime =" + createTime + ", msgtype =" + msgtype + ", articlound =" + articl;; } public string gettouserName () {return touserName; } public void SettouserName (string touserName) {tousername = touserrne; } public string getFromUserName () {return fromUserName; } public void setFromUserName (String FromUserName) {FromUSerName = FromuSerName; } public long getCreateTime () {return createTime; } public void setCreateTime (Long CreateTime) {createTime = createTime; } public string getMsgtype () {return msgtype; } public void setmsgType (string msgtype) {msgtype = msgtype; } public int getArticleCount () {return articleCount; } public void setArticleCount (int articleCount) {articleCount = articleCount; } Lista pública <Trission> getArticles () {return Artigos; } public void settartics (list <Artigo> Artigos) {Artigos = Artigos; }}
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.