Pertama -tama, mode pengembangan akun perusahaan WeChat dibagi menjadi: mode pengeditan (mode normal) dan mode pengembangan (mode panggilan balik) . Dalam mode pengeditan, Anda hanya dapat membuat menu khusus sederhana dan secara otomatis membalas pesan. Untuk mewujudkan fungsi lain, Anda harus menyalakan mode pengembang.
1. Mode Pengeditan dan Mode Pengembangan untuk Memproses Pesan
1. Dalam mode Edit, semua proses bisnis dikonfigurasi pada server WeChat dan diproses olehnya.
2. Mode pengembangan, pesan diproses melalui server pihak ketiga, dan akhirnya pesan dikirim ke pengguna melalui server WeChat.
Mode pengembangan dapat memproses lebih banyak pesan daripada mode edit, sehingga Anda harus terlebih dahulu mengaktifkan mode pengembangan untuk mengembangkan lebih banyak fungsi.
2. Model pengembangan dimulai
Dalam mode panggilan balik, perusahaan tidak hanya dapat secara aktif memanggil antarmuka nomor perusahaan, tetapi juga menerima pesan atau acara dari pengguna. Informasi yang diterima dikodekan dalam format data XML, UTF8, dan dienkripsi dalam AES .
1. Setelah menyalakan mode panggilan balik, parameter harus dikonfigurasi sebagai berikut:
URL adalah servlet yang akan diakses, dan token dan encodingaeskey diperoleh secara acak, tetapi harus konsisten dengan proyek.
2. Verifikasi validitas URL
Saat Anda mengirimkan informasi di atas, nomor perusahaan akan mengirim permintaan GET ke URL yang diisi. Permintaan GET membawa empat parameter. Perusahaan perlu melakukan pemrosesan Urldecode saat mendapatkannya , jika tidak verifikasi tidak akan berhasil.
3. Kode
Kelas CoreserVlet1
coreserver kelas publik1 memperluas httpservlet {private static final long serialversionuid = 4440739483644821986L; String stoken = "weixincourse"; String scorpid = "wxe510946434680dab"; String sencodingaeskey = "djlyzxgkiwresiw2vnv9dsr7hss7uswdfnwa8q1ove1"; public void doGet (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {wxbizmsgcrypt wxcpt; coba {wxcpt = wxbizmsgcrypt baru (stoken, sencodingaeskey, scorpid); String sverifymsgsig = request.getParameter ("msg_signature"); String sverifyTimestamp = request.getParameter ("timestamp"); String sverifynonce = request.getParameter ("nonce"); String sverifyChoStr = request.getParameter ("echoStr"); String sechostr; sechoStr = wxcpt.verifyurl (sverifymsgsig, sverifyTimestamp, sverifynonce, sverifyechoStr); System.out.println ("VerifyURL Echostr:" + sechostr); Printwriter out = response.getWriter (); out.print (sechostr); out.close (); keluar = null; } catch (aesException e1) {e1.printstacktrace (); }}} Peralatan:
/*** Kode sampel untuk mengenkripsi dan mendekripsi pesan yang dikirim ke akun publik oleh platform publik. * * @copyright Hak Cipta (C) 1998-2014 Tencent Inc. * /// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- com com.weixin.mp.aes; import java.nio.charset.charset; import java.util.arrays; import java.util.random; javax.crypto.cipher; import javax.crypto.spec.ivparameterspec; impor javax.crypto.spec.ivparameterspec; impor javax.crypto org.apache.commons.codec.binary.base64;/*** Menyediakan antarmuka enkripsi dan dekripsi (string encoded UTF8) untuk menerima dan mendorong pesan ke platform publik. * <Ol> * <li> Balas pihak ketiga ke pesan yang dienkripsi ke platform publik </li> * <li> Pihak ketiga menerima pesan yang dikirim oleh platform publik untuk memverifikasi keamanan pesan dan mendekripsi pesan. </li> * </ol> * Deskripsi: Pengecualian java.security.invalidKeyException: Solusi untuk ukuran kunci ilegal * <Ol> * <li> Unduh file kebijakan izin tak terbatas JCE di situs web resmi (alamat unduhan JDK7: * http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html </li> * <li> Decompress Setelah mengunduh, Anda dapat melihat local_policy. Direktori %JRE_HOME/LIB/Security untuk menimpa file asli </li> * <li> Jika JDK diinstal, letakkan dua file jar dalam %JDK_HOME %/JRE/LIB/Security Directory untuk menimpa "charset-charset {stouct {stoucson {oPornson {sto. Base64 Base64 = New Base64 (); Pengecualian */ public wxbizmsgcrypt (token string, string encodingaeskey, string corpid) melempar aesException {if (encodingaeskey.length ()! = 43) {lempar AESException baru (AesException.illegalaeskey); } this.token = token; this.corpid = corpid; aeskey = base64.decodebase64 (encodingaeskey + "="); } /*** mendekripsi ciphertext. ** @param Text Ciphertext yang perlu didekripsi* @return Plaintext yang diperoleh dengan dekripsi* @throws AesException AES gagal mendekripsi*/ string decrypt (Teks String) melempar AesException {byte [] asli; coba {// atur mode dekripsi ke mode cbc cbc cipher cipher = cipher.getInstance ("aes/cbc/nopadding"); SecretKeySpec key_spec = SecretKeyspec baru (Aeskey, "AES"); Ivparameterspec iv = ivparameterspec baru (arrays.copyofrange (Aeskey, 0, 16)); cipher.init (cipher.decrypt_mode, key_spec, iv); // Gunakan base64 untuk mendekode byte ciphertext [] dienkripsi = base64.decodebase64 (teks); // dekripsi asli = cipher.dofinal (dienkripsi); } catch (Exception e) {E.PrintStackTrace (); Lempar Aesexception baru (AesException.DecryPtaesError); } String xmlcontent, from_corpid; coba {// hapus byte karakter komplemen [] bytes = pkcs7encoder.decode (asli); // Pisahkan string acak 16-bit, endianness jaringan dan byte corpid [] networkorder = arrays.copyofrange (byte, 16, 20); int xmllength = RecoverVerTworkByTesOrder (NetworkOrder); xmlcontent = string baru (arrays.copyofrange (byte, 20, 20 + xmllength), charset); from_corpid = string baru (arrays.copyofrange (bytes, 20 + xmllength, bytes.length), charset); } catch (Exception e) {E.PrintStackTrace (); Lempar Aesexception baru (aesexception.illegalbuffer); } // case di mana corpid berbeda jika (! from_corpid.equals (corpid)) {lempar aesexception baru (aesexception.validateCorpideRor); } return xmlcontent; } /** * Verifikasi URL * @param msgSignature Signature String, sesuai dengan parameter URL msg_signature * @param timestamp camp, sesuai dengan timestamp * @param nonce random string @parry @@parry @@parry @parry @parry @parry @parry @parry @parry @parry @parry @parry @parrys, Eksekusi AesException gagal, silakan periksa kode kesalahan dan informasi kesalahan spesifik dari pengecualian */ public string verifyUrl (string msgSignature, string timestamp, string nonce, string echoStr) melempar aesException {string Signature = sha1.getsha1 (token, stempel, nonce, echostr); if (! Signature.equals (msgSignature)) {lempar aesException baru (aesexception.validateSignateError); } String result = decrypt (echoStr); hasil pengembalian; }} /*** Kode sampel untuk mengenkripsi dan mendekripsi pesan yang dikirim ke akun publik oleh platform publik. * * @copyright Hak Cipta (C) 1998-2014 Tencent Inc. * /// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @param encrypt ciphertext* @return Secure signature* @throws AesException */ public static String getSHA1(String token, String timestamp, String nonce, String encrypt) throws AesException { try { String[] array = new String[] { token, timestamp, nonce, encrypt }; StringBuffer SB = StringBuffer baru (); // string sortir arrays.sort (array); untuk (int i = 0; i <4; i ++) {sb.append (array [i]); } String str = sb.toString (); // sha1 tanda tangan generasi pesan md = messageDigest.getInstance ("sha-1"); md.update (str.getbytes ()); byte [] digest = md.digest (); StringBuffer hexstr = new StringBuffer (); String shahex = ""; untuk (int i = 0; i <digest.length; i ++) {shahex = integer.tohexString (digest [i] & 0xff); if (shahex.length () <2) {hexstr.append (0); } hexstr.append (shahex); } return hexstr.toString (); } catch (Exception e) {E.PrintStackTrace (); Lempar Aesexception baru (aesexception.ComputesignateureError); }}} kelas pkcs7encoder {static charset charset = charset.forname ("UTF-8"); static int block_size = 32;/ *** Hapus karakter komplemen dari plaintext decrypted** @param mendekripsi plaintext decrypted* @Return Plaintext setelah menghapus karakter pengisian*/ byte statis [] decode (decryped -1 decrypted) {int pad = (int) decrypted [decryped [decryplay. if (pad <1 || pad> 32) {pad = 0; } return arrays.copyofrange (didekripsi, 0, decrypted.length - pad); }} 3. Ringkasan
Perusahaan memverifikasi permintaan melalui parameter msg_signature. Jika dikonfirmasi bahwa permintaan GET berasal dari nomor perusahaan, maka aplikasi perusahaan mendekripsi parameter echostr dan mengembalikan Echostr Plaintext seperti (dikutip tidak dapat ditambahkan), maka verifikasi akses mulai berlaku dan mode panggilan balik dapat diaktifkan. Setelah menyala, beberapa fungsi akan diimplementasikan satu demi satu, jadi tetaplah disini!
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.