Saya telah sibuk dengan waktu front-end untuk sementara waktu. Saya telah membaca dokumen dari awal dan telah menginjak banyak jebakan. Saya telah melewatinya baru -baru ini. Saya telah mempertimbangkan untuk membuat beberapa ringkasan sehingga saya dapat meninjaunya di masa depan ketika saya mengembangkannya. Saya juga akan memberikan referensi kepada siswa yang sedang mengerjakan proyek terkait.
Bahkan, setelah melakukannya sekali, Anda akan menemukan bahwa itu tidak sulit. Gagasan umum adalah: pesan pengguna dan dorongan acara yang diperlukan oleh pengembang akan memulai permintaan melalui server WeChat dan meneruskannya 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 akan menyambungkan token yang dikonfigurasi oleh platform publik dan timestamp yang diunggah. Nonce akan dienkripsi di SHA1 dan cocok dengan tanda tangan. Kembalikan Ture untuk menunjukkan bahwa akses berhasil.
1. Konfigurasi platform publik
2.Controller
@Controller@requestMapping ("/weChat") publicclass wechatcontroller {@value ("$ {dnbx_token}") string pribadi dnbx_token; private static final Logger = loggerFactory.getLogger (weChatController.class);@resourceCerserve.getLogger (weChatController.class);@ResourceCerserve. @return * @throws IoException */ @requestMapping (value = "/connect", method = {requestMethod.get, requestMethod.post}) @responseBodypublicVoid connectweixin (httpservlequest, httpservletResponse response) lemparan ioException {httpservlets response) request.setcharacterencoding ("UTF-8"); // Server WeChat menggunakan pengkodean UTF-8 ketika pesan posting, dan pengkodean yang sama harus digunakan saat menerima, jika tidak kode yang kacau Cina akan menjadi kode yang 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"); // Timestamp String nonce = request.getParameter ("nonce");////// timestamp string nonce = request.getParameter ("nonce");////// timestamp string nonce = eceran.getParameter ("nonce");///// timestamp string eche = echosparameter ("nonCE");// RANCERECE request.getParameter ("echostr"); // string acak // periksa permintaan dengan memeriksa 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 = "Exception message! ";try {respMessage = wechatService.weixinPost(request);out.write(respMessage);LOGGER.info("The request completed successfully");LOGGER.info("to weixin server "+respMessage);} catch (Exception e) {LOGGER.error("Failed to convert the message from 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, requestMap = messageutil.xmltoMap (request); // akun sender (OpenEneMap = extryuTil) fromusMltoMap (request);//sender reruntuhan (OpenEname) dari Account (REKRICE) DARI) DARI (REKAD); requestMap.get("FromUserName");// Public account String toUserName = requestMap.get("ToUserName");// Message type String msgType = requestMap.get("MsgType");// Message content String content = requestMap.get("Content");LOGGER.info("FromUserName is:" + fromUserName + ", ToUserName is:" + toUserName + ", MsgType adalah: " + msgType); // pesan teks if (msgtype.equals (messageutil.req_message_type_text)) {// logika yang sesuai dijalankan sesuai dengan kata kunci. Hanya ada satu yang tidak bisa Anda bayangkan. There is no such thing as you can't do if(content.equals("xxx")){}//Automatic reply TextMessage text = new TextMessage();text.setContent("the text is" + content);text.setToUserName(fromUserName);text.setFromUserName(toUserName);text.setCreateTime(new Date().getTime() + ""); text.setMsgType (msgType); respMessage = messageutil.textmessageToxMl (text);}/*else if (msgtype.equals (messageutil.req_message_type_event)) {// event string eventtype = requestMap.get ("event"); (eventType.equals (messageutil.event_type_subscribe)) {// Berlangganan respContent = "Selamat datang untuk mengikuti akun resmi XXX!"; return messageresponse.gettextMessage (evel eventUntye.Eving event -evenponse); eventsype/ eventsypon); eventsype (eventsypeile.Eval event -even (evestype. eventsye); RequestMap.get ("EventKey"); // Nilai Kunci Acara, sesuai dengan nilai kunci yang ditentukan saat membuat menu kustom Logger.info ("EventKey adalah:" +EventKey); return xxx;}} // Nyalakan uji pengenalan suara WeChat 2015-3-3-3- requestMap.get ("pengakuan"); // respContent = "Hasil analisis wicara yang diterima:"+RecvMessage; if(recvMessage!=null){respContent = TulingApiProcess.getTulingResult(recvMessage);}else{respContent = "What you said is too vague, can you say it again? ";}return MessageResponse.getTextMessage(fromUserName , toUserName , respContent); } // Fungsi Fotografi Lain if (msgtype.equals ("pic_sysphoto")) {} else {return messageresponse.gettextMessage (fromusername, Tousername, "return old empt"); }*// 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("Welcome to follow, xxx "); text.settouserName (fromusername); text.setFromusername (Tousername); text.setCreateTime (tanggal baru (). getTime () +" "); text.setmsgType (afterresp_message_type_text); respMessage = messageutil.tever.tible. Pengguna tidak dapat menerima pesan yang dikirim oleh akun resmi, jadi tidak perlu membalas pesan lain jika (eventType.equals (messageutil.event_type_unsubscribe)) {// berhenti berlangganan} // menu kustom klik event evening (eventType.equals (messageutil.event_type_click)) event eventkey = paysyping (eventtye (messageutil. ditentukan saat membuat menu kustom if (eventkey.equals ("customer_telephone")) {textMessage text = new TextMessage (); text.setContent ("0755-86671980"); text.settouserName (fromusername); text.setFromusername (Tousername); ""); 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.
Ide singkat: Ketika pengguna mengirim pesan ke akun resmi, server WeChat akan meminta pesan pengguna melalui posting ke antarmuka yang sesuai dari server yang kami konfigurasi dalam format XML. 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 kemudian menyampaikannya kepada pengguna.
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 convert to map* @param request* @return* @throws IOException*/@SuppressWarnings("unchecked")public static Map<String, String> xmlToMap(HttpServletRequest request) throws IOException{Map<String, String> map = new HashMap<String, String>();SAXReader reader = new SAXREADER (); InputStream INS = NULL; coba {INS = Request.GetInputStream ();} catch (ioException e1) {e1.printStackTrace ();} dokumen doc = null; coba {doc = reader.read (ins); element root = doc.getrootelement (); list {doc = reader. {map.put (e.getName (), e.getText ());} return map;} 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.get (); xstream.alias ("xml", textmessage.get (); xstream.alias ("xml", textmessage.get (); xStream.Di atas adalah pengantar editor untuk Java untuk mengimplementasikan akses springmvc weChat dan menerapkan fungsi balasan otomatis sederhana. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!