Прежде всего, режим разработки учетных записей WeChat Enterprise разделен на: режим редактирования (нормальный режим) и режим разработки (режим обратного вызовов) . В режиме редактирования вы можете сделать только простые пользовательские меню и автоматически отвечать на сообщения. Чтобы реализовать другие функции, вы должны включить режим разработчика.
1. Редактирование режима и режима разработки для обработки сообщений
1. В режиме редактирования все бизнес -процессы настроены на сервере WeChat и обрабатываются им.
2. Режим разработки, сообщения обрабатываются через сторонние серверы, и, наконец, сообщения отправляются пользователям через серверы WeChat.
Режим разработки может обрабатывать больше сообщений, чем режим редактирования, поэтому сначала необходимо включить режим разработки разрабатывать больше функций.
2. Модель разработки запускается
В режиме обратного вызовов предприятия могут не только активно вызывать интерфейс номера предприятия, но и получать сообщения или события от пользователей. Полученная информация кодируется в формате данных XML, UTF8 и зашифрована в AES .
1. После включения режима обратного вызова параметры должны быть настроены следующим образом:
URL - это сервлет, который должен быть доступен, а токен и кодингезаки получаются случайным образом, но должны соответствовать проекту.
2. Проверьте обоснованность URL
Когда вы отправите приведенную выше информацию, номер предприятия отправит запрос GET на заполненный URL. Запрос GET несет четыре параметра. Предприятие должно выполнять обработку UrldEcode при его получении , в противном случае проверка не будет успешной.
3. код
Coreservlet1 Class
Public Class Coreservlet1 Extends httpservlet {private Static Long Long SerialVersionuid = 4440739483644821986L; String stoken = "weixincurse"; String scorpid = "wxe510946434680dab"; String sencodingaeskey = "djlyzxgkiwresiw2vnv9dsr7hss7uswdfnwa8q1ove1"; public void Doget (httpservletrequest, httpservletresponse response) бросает Servletexception, ioexception {wxbizmsgcrypt wxcpt; try {wxcpt = new wxbizmsgcrypt (Stoken, Sencodingaeskey, Scorpid); String sverifymsgsig = request.getParameter ("msg_signature"); String sverifytimestamp = request.getParameter ("timeStamp"); String sverifynonce = request.getParameter ("nonce"); String sverifyechoStr = 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 (); out = 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; import javax.crypto.spec.ivparameterspec; import javax.crypto.specpecpecpecpecpecpecpecpecpecpecpecpecpec org.apache.commons.codec.binary.base64;/*** Предоставляет интерфейс шифрования и дешифрования (itf8-кодированная строка) для получения и передачи сообщений на общедоступную платформу. * <ol> * <li> Сторонний ответ на зашифрованные сообщения на общедоступную платформу </li> * <li> Третья сторона получает сообщения, отправленные общедоступной платформой для проверки безопасности сообщений и расшифровывает сообщения. </li> * </ol> * Описание: Исключение java.security.invalidkeyexception: решение незаконного размера ключа * <ol> * <li> Загрузить файл политики Unlimited разрешения JCE на официальном сайте (адрес загрузки JDK7: * http://www.oracle.com/technetwork/java/javase/downloads/jce-7-noundload-432124.html </li> * <li> Decompress после загрузки, вы можете увидеть local_policy.jar, us_export_policy.jar и readme.txt </li> %Jre_home %/lib/directory для перезаписи исходного файла </li> * <li> Если jdk установлен, поместите два файла JAR в %jdk_home %/jre/lib/security), чтобы перезаписать оригинальный файл </li> * </ol> */public wxbizmsgcrypt {static charset arset arset. Base64 = Base64 (); */ public wxbizmsgcrypt (string token, string encodingaeskey, string corpis) бросает aesexception {if (encodingaeskey.length ()! = 43) {бросить новое aesexception (aesexception.illegalaeskey); } this.token = token; this.corpid = corpid; aeskey = base64.decodebase64 (Encodingaeskey + "="); } /*** Дешифрирует зашифрованный текст. ** @param Текст The Ciphertext, который необходимо расшифровать* @return Plaintext, полученный Decryption* @throws aesexception aes не удалось расшифровать*/ Строка расшифрована (текст строки), бросает aesexception {byte [] Original; try {// установить режим расшифровки в режим AES CBC 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 Byte [] Encrypted = base64.decodebase64 (text); // расшифровывать оригинал = cipher.dofinal (зашифровано); } catch (Exception e) {e.printstackTrace (); бросить новое aesexception (aesexception.decryptaeserror); } String xmlcontent, from_corpid; try {// Удалить байт символа комплемента [] bytes = pkcs7encoder.decode (Original); // отдельные 16-битные случайные строки, сетевая эндсианность и корпоративная байт [] networkorder = arrays.copyofrange (байты, 16, 20); int xmllength = recordnetworkbytesorder (сетевой заказ); xmlcontent = new String (arrays.copyofrange (байты, 20, 20 + xmllength), charset); from_corpid = new String (arrays.copyofrange (байты, 20 + xmllength, bytes.length), charset); } catch (Exception e) {e.printstackTrace (); бросить новое aesexception (aesexception.illegalbuffer); } // случай, когда корпорация отличается if (! from_corpid.equals (corpis)) {бросить новое aesexception (aesexception.validatecorpiderror); } return xmlcontent; } /** * Проверьте url * @param msgsignaturation string, соответствующую параметрам URL msg_signature * @param timeStamp, соответствующая параметрам URL TimeStam Отсутствие выполнения aeSexception выполнение, пожалуйста, проверьте код ошибки и конкретную информацию об ошибке исключения */ public String verifyUrl (String MSGSignature, String TimeStamp, String nonce, String echoStr) Throws Aesexception {String Signature = sha1.getsha1 (token, timestamp, nonce, echoStr); if (! signature.equals (msgsignature)) {бросить новое aesexception (aesexception.validatesignatureError); } String result = decrypt (echoStr); результат возврата; }} /*** Пример кода для шифрования и расшифровки сообщений, отправляемых на публичные учетные записи публичными платформами. * * @copyright Copyright (C) 1998-2014 Tencent Inc. * /// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @Param Encrypt CipherText* @return Secure Signature* @Throws Aesexception*/ public Static String getSha1 (token String, String TimeStamp, String nonce, String Encrypt) Throws Aesexception {try {string [] array = new String [] {token, timestamp, nonce, encrypt}; StringBuffer sb = new StringBuffer (); // строки сортировки arrays.sort (массив); for (int i = 0; i <4; i ++) {sb.append (массив [i]); } String str = sb.toString (); // SHA1 Signature Generation MessageGest MD = MOSSAGEDIGEST.GETINSTANCE ("SHA-1"); md.update (str.getbytes ()); byte [] digest = md.digest (); StringBuffer hexstr = new StringBuffer (); String shahex = ""; for (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 (Exception e) {e.printstackTrace (); бросить новое aesexception (aesexception.computeignatureerror); }}} class pkcs7encoder {static charset charset = charset.forname ("utf-8"); static int block_size = 32;/ *** Удалить символ комплемента расширенного открытого текста** @param расшифровал расшифрованный открытый текст* @return Plaintext после удаления заливного символа*/ static byte [] Декод (byte [] Decrypted) {int pad = (int) decrypted [decrypted. if (pad <1 || pad> 32) {pad = 0; } return Arrays.copyOfrange (расшифровка, 0, Decrypted.length - PAD); }} 3. Резюме
Предприятие проверяет запрос через параметр msg_signature. Если подтверждено, что запрос GET находится из корпоративного номера, то приложение Enterprise расшифровывает параметр EchoStr и возвращает открытый текст EchoStr, как это (цитируется не может быть добавлен), то проверка доступа вступает в силу, и режим обратного вызовов может быть включен. После включения некоторые функции будут реализованы один за другим, так что следите за обновлениями!
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.