ก่อนอื่นโหมดการพัฒนาของบัญชี WeChat Enterprise แบ่งออกเป็น: โหมดการแก้ไข (โหมดปกติ) และ โหมดการพัฒนา (โหมดการโทรกลับ) ในโหมดแก้ไขคุณสามารถสร้างเมนูแบบกำหนดเองได้อย่างง่ายและตอบกลับข้อความโดยอัตโนมัติ ในการตระหนักถึงฟังก์ชั่นอื่น ๆ คุณต้องเปิดโหมดนักพัฒนา
1. โหมดการแก้ไขและโหมดการพัฒนาเพื่อประมวลผลข้อความ
1. ในโหมดแก้ไขกระบวนการทางธุรกิจทั้งหมดได้รับการกำหนดค่าบนเซิร์ฟเวอร์ WeChat และประมวลผลโดยมัน
2. โหมดการพัฒนาข้อความจะถูกประมวลผลผ่านเซิร์ฟเวอร์ของบุคคลที่สามและในที่สุดข้อความจะถูกส่งไปยังผู้ใช้ผ่านเซิร์ฟเวอร์ WeChat
โหมดการพัฒนาสามารถประมวลผลข้อความได้มากกว่าโหมดแก้ไขดังนั้นคุณต้องเปิดใช้งานโหมดการพัฒนาเพื่อพัฒนาฟังก์ชั่นเพิ่มเติม
2. รูปแบบการพัฒนาเริ่มต้นขึ้น
ในโหมดการโทรกลับองค์กรไม่เพียง แต่เรียกใช้อินเทอร์เฟซหมายเลของค์กร แต่ยังได้รับข้อความหรือเหตุการณ์จากผู้ใช้ ข้อมูลที่ได้รับจะถูกเข้ารหัสในรูปแบบข้อมูล XML, UTF8 และเข้ารหัสใน AES
1. หลังจากเปิดโหมดการโทรกลับพารามิเตอร์จะต้องกำหนดค่าดังนี้:
URL คือ servlet ที่จะเข้าถึงและโทเค็นและ encodingaeskey ได้รับแบบสุ่ม แต่ต้องสอดคล้องกับโครงการ
2. ตรวจสอบความถูกต้องของ URL
เมื่อคุณส่งข้อมูลข้างต้นหมายเลของค์กรจะส่งคำขอ GET ไปยัง URL ที่เติมเต็ม คำขอรับมีพารามิเตอร์สี่ตัว องค์กรจำเป็นต้องทำการประมวลผล UrldeCode เมื่อได้รับ มิฉะนั้นการตรวจสอบจะไม่สำเร็จ
3. รหัส
คลาส Coreservlet1
คลาสสาธารณะ CORESERVLET1 ขยาย HTTPSERVLET {ส่วนตัวคงที่สุดท้าย Long SerialVersionUID = 4440739483644821986L; String stoken = "Weixincourse"; String scorpid = "WXE510946434680DAB"; String sencodingaeskey = "djlyzxgkiwresiw2vnv9dsr7hss7uswdfnwa8q1ove1"; โมฆะสาธารณะ DOGET (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {wxbizmsgcrypt wxcpt; ลอง {WXCPT = ใหม่ wxBizMsGCrypt (Stoken, SencodaSkey, Scorpid); String sverifymsgsig = request.getParameter ("msg_signature"); String sverifyTimestamp = request.getParameter ("timestamp"); String sverifyNonce = request.getParameter ("nonce"); String sverifyechostr = request.getParameter ("echosttr"); Sechostr String; SECHOSTR = WXCPT.VERIFYURL (SVERIFYMSGSIG, SVERIFYTIMESTAMP, SVERIFYNONCE, SVERITYECHOSTR); System.out.println ("Verifyurl echosttr:" + sechostr); PrintWriter out = response.getWriter (); out.print (sechosttr); out.close (); ออก = null; } catch (aesexception e1) {e1.printstacktrace (); - เครื่องมือ:
/*** รหัสตัวอย่างสำหรับการเข้ารหัสและถอดรหัสข้อความที่ส่งไปยังบัญชีสาธารณะโดยแพลตฟอร์มสาธารณะ * * @Copyright Copyright (c) 1998-2014 Tencent Inc. * /// - com.qq.weixin.mp.aes; นำเข้า java.nio.charset.charset; นำเข้า java.util.arrays; นำเข้า java.util.random; นำเข้า Javax.crypto.cipher; นำเข้า Javax.crypto.spec.ivaparameterspec; org.apache.commons.codec.binary.base64;/*** จัดเตรียมอินเทอร์เฟซการเข้ารหัสและถอดรหัส (สตริงที่เข้ารหัส UTF8) สำหรับการรับและผลักข้อความไปยังแพลตฟอร์มสาธารณะ * <ol> * <li> การตอบกลับของบุคคลที่สามเพื่อส่งข้อความที่เข้ารหัสไปยังแพลตฟอร์มสาธารณะ </li> * <li> บุคคลที่สามได้รับข้อความที่ส่งโดยแพลตฟอร์มสาธารณะเพื่อตรวจสอบความปลอดภัยของข้อความและถอดรหัสข้อความ </li> * </ol> * คำอธิบาย: ข้อยกเว้น java.security.invalidKeyException: การแก้ปัญหาขนาดคีย์ที่ผิดกฎหมาย * <ol> * <li> ดาวน์โหลดไฟล์นโยบายการอนุญาต JCE ไม่ จำกัด บนเว็บไซต์ทางการ (ที่อยู่ดาวน์โหลดของ JDK7: * http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html </li> * <li> decompress หลังจากการดาวน์โหลดคุณสามารถดู local_policy.jar, us_expolicy.jar ไดเรกทอรี %jre_home %/lib/ความปลอดภัยเพื่อเขียนทับไฟล์ต้นฉบับ </li> * <li> หากติดตั้ง JDK ให้วางไฟล์ JAR สองไฟล์ใน %JDK_HOME %/JRE/LIB/Security Directory เพื่อเขียนไฟล์ต้นฉบับ Base64 Base64 = ใหม่ Base64 (); รหัสข้อผิดพลาดและข้อมูลข้อผิดพลาดเฉพาะของข้อยกเว้น */ สาธารณะ wxBizMSGCrypt (โทเค็นสตริง, สตริง encodingaeskey, สตริง corpid) พ่น Aesexception {ถ้า (encodingaeskey.length ()! = 43) {โยน aesexception ใหม่ (aesexception.illegalaeskey); } this.token = token; this.corpid = corpid; aeskey = base64.decodeBase64 (encodingaeskey + "="); } /*** ถอดรหัส ciphertext ** @param text ciphertext ที่ต้องถอดรหัส* @@return plaintext ที่ได้รับจากการถอดรหัส* @throws aesexception aes ล้มเหลวในการถอดรหัส*/ string decrypt (ข้อความสตริง) พ่น Aesexception {byte [] ต้นฉบับ; ลอง {// ตั้งค่าโหมดการถอดรหัสเป็น AES CBC Mode Cipher Cipher = Cipher.GetInstance ("AES/CBC/Nopadding"); SecretKeySpec key_spec = ใหม่ SecretKeySpec (Aeskey, "AES"); ivParameterspec IV = ใหม่ ivparameterspec (arrays.copyofrange (aeskey, 0, 16)); cipher.init (cipher.decrypt_mode, key_spec, iv); // ใช้ base64 เพื่อถอดรหัส ciphertext byte [] encrypted = base64.decodeBase64 (ข้อความ); // DECRYPT Original = cipher.dofinal (เข้ารหัส); } catch (exception e) {e.printstacktrace (); โยน Aesexception ใหม่ (aesexception.decryptaeserror); } สตริง xmlcontent, from_corpid; ลอง {// ลบอักขระส่วนประกอบไบต์ [] bytes = pkcs7encoder.decode (ต้นฉบับ); // แยกสายสุ่ม 16 บิต, เครือข่าย endianness และ corpid byte [] networkorder = arrays.copyofrange (ไบต์, 16, 20); int xmllength = dearchNetWorkByTesOrder (NetworkOrder); XMLCONTENT = สตริงใหม่ (array.CopyOfRange (ไบต์, 20, 20 + xmllength), charset); from_corpid = สตริงใหม่ (arrays.copyofrange (ไบต์, 20 + xmllength, bytes.length), charset); } catch (exception e) {e.printstacktrace (); โยน Aesexception ใหม่ (aesexception.illegalbuffer); } // กรณีที่ corpid แตกต่างกันถ้า (! from_corpid.equals (corpid)) {โยน aesexception ใหม่ (aesexception.validatecorpiderror); } ส่งคืน xmlcontent; } /** * ตรวจสอบ url * @param msgsignature signature string, สอดคล้องกับพารามิเตอร์ URL msg_signature * @param timestamp timestamp timestamp, สอดคล้องกับพารามิเตอร์ URL timestamp * @param nonce nonce string แบบสุ่ม @throws Aesexception Execution ล้มเหลวโปรดตรวจสอบรหัสข้อผิดพลาดและข้อมูลข้อผิดพลาดเฉพาะของข้อยกเว้น */ Public String VerifyUrl (String msgsignature, String Timestamp, String Nonce, String echosttr) โยน aesexception {String Signature = sha1.getsha1 if (! signature.equals (msgsignature)) {โยน aesexception ใหม่ (aesexception.validatesignatureError); } string result = decrypt (echoStr); ผลการกลับมา; }} /*** รหัสตัวอย่างสำหรับการเข้ารหัสและถอดรหัสข้อความที่ส่งไปยังบัญชีสาธารณะโดยแพลตฟอร์มสาธารณะ * * @Copyright Copyright (c) 1998-2014 Tencent Inc. * /// - - @Param เข้ารหัส ciphertext* @return Secure Signature* @throws Aesexception*/ String String สาธารณะ getSha1 (โทเค็นสตริง, สตริง timestamp, สตริง nonce, สตริงเข้ารหัส) พ่น Aesexception {ลอง {String [] array = สตริงใหม่ [] {token, timestamp, nonce StringBuffer sb = new StringBuffer (); // string sort Arrays.sort (อาร์เรย์); สำหรับ (int i = 0; i <4; i ++) {sb.append (อาร์เรย์ [i]); } string str = sb.toString (); // sha1 การสร้างลายเซ็น MESAGEDIGEST MD = MESEGATEGEST.GETINSTANCE ("SHA-1"); md.update (str.getBytes ()); ไบต์ [] digest = md.digest (); StringBuffer hexstr = new 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); } return hexstr.toString (); } catch (exception e) {e.printstacktrace (); โยน Aesexception ใหม่ (Aesexception.ComputesignatureError); }}} คลาส pkcs7encoder {charset charset แบบคงที่ = charset.forname ("UTF-8"); int int block_size = 32;/ *** ลบอักขระส่วนประกอบของ plaintext ที่ถอดรหัส** @param ถอดรหัส plaintext ที่ถอดรหัส* @return plaintext หลังจากลบอักขระเติม*/ byte static [] decode (byte [] decrypted) {int pad = int) if (pad <1 || pad> 32) {pad = 0; } return arrays.copyofRange (ถอดรหัส, 0, decrypted.length - pad); - 3. สรุป
องค์กรตรวจสอบคำขอผ่านพารามิเตอร์ msg_signature หากได้รับการยืนยันว่าคำขอ GET นั้นมาจากหมายเลของค์กรแล้วแอปพลิเคชันระดับองค์กรจะถอดรหัสพารามิเตอร์ ECHOSTR และส่งคืน EchOSTR PlainText ตามที่เป็นอยู่ (ไม่สามารถเพิ่มได้) การตรวจสอบการเข้าถึงจะมีผล หลังจากเปิดใช้งานฟังก์ชั่นบางอย่างจะถูกนำไปใช้ต่อไปดังนั้นโปรดติดตาม!
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น