Cara Mendapatkan dan Membalas Pesan dari WeChat Development API, saya akan memperkenalkan Anda di bawah
1. Penjelasan
* Contoh ini dikembangkan dan ditunjukkan menurut dokumen pengembangan WeChat: http://mp.weixin.qq.com/wiki/home/index.html Versi terbaru (4/3/2016 5:34:36 pm).
* Platform pengeditan: myeclipse10.7+win32+jdk1.7+tomcat7.0
* Server: Alibaba Cloud Windows Server 2008 64bits
* Persyaratan Platform: Metode Anotasi Penggunaan Servlet, Persyaratan Platform: J2EE6.0+, JDK6.0+, TomCat7.0+
* Demo lebih fokus pada parsing API.
* Demi instruksi pengujian, setiap kasus uji independen dan tidak bergantung pada metode lain. Jangan banyak mempertimbangkan kemasannya.
* Demonstrasi dilakukan sebanyak mungkin sesuai dengan persyaratan API. Tujuan: Pahami bagaimana dokumen digunakan dan mencapai efek pembelajaran dari satu contoh dan menerapkannya kepada orang lain.
* Persyaratan Pengetahuan: Yayasan Java yang Solid, Memahami Pengetahuan Komunikasi Jaringan HTTP, memiliki pemahaman yang cukup tentang Javaweb, Analisis JSON
* Bagian kode sumber demo ini akan diberikan di akhir setiap artikel. Setelah menganalisis API, semua kode sumber demo akan diberikan dalam bentuk paket kode sumber.
* Waktu saat ini: 4/3/2016 5:32:57 PM, kali ini akan menang.
2. Dokumen Manajemen Teks Asli (Abstrak)
• Alamat dokumen: http://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html
• Manajemen Pesan
◦Teseive pesan-menerima pesan normal
◦Teseive Pesan-Penerima Pesan Dorong
◦Sendlah pesan balasan-passive pesan
◦ Lakukan enkripsi dan dekripsi pesan saat balasan pasif
◦ Lakukan pesan layanan pelanggan pesan
◦ Luang antarmuka massage pesan
◦ Luang antarmuka pesan templat pesan
◦ Lakukan spesifikasi operasi pesan-template pesan
◦ Dapatkan konfigurasi balasan otomatis untuk akun resmi
3. Pemahaman dokumen
• Menerima pesan
◦ Dokumen menjelaskan ini: Ketika pengguna WeChat biasa mengirim pesan ke akun publik, server WeChat akan mengemas data XML dari pesan posting ke URL yang diisi oleh pengembang.
◦Peremudi: Server WeChat mengembalikan pesan yang dikirim oleh pengguna untuk req dalam bentuk streaming pos. Ketika kami ingin mendapatkan pesan yang dikirim oleh pengguna, kami bisa mendapatkannya melalui req.getInputStream (). Tentu saja, kita dapat melakukan parsing yang diperlukan berdasarkan format XML dari pesan pengembalian dalam dokumen.
◦
menyelesaikan:
/** Pada bagian ini, kami mendapatkan informasi yang dikirim oleh pengguna dan menguraikannya ke <k, v> untuk tampilan* /// parsing informasi yang dikirim oleh pengguna. InputStream is = req.getInputStream();// Get the request stream// Store the parsed result in HashMap Map<String, String> map = new HashMap<String, String>();// parse xml, parse the obtained return result into the text information we are used to SAXReader reader = new SAXReader();// Third-party jar:dom4j [Baidu: saxreader parsing xml] Document document = null;try { document = reader.read(is);} catch (DocumentException e1) { // TODO Auto-generated catch block e1.printStackTrace();}// Get xml root element Element root = document.getRootElement();// Get all child nodes of the root element List<Element> elementList = root.elements (); // melintasi semua node anak untuk (elemen e: elementlist) peta.put (e.getname (), mis. untuk (tombol string: keyset) {System.out.println (key + ":" + map.get (key));} system.out.println (tag + ": end untuk parse informasi yang dikirim oleh pengguna"); • Kirim pesan
◦ Dokumen menjelaskan ini: Ketika pengguna mengirim pesan ke akun resmi (atau ketika suatu acara didorong oleh operasi pengguna tertentu), permintaan pos akan dihasilkan. Pengembang dapat mengembalikan struktur XML tertentu dalam paket respons (GET) untuk menanggapi pesan (sekarang mendukung balasan teks, gambar, gambar, teks, suara, video, dan musik). Sebenarnya, mengirim pesan respons pasif sebenarnya bukan antarmuka, tetapi balasan untuk pesan yang dikirim ke server WeChat.
◦Pengundang: Ketika pengguna mengirim permintaan, permintaan pos akan dihasilkan, dan kami dapat membalas pesan melalui respone. Namun, konten balasan memiliki persyaratan format yang ketat. Hanya ketika persyaratan format dipenuhi proses server WeChat dan mengembalikannya ke pengguna. Dengan melihat modul "manajemen pesan" dokumen, kita dapat melihat bahwa ada berbagai pesan di WeChat, dan setiap jenis pesan memiliki persyaratan format spesifiknya sendiri. Kita harus mengikuti persyaratan untuk mengembalikan informasi spesifik ke pengguna secara normal. Kami mencoba membalas pengguna dengan informasi teks dan pesan grafis dalam format dokumen yang diperlukan. Fokus: Membangun parameter yang diperlukan sesuai dengan persyaratan dokumen. Catatan Khusus: Parameter peka case.
◦Implement 1-Reply ke pesan teks normal:
// Contoh 1: Kirim pesan teks normal, silakan periksa format XML dari dokumen tentang "pesan teks balasan" // Langkah 1: Bangun parameter yang diperlukan TextMSG TextMSg = new TextMSg (); TextMSG.SETTOUSERNAME (MAP.GET ("fromUsername")); // Kirim dan terima pesan "hanya lawan (" fromusername ")); // Kirim dan terima pesan" hanya lawan ("fromusername")); // Kirim dan terima pesan "hanya lawan (" fromusername ")); // Kirim dan terima pesan" hanya lawan ("fromUsername")); // Kirim dan terima pesan "hanya lawan (" fromusername ")); // kirim dan terima pesan" hanya lawan dari " textmsg.setFromusername (Map.get ("Tousername")); textmsg.setCreateTime (tanggal baru (). GetTime ()); // Pesan Pembuatan Pesan (Integer) TextMSG.SetMsGType ("Text"); // Teks jenis TextMSG.SetContent ("Saya adalah server membalas pengguna"); format recognized by WeChat [Baidu: xstream bean to xml]XStream xStream = new XStream();xStream.alias("xml", textMsg.getClass());String textMsg2Xml = xStream.toXML(textMsg);System.out.println(textMsg2Xml);// // The third step is to send the xml format informasi ke server weChat, dan server meneruskannya ke printwriter pengguna printwriter = resp.getWriter (); printwriter.print (textmsg2xml); ◦Implement 2-Reply ke pesan teks:
// Contoh 2, kirim pesan grafik dan teks. Silakan periksa format XML dari dokumen "Balas Pesan Teks" // Langkah 1: Bangun parameter yang diperlukan oleh balasan ke daftar pesan teks <Artikel> Artikel = Daftar Array baru <TARTENTER> (); Artikel A = Artikel baru (); a.settitle ("I Am The Picture Title"); a.seturl ("www.baidu.com"); a.setPicUrl ("http://b.hiphotos.baidu.com/image/pic/item/08f790529822720ea5d058ba7ccb0a46f21fab50.jpg"); // alamat ini adalah alamat gambar yang valid ("i am the descriple"); picandtextmsg = new picandtextmsg (); picandtextmsg.settousername (Map.get ("fromusername")); // Kirim dan terima pesan "pengguna" hanya picandtextmsg.setFromuserName (map.get ("Tousername"); picandtextmsg.setRomuserName (Map.get ("Tousername")); picandtextmsg.setRomuseTame (Map.get ("Tousername")); picandtextmsg.seteteTeM (integer) picandtextmsg.setMsgType ("news"); // jenis grafis dan teks pesan picandtextmsg.setarticlecount (1); picandtextmsg.setarticles (artikel); // Langkah kedua adalah untuk mengubah informasi yang dibangun menjadi format XML yang dikenali oleh weChat [baidu: xstream bean ke xml] xstream xstream = xstream (); xstream.alias ("xml", picandtextmsg.Gesar (); "xml (" xml ", picandtextmsg.Gesar () (" geta () ("xStream (" xStream ("xStream (" xStream ("xstream (" xstream ("xstream (xstream (" xstream ("xStream (xstream (" xstream ("xstream (" xStream ("xstream, a.getClass ()); string picandtextmsg2xml = xstream.toxml (picandtextmsg); System.out.println (picandtextmsg2xml); // Langkah ketiga adalah mengirim informasi format XML ke server weChat, dan server meneruskannya ke Pengguna Printwriter = resp.getWriter (); printwriter.print (picandtextmsg2xml); Semua kode sumber operasi di bagian ini dapat digunakan secara langsung
• coreservlet.java (termasuk akses server, menerima pesan pengiriman pengguna, membalas pesan teks biasa, dan membalas pesan grafis. Guci pihak ketiga: DOM4J, XStream)
Paket com.gist.servlet; impor java.io.ioException; impor java.io.inputstream; impor java.io.printwriter; impor java.security.messagedigest; impor java.roate. java.util.hashmap; import java.util.list; impor java.util.map; impor java.util.set; impor javax.servlet.servletException; import javax.servlet.annotation.webservlet; impor javax.servlet.htp.htpservlet; javax.servlet.http.httpservletrequest; impor javax.servlet.http.httpservletResponse; impor org.dom4j.document; impor org.dom.documentexception; impor org.dom.element; impor org.dom.documentexception; impor org.dom.element; Impor org.dom4j.dom.dom.dom.dom.dom. com.gist.bean.picandtextmsg; import com.thoughtworks.xstream.xstream;/** * @author gao yuan </n> Email: [email protected] </n> Blog http://blog.csdn.net/wgyscsf </n> purslog.csdn.net */@WebServer ("/coreserVlet") kelas publik CoreserVlet memperluas httpservlet {private static final long serialversionuid = 1l; Tag string = "coreserver"; / * * Langkah 2: Verifikasi validitas alamat server setelah pengembang mengirimkan informasi, server WeChat akan mengirim permintaan GET ke URL alamat server yang diisi. * Permintaan GET membawa empat parameter: tanda tangan, stempel waktu, nonce, echostr * Pengembang memverifikasi permintaan dengan memverifikasi tanda tangan (ada metode verifikasi di bawah). Jika Anda mengonfirmasi bahwa permintaan GET berasal dari server WeChat, silakan kembalikan konten parameter EchoStr sebagaimana adanya. *, akses akan mulai berlaku dan menjadi pengembang dengan sukses, jika tidak akses akan gagal. * * Proses enkripsi/pemeriksaan adalah sebagai berikut: 1. Urutkan Urutan Kamus Token, Timestamp, dan Nonce 2. * Penyambungan Tiga String Parameter ke dalam String untuk Enkripsi SHA1. untuk membentuk urutan. Metode ini adalah membentuk urutan dari kecil hingga besar dalam urutan abjad atau dalam urutan jumlah kecil dan besar. */ @Override Protected void doGet (httpservletRequest req, httpservletResponse resp) melempar servletException, ioException {// atur encoding req.setcharacterencoding ("UTF-8"); resp.setContentType ("html/text; charset = utf-8"); resp.setcharacterencoding ("UTF-8"); // dapatkan output stream printwriter printwriter = resp.getWriter (); // Tetapkan token global, pengembang menetapkannya sendiri. API menjelaskan ini: token dapat diisi sesuka hati oleh pengembang, // digunakan sebagai tanda tangan generasi (token akan dibandingkan dengan token yang terkandung dalam URL antarmuka untuk memverifikasi keamanan) token string = "wgyscsf"; // Menurut deskripsi API, dapatkan empat parameter di atas string Signature = req.getParameter ("Signature"); String timestamp = req.getParameter ("timestamp"); String nonce = req.getParameter ("nonce"); String echostr = req.getParameter ("echostr"); // // temp: pencetakan sementara, saksikan situasi parameter pengembalian // system.out.println (tag + ": tanda tangan:" + tanda tangan + ", cap waktu:" // + timestamp + ", nonce:" + nonce + ", echostr:" + echostr); // akses sesuai dengan "proses enkripsi/verifikasi" yang disebutkan oleh API. Ada tiga langkah secara total // Langkah 1: Urutkan Urutan Kamus Token, Timestamp, Nonce Three Parameter String [] PARMS = string baru [] {token, timestamp, nonce}; // Masukkan string yang perlu diurutkan pada string (Parms (Parm); // Sambungkan string string parmsString = ""; // Perhatikan bahwa itu tidak dapat = nol di sini. untuk (int i = 0; i <parms.length; i ++) {parmsstring+= parms [i]; } // string enkripsi SHA1 mparms = null; // hasil terenkripsi messagedigest digest = null; coba {digest = java.security.messagedigest.getInstance ("sha"); } catch (nosuchalgorithMexception e) {// todo auto-generated catch block e.printstacktrace (); } digest.update (parmsString.getBytes ()); byte messagedigest [] = digest.gigest (); // buat hex string stringBuffer hexString = new stringBuffer (); // Konversi array byte menjadi hexadecimal number untuk (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 (); // Hasil enkripsi/ * * Persyaratan API: Jika Anda mengonfirmasi bahwa permintaan GET berasal dari server WeChat, silakan kembalikan konten parameter EchoStr sebagaimana adanya, dan akses akan berlaku dan menjadi pengembang dengan sukses. Kalau tidak, akses akan gagal. */ // Langkah 3: Pengembang memperoleh string terenkripsi dan dapat membandingkannya dengan tanda tangan untuk mengidentifikasi bahwa permintaan tersebut berasal dari akses WeChat yang berhasil. // System.out.println (tag + ":" + mparms + "--->" + tanda tangan); if (mparms.equals (Signature)) {// System.out.println (tag + ":" + mparms + "---->" + Signature); printwriter.write (echostr); } else {// akses gagal, tidak perlu menulis kembali // system.out.println (tag + "akses gagal"); }} / * * Periksa dokumen API untuk mengirim dan menerima pesan dan mendorong pada dasarnya format pesan yang sama. Seperti dalam format berikut: <xml> * <Tousername> <! [Cdata [Touser]]> </tousername> * <Fromusername> <! <den konten> <! [CDATA [Ini adalah tes]]> </content> * <msgid> 1234567890123456 </sgid> </xml> Kemudian, kami dapat melakukan pemrosesan terpadu. * / / * * Mari pertama -tama dapatkan aliran input dan lihat informasi dalam aliran input. Dengan menguji aliran cetakan, kita dapat melihat bahwa setiap kali pengguna meminta, kami menerima permintaan Req. Format permintaan dalam format XML, yang dijelaskan dalam dokumen. * / / * * Perhatikan bahwa req.getInputStream () hanya dapat diambil sekali dan hanya dapat dibaca sekali. Jika Anda ingin membacanya beberapa kali, Anda perlu menemukan cara lain. Untuk kesederhanaan, * kami hanya mendapatkan req.getInputStream () sekali dan tidak lagi mencetak informasi aliran output. Langsung mencetak informasi parsed. */ @Override void dopost (httpservletrequest req, httpservletresponse resp) melempar servletException, ioException {// set encoding req.setcharacterencoding ("UTF-8"); resp.setContentType ("html/text; charset = utf-8"); resp.setcharacterencoding ("UTF-8"); /** Pada bagian ini kami mendapatkan informasi yang dikirim oleh pengguna dan menguraikannya ke <k, v> untuk display*/ // menganalisis informasi yang dikirim oleh inputStream pengguna adalah = req.getInputStream (); // Dapatkan aliran permintaan // simpan hasil yang diurai di peta hashmap <string, string> peta = hashmap <string> () (); // Parses XML, Parsing Hasil Pengembalian yang Diperoleh XML ke Informasi Teks Kita digunakan untuk Saxreader Reader = baru SaxReader (); // Jar Partai Ketiga: DOM4J [Baidu: Saxreader Parsing XML] Dokumen dokumen = null; coba {document = reader.read (IS); } catch (DocumentException E1) {// TODO AUTO-ENTO-ENTERATED Catch Block E1.PrintStackTrace (); } // Dapatkan elemen elemen root xml root = document.getrooteLement (); // Dapatkan semua node anak dari daftar elemen root <sement> elementList = root.elements (); // traverse semua node anak untuk (elemen e: elementlist) map.put (e.getname (), e.getText ()); // output output set <string> keyset = map.keyset (); // uji pesan output yang dikirim oleh pengguna setelah analisis system.out.println (tag + ": mulai mengurai informasi yang dikirim oleh pengguna"); untuk (tombol string: keyset) {System.out.println (key + ":" + map.get (key)); } System.out.println (tag + ": akhir parsing informasi yang dikirim oleh pengguna"); / * * Pada bagian ini, kami mencoba membalas informasi teks dan pesan grafis kepada pengguna sesuai dengan format dokumen yang diperlukan. Fokus: Membangun parameter yang diperlukan sesuai dengan persyaratan dokumen. Catatan Khusus: Parameter peka case. */ // // Contoh 1: Kirim pesan teks normal, silakan periksa format XML dari dokumen tentang "Pesan Teks Balas" // // // Langkah 1: Bangun parameter yang diperlukan sesuai dengan informasi teks balasan // textmsg textmsg = new TextMSg (); // textmsg.settouserName (map.get ("fromusername")); // kirim dan terima pesan "pengguna" persis sebaliknya // textmsg.setfromusername (peta.get ("Tousername")); // textmsg.setCreateTime (tanggal baru (). getTime ()); // Waktu Pembuatan Pesan (integer) // textmsg.setmsgType ("Text"); // Teks jenis pesan // textmsg.setContent ("Saya adalah balasan server ke pengguna"); // // // // // // Langkah kedua adalah mengonversi informasi yang dibangun menjadi format XML yang dikenali oleh WeChat [Baidu: XStream Bean ke XML] // xstream xstream = new xStream (); // xstream.alias ("xml", textmsg.getClass ()); // string textmsg2xml = xstream.toxml (textmsg); // System.out.println (TextMSG2XML); // // // // // // // Langkah ketiga adalah mengirim informasi format XML ke server WeChat, dan server meneruskannya ke pengguna // printwriter printwriter = resp.getWriter (); // printwriter.print (textmsg2xml); // // Contoh 2, kirim pesan grafik dan teks. Silakan periksa dokumen tentang format XML dari "Balas Pesan Teks" // Langkah 1: Bangun parameter yang diperlukan sesuai dengan balasan ke daftar pesan teks <Artikel> Artikel = Daftar Array baru <TARTICTER> (); Artikel A = artikel baru (); a.settitle ("I Am The Picture Title"); a.setUrl ("www.baidu.com"); // Alamat ini setelah mengklik gambar dan melompat a.setpicurl ("http://b.hiphotos.baidu.com/image/pic/item/08f79052982720ea5d058ba7ccb0a46f2.jg5.jg5.jg5.jg5.jg5.jg5.jg5.jg5.jg5.jg5.jg5.jg.jo); a.setDescription ("Saya adalah deskripsi gambar"); artikel.add (a); Picandtextmsg picandtextmsg = new picandtextmsg (); picandtextmsg.settousername (map.get ("fromusername")); // kirim dan terima pesan "pengguna" hanya lawan picandtextmsg.setFromusername (peta.get ("Tousername")); picandtextmsg.setCreateTime (tanggal baru (). getTime ()); // Waktu pembuatan pesan (integer) picandtextmsg.setmsgType ("news"); // jenis grafis jenis picandtextmsg.setarticlecount (1); picandtextmsg.setarticles (artikel); // Langkah kedua adalah mengubah informasi yang dibangun menjadi format XML yang diakui oleh weChat [Baidu: Xstream Bean ke XML] xstream xstream = new xStream (); xstream.alias ("xml", picandtextmsg.getClass ()); xstream.alias ("item", a.getClass ()); String picandtextmsg2xml = xstream.toxml (picandtextmsg); System.out.println (picandtextmsg2xml); // Langkah ketiga adalah mengirim informasi format XML ke server WeChat, dan server meneruskannya ke printwriter pengguna printwriter = resp.getWriter (); printwriter.print (picandtextmsg2xml); }}
• testmsg.java (kacang pesan normal)
Paket com.gist.bean;/** * @author gao yuan </n> Email: [email protected] </n> blog http://blog.csdn.net/wgyscsf </n> * periode penulisan 2016-4-4 2:09:27 pm */Public TextMSG {private 2016-4-4 2:09:27 pm */Public TextMSG {priver {private {private {public TextMSG {priver {public TextMSG {n> string privat fromusername; createtime panjang pribadi; msgtype string pribadi; @Override Public String ToString () {return "TextMSg [Tousername =" + Tousername + ", fromusername =" + fromusername + ", createTime =" + createTime + ", msgtype =" + msgtype + ", content =" + content + "]"; } konten string pribadi; TextMSG publik (String Tousername, String Fromusername, Long CreateTime, String MsgType, String Content) {super (); Tousername = Tousername; Fromusername = fromusername; CreateTime = createTime; MsgType = msgType; Konten = konten; } public textmsg () {super (); } public String getTousername () {return Tousername; } public void settousername (String Tousername) {Tousername = 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; }}
• artikel.java (artikel kacang di dalam pesan teks)
package com.gist.bean;/** * @author Gao Yuan</n> Email: [email protected]</n> Blog http://blog.csdn.net/wgyscsf</n> * Writing period 2016-4-4 2:47:08 pm */public class Article { private String Title; @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; } deskripsi string pribadi; picurl string pribadi; private string url;}
• picandtextmsg.java (Pesan Teks Grafis Bean)
Paket com.gist.bean; import java.util.list;/** * @author gao yuan </n> email: [email protected] </n> blog http://blog.csdn.net/wgyscsf </n> periode penulisan 2016-4-4-4 2:47:47:47:47:47:47:47:47:47:47:47:47:47:47:47 string privat fromusername; createtime panjang pribadi; msgtype string pribadi; private int articlecount; Daftar Privat <Artikel> Artikel; @Override Public String ToString () {return "picandTextMSg [Tousername =" + Tousername + ", Fromusername =" + Fromusername + ", createTime =" + createTime + ", msgtype =" + msgType + ", articlecount =" + artiklecount + ", artikel =" + "," + " +" + " +" + " +" + " +" + " +" + " +" + " +", Article = ", ARTICLECOUNT =" + ARTIKLECOUNT + ", MSGTYPE =" "; } public String getTousername () {return Tousername; } public void settousername (String Tousername) {Tousername = 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 articlecount; } public void setarticlecount (int articlecount) {articlecount = articlecount; } Daftar Publik <Artticle> getArticles () {return artikel; } setArticles public void (Daftar <Artikel> artikel) {artikel = artikel; }}
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.