So erhalten und antworten Sie auf Nachrichten von der Wechat Development API, ich werde Sie unten vorstellen
1. Erklärung
* Dieses Beispiel wird gemäß dem WeChat -Entwicklungsdokument entwickelt und demonstriert: http://mp.weixin.qq.com/wiki/home/index.html Neueste Version (03.04.2016 17:34:36 Uhr).
* Bearbeitungsplattform: MyeClipse10.7+Win32+JDK1.7+Tomcat7.0
* Server: Alibaba Cloud Windows Server 2008 64bits
* Plattformanforderungen: Servlet -Nutzung Annotationsmethode, Plattformanforderungen: J2EEE6.0+, JDK6.0+, TOMCAT7.0+
* Demo konzentriert sich mehr auf die API -Parsen.
* Aus Gründen der Testanweisungen ist jeder Testfall unabhängig und hängt nicht von anderen Methoden ab. Betrachten Sie die Verpackung nicht sehr.
* Die Demonstration wird gemäß den API -Anforderungen so weit wie möglich durchgeführt. Zweck: Verstehen Sie, wie das Dokument verwendet wird, und erreichen Sie den Effekt des Lernens aus einem Beispiel und die Anwendung auf andere.
* Wissensanforderungen: Solid Java Foundation, Verständnis von HTTP -Netzwerkkommunikationswissen, genug Verständnis von Javaweb, JSON -Analyse
* Dieser Teil des Demo -Quellcodes wird am Ende jedes Artikels angegeben. Nach der Analyse der API werden alle Demo -Quellcodes in Form eines Quellcodepakets angegeben.
* Aktuelle Zeit: 03.04.2016 17:32:57 Uhr, diesmal wird es herrschen.
2. Dokumentieren Sie Original-Text-Message-Verwaltung (Zusammenfassung)
• Dokumentadresse: http://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html
• Nachrichtenverwaltung
◦Repe Message-Receive Normal Message
◦Repe Message-Receive-Ereignisschub
◦Sendernde meldungspassive Antwortnachricht
◦Sendernde Nachrichtenverschlüsse und Entschlüsselung bei passiver Antwort
◦Sendernde Nachrichten-Kunden-Dienstnachricht
◦Sendungsmessungs-Schnittstelle
◦Sendernde Nachrichten-Template-Nachrichtenschnittstelle
◦Senderne Nachrichten-Template-Nachrichten Betriebsspezifikationen
◦ Erhalten Sie eine automatische Antwortkonfiguration für offizielles Konto
3.. Dokumentverständnis
• Meldungen empfangen
◦Das Dokument erklärt Folgendes: Wenn ein gewöhnlicher WeChat -Benutzer eine Nachricht an ein öffentliches Konto sendet, verpackt der WeChat -Server die XML -Daten der Postnachricht an die vom Entwickler ausgefüllte URL.
◦Ververständnis: Der WeChat -Server gibt die vom Benutzer gesendete Nachricht in Form eines Post -Streams zurück. Wenn wir die vom Benutzer gesendete Nachricht erhalten möchten, können wir sie über req.getInputStream () erhalten. Natürlich können wir die erforderliche Parsen basierend auf dem XML -Format der Rückgabenachricht im Dokument durchführen.
◦
erreichen:
/** In diesem Teil erhalten wir die vom Benutzer gesendeten Informationen und analysieren sie in <k, v> für die Anzeige* /// an, die vom Benutzer gesendeten Informationen analysieren. InputStream is = req.getInputStream (); // den Anforderungsstrom abrufen // Das Parsen-Ergebnis in Hashmap-Karte <String, String> map = new Hashmap <String, String> (); // Parse XML, Parse des erhaltenen Rückkehrergebnisses in den Textinformationen, die wir zum Saxreader-Leser-SAXREADREADREADREADREAWER verwendet haben. Parsing xml] document document = null; try {document = reader.read (IS);} catch (documentException e1) {// Todo automatisch generiert Block e1.printstacktrace ();} // XML-Root-Element-Element-Element-Element-Element-Element-Element-Element-Element (). Alle untergeordneten Knoten für (Element E: ElementList) map.put (e.getName (), e.GetText (); // TEST -Ausgabemittel set <string> keyset = map.keySet (); // Nach der Analyse des Testausgangs werden die vom Benutzer gesendeten Informationen vom Benutzer gesendet. für (String -Schlüssel: Schlüsselset) {System.out.println (Schlüssel + ":" + map.get (Schlüssel));} System.out.println (Tag + ": Beenden Sie die vom Benutzer gesendeten Informationen"); • Senden Sie eine Nachricht
◦Das Dokument erklärt Folgendes: Wenn ein Benutzer eine Nachricht an das offizielle Konto sendet (oder wenn ein Ereignis von einem bestimmten Benutzervorgang gedrückt wird), wird eine Postanforderung erstellt. Der Entwickler kann eine bestimmte XML -Struktur in das Antwortpaket (GET) zurückgeben, um auf die Nachricht zu antworten (unterstützt jetzt Antworttext, Bilder, Bilder, Text, Sprache, Video und Musik). Streng genommen ist das Senden von passiven Antwortmeldungen keine Schnittstelle, sondern eine Antwort auf eine Nachricht, die an einen WeChat -Server gesendet wird.
◦Ververständnis: Wenn ein Benutzer eine Anfrage sendet, wird eine Postanforderung generiert, und wir können auf Nachrichten über Respone antworten. Der Antwortinhalt hat jedoch strenge Formatanforderungen. Nur wenn die Formatanforderungen erfüllt sind, wird der WeChat -Server bearbeitet und es an den Benutzer zurückgibt. Indem wir das Dokument "Message Management" -Modul anzeigen, können wir feststellen, dass es in WeChat verschiedene Nachrichten gibt, und jede Art von Nachrichten hat ihre eigenen spezifischen Formatanforderungen. Wir müssen die Anforderungen befolgen, um bestimmte Informationen normalerweise an den Benutzer zurückzugeben. Wir versuchen, Benutzern mit Textinformationen und Grafiknachrichten im erforderlichen Format des Dokuments zu antworten. Fokus: Erstellen Sie die erforderlichen Parameter gemäß den Dokumentenanforderungen. Besonderer Hinweis: Parameter sind fallempfindlich.
◦Implement 1 repry zu normalen Textnachrichten:
// Beispiel 1: Senden Sie eine normale Textnachricht. Überprüfen Sie bitte das XML -Format des Dokuments über die "Antwort des Textnachrichtens" // Schritt 1: Konstruieren Sie die erforderlichen Parameter textmsg textmsg = new textmsg (); textmsg.settousername (map.get ("Fromsername"); // Senden und empfangen die Nachricht "Benutzer" genau das Gegenteil "Deineits" genau das Gegenteil "DAS OPKETTE". textmsg.setfromusername (map.get ("tousername")); textmsg.setCreateTime (New Date (). GetTime ()); // Nachrichtenerstellung Zeit (Integer) textmsg.setmsgtype ("text"); // Texttyp -Nachricht textmsg.setcontent ("Ich bin die Server -Antwort. XML -Format von WeChat [Baidu: Xstream Bean zu XML] Xstream Xstream = new Xstream (); xstream.alias ("xml", textmsg.getClass ()); String textmsg2xml = xstream.toxml (textmsg). XML -Formatinformationen an den WeChat -Server, und der Server leitet sie an den Benutzer Printwriter Printwriter = resp.getWriter (); printwriter.print (textmsg2xml) weiter. ◦Implement 2-reply zur SMS:
// Beispiel 2, Senden Sie Grafik- und Textnachrichten. Bitte überprüfen Sie das XML -Format des Dokuments "Antwort auf die Textnachricht" // Schritt 1: Konstruieren Sie die Parameter, die von den Antworten auf die Textnachrichtsliste gefordert werden. A.SetpicUrl ("http://b.hiphotos.baidu.com/image/item/08f790529822720ea5d058ba7ccb0a46f21fab50.jpg"); // Diese Adresse ist eine gültige Bildanschrift A.Setdescription ("i am Beschreibung des Bildes"). picandTextmsg = new picandTextmsg (); picandTextmsg.settousername (map.get ("fromuername"); // Senden und empfangen Sie die Nachricht "Benutzer" genau die gegenüberliegenden picandTextmsg.setfromusername (MAP.get ("tousername"); picandtextmsg.set -setGeGeGeGe -Zeit (New Date). picandTextmsg.setmsgType ("news"); // Grafik und Texttyp Meldung picandTextmsg.setarticleCount (1); PicandTextmsg.Setarticles (Artikel); // Der zweite Schritt besteht darin, die konstruierten Informationen in das von WeChat [Baidu: Xstream -Bean angekündigte XML -Format zu kontrollieren. picandTextmsg2xml = xstream.toxml (picandTextmsg); system.out.println (picandTextmsg2xml); // Der dritte Schritt besteht darin, die Formatinformationen des XML an den WeChat -Server zu senden, und der Server leitet sie an die Benutzerprinkerin Princiter = GETRIGRITRITER (); Alle Betriebsquellencodes in diesem Teil können direkt verwendet werden
• coreservlet.java (einschließlich Serverzugriff, Empfangen von Benutzern, die Nachrichten senden, auf gewöhnliche Textnachrichten beantworten und auf grafische Nachrichten antworten.
Paket com.gist.servlet; import java.io.ioxception; import Java.io.inputStream; Import Java.io.printwriter; Import Java.Security.Messagedigest; Import Java.Security.NoSuchalgorithmException; java.util.hashMap; import Java.util.list; import Java.util.map; import Java.util.set; import Javax.servlet.servletException; import Javax.servlet.Notation.WebServlet; Import Javax.servlet.http.http.htp. javax.servlet.http.httpServletRequest; import Javax.servlet.http.httpServletResponse; Imory org.dom4j.document; import org.dom4j.documentException; Importe. com.gist.bean.picandTextmsg; import com.thoughtworks.xstream.xstream;/** * @author gao yuan */@WebServlet ("/coreservlet") öffentliche Klasse Coreservlet erweitert httpServlet {private statische endgültige long serialversionuid = 1l; String tag = "coreservlet"; / * * Schritt 2: Überprüfen Sie die Gültigkeit der Serveradresse Nachdem der Entwickler die Informationen eingereicht hat, sendet der WeChat-Server eine GET-Anforderung an die ausgefüllte Serveradress-URL. * Die GET -Anforderung trägt vier Parameter: Signatur, Zeitstempel, Nonce, Echostr * Der Entwickler überprüft die Anforderung durch Überprüfung der Signatur (es finden Sie eine Überprüfungsmethode unten). Wenn Sie bestätigen, dass die GET -Anforderung vom WeChat -Server erfolgt, geben Sie bitte den Inhalt des Echostr -Parameters so zurück. *Der Zugang wird erfolgreich wirksam und werden erfolgreich ein Entwickler, da der Zugriff ansonsten fehlschlägt. * * Der Verschlüsselungs-/Überprüfungsprozess lautet wie folgt: 1. Sortieren Sie die Wörterbuchreihenfolge von Token, Zeitstempel und Nonce. Sequenzen bilden. Die Methode besteht darin, eine Sequenz von klein bis groß in alphabetischer Reihenfolge oder in der Reihenfolge kleiner und großer Anzahl zu bilden. */ @Override Protected void dagget (httpServletRequest req, httpServletResponse resp) löst ServletException aus, ioException {// codieren codieren req.setcharactercoding ("utf-8"); resp.setContentType ("html/text; charSet = utf-8"); resp.setcharacterencoding ("utf-8"); // Ausgabe Stream PressWriter Printwriter = resp.getWriter (); // Setze ein globaler Token und setzt es selbst. API erklärt Folgendes: Das Token kann vom Entwickler nach Belieben ausgefüllt werden, // wird als Generationssignatur verwendet (das Token wird mit dem in der Grenzflächen -URL enthaltenen Token verglichen, um die Sicherheit zu überprüfen) String token = "wgyscsf"; // Nach der API -Beschreibung die oben genannten vier Parameter String Signature = req.getParameter ("Signatur") erhalten; String timestamp = req.getParameter ("timestamp"); String nonce = req.getParameter ("nonce"); String echoStr = req.getParameter ("echostr"); // // temp: Temporärer Druck, sehen Sie sich die Situation der Rückgabeparameter an. // Zugriff gemäß dem von der API erwähnten "Verschlüsselung/Überprüfungsprozess". Insgesamt gibt es drei Schritte. Verschlüsselung // Spleißen Sie die String String carmsstring = ""; // Beachten Sie, dass es hier nicht = null kann. für (int i = 0; i <parms.length; i ++) {parmsstring+= parms [i]; } // sha1 Verschlüsselungszeichenfolge mparms = null; // verschlüsseltes Ergebnis MessagedIGest Digest = null; try {digest = java.security.messagedigest.getInstance ("sha"); } catch (NoSuchalgorithmException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } digest.update (carmsstring.getBytes ()); Byte MessagedIGest [] = digest.Digest (); // Hex String StringBuffer HexString = new StringBuffer () erstellen; // Byte -Array in Hexadezimalzahl für (int i = 0; i <MessagedIGest.length; i ++) {String shahex = Integer.TohexString (MessagedIGest [i] & 0xff) konvertieren; if (shahex.length () <2) {hexstring.Append (0); } hexstring.Append (Shahex); } mparms = hexString.toString (); // Verschlüsselungsergebnis/ * * API -Anforderungen: Wenn Sie bestätigen, dass die GET -Anforderung vom WeChat -Server stammt, geben Sie bitte den EchoStr -Parameterinhalt so zurück, dass der Zugriff wirkt und der Entwickler erfolgreich wird. Andernfalls schlägt der Zugang fehl. */ // Schritt 3: Der Entwickler erhält die verschlüsselte Zeichenfolge und kann sie mit der Signatur vergleichen, um festzustellen, dass die Anforderung vom erfolgreichen Zugriff von WeChat stammt. // system.out.println (Tag + ":" + mparms + "--->" + Signature); if (mparms.equals (signature)) {// system.out.println (Tag + ":" + mparms + "---->" + Signatur); printwriter.write (echostr); } else {// Zugriff fehlgeschlagen, keine zurückschreiben // system.out.println (Tag + "Zugriff fehlgeschlagen"); }} / * * Überprüfen Sie das API -Dokument zum Senden und Empfangen von Nachrichten und drücken Sie im Grunde das gleiche Nachrichtenformat. Wie im folgenden Format: <xml> * <Tousername> <! [CData [Touser]> </tousername> * <fromusername> <! [Cdata [fromUser]> </fromusername> * <createTime> 1348831860 </createtime> <msgType> <! [[[Texter <Content> <! [CDATA [Dies ist ein Test]]> </content> * <Msgid> 1234567890123456 </msgid> </xml> Dann können wir eine einheitliche Verarbeitung durchführen. * / / * * Lassen Sie uns zunächst den Eingabestream erhalten und die Informationen im Eingabestream sehen. Durch das Testen des Ausdrucksflusss können wir feststellen, dass wir jedes Mal, wenn die Benutzeranforderung eine REQ -Anfrage erhalten. Das Anforderungsformat befindet sich im XML -Format, das im Dokument erläutert wird. * / / * * Beachten Sie, dass req.getInputStream () nur einmal abgerufen werden kann und nur einmal gelesen werden kann. Wenn Sie es mehrmals lesen möchten, müssen Sie einen anderen Weg finden. Der Einfachheit halber erhalten wir nur einmal req.getInputStream () und drucken Sie die Ausgabestream -Informationen nicht mehr aus. Drucken Sie die analysierten Informationen direkt aus. */ @Override protected void dopost (httpServletRequest req, httpServletResponse resp) löst ServletException aus, ioException {// codieren codieren req.setcharactercoding ("utf-8"); resp.setContentType ("html/text; charSet = utf-8"); resp.setcharacterencoding ("utf-8"); /** In diesem Teil erhalten wir die vom Benutzer gesendeten Informationen und analysieren Sie sie in <k, v> für Anzeigen*/ // Die vom Benutzer inputStream gesendeten Informationen analysieren. // Parse xml, analysiert das erhaltene Rückgabeergebnis XML in die Textinformationen, mit denen wir SAXREADER reader = new SAXReader (); // Drittanbieter Jar: DOM4J [Baidu: SAXReader Parsing XML] Dokument = Null; try {document = reader.read (ist); } catch (documentException e1) {// Todo automatisch generiertes Catch-Block e1.printstacktrace (); } // XML Root Element Element root = document.getRootElement () abrufen; // Erhalten Sie alle untergeordneten Knoten der Root -Elementliste <element> elementList = root.elements (); // Alle untergeordneten Knoten für (Element E: ElementList) map.put (e.getName (), e.getText ()) durchqueren; // Ausgangssatz <string> keyset = map.keyset (); // Testen Sie die vom Benutzer gesendete Ausgabenachricht nach dem Analyse -System.out.println (Tag + ": Beginnen Sie, die vom Benutzer gesendeten Informationen zu analysieren"); für (String -Schlüssel: Schlüsselset) {System.out.println (Schlüssel + ":" + map.get (Schlüssel)); } System.out.println (Tag + ": Ende der Analyse der vom Benutzer gesendeten Informationen"); / * * In diesem Teil versuchen wir, Textinformationen und grafische Nachrichten an den Benutzer gemäß dem erforderlichen Format des Dokuments zu beantworten. Fokus: Erstellen Sie die erforderlichen Parameter gemäß den Dokumentenanforderungen. Besonderer Hinweis: Parameter sind fallempfindlich. */ // // Beispiel 1: Senden Sie eine normale Textnachricht. Überprüfen Sie bitte das XML -Format des Dokuments über "Antwort von Textnachricht" // // // Schritt 1: Erstellen Sie die erforderlichen Parameter gemäß den Informationen zum Antwort Text // textmsg textmsg = new textmsg (); // textmsg.settousername (map.get ("fromuername")); // Die Meldung "Benutzer" genau das Gegenteil // textmsg.setfromusername (map.get ("tousername")); // textmsg.setCreateTime (neues Datum (). GetTime ()); // Nachrichtenerstellung Zeit (Ganzzahl) // textmsg.setmsgType ("text"); // Texttypnachricht // textmsg.setContent ("Ich bin der Server, der dem Benutzer antwortet"); // // // // // // Der zweite Schritt besteht darin, die konstruierten Informationen in das von WeChat [Baidu: Xstream Bean anerkannte XML -Format in XML] // xstream xstream = new Xstream () umzuwandeln; // xstream.alias ("xml", textmsg.getClass ()); // string textmsg2xml = xstream.toxml (TextMSG); // system.out.println (TextMSG2XML); // // // // // // // Der dritte Schritt besteht darin, die Formatinformationen des XML an den WeChat -Server zu senden, und der Server leitet sie an den Benutzer weiter // printwriter printwriter = resp.getWriter () weiter. // printwriter.print (TextMSG2XML); // // Beispiel 2, senden Sie Grafik- und Textnachrichten. Bitte überprüfen Sie das Dokument über das XML -Format "Antwort auf die Textnachricht" // Schritt 1: Erstellen Sie die erforderlichen Parameter gemäß den Antworten auf die Textnachrichtliste <artikels> Artikel = new ArrayList <Aktion> (). Artikel a = neuer Artikel (); A.Settitle ("Ich bin der Bildtitel"); A.Seturl ("www.baidu.com"); // Diese Adresse ist nach dem Klicken auf das Bild und springen A.Setpicurl ("http://b.hiphotos.baidu.com/image/pic/item/08f790529822720ea5d058ba7ccb0a46f21fab21fab50.JPG"; A.SetDescription ("Ich bin die Beschreibung des Bildes"); Artikel.Add (a); PicandTextmsg picandTextmsg = new PicandTextmsg (); picandTextmsg.settousername (map.get ("fromuername"); // die meldung "user" nur das gegenüberliegende picandtextmsg.setfromusername (map.get ("tousername")); picandTextmsg.setCreateTime (neues Datum (). GetTime ()); // Nachrichtenerstellung Zeit (Integer) picandTextmsg.setmsgType ("news"); // Graphic Typ Meldung picandtextmsg.setarticleCount (1); picandTextmsg.setarticles (Artikel); // Der zweite Schritt besteht darin, die konstruierten Informationen in das von WeChat [Baidu: Xstream Bean in XML] Xstream Xstream = new Xstream () erkannte XML -Format umzuwandeln. xstream.alias ("xml", picandTextmsg.getClass ()); xstream.alias ("item", a.getClass ()); String picandTextmsg2xml = xstream.toxml (picandTextmsg); System.out.println (picandTextmsg2xml); // Der dritte Schritt besteht darin, die Formatinformationen des XML an den WeChat -Server zu senden, und der Server leitet sie an den User Printwriter Printwriter = resp.getWriter () weiter. printwriter.print (picandTextmsg2xml); }} • testmsg.java (Normale SMS -Meldung Bean)
Paket com.gist.bean;/** * @author gao yuan </n> E-Mail: [email protected] </n> Blog http://blog.csdn.net/wgyscsf </n> * Schreibzeitraum 2016-4-4 2:09:27 PM */Public Class TextMSG {private {private texmsg {private texmsg {private tearmsg {private tearmsg {private tearmsg {private tearmsg {private tearmsg {private tearmsg {private {private tearsg {private teuresg {private {nt. private Zeichenfolge ausvertern; private lange Kreatur; private String msgType; @Override public String toString () {return "textmsg [tousername =" + tousername + ", fromuername =" + fromusername + ", createTime =" + createTime + ", msgType =" + msgtype + ", content =" + content + "]; } private String -Inhalt; public textmsg (String tousername, String fromuername, Long CreateTime, String msgType, String -Inhalt) {Super (); Tousername = tousername; Fromuername = fromuername; CreateTime = CreateTime; MsgType = msgType; Inhalt = Inhalt; } public textmsg () {super (); } public String Gettousername () {return tousername; } public void settousername (String tousername) {tousername = tousername; } public String GetFromusername () {return fromuNername; } public void setfromusername (String fromuSerername) {fromuSerername = fromuername; } 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 -Inhalt) {content = content; }}
• Artikel.java (Artikelbean in der Textnachricht)
Paket com.gist.bean;/** * @author gao yuan </n> E-Mail: [email protected] </n> Blog http://blog.csdn.net/wgyscsf </n> * Schreibzeitraum 2016-4-4 2:47:08 PM */Public Class-Artikel {privater Zeichen für Zeichenstreicher; @Override public String toString () {return "item [title =" + title + ", Beschreibung =" + Beschreibung + ", picUrl =" + picurl + ", url =" + url + "]"; } public String gettitle () {return title; } public void settitle (String title) {title = title; } public String getDescription () {Rückgabe Beschreibung; } public void setDescription (String Beschreibung) {Beschreibung = Beschreibung; } public String getPicurl () {return picurl; } public void setpicurl (String picurl) {picurl = picurl; } public String geturl () {return url; } public void seturl (String url) {url = url; } private Zeichenfolge Beschreibung; private String picurl; private String -URL;}
• picandTextmsg.java (Grafische Textnachricht Bean)
Paket com.gist.bean; import java.util.list;/** * @author gao yuan </n> E-Mail: [email protected] </n> Blog http://blog.csdn.net/wgyscsf </n> * Schreibperiode 2016-4-4-4 2:47:08 pm */public class picandtedh; private Zeichenfolge ausvertern; private lange Kreatur; private String msgType; private int articlecount; private Liste <artikels> Artikel; @Override public String toString() { return "PicAndTextMsg [ToUserName=" + ToUserName + ", FromUserName=" + FromUserName + ", CreateTime=" + CreateTime + ", MsgType=" + MsgType + ", ArticleCount=" + ArticleCount + ", Articles=" + Articles + "]"; } public String Gettousername () {return tousername; } public void settousername (String tousername) {tousername = tousername; } public String GetFromusername () {return fromuNername; } public void setfromusername (String fromuSerername) {fromuSerername = fromuername; } 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; } publiclist <Aktion> getArticles () {Artikel zurückgeben; } public void setArticles (Liste <artikels> Artikel) {Artikel = Artikel; }}
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.