Comment obtenir et répondre aux messages de l'API de développement WeChat, je vous présenterai ci-dessous
1. Explication
* Cet exemple est développé et démontré selon le document de développement de WeChat: http://mp.weixin.qq.com/wiki/home/index.html la dernière version (4/3/2016 5:34:36 PM).
* Plateforme d'édition: myeclipse10.7 + win32 + jdk1.7 + tomcat7.0
* Serveur: Alibaba Cloud Windows Server 2008 64bits
* Exigences de la plate-forme: Méthode d'annotation d'utilisation du servlet, Exigences de la plate-forme: J2EE6.0 +, JDK6.0 +, Tomcat7.0 +
* La démo se concentre davantage sur l'analyse de l'API.
* Pour les instructions de test, chaque cas de test est indépendant et ne dépend pas d'autres méthodes. Ne considérez pas beaucoup l'emballage.
* La démonstration est effectuée autant que possible selon les exigences de l'API. Objectif: Comprendre comment le document est utilisé et réaliser l'effet de l'apprentissage d'un exemple et de l'appliquer à d'autres.
* Exigences de connaissances: Fondation Java solide, compréhension des connaissances en communication du réseau HTTP, ayant une compréhension suffisante de Javaweb, analyse JSON
* Cette partie du code source de démonstration sera donnée à la fin de chaque article. Après avoir analysé l'API, tous les codes source de démonstration seront donnés sous la forme d'un package de code source.
* Heure actuelle: 3/3/2016 17:32:57, cette fois prévaudra.
2. Document Management Original Text-Message (Résumé)
• Adresse du document: http://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html
• Gestion des messages
◦ Receive Message-Receive Normal Message
◦ Récevoir des messages-récepter l'événement push
Message de réponse passive du message
◦Sender le cryptage et le décryptage des messages en réponse passive
Message de service Message-client de Send
◦Send Interface Message-Massage
Interface de message de message-modèle
Spécifications de fonctionnement du message de message-modèle
◦ Obtenir une configuration de réponse automatique pour le compte officiel
3. Compréhension du document
• Recevoir des messages
◦Le document explique ceci: Lorsqu'un utilisateur WECHAT ordinaire envoie un message à un compte public, le serveur WeChat emballera les données XML du message Post à l'URL rempli par le développeur.
◦Croit de comptes: le serveur WeChat renvoie le message envoyé par l'utilisateur pour req sous la forme d'un flux post-flux. Lorsque nous voulons faire envoyer le message par l'utilisateur, nous pouvons l'obtenir via req.getInputStream (). Bien sûr, nous pouvons effectuer l'analyse nécessaire en fonction du format XML du message de retour dans le document.
◦
accomplir:
/ * * Dans cette partie, nous obtenons les informations envoyées par l'utilisateur et les analysons dans <k, v> pour afficher * /// analyser les informations envoyées par l'utilisateur. InputStream est = req.getInputStream (); // Obtenez le flux de demande // Stockez le résultat analysé dans la carte HashMap <String, String> map = new Hashmap <String, String> (); // Parse XML, parse the obtenue Retour Result in the Text Informations We Are est utilisé pour SAXREADER LEADER = NEW SAXREDER () Parsing xml] document de document = null; try {document = reader.read (is);} catch (documentException e1) {// todo généré par l'élément root root e1.printstackTrace ();} // obtient les nœuds root xml root <élément> élément> élément> root. Les nœuds pour (élément e: elementList) map.put (e.getName (), e.getText ()); // set de sortie de test <string> keyset = map.keyset (); // Une fois l'analyse de la sortie du test, les informations envoyées par l'utilisateur sont envoyées par l'utilisateur. for (String key: keyset) {System.out.println (key + ":" + map.get (key));} System.out.println (tag + ": end pour analyser les informations envoyées par l'utilisateur"); •Envoyer un message
◦Le document explique ceci: Lorsqu'un utilisateur envoie un message au compte officiel (ou lorsqu'un événement est poussé par une opération utilisateur spécifique), une demande de poste sera générée. Le développeur peut renvoyer une structure XML spécifique dans le package de réponse (GET) pour répondre au message (prend maintenant en charge le texte de réponse, les images, les images, le texte, la voix, la vidéo et la musique). À strictement parler, l'envoi de messages de réponse passif n'est pas en fait une interface, mais une réponse à un message envoyé à un serveur WeChat.
◦Crandonnant: Lorsqu'un utilisateur envoie une demande, une demande de poste sera générée et nous pouvons répondre aux messages via le respect. Cependant, le contenu de réponse a des exigences de format strictes. Ce n'est que lorsque les exigences du format seront satisfaites que le serveur WeChat sera le processus et le renvoie à l'utilisateur. En affichant le module document "Management de messages", nous pouvons voir qu'il existe divers messages dans WeChat, et chaque type de message a ses propres exigences de format spécifiques. Nous devons suivre les exigences pour renvoyer normalement l'information spécifique à l'utilisateur. Nous essayons de répondre aux utilisateurs avec des informations texte et des messages graphiques dans le format requis du document. Focus: Construire les paramètres requis en fonction des exigences du document. Remarque spéciale: les paramètres sont sensibles à la casse.
◦ Implémentation 1-REPLY AUX MECTS Textaux:
// Exemple 1: Envoyez un message texte normal, veuillez vérifier le format XML du document sur le "Message texte de réponse" // Étape 1: Construisez les paramètres requis TextMsg TextMsg = new TextMsG (); TextMsg.SetTousername (Map.get ("FromUsername")); // Envoyer et recevoir le message "User" UNELL US TextMsg.setFromUsername (map.get ("Tausername")); textmsg.setCreateTime (new Date (). GetTime ()); // Message Creation Time (Integer) TextMsg.setContent ("Je suis la réponse du serveur à l'utilisateur"); // // La seconde étape est pour convertir les informations sur le serveur "); // // la seconde étape est pour convertir les informations sur le serveur"); // // La seconde étape est pour convertir les informations sur le serveur "); // // La seconde étape est pour convertir les informations sur le serveur"); // // La seconde étape est pour convertir les informations sur le serveur "); // // La seconde étape est pour convertir les informations sur le serveur"); // // La seconde étape est pour convertir des informations sur le serveur "), Format reconnu par WeChat [Baidu: Xstream Bean à Xml] xstream xstream = new XStream (); xstream.alias ("xml", textmsg.getClass ()); String textMsg2xml = xstream.toxml (textmsg); System.out.println (textmsg2xml); // // au serveur WeChat, et le serveur le transmet à l'utilisateur printwriter printwriter = resp.getWriter (); printwriter.print (textmsg2xml); ◦ Implément 2-REPLY AU MESSION SMS:
// Exemple 2, envoyer des messages graphiques et texte. Veuillez vérifier le format XML du document "Répondre au SMS" // Étape 1: Construisez les paramètres requis par les réponses à la liste des messages texte <Bection> Articles = Nouveau ArrayList <Article> (); Article A = nouvel article (); A.SetTitle ("Je suis l'image A.Setpicurl ("http://b.hiphotos.baidu.com/image/pic/item/08f790529822720ea5d058ba7cb0a46f21fab50.jpg"); // cette adresse est une adresse d'image valide a.setDescription ("Je suis la description de l'image"); articules. picandTextmsg = new picAndTextMsg (); picAndTextMsg.SetTousername (map.get ("FromUserName")); // Envoyer et recevoir le message "User" juste le PicAndTextMsg.SetFromUsername (Map.get ("Tausername")); PicandTextmsg.Setcreate) picandTextmsg.setmsGtype ("news"); // Message de type graphique et de texte picAndTextmsg.SetarticleCount (1); picandTextmsg.setarticles (articles); // La deuxième étape consiste à convertir les informations construites en format XML reconnu par WeChat [Baidu: Xstream Bean en XML] xstream xstream = new Xstream (); xstream.alias ("xml", picandTextmsg.getClass ()); picandTextmsg2xml = xstream.toxml (picandTextmsg); System.out.println (picAndTextmsg2xml); // La troisième étape consiste à envoyer les informations de format du XML au serveur WECHAT, et le serveur les transmet à l'utilisateur printwriter printwriter = resp.getwriter (); printwriter.print (PicandTextMsg2xml); Tous les codes source d'opération dans cette partie peuvent être utilisés directement
• coreServlet.java (y compris l'accès au serveur, recevoir des messages d'envoi d'utilisateurs, répondre aux messages texte ordinaires et répondre aux messages graphiques. Pots tiers: DOM4J, xstream)
Package com.gist.servlet; import java.io.ioexception; import java.io.inputstream; import java.io.printwriter; import java.security.mesagedigest; import java.security.nosuchalgorithmexception; import java.util.arraylist; import java.util.array java.util.hashmap; importer java.util.list; import java.util.map; import java.util.set; import javax.servlet.servletException; import javax.servlet.annotation.webservlet; import javax.servlet.http.httplet.webservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import org.dom4j.document; import org.dom4j.documentException; import org.dom4j.element; import org.dom4j.io.saxreader; import com.element.ban.articule; com.gist.bean.picandtextmsg; import com.thoughtworks.xstream.xstream; / ** * @author gao yuan </ n> e-mail: [email protected] </n> blog http://blog.csdn.net/wgyscsf </n> * Écriture 2016-4-3 4:34:05 pm * / @ WebServlet ("/ CoreServlet") Classe publique CoreServlet étend httpServlet {private static final long SerialVersionUID = 1l; String tag = "coreServlet"; / * * Étape 2: Vérifiez la validité de l'adresse du serveur après que le développeur a soumis les informations, le serveur WeChat enverra une demande GET à l'URL d'adresse du serveur rempli. * La demande GET comporte quatre paramètres: signature, horodatage, nonce, echostr * Le développeur vérifie la demande en vérifiant la signature (il existe une méthode de vérification ci-dessous). Si vous confirmez que la demande GET provient du serveur WeChat, veuillez retourner le contenu du paramètre ECHOSTR tel qu'il est. *, l'accès prendra effet et deviendra un développeur avec succès, sinon l'accès échouera. * * Le processus de chiffrement / vérification est le suivant: 1. Trier Ordre du dictionnaire de jeton, horodatage et nonce 2. * Éplice les trois chaînes de paramètres dans une chaîne pour le cryptage SHA1 3. Les chaînes après le développeur obtiennent les chaînes cryptées Variables pour former des séquences. La méthode consiste à former une séquence de petite à grande dans l'ordre alphabétique ou dans l'ordre de petit et grand nombre. * / @Override Protected void doGet (httpServletRequest req, httpServletResponse resp) lève Servlexception, ioException {// set coding req.SetcharAtterencoding ("utf-8"); resp.setContentType ("html / text; charset = utf-8"); resp.SetcharAtterencoding ("UTF-8"); // Obtenez un stream de sortie printwriter printwriter = resp.getWriter (); // Définit un jeton global, le développeur le définit lui-même. L'API explique ceci: le jeton peut être rempli à volonté par le développeur, // utilisé comme signature de génération (le jeton sera comparé au jeton contenu dans l'URL de l'interface pour vérifier la sécurité) Token de chaîne = "WGYSCSF"; // Selon la description de l'API, obtenez les quatre paramètres ci-dessus Signature de chaîne = req.getParameter ("Signature"); String TimeStamp = req.getParameter ("Timestamp"); String nonce = req.getParameter ("nonce"); String echostr = req.getParameter ("eChostr"); // // temp: imprime temporaire, regardez la situation du paramètre de retour // System.out.println (tag + ": signature:" + signature + ", horodat:" // + horodatage + ", nonce:" + nonce + ", echostr:" + echostr); // Accès en fonction du "processus de chiffrement / vérification" mentionné par l'API. Il y a trois étapes dans le total // Étape 1: Trier Ordre du dictionnaire de jeton, horodatage, nonce trois paramètres String [] Parms = nouvelle chaîne [] {jeton, horodatage, nonce}; // les chaînes doivent être triées dans les exigences de l'arrivée // étape 2: Splice (Splice); Encryption // épisser la chaîne String parmsString = ""; // Notez qu'il ne peut pas = null ici. for (int i = 0; i <parms.length; i ++) {parmsString + = parms [i]; } // SHA1 Encryption String mparms = null; // Résultat chiffré MessagediGest digest = null; essayez {digest = java.security.MessagediGest.getInstance ("sha"); } Catch (NosuchalgorithMexception e) {// Bloc de capture généré automatiquement de TODO E.PrintStackTrace (); } digest.update (parmsString.getBytes ()); BYTE MessagediGest [] = digest.digest (); // Créer une chaîne hexagonale stringbuffer hexstring = new StringBuffer (); // Convertir le tableau d'octets en numéro hexadécimal pour (int i = 0; i <messagediGest.length; i ++) {String shahex = Integer.tohexString (MessagediGest [i] & 0xff); if (shahex.length () <2) {hexstring.append (0); } hexstring.append (shahex); } mparms = hexstring.toString (); // Résultat de cryptage / * * Exigences de l'API: si vous confirmez que la demande de GET provient du serveur WECHAT, veuillez renvoyer le contenu du paramètre ECHOSTR tel qu'il est, et l'accès prendra effet et deviendra un développeur avec succès. Sinon, l'accès échouera. * / // Étape 3: Le développeur obtient la chaîne cryptée et peut la comparer avec la signature pour identifier que la demande provient de l'accès réussi de WeChat. // System.out.println (tag + ":" + mparms + "--->" + signature); if (mparms.equals (signature)) {// system.out.println (tag + ":" + mparms + "---->" + signature); printwriter.write (echostr); } else {// L'accès a échoué, pas besoin d'écrire // System.out.println (tag + "Access a échoué"); }} / * * Vérifiez le document de l'API pour l'envoi et la réception de messages et pousser essentiellement le même format de message. Comme dans le format suivant: <xml> * <Tousername> <! [Cdata [Touser]]> </ Tousername> * <NomUserName> <! [CDATA [FromSer]]> </ FromUserName> * <CreateTetime> 1348831860 </ CreateTetime> <sgtype> <! [CDATA [Text]] <honied> <! [CDATA [Ceci est un test]]> </ponted> * <sgid> 1234567890123456 </sgid> </xml> Ensuite, nous pouvons effectuer un traitement unifié. * / / * * Obtenez d'abord le flux d'entrée et voyons les informations dans le flux d'entrée. En testant le flux d'impression, nous pouvons voir que chaque fois que l'utilisateur demande, nous recevons une demande REQ. Le format de demande est au format XML, qui est expliqué dans le document. * / / * * Notez que req.getInputStream () ne peut être récupéré qu'une seule fois et ne peut être lu qu'une seule fois. Si vous voulez le lire plusieurs fois, vous devez trouver un autre moyen. Pour plus de simplicité, * nous n'obtenons req.getInputStream () qu'une seule fois et n'imprimez plus les informations de flux de sortie. Imprimez directement les informations analysées. * / @Override Protected void doPost (httpServletRequest req, httpServletResponse resp) lève ServletException, ioException {// set coding req.SetcharacteRending ("utf-8"); resp.setContentType ("html / text; charset = utf-8"); resp.SetcharAtterencoding ("UTF-8"); / * * Dans cette partie, nous obtenons les informations envoyées par l'utilisateur et les analyserons dans <k, v> pour l'affichage * / // analyser les informations envoyées par l'utilisateur InputStream est = req.getInputStream (); // Obtenez le flux de demande // Stockez les résultats analysés dans HashMap Map <String, String> map = new Hashmap <String, String> (); // Parses XML, analysant le résultat de retour obtenu XML dans les informations texte Nous sommes utilisés sur saxReader Reader = new saxReader (); // Jar tiers: Dom4j [baidu: saxreader analyse xml] document de document = null; essayez {document = reader.read (is); } catch (DocumentException E1) {// TODO Block Catch généré automatiquement e1.printStackTrace (); } // Obtenez un élément root xml root root = document.getRootelement (); // Obtenez tous les nœuds enfants de la liste des éléments racinaires <element> elementList = root.Elements (); // Traverse tous les nœuds enfants pour (élément e: elementList) map.put (e.getName (), e.getText ()); // Test de sortie set <string> keySet = map.KeySet (); // Tester le message de sortie envoyé par l'utilisateur après le système d'analyse.out.println (tag + ": commencer à analyser les informations envoyées par l'utilisateur"); for (String key: keyset) {System.out.println (key + ":" + map.get (key)); } System.out.println (Tag + ": Fin de l'analyse des informations envoyées par l'utilisateur"); / * * Dans cette partie, nous essayons de répondre aux informations textuelles et aux messages graphiques à l'utilisateur en fonction du format requis du document. Focus: Construire les paramètres requis en fonction des exigences du document. Remarque spéciale: les paramètres sont sensibles à la casse. * / // // Exemple 1: Envoyez un SMS normal, veuillez vérifier le format XML du document sur "Message texte de réponse" // // // Étape 1: Construisez les paramètres requis en fonction des informations texte de réponse // TextMsg TextMsg = new TextMsG (); // textmsg.setTousername (map.get ("FromUserName")); // Envoi et recevez le message "utilisateur" exactement le contraire // textmsg.setFromUsername (map.get ("Tausername")); // textmsg.setCreateTime (new Date (). GetTime ()); // Time de création de messages (Integer) // TextMsG.SetmSGType ("Text"); // Type de texte Message // TextMsg.SetContent ("Je suis la réponse du serveur à l'utilisateur"); // // // // // // La deuxième étape consiste à convertir les informations construites en format XML reconnu par WeChat [baidu: xstream bean en xml] // xstream xstream = new XStream (); // xstream.alias ("xml", textmsg.getClass ()); // chaîne textmsg2xml = xstream.toxml (textmsg); // System.out.println (textmsg2xml); // // // // // // // La troisième étape consiste à envoyer les informations de format du XML au serveur WeChat, et le serveur le transfère à l'utilisateur // printwriter printwriter = resp.getWriter (); // printwriter.print (textmsg2xml); // // Exemple 2, envoyer des messages graphiques et texte. Veuillez vérifier le document sur le format XML de "Répondre au SMS" // Étape 1: Construisez les paramètres requis en fonction des réponses à la liste des messages texte <Reticle> Articles = Nouveau ArrayList <ReTist> (); Article A = nouvel article (); A.SetTitle ("Je suis le titre d'image"); A.SetUrl ("www.baidu.com"); // Cette adresse a après avoir cliqué sur l'image et sauter a.setpicurl ("http://b.hiphotos.baidu.com/image/pic/item/08f79052982720ea5d058ba7cb0a46f21fab50.jpg"); A.SetDescription ("Je suis la description de l'image"); articles.add (a); PicAndTextmsg picAndTextmsg = new picAndTextMsg (); picAndTextmsg.setTousname (map.get ("FromUserName")); // Envoyer et recevoir le message "utilisateur" juste le picAndTextmsg.SetFromUserName (Map.get ("Tausername")); picandTextmsg.setCreateTime (new Date (). GetTime ()); // Time de création de messages (entier) picandTextmsg.setmsGtype ("news"); // Message de type graphique picAndTextMsg.SetarticleCount (1); picandTextmsg.setarticles (articles); // La deuxième étape consiste à convertir les informations construites en format XML reconnu par WeChat [Baidu: XStream Bean en xml] xstream xstream = new Xstream (); xstream.alias ("xml", picAndTextMsg.getClass ()); xstream.alias ("item", a.getClass ()); String picAndTextMsg2xml = xstream.toxml (picAndTextMsg); System.out.println (PicAndTextMsG2XML); // La troisième étape consiste à envoyer les informations du format du XML au serveur WeChat, et le serveur le transfère à l'utilisateur Printwriter PrintWriter = resp.getWriter (); printwriter.print (picAndTextMsg2xml); }}
• testmsg.java (bean de message texte normal)
Package com.gist.bean; / ** * @author gao yuan </n> Courriel: [email protected] </n> Blog http://blog.csdn.net/wgyscsf </n> * Période d'écriture 2016-4-4 2:09:27 PM * / Public Class TextMsg {private String tousname; chaîne privée FromUserName; Création longue privée; chaîne privée msgtype; @Override public String toString () {return "textmsg [Tausername =" + Tausername + ", FromUsername =" + FromUserName + ", CreateTime =" + CreateEtime + ", msgType =" + msgType + ", content =" + content + "]"; } Contenu de chaîne privée; Public TextMsg (String Tuername, String FromUserName, Long CreateTime, String msgType, String Content) {super (); Tousername = Tousername; FromUserName = FromUserName; CreateTime = CreateTime; MsgType = msgType; Contenu = contenu; } public textmsg () {super (); } public String getTousername () {return Tausername; } public void Settousename (String Tousername) {Tausername = Tousername; } 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; }}
• Article.java (article Bean dans le SMS)
Package com.gist.bean; / ** * @author gao yuan </n> Courriel: [email protected] </n> Blog http://blog.csdn.net/wgyscsf </n> * Période d'écriture 2016-4-4 2:47:08 PM * / Classe publique Article {Titre de la chaîne privée; @Override public String toString () {return "item [title =" + title + ", description =" + description + ", picurl =" + picurl + ", url =" + url + "]"; } public String getTitle () {return title; } public void SettItle (String title) {title = title; } public String getDescription () {return Description; } public void setDescription (String Description) {Description = Description; } public String getPICUrl () {return picurl; } public void setPicurl (String picurl) {picurl = picurl; } public String getUrl () {return url; } public void setUrl (string url) {url = url; } description de la chaîne privée; chaîne privée picurl; URL de chaîne privée;}
• picandtextmsg.java (bean de message texte graphique)
Package com.gist.bean; Importer java.util.list; / ** * @author gao yuan </n> Courriel: [email protected] </n> Blog http://blog.csdn.net/wgyscsf </n> * Période d'écriture 2016-4-4 2:47:08 PM * / PICLAT PICALDTEXT PICANDEXTM chaîne privée FromUserName; Création longue privée; chaîne privée msgtype; privé int ArticleCount; Liste privée <Re article> Articles; @Override public String toString () {return "picAndTextmsg [Tausername =" + Tausername + ", FromUserName =" + FromUserName + ", CreateTime =" + CreateTime + ", msgType =" + msgType + ", articleCount =" + articleCount + ", articles =" + articules + "]";; } public String getTousername () {return Tausername; } public void Settousename (String Tousername) {Tausername = Tousername; } 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 AticleCount; } public void setarticleCount (int ArtiCleCount) {artiCleCount = artiCleCount; } Liste publique <ReTist> GetArticles () {Return Articles; } public void setarticles (list <article> Articles) {articles = articles; }}
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.