Pengembangan akun publik WeChat umumnya ditujukan untuk perusahaan dan organisasi. Individu hanya dapat mengajukan permohonan untuk akun berlangganan, dan antarmuka yang mereka sebut terbatas. Mari kita jelaskan langkah -langkah untuk mengakses akun publik secara singkat:
1. Pertama -tama, Anda memerlukan alamat email untuk mendaftar di platform akun resmi WeChat;
Metode pendaftaran termasuk akun berlangganan, akun resmi, program mini dan akun perusahaan. Individu, kami hanya dapat memilih akun berlangganan di sini.
2. Setelah pendaftaran, kami masuk ke platform akun resmi ---> Pengembangan ---> Konfigurasi Dasar. Anda perlu mengisi URL dan token di sini. URL adalah antarmuka tempat kami menggunakan server;
3. Jika program Java Web Server dikompilasi dan digunakan di server dan dapat dijalankan, Anda dapat men -debug antarmuka online di akun resmi WeChat:
1) Pilih antarmuka yang sesuai
2) Sistem akan menghasilkan tabel parameter untuk antarmuka ini. Anda dapat secara langsung mengisi nilai parameter yang sesuai di kotak teks (tanda bintang merah menunjukkan bahwa bidang ini diperlukan)
3) Klik tombol Periksa Masalah untuk mendapatkan informasi debugging yang sesuai
misalnya: langkah -langkah untuk mendapatkan akses_token:
1) Jenis Antarmuka: Dukungan Dasar
2) Daftar Antarmuka: Dapatkan Access_Token Interface/Token
3) Isi parameter yang sesuai: Grant_type, appid, rahasia
4) Klik untuk memeriksa masalah
5) Hasil dan prompt akan dikembalikan setelah verifikasi berhasil, dan hasilnya adalah: 200 ok, prompt: permintaan sukses berarti verifikasi berhasil
Yang kami miliki lebih banyak verifikasi di sini adalah debugging antarmuka pesan: pesan teks, pesan gambar, pesan suara, pesan video, dll.
4. Jika Anda tidak memahami antarmuka, Anda dapat pergi ke pengembangan-> alat pengembang-> dokumen pengembang untuk meminta
5. Izin Antarmuka: Akun berlangganan terutama memiliki dukungan dasar, penerimaan pesan dan beberapa antarmuka dalam layanan web.
Di bawah ini kami terutama berbicara tentang kasus cara menerima pesan dengan akun berlangganan :
1. Anda perlu mengajukan permohonan akun langganan WeChat pribadi
2. URL Server dan Penyebaran Kode Sisi Server (Anda dapat menggunakan Tencent Cloud atau Alibaba Cloud Server)
1) Kelas AccountSServlet.java untuk memverifikasi pemrosesan pesan dari server WeChat dan server WeChat
paket cn.jon.wechat.servlet; impor java.io.ioException; impor java.io.printwriter; impor javax.servlet.servletException; impor javax.servlet.http.httpservlet; impor javax.servlet.http.httpservletRequest; impor javax.servlet.http.httpservletResponse; impor cn.jon.wechat.service.accountsservice; impor cn.jon.wechat.utils.signutil; AccountSServlet kelas publik memperluas httpservlet {public AccountsServlet () {super (); } public void hancur () {super.destroy (); // Masukkan kode Anda di sini}/ *** Konfirmasikan permintaan berasal dari server weChat*/ public void doGet (httpservletRequest, respons httpservletResponse) melempar servletException, ioException {System.out.println ("Tes Antarmuka dimulai !!!"); // WeChat Enkripsi Signature String Signature = Request.GetParameter ("Signature"); // timestamp string timestamp = request.getParameter ("timestamp"); // Nomor acak string nonce = request.getParameter ("nonce"); // string acak echoStr = request.getParameter ("echoStr"); Printwriter out = response.getWriter (); // Periksa permintaan dengan memeriksa tanda tangan. Jika verifikasi berhasil, pengembalian echostr sebagaimana adanya, menunjukkan bahwa akses berhasil, jika tidak akses gagal jika (Signutil.CheckSignature (tanda tangan, cap waktu, nonce)) {out.print (echostr); } out.close (); keluar = null; // response.encoderedirecturl ("Success.jsp"); } /*** Pesan proses yang dikirim oleh server weChat* /public void dopost (httpservletRequest, respons httpservletResponse) melempar servletException, ioException {// menerima, memproses, dan menanggapi permintaan pesan.setcharacterencoding ("UTF-8"); response.setcharacterencoding ("UTF-8"); // Memanggil Jenis Bisnis Core untuk menerima pesan dan memproses pesan string respMessage = AccountSService.ProcessRequest (permintaan); // pesan respons printwriter out = response.getWriter (); out.print (respMessage); out.close (); } public void init () melempar servletException {// letakkan kode Anda di sini}} 2) Kelas Signutil.java, Permintaan Kelas Alat Verifikasi, token harus konsisten dengan token yang diisi di WeChat
paket cn.jon.wechat.utils; impor java.security.messagedigest; impor java.security.nosuchalgorithmException; impor java.util.arrays; impor java.util.iterator; impor java.util.map; impor java.util.set; impor java.util.concurrent.concurrenthashmap; /*** Permintaan Kelas Alat Verifikasi* @Author Jon*/Kelas Publik Signutil {// Konsisten dengan token di WeChat Configuration Private Static String Token = ""; public static boolean checkSignature (string Signature, String timestamp, string nonce) {string [] array = new string [] {token, timestamp, nonce}; //Arrays.sort(arra); StringBuilder SB = StringBuilder baru (); untuk (int i = 0; i <arra.length; i ++) {sb.append (arra [i]); } MessageScageTest md = null; String stnstr = null; coba {md = messageDigest.getInstance ("sha-1"); byte [] digest = md.digest (sb.tostring (). getBytes ()); STNSTR = BYTETOSTR (Digest); } catch (nosuchalgorithMexception e) {// todo auto-generated catch block e.printstacktrace (); } // memori gratis sb = null; // Bandingkan string SHA1 terenkripsi dengan tanda tangan, mengidentifikasi bahwa permintaan berasal dari weChat return stnstr! = Null? Stnstr.equals (Signature.touppercase ()): false; } / ** * Konversi array byte ke string hexadecimal * @param digestarra * @return * / private static string bytetoStr (byte [] digestarra) {// todo metode yang dihasilkan auto-stub string string stringstr = ""; untuk (int i = 0; i <digestrarra.length; i ++) {digeststr+= bytetoHexstr (digestarra [i]); } return DigestStr; } / *** Konversi byte menjadi hexadecimal string* / private static string bytetohexstr (byte dbyte) {// toddo metode yang dihasilkan otomatis stub char [] digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; char [] tmparr = char baru [2]; tmparr [0] = digit [(dbyte >>> 4) & 0x0f]; tmparr [1] = digit [dbyte & 0x0f]; String s = string baru (tmparr); kembali S; } public static void main (string [] args) { /*byte dbyte = 'a'; System.out.println (bytetoHexstr (dbyte));*/ peta <string, string> peta = concurrenthashMap baru <string, string> (); Map.put ("4", "Zhangsan"); peta.put ("100", "lisi"); Set set = map.keyset (); Iterator iter = set.iterator (); while (iter.hasnext ()) {// string keyv = (string) iter.next (); String key = (string) iter.next (); System.out.println (Map.get (key)); // System.out.println (Map.get (iter.next ())); } /*untuk (int i = 0; i <map.size (); i ++) {}* /}} 3) Kelas Layanan AccountSService.java, terutama untuk permintaan pesan dan pemrosesan respons, dan ketika pengguna mengikuti akun resmi Anda, mereka dapat mengatur pesan push default
paket cn.jon.wechat.service; impor java.util.date; impor java.util.map; impor javax.servlet.http.httpservletRequest; impor cn.jon.wechat.message.req.imagemessage; impor cn.jon.wechat.message.req.linkmessage; impor cn.jon.wechat.message.req.locationMessage; impor cn.jon.wechat.message.req.videomessage; impor cn.jon.wechat.message.req.voicemessage; impor cn.jon.wechat.message.resp.textmessage; impor cn.jon.wechat.utils.messageutil; / *** decoupling, pisahkan lapisan kontrol dari lapisan logika bisnis, terutama berurusan dengan permintaan, dan merespons* @author jon*/ class accountsservice {public string proses rentetan (permintaan httpservletrequest) {string respMessage = null; // Konten pesan teks yang dikembalikan oleh string default respContent = "Permintaan Penanganan Pengecualian, silakan coba nanti!"; coba {// XML permintaan parsing peta <string, string> requestMap = messageutil.parexml (request); // Akun Pengirim (Open_ID) String FromUserName = RequestMap.get ("FromUserName"); // string akun publik Tousername = requestMap.get ("Tousername"); // jenis pesan string msgType = requestMap.get ("msgType"); // Balas pesan teks ini secara default TextMessage defaultTextMessage = new TextMessage (); defaultTextMessage.settousername (fromusername); defaultTextMessage.setFromusername (Tousername); defaultTextMessage.setCreateTime (tanggal baru (). getTime ()); defaultTextMessage.setMsgType (messageutil.messsage_type_text); defaultTextMessage.setFuncflag (0); // Karena nilai atribut HREF harus disebabkan dalam kutipan ganda, ini bertentangan dengan kutipan ganda dari string itu sendiri, defaultTextMessage.setContent harus diloloskan ("Selamat Datang di <a href =/" http://blog.csdn.net/j086924/ "> blog Jon!" // defaultTextMessage.setContent (getMainMenu ()); // Konversi objek pesan teks menjadi xml string respMessage = messageutil.textmessageToxMl (defaultTextMessage); // pesan teks if (msgtype.equals (messageutil.messsage_type_text)) {// respContent = "Hai, Anda mengirim pesan teks!"; // Balas ke pesan teks TextMessage textMessage = new TextMessage (); // textmessage.settousername (Tousername); // textmessage.setFromusername (fromusername); // Catatan di sini, jika tidak, pesan tidak dapat dibalas ke Pengguna TextMessage.settouserName (Fromusername); TextMessage.setFromusername (Tousername); TextMessage.setCreateTime (tanggal baru (). GetTime ()); TextMessage.setMSgType (messageutil.messsage_type_text); TextMessage.setFuncflag (0); respContent = "Hai, pesan yang Anda kirim adalah:"+requestMap.get ("Content"); textmessage.setContent (respContent); respMessage = messageutil.textmessageToxMl (textMessage); } // pesan gambar lain jika (msgtype.equals (messageutil.messsage_type_image)) {imagemessage imagemessage = new imagemessage (); Imagemessage.setousername (Fromusername); Imagemessage.setFromusername (Tousername); Imagemessage.setCreateTime (tanggal baru (). GetTime ()); Imagemessage.setMSgType (messageutil.messsage_type_image); //respcontent=RequestMap.get("picurl "); Imagemessage.setPicUrl ("http://img24.pplive.cn//2013//07//24//12103112092_230x306.jpg"); respMessage = messageutil.imagemessageToxMl (Imagemessage); } // Lokasi geografis lain jika (msgtype.equals (messageutil.messsage_type_location)) {locationMessage locationMessage = new LocationMessage (); locationMessage.setousername (fromusername); locationMessage.setFromusername (Tousername); locationMessage.setCreateTime (tanggal baru (). GetTime ()); locationMessage.setMSgType (messageutil.messsage_type_location); locationMessage.setLocation_x (requestMap.get ("location_x")); locationMessage.setlocation_y (requestMap.get ("location_y")); locationMessage.setscale (requestMap.get ("skala")); locationMessage.setLabel (requestMap.get ("label")); respMessage = messageutil.locationMessageToxMl (locationMessage); } // pesan video lain jika (msgtype.equals (messageutil.messsage_type_video)) {videomessage videomessage = videomessage baru (); videomessage.settousername (fromusername); videomessage.setFromusername (Tousername); videomessage.setCreateTime (tanggal baru (). GetTime ()); videomessage.setMSgType (messageutil.messsage_type_video); videomessage.setMediaID (requestMap.get ("MediaId")); videomessage.setthumbmediaId (requestMap.get ("thumbmediaid")); respMessage = messageutil.videomessageToxMl (videomessage); } // tautan pesan lain if (msgtype.equals (messageutil.messsage_type_link)) {linkMessage linkMessage = new LinkMessage (); linkmessage.settousername (fromusername); LinkMessage.setFromusername (Tousername); LinkMessage.setCreateTime (tanggal baru (). GetTime ()); LinkMessage.setMSgType (messageutil.messsage_type_link); linkmessage.settitle (requestMap.get ("title")); LinkMessage.setDescription (requestMap.get ("Deskripsi")); linkMessage.setUrl (requestMap.get ("url")); respMessage = messageutil.linkmessageToxMl (linkmessage); } // pesan suara lain jika (msgtype.equals (messageutil.messsage_type_voice)) {voicemessage voicemessage = voicemessage baru (); voicemessage.settousername (fromusername); voicemessage.setFromusername (Tousername); voicemessage.setCreateTime (tanggal baru (). getTime ()); voicemessage.setMSgType (messageutil.messsage_type_voice); voicemessage.setmediaId (requestMap.get ("Mediaid")); voicemessage.setFormat (requestMap.get ("format")); respMessage = messageutil.voicemessageToxMl (voicemessage); } // acara Push lain if (msgtype.equals (messageutil.messsage_type_event)) {// event type string eventType = requestMap.get ("event"); // Berlangganan if (eventType.equals (messageutil.event_type_subscribe)) {respContent = "Terima kasih atas perhatian Anda!"; } // berhenti berlangganan lain if (eventType.equals (messageutil.event_type_unsubscribe)) {// system.out.println ("berhenti berlangganan"); } else if (eventType.equals (messageutil.event_type_click)) {// sistem pemrosesan pesan menu khusus.out.println ("Pemrosesan Pesan Menu Kustom"); }}} catch (Exception e) {// TODO AUTO-ENCEALATED Catch Block E.PrintStackTrace (); } return respMessage; } public static String getMainMenu () {stringBuffer buffer = new StringBuffer (); buffer.append ("Halo, saya jon, tolong balas layanan pemilihan nomor:"). append ("/n"); buffer.append ("1. Blog saya"). append ("/n"); buffer.append ("/n"); buffer.append ("2. Song on Demand"). Append ("/n"); buffer.append ("3. Game klasik"). append ("/n"); buffer.Append ("4. CHAT dan PLAY CARD"). Tambahkan ("/n/n"); buffer.Append ("Balas"+"0"+"Tampilkan menu bantuan"); return buffer.toString (); }} 4) Messageutil.java kelas bantuan, termasuk definisi konstan dan konversi dan pemrosesan pesan XML
paket cn.jon.wechat.utils; impor java.io.inputstream; impor java.io.writer; impor java.util.hashmap; impor java.util.list; impor java.util.map; impor javax.servlet.http.httpservletRequest; impor org.dom4j.document; impor org.dom4j.element; impor org.dom4j.io.saxreader; impor cn.jon.wechat.message.req.imagemessage; impor cn.jon.wechat.message.req.linkmessage; impor cn.jon.wechat.message.req.locationMessage; impor cn.jon.wechat.message.req.videomessage; impor cn.jon.wechat.message.req.voicemessage; impor cn.jon.wechat.message.req.voicemessage; impor cn.jon.wechat.message.resp.textmessage; impor cn.jon.wechat.message.resp.musicmessage; impor cn.jon.wechat.message.resp.textmessage; impor cn.jon.wechat.message.resp.textmessage; impor cn.jon.wechat.message.resp.textmessage; impor cn.jon.wechat.message.resp.textmessage; impor com.thoughtworks.xstream.xstream; impor com.thoughtworks.xstream.core.util.quickwriter; impor com.thoughtworks.xstream.io.hierarchicalStreamWriter; impor com.thoughtworks.xstream.io.xml.prettypretyrintwriter; impor com.thoughtworks.xstream.io.xml.xppdriver; / *** Berbagai kelas pemrosesan pesan* @author jon*/ kelas publik Messageutil {/ *** Tipe Teks*/ Public Static Final String MessSage_Type_Text = "Text"; / *** Jenis musik*/ string final statis public messsage_type_music = "musik"; / *** Jenis gambar*/ string final statis public messsage_type_news = "news"; / *** Jenis video*/ string final statis public messsage_type_video = "video"; / *** Jenis gambar*/ string final statis public messsage_type_image = "image"; / *** Jenis tautan*/ string final statis public messsage_type_link = "tautan"; / *** Jenis Lokasi Geografis*/ String Akhir Statis Publik Messsage_Type_location = "Lokasi"; / *** Jenis audio*/ string final statis public messsage_type_voice = "voice"; / *** Tipe push*/ string final statis public messsage_type_event = "event"; / ** * Tipe acara: berlangganan (berlangganan) */ public static final string event_type_subscribe = "berlangganan"; / ** * Jenis acara: berhenti berlangganan (berhenti berlangganan) */ public static final string event_type_unsubscribe = "berhenti berlangganan"; / ** * Tipe Acara: Klik (Menu Kustom Klik Event) */ Public Static Final String Event_Type_Click = "Klik"; /** * * Parsing request XML sent by WeChat */ @SuppressWarnings("unchecked") public static Map<String,String> pareXml(HttpServletRequest request) throws Exception { //Storage the parsed result in HashMap Map<String,String> reqMap = new HashMap<String, String>(); // Dapatkan aliran input dari inputStream inputStream = request.getInputStream (); // Baca input stream Saxreader Reader = SaxReader baru (); Dokumen dokumen = reader.read (inputStream); // Dapatkan elemen elemen root XML root = document.getrooteLement (); // Dapatkan semua node anak dari daftar elemen root <sement> elementList = root.elements (); // mentransfer semua node anak untuk mendapatkan konten kelas informasi untuk (elemen elem: elementList) {reqmap.put (elem.getname (), elem.getText ()); } // Lepaskan sumber daya inputStream.close (); inputStream = null; return reqmap; } / ** * Konversi pesan respons ke xml untuk mengembalikan * objek teks ke xml * / string public statis textMessageToxMl (textMessage textMessage) {xstream.alias ("xml", textmessage.getClass ()); return xstream.toxml (TextMessage); } / ** * Konversi objek suara ke xml * * / string statis public voicemessageToxMl (voicemessage voicemessage) {xstream.alias ("xml", voicemessage.getClass ()); return xstream.toxml (voicemessage); } / ** * Konversi objek video ke xml * * / public static string videomessageToxMl (video videomessage) {xstream.alias ("xml", videomessage.getClass ()); return xStream.toxml (Videomessage); } / ** * Konversi objek musik ke xml * * / public string static musicMessageToxMl (MusicMessage MusicMessage) {xstream.alias ("xml", musicmessage.getClass ()); return xstream.toxml (MusicMessage); } / ** * Konversi objek grafis ke xml * * / public string statis newsmessageToxMl (NewsMessage Newsmessage) {xstream.alias ("xml", newsmessage.getClass ()); xstream.alias ("item", artikel baru (). getClass ()); return xstream.toxml (Newsmessage); } / ** * Konversi objek gambar menjadi xml * * / string statis public ImagemessAgetoxMl (ImageMessage ImageMessage) {xstream.alias ("xml", ImageMessage.getClass ()); return xstream.toxml (Imagemessage); } / ** * Konversi objek tautan ke xml * * / string statis public linkMessAgetoxMl (LinkMessage LinkMessage) {xstream.alias ("xml", linkMessage.getClass ()); return xstream.toxml (LinkMessage); } / ** * Konversi objek geolokasi menjadi xml * * / public static string locationMessAgetoxMl (locationMessage locationMessage) {xstream.alias ("xml", locationMessage.getClass ()); return xstream.toxml (locationMessage); } /** * Expand xstream to support CDATA blocks* */ private static XStream xstream = new XStream(new XppDriver(){ public HierarchicalStreamWriter createWriter(Writer out){ return new PrettyPrintWriter(out){ //Add CDATA tag to all xml nodes boolean cdata = true; @SuppressWarnings("unchecked") public void StartNode, nama string, clazz) {super.startnode (nama, clazz); } 5) Kelas Basis Pesan Basemessage.java (termasuk: Akun Pengembang WeChat, akun pengguna, waktu pembuatan, jenis pesan, variabel ID pesan), teks, video, dan pesan gambar akan mewarisi kelas dasar ini, dan atas dasar ini, akan memperluas variabelnya sendiri dan dapat didefinisikan berdasarkan berbagai atribut pesan dalam dokumen pengembang.
paket cn.jon.wechat.message.req; /** * Pesan Kelas Basis (Akun Public Pengguna biasa) * @Author Jon */Kelas Publik Basemessage {// Pengembang WeChat ID Private String Tousername; // Akun Pengirim (Satu OpenID) String Pribadi Dari Nama Sayang; // Waktu Pembuatan Pesan (Integer) Private Long CreateTime; // Jenis Pesan (Teks/Gambar/Lokasi/Tautan ...) Private String MsgType; // ID Pesan 64-Bit Integer Private String MsGID; public basemessage () {super (); // TODO Stub Konstruktor yang Dihasilkan Otomatis} Public Basemessage (String Tousername, String Fromusername, Long CreateTime, String MsgType, String MsGID) {super (); Tousername = Tousername; Fromusername = fromusername; CreateTime = createTime; MsgType = msgType; Msgid = msgid; } 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 getMsGID () {return msgid; } public void setMsGID (String msGID) {msGID = msGID; }} 6) TextMessage.java pesan teks, diwarisi dari kelas dasar dalam 5, memperluas atribut konten
paket cn.jon.wechat.message.req; /*** pesan teks* @author jon*/kelas publik TextMessage memperluas Basemessage {// konten pesan konten string pribadi; public string getContent () {return content; } public void setContent (string content) {this.content = content; }}7) Imagemessage.java pesan gambar
paket cn.jon.wechat.message.req; /*** Pesan gambar* @author jon*/kelas publik Imagemessage memperluas Basemessage {// pic link private string picurl; Public String getPICURL () {return picurl; } public void setPicUrl (string picurl) {picurl = picurl; }} 8) Pesan video videomessage.java
paket cn.jon.wechat.message.req; Videomessage kelas publik memperluas Basemessage {Private String MediaId; Private String Thumbmediaid; public string getmediaid () {return mediaId; } public void setmediaId (String MediaId) {this.mediaId = MediaId; } public string getthumbmediaId () {return thumbmediaid; } public void setthumbmediaid (string thumbmediaid) {this.thumbmediaid = thumbmediaid; }}Kelas pesan lainnya dapat diselesaikan sendiri berdasarkan dokumentasi pengembang. Selain itu, pengembang juga dapat mengajukan permohonan akun uji platform publik untuk menguji konten pengembangan yang relevan.
Artikel ini telah dikompilasi menjadi "Ringkasan Tutorial Pengembangan Android WeChat", dan "Java WeChat Development Tutorial Ringkasan" menyambut semua orang untuk dipelajari dan dibaca.
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.