بادئ ذي بدء ، يتم تقسيم وضع تطوير حسابات WeChat Enterprise إلى: وضع التحرير (الوضع العادي) ووضع التطوير (وضع رد الاتصال) . في وضع التحرير ، يمكنك فقط عمل قوائم مخصصة بسيطة والرد تلقائيًا على الرسائل. لتحقيق وظائف أخرى ، يجب عليك تشغيل وضع المطور.
1. وضع التحرير ووضع التطوير لمعالجة الرسائل
1. في وضع التحرير ، يتم تكوين جميع عمليات الأعمال على خادم WeChat ومعالجته به.
2. وضع التطوير ، تتم معالجة الرسائل من خلال خوادم الطرف الثالث ، وأخيراً يتم إرسال الرسائل إلى المستخدمين من خلال خوادم WeChat.
يمكن أن يعالج وضع التطوير رسائل أكثر من وضع التحرير ، لذلك يجب عليك أولاً تمكين وضع التطوير لتطوير المزيد من الوظائف.
2. بدأ نموذج التطوير
في وضع رد الاتصال ، لا يمكن للمؤسسات استدعاء واجهة رقم المؤسسة بنشاط فحسب ، بل يمكنها أيضًا تلقي الرسائل أو الأحداث من المستخدمين. يتم ترميز المعلومات المستلمة بتنسيق بيانات XML ، UTF8 ، ومشفر في AES .
1. بعد تشغيل وضع رد الاتصال ، يجب تكوين المعلمات على النحو التالي:
عنوان URL هو Servlet الذي سيتم الوصول إليه ، ويتم الحصول على الرمز المميز و encodingaeskey بشكل عشوائي ، ولكن يجب أن يكون متسقًا مع المشروع.
2. تحقق من صحة عنوان URL
عند إرسال المعلومات أعلاه ، سيرسل رقم المؤسسة طلب الحصول على عنوان URL المملوء. يحمل طلب الحصول على أربعة معلمات. تحتاج المؤسسة إلى إجراء معالجة urldecode عند الحصول عليها ، وإلا فلن يكون التحقق ناجحًا.
3. الكود
Coreservlet1 فئة
يمتد CoreServlet1 من الفئة العامة httpservlet {Private Static Final Long SerialVersionuid = 4440739483644821986L ؛ String Stoken = "Weixincourse" ؛ String Scorpid = "WXE510946434680DAB" ؛ String sencodingaeskey = "djlyzxgkiwresiw2vnv9dsr7hss7uswdfnwa8q1ove1" ؛ DOGED void public (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servleTexception ، ioException {wxbizmsgcrypt wxcpt ؛ حاول {wxcpt = new wxbizmsgcrypt (Stoken ، Sencodingaeskey ، Scorpid) ؛ SverifyMsgSig = request.getParameter ("msg_signature") ؛ String SverifyTimestamp = request.getParameter ("Timestamp") ؛ String sverifynonce = request.getParameter ("nonce") ؛ String SverifyeChoStr = request.getParameter ("echosttr") ؛ سلسلة sechostr. SECHOSTR = WXCPT.VERifyUrl (SverifyMSGSIG ، SverifyTimestamp ، SverifyNonce ، SverifyeChoStr) ؛ System.out.println ("VerifyUrl echosttr:" + sechoStr) ؛ printWriter out = response.getWriter () ؛ out.print (sechostr) ؛ out.close () ؛ خارج = فارغ ؛ } catch (aesexception e1) {e1.printStackTrace () ؛ }}} أدوات:
/*** نموذج رمز لتشفير الرسائل وفك تشفيرها إلى الحسابات العامة من قبل المنصات العامة. * * copyright حقوق الطبع والنشر (C) 1998-2014 Tencent Inc. * /// ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- com.qq.weixin.mp.aes ؛ استيراد java.nio.charset.charset ؛ استيراد java.util.arrays ؛ استيراد java.util.random ؛ استيراد javax.crypto.cipher Org.apache.commons.codec.binary.base64 ؛/*** يوفر واجهة تشفير وفك التشفير (سلسلة utf8 المشفرة) لاستلام الرسائل ودفعها إلى النظام الأساسي العام. * <ol> * <li> رد الطرف الثالث على الرسائل المشفرة على النظام الأساسي العام </li> * <li> يتلقى الطرف الثالث رسائل تم إرسالها بواسطة النظام الأساسي العام للتحقق من أمان الرسائل وفك تشفير الرسائل. </li> * </ol> * الوصف: استثناء java.security.invalidKeyexception: حل لحجم المفتاح غير القانوني * <ol> * <li> تنزيل ملف سياسة JCE Unlimited على الموقع الرسمي (عنوان تنزيل JDK7: * http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html </li> * <li> قم بإلغاء الضغط بعد التنزيل ، يمكنك رؤية JORING jar ، us_export_policy.jar و readme. ٪ JRE_HOME ٪/LIB/دليل الأمان في الكتابة فوق الملف الأصلي </li> * <li> إذا تم تثبيت JDK ، فضع ملفان اثنين في ٪ JDK_HOME ٪/JRE/LIB/Security CHARSETARENTARENAME (charset) BASE64 BASE64 = BASE64 () الاستثناء */ public wxbizmsgcrypt (رمز السلسلة ، سلسلة isrodingaeskey ، سلسلة string) يلقي aesexception {if (encodingaeSkey.length ()! = 43) {رمي aesexception جديد (aesexception.ilegalaeskey) ؛ } this.token = token ؛ this.corpid = corpid ؛ AESKEY = BASE64.DECODEBASE64 (ENCODINGAESKEY + "=") ؛ } /*** فك تشفير النص المشفر. ** @param النص The CipherText الذي يحتاج إلى فك تشفير* @Return النص العادي الذي تم الحصول عليه بواسطة decryption* throws aesexception فشل AES في فك تشفير*/ سلسلة decrypt (سلسلة سلسلة) يلقي aesexception {byte [] الأصلي ؛ حاول {// تعيين وضع decryption إلى AES CBC Mode Cipher Cipher = cipher.getInstance ("AES/CBC/Nopadding") ؛ SecretKeySpec key_spec = new SecretKeySpec (Aeskey ، "AES") ؛ Ivparameterspec IV = New Ivparameterspec (Arrays.Copyofrange (Aeskey ، 0 ، 16)) ؛ cipher.init (cipher.decrypt_mode ، key_spec ، iv) ؛ // استخدم BASE64 لفك تشفير BYTE -Ciphertext [] مشفر = base64.DecodeBase64 (TEXT) ؛ // decrypt Original = cipher.dofinal (مشفرة) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ رمي aesexception جديدة (aesexception.decryptaEserror) ؛ } string xmlcontent ، from_corpid ؛ حاول {// إزالة البايت الحرف المكملة [] bytes = pkcs7encoder.decode (Original) ؛ // سلاسل عشوائية منفصلة 16 بت ، إنديانس الشبكة و byte [] networkorder = arrays.copyofrange (بايت ، 16 ، 20) ؛ int xmllength = RecoverNetworkBytesorder (Networkorder) ؛ XmlContent = new String (Arrays.copyofrange (Bytes ، 20 ، 20 + Xmllength) ، charset) ؛ from_corpid = new string (arrays.copyofrange (bytes ، 20 + xmllength ، bytes.length) ، charset) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ رمي aesexception جديد (aesexception.illegalbuffer) ؛ } // CASE حيث تختلف corpid إذا (! from_corpid.equals (corpid)) {رمي aesexception جديد (aesexception.validateCorpiderror) ؛ } إرجاع xmlContent ؛ } /** * تحقق من url * param msgsignature سلسلة توقيع ، المقابلة لمعلمات url msg_signature * param timestamp timestamp ، المقابلة لبرامج url timestamp * @param غير عشوائي ، @ @trl echanttr echoStr echoStr echoStr فشل تنفيذ AESException ، يرجى التحقق من رمز الخطأ ومعلومات خطأ محددة من الاستثناء */ السلسلة العامة VERIFYURL (String msgSignature ، Triter Timestamp ، String nonce ، string echoStr) يلقي Aesexception {String signatured = sha1.getsha1 (الرمز المميز ، الزاوية الزمنية ، nonce ، echosttr) ؛ if (! signature.equals (msgSignature)) {رمي aesexception جديد (aesexception.validatesIgnatureRor) ؛ } النتيجة السلسلة = decrypt (echoStr) ؛ نتيجة العودة }} /*** نموذج رمز لتشفير الرسائل المرسلة إلى حسابات عامة من قبل منصات عامة. * * copyright حقوق الطبع والنشر (C) 1998-2014 Tencent Inc. * /// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Param Encrypt CipherText* @REGRINT Secure Signature* Throws Aesexception*/ public Static String getSha1 (سلسلة الرمز المميز للسلسلة ، الطابع الزمني للسلسلة ، السلسلة nonce ، string encrypt) يلقي aesexception {try {string [] array = new string [] {token ، timestamp ، nonce ، encrypt} ؛ StringBuffer SB = New StringBuffer () ؛ // String sort arrays.sort (Array) ؛ لـ (int i = 0 ؛ i <4 ؛ i ++) {sb.append (array [i]) ؛ } string str = sb.toString () ؛ // SHA1 Signature Generation messagedigest md = messagedigest.getInstance ("sha-1") ؛ md.update (str.getBytes ()) ؛ byte [] digest = md.digest () ؛ StringBuffer Hexstr = جديد StringBuffer () ؛ سلسلة shahex = "" ؛ لـ (int i = 0 ؛ i <digest.length ؛ i ++) {shahex = integer.toHexString (digest [i] & 0xff) ؛ if (shahex.length () <2) {hexstr.append (0) ؛ } hexstr.append (shahex) ؛ } إرجاع hexstr.toString () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ رمي aesexception جديد (aesexception.computesignatureRor) ؛ }}} class pkcs7encoder {static charset charset = charset.forname ("utf-8") ؛ static int block_size = 32 ؛/ *** حذف الحرف المكملة للنص العادي declypted** param فك تشفير النص العادي decrypted* @return بعد حذف حرف التعبئة*/ static byte [] decode (byte [] decrypted) {int pad = (int) decrypteded. if (pad <1 || pad> 32) {pad = 0 ؛ } return arrays.copyofrange (declypted ، 0 ، decrypted.length - pad) ؛ }} 3. ملخص
يتحقق المؤسسة من الطلب من خلال المعلمة msg_signature. إذا تم التأكيد على أن طلب GET هو من رقم المؤسسة ، فإن تطبيق Enterprise يفكك معلمة EchoStr وإرجاع نص Echosttr ClainteTs كما هو (لا يمكن إضافته) ، فإن التحقق من الوصول يمكن أن يكون مفعولًا ويمكن تمكين وضع الاتصال. بعد التشغيل ، سيتم تنفيذ بعض الوظائف واحدة تلو الأخرى ، لذلك ترقبوا!
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.