Saya sibuk beberapa saat yang lalu. Saya mulai mengembangkan akun resmi WeChat dan membaca dokumen dari awal. Saya menginjak banyak jebakan. Saya telah melewatinya. Saya baru -baru ini mempertimbangkan untuk membuat beberapa ringkasan sehingga saya dapat memeriksanya ketika saya mengembangkannya di masa depan. Saya juga akan memberikan referensi kepada siswa yang sedang mengerjakan proyek terkait.
1. Ide
WeChat Access: Pesan dan dorongan pengguna yang diperlukan oleh pengembang akan memulai permintaan melalui server WeChat dan meneruskan ke alamat URL server yang Anda konfigurasikan di platform publik. Server WeChat akan membawa empat parameter tanda tangan, stempel waktu, nonce, dan echostr. Server kami sendiri menyambung token yang dikonfigurasi oleh platform publik, serta timestamp yang diunggah, dan Nonce dienkripsi di SHA1 dan cocok dengan tanda tangan. Kembalikan Ture untuk menunjukkan bahwa akses berhasil.
Balas Pesan: Ketika pengguna mengirim pesan ke akun resmi, server WeChat akan meminta pesan pengguna ke antarmuka yang sesuai dari server yang kami konfigurasi dalam format XML melalui POST. Yang harus kami lakukan adalah melakukan pemrosesan logis yang sesuai berdasarkan jenis pesan, dll., Dan mengembalikan hasil pengembalian akhir ke server WeChat melalui format XML, dan Partai WeChat akan menyampaikannya kepada pengguna.
1. Konfigurasi platform publik
2.Controller
@Controller @requestMapping ("/weChat") publicclass weChatController {@value ("$ {dnbx_token}") string pribadi dnbx_token; private static final Logger Logger = loggerFactory.getLogger (wechatcontroller.class); @Resource weChatService weChatService; /** * WeChat access* @param wc * @return * @throws IOException */ @RequestMapping(value="/connect",method = {RequestMethod.GET, RequestMethod.POST}) @ResponseBody publicvoid connectWeixin(HttpServletRequest request, HttpServletResponse response) throws IOException{ // Set the encoding of Permintaan dan tanggapan terhadap permintaan UTF-8 (mencegah Chinese kacau). Setcharacterencoding ("UTF-8"); // Server WeChat menggunakan pengkodean UTF-8 ketika pesan posting, dan pengkodean yang sama harus digunakan saat menerima, jika tidak, Cina kacau; response.setcharacterencoding ("UTF-8"); // Saat menanggapi pesan (membalas pengguna), metode pengkodean juga diatur ke UTF-8, prinsipnya sama seperti di atas; boolean isget = request.getMethod (). TolowerCase (). Equals ("get"); Printwriter out = response.getWriter (); coba {if (isGet) {string Signature = request.getParameter ("Signature"); // WeChat Enkripsi String Timestamp = request.getParameter ("Timestamp"); // string timestamp nonce = request. tanda tangan. Jika verifikasi berhasil, pengembalian Echostr sebagaimana adanya, menunjukkan bahwa akses berhasil. Jika tidak, akses gagal jika (Signutil.CheckSignature (dnbx_token, tanda tangan, timestamp, nonce)) {logger.info ("Hubungkan server Weixin berhasil."); response.getWriter (). Write (echostr); } else {logger.error ("Gagal memverifikasi tanda tangan!"); }} else {String respMessage = "Pesan Pengecualian!"; coba {respMessage = weChatservice.weixInpost (permintaan); out.write (respMessage); Logger.info ("Permintaan selesai dengan sukses"); Logger.info ("ke server weixin"+respMessage); } catch (Exception e) {logger.error ("Gagal mengonversi pesan dari Weixin!"); }}} catch (Exception e) {logger.error ("Hubungkan server Weixin adalah kesalahan."); } akhirnya {out.close (); }}}3. Pendaftaran verifikasi tanda tangan
Dari pengontrol di atas, kita dapat melihat bahwa saya merangkum class class class, yang disebut checkSignature, dan diteruskan dalam empat nilai, dnbx_token, tanda tangan, cap waktu, nonce. Proses ini sangat penting. Bahkan, kita dapat memahaminya sebagai proses enkripsi dan dekripsi nilai yang ditransmisikan oleh WeChat. Untuk memastikan keamanan, semua antarmuka dalam banyak proyek besar akan memiliki proses verifikasi seperti itu. Dnbx_token Kami telah mengkonfigurasi string token di platform publik WeChat, menjaga kerahasiaan ide! Tiga lainnya adalah parameter yang dikirim oleh server WeChat untuk mengirim permintaan GET. Kami melakukan lapisan enkripsi SHA1:
public class SignUtil { /** * Verification signature * @param token WeChat server token, configured in the env.properties file and configured in the developer center must be consistent* @param signature The WeChat server sends the sha1 encrypted certificate signature* @param timestamp timestamp* @param nonce Random number* @return */ public static boolean checkSignature(String token,String tanda tangan, string timestamp, string nonce) {string [] arr = new string [] {token, timestamp, nonce}; // Urutkan Urutan Kamus Token, Timestamp, dan Nonce; // Sambungkan tiga string parameter ke dalam string untuk string enkripsi SHA1 TMPSTR = sha1.encode (ARR [0] + ARR [1] + ARR [2]); // string yang dienkripsi SHA1 dapat dibandingkan dengan tanda tangan, mengidentifikasi bahwa permintaan berasal dari weChat return tmprstr! = Null? tmpstr.Equals (Signature.touppercase ()): false; }} Sha1:
/** * WeChat Public Platform (Java) SDK * * SHA1 Algoritma * @Author Helijun 2016/06/15 19:49 */Kelas Akhir Publik Sha1 {private static final char [] hex_digits = {'0', '1', '2 'B', 'c', 'd', 'e', 'f'}; /*** Mengambil byte mentah dari pencernaan dan memformatnya dengan benar. * * @param byte byte mentah dari pencernaan. * @Keturn byte yang diformat. */ string statis privat getFormattedText (byte [] bytes) {int len = bytes.length; StringBuilder buf = New StringBuilder (len * 2); // Konversi cipherText menjadi bentuk string hexadecimal untuk (int j = 0; j <len; j ++) {buf.append (hex_digits [(bytes [j] >> 4) & 0x0f]); buf.append (hex_digits [bytes [j] & 0x0f]); } return buf.toString (); } public static string encode (string str) {if (str == null) {return null; } coba {MessageSpingIgest MessageDigest = MessageDigest.getInstance ("sha1"); MessageDigest.update (str.getbytes ()); return getFormattEdtext (MessageDigest.digest ()); } catch (Exception e) {lempar runtimeException baru (e); }}}Saat Anda mengirimkan dan menyimpannya di platform publik dan melihat "Akses Sukses" Prompt Hijau, selamat telah menyelesaikan akses WeChat. Proses ini membutuhkan sedikit lebih hati -hati dan memperhatikan kasus dalam algoritma enkripsi. Jika akses tidak berhasil, sebagian besar kasus adalah masalah dengan algoritma enkripsi, periksa lebih lanjut.
4. Menerapkan Layanan Balas Pesan Otomatis
/ ** * Permintaan proses dari weChat * * @param permintaan * @return */ public string weixInpost (permintaan httpservletRequest) {string respMessage = null; coba {// xml permintaan parsing peta <string, string> requestMap = messageutil.xmltomap (request); // Akun Pengirim (Open_ID) String FromUserName = RequestMap.get ("FromUserName"); // string akun publik Tousername = requestMap.get ("Tousername"); // jenis pesan string msgType = requestMap.get ("msgType"); // Konten Pesan Konten Konten = RequestMap.get ("Konten"); Logger.info ("Fromusername adalah:" + fromusername + ", Tousername adalah:" + Tousername + ", msgtype adalah:" + msgtype); // Pesan Teks if (msgtype.equals (messageutil.req_message_type_text)) {// Di sini Anda menjalankan logika yang sesuai sesuai dengan kata kunci, hanya ada satu yang tidak dapat Anda pikirkan, dan tidak ada hal yang tidak dapat Anda lakukan jika (content.equals ("xxx")) {} // text.setContent ("Teks adalah" + konten); text.settousername (fromusername); text.setFromusername (Tousername); text.setCreateTime (tanggal baru (). getTime () + ""); text.setMsgType (msgType); respMessage = messageutil.textmessageToxMl (teks); }/*else if (msgtype.equals (messageutil.req_message_type_event)) {// event push string eventType = requestMap.get ("event"); // event type if (eventType.equals (messageutil.event_type_subscribe)) {// berlangganan respconn (messageutil.event_type_subscribe)) {// berlangganan respconten = "xxx TO" return messageresponse.gettextMessage (fromusername, Tousername, respContent); } lain if (eventType.equals (messageutil.event_type_click)) {// menu kustom klik event string eventkey = requestMap.get ("eventkey"); // nilai kunci acara, sesuai dengan nilai kunci yang ditentukan saat membuat menu kustom.info ("eventkey is:" +eventkey); mengembalikan xxx; }} // Nyalakan uji pengenalan suara weChat 2015-3-30 lain if (msgtype.equals ("voice")) {string recvMessage = requestMap.get ("pengakuan"); // respContent = "Menerima Hasil Analisis Bicara:"+RecvMessage; if (recvMessage! = null) {respContent = tulingapiprocess.gettulingResult (recvMessage); } else {respContent = "Apa yang Anda katakan terlalu kabur, dapatkah Anda mengatakannya lagi?"; } return messageresponse.getTextMessage (fromusername, Tousername, respContent); } // Fungsi fotografi lain if (msgtype.equals ("pic_sysphoto")) {} else {return messageresponse.gettextMessage (fromusername, Tousername, "Return to Empty"); }*/ // Event push else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) { String eventType = requestMap.get("Event");// Event type// Subscribe if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) { TextMessage text = new TextMessage(); text.setContent ("Selamat datang untuk mengikuti, xxx"); text.settousername (fromusername); text.setFromusername (Tousername); text.setCreateTime (tanggal baru (). getTime () + ""); text.setMsgType (messageutil.resp_message_type_text); respMessage = messageutil.textmessageToxMl (teks); } // TODO Setelah berhenti berlangganan, pengguna tidak dapat menerima pesan yang dikirim oleh akun resmi, jadi tidak perlu membalas pesan lain jika (eventType.equals (messageutil.event_type_unsubscribe)) {// unsubscribe} // custom event event ife (eventType.equals (messageutil.event} // kustom) event event {eventType.equals (messageutil.event} // custom event {eventType (eventsype.equals (messageutil.event}) custom {eventType (eventType.equals (messageutil.event {eVent_type)) requestMap.get ("EventKey"); // Nilai kunci acara sesuai dengan nilai kunci yang ditentukan saat membuat menu khusus jika (eventkey.equals ("customer_telephone")) {textMessage text = new TextMessage (); text.setContent ("0755-86671980"); text.settousername (fromusername); text.setFromusername (Tousername); text.setCreateTime (tanggal baru (). getTime () + ""); text.setMsgType (messageutil.resp_message_type_text); respMessage = messageutil.textmessageToxMl (teks); }}}} catch (Exception e) {logger.error ("error ...")} return respMessage; }Kode diposting seperti di atas. Kebanyakan dari mereka memiliki komentar. Jika Anda membaca semantik dasar sekali, Anda tidak perlu menjelaskannya.
Ada satu tempat yang membutuhkan perhatian khusus:
Warna merah dari nama dan nama cerita merah justru sebaliknya, yang juga merupakan salah satu jebakan. Saya ingat bahwa saya telah menyesuaikannya untuk waktu yang lama, tetapi itu bukan masalah, tetapi itu tidak berhasil. Akhirnya, saya menerima pesan setelah mengubah keduanya! Bahkan, benar untuk memikirkannya. Saat Anda kembali ke server WeChat, peran Anda akan berubah, sehingga pengirim dan penerima jelas sebaliknya.
5.Messageutil
Public Class MessageUtil { / *** Return Message Type: Text* / Public Static Final String resp_message_type_text = "text"; / *** Jenis Pesan Pengembalian: Musik*/ String akhir statis public resp_message_type_music = "musik"; / *** Kembalikan Jenis Pesan: Teks Grafis*/ String Akhir Statis Public Resp_Message_Type_News = "News"; / *** Permintaan Jenis Pesan: Teks*/ String akhir statis public req_message_type_text = "text"; / *** Permintaan Jenis Pesan: Gambar*/ String Akhir Statis Public Req_Message_Type_Image = "Image"; / *** Permintaan Jenis Pesan: Tautan*/ String Akhir Statis Public Req_Message_Type_link = "tautan"; / *** Permintaan Pesan Jenis: Lokasi Geografis*/ String Akhir Statis Publik Req_Message_Type_location = "Lokasi"; / *** Permintaan Jenis Pesan: Audio*/ String Akhir Statis Public Req_Message_Type_Voice = "Voice"; / ** * Permintaan Jenis Pesan: Push */ String Akhir Statis Publik Req_Message_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"; }Di sini, untuk membuat keterbacaan program dan skalabilitas lebih baik, saya telah membuat beberapa enkapsulasi, mendefinisikan beberapa konstanta, dan merangkum beberapa parameter yang ditularkan dari WeChat ke dalam objek persisten Java Bean. Kode inti seperti di atas. Fokus pada konversi antara XML dan peta
Bahkan, masalah ini disebabkan oleh WeChat menggunakan komunikasi XML, dan kami biasanya menggunakan JSON, jadi kami mungkin merasa sedikit tidak nyaman dalam waktu singkat.
1. Paket Jar
<!-Parse xml-> <dependency> <GroupId> dom4j </proupid> <ArTifactId> dom4j </stifactid> <version> 1.6.1 </version> </dependency> <sependency> </ArtIctid </Version> </versi </groupid> <T ArtifacTid> </Artictid </Version.9.4.4.4.4.4.
2.xml untuk memetakan objek koleksi
/ ** * xml ke peta * @param permintaan * @return * @throws IoException */ @suppressWarnings ("Uncecked") public peta statis <string, string> xmltoMap (httpservletRequest request) (string>) (peta <string, string> map = new hashmap <in Saxreader Reader = SaxReader baru (); InputStream INS = NULL; coba {INS = request.getInputStream (); } catch (ioException e1) {e1.printstacktrace (); } Dokumen dok = null; coba {doc = reader.read (INS); Elemen root = doc.getrooteLement (); Daftar <sement> daftar = root.elements (); untuk (elemen e: daftar) {map.put (e.getname (), e.getText ()); } return peta; } catch (DocumentException E1) {E1.PrintStackTrace (); } akhirnya {ins.close (); } return null; } 3. Konversi objek pesan teks ke xml
/ ** * Konversi objek pesan teks ke xml * * @param TextMessage Objek pesan teks * @return xml */ public string statis TextMessAgetoxMl (TextMessage TextMessage) {xStream xStream = new xStream (); xstream.alias ("xml", textmessage.getClass ()); return xstream.toxml (TextMessage); } Sejauh ini, pekerjaan telah selesai. Saat ini, Anda dapat mencoba mengirim "tes" di akun resmi. Anda akan menerima balasan wechat "Teks adalah tes". Ini juga proses balasan yang dibuat dalam kode di atas. Tentu saja, Anda juga dapat menggunakan imajinasi Anda untuk melakukan semua yang ingin Anda lakukan, seperti membalas 1 periksa cuaca, 2 memeriksa pelanggaran, dll ....
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.