1. Интранет -картирование
Поскольку URL -адрес режима обратного вызова учетной записи WeChat Enterprise поддерживает доступ доменного имени, подсчитано, что вам необходимо зарегистрировать оболочку арахиса и выполнить проникновение интрасети (это стоит 16 юаней для покупки бесплатной версии, и вы можете добавить только доменное имя на следующий день после его покупки).
2. Учетная запись WeChat Enterprise
Зарегистрируйте учетную запись WeChat Enterprise: https://qy.weixin.qq.com/ (выберите команду, команда не требует сертификации)
Контакты: Создайте новую организацию -> Следуйте за участниками
Учетная запись Enterprise -> Application Center -> New Application -> Application -> Selection Mode (режим обратного вызова) -> Включите переадресацию сообщения WeChat,
Режим обратного вызова Описание: http://qydev.weixin.qq.com/wiki/index.php?title=%E5%9B%9E%E8%B0%83%E6%A8%A1%E5%BC%8f
Код шифрования и дешифрования режима обратного вызова: http://qydev.weixin.qq.com/wiki/index.php?title=%E5%8A%A0%E8%A7%A3%E5 %AF%86%E5%BA%93%E4%B8%8B%E8%BD%BD%E4%B8%8E%E8%BF%94%E5%9B%9E%E7%A0%81
Как показано на рисунке 1:
Пользовательское меню: Путь запроса для приложения разработки показан на рисунке 2:
Настройки -> Настройки функции -> Управление разрешением -> Новая группа управления -> разрешения приложения (секрет)
3. Используйте Джерси для разработки услуг веб -сервисов
3.1 Определить токен в классе, случайный пароль 43 цифр, Company Corpid, Secret
3.2 Метод проверки
/ * * ----------------------------- Когда предприятие включает режим обратного вызова, номер предприятия отправит запрос GET на URL-адрес проверки * Предположим, что при нажатии на проверку предприятие получает аналогичный запрос: get * /cgi-bin /wxpush? × tamp * = 1409659589 & nonce = 263014780 & echostr = p9nazczydtytweshep1vc5x9xho% * 2FQYX3ZPB4YKA9SKLD1DSH3IYT3TP3ZNDTP%2B4RPCS8TGAE7OABO%2BFZXVNAQQ%3D%3D * HTTP/1.1 HOST: QY.WEIXIN. Signature (MSG_Signature), TimeStamp (TimeStamp), Строка случайных чисел (nonce *) и случайная зашифрованная строка (EchoStr), выдвинутая публичной платформой. Обратите внимание на декодирование URL на этом шаге. 2. Проверьте правильность подписи тела сообщения 3. * Дешифрируйте исходный текст EchoStr, рассматривайте исходный текст как ответ запроса GET и верните его на общедоступную платформу. Шаг 2. 3 может быть реализован с использованием функции библиотеки VerifyUrl, предоставленной общедоступной платформой. *// ** * URL обратного вызова, WeChat вызывает этот метод для проверки * * @return */ @get @path ("station") public String verify () {string msgsignature = request.getParameter ("msg_signature"); String TimeStamp = request.getParameter ("TimeStamp"); String nonce = request.getParameter ("nonce"); System.out.println (TimeStamp + "" + nonce); String echoStr = request.getParameter ("echoStr"); String sechoStr = null; try {sechoStr = wxcpt.verifyurl (msgsignature, timestamp, nonce, echostr); } catch (Exception e) {e.printstackTrace (); // url url. Ошибка проверки, пожалуйста, см. Exception для причины ошибки} return sechoStr; }3.3 Получить информацию пользователя и расшифровать ее
/ * * -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * <TouSername> <! [CDATA [WX5823BF96D3BD56C7]]> </tousername *> <Stinrypt> <! [CDATA [rypevhkd8qqkfhvq6qleeb4j58tipdvo * +rtk1i9qca6am/wvqnlsv5zepeusuix5l5x/0lwfrf0qadhhhgd3qczcdcupj911l3vg3w/ * syyvujts3tuuksuxcaccas0qhxchrryt66wispglyl42am6a8dttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttTt +6k4asknmpj48kzjs8qljvd4xgpue06dodnlxauhzm6 * +kdz +hmzfjyur +ltwgc2hgf5gsijff0ekunxziqatp7pf5mzxz3izoun1s4zg4lumnvv2r * +kqckiwiwiwiwiwiw * kqckiw. * kqckiw wrickiw kqckiw wrickiw +3IQH03V +BCA9NMELNQBSF6TIWSRXJB3LAVGUCALLCRW8V2T9EL4EHZJWRQUAX5WLVMNS0 * +RUPA3K22NCX4XXS9O0MBH27BO6BPNELZPS * +/uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl */t8z1ptdave0lxdq2yoyyh2uypighbzzis2pdbs8r07+qn+e7q ==]]> </incrypt> * <AgentId> <! Enterprise получает запрос POST, он должен * 1. Проанализирует параметры на URL, включая подпись тела сообщения (MSG_Signature), TimeStamp (TimeStamp) и строка случайных чисел (nonce) * 2. Убедитесь правильность подписи тела сообщения. * 3. Запрашиваемые данные о сообщении проанализируются XML и расшифровывают содержание тега <crrypt>. Расшифрованный простой текст - это простой текст ответного сообщения пользователя. Пожалуйста, обратитесь к официальному документу для простого текстового формата* Шаг 2 и 3 могут быть реализованы с использованием библиотечной функции Decryptmsg, предоставленной общедоступной платформой. */ @Post @path ("station") public String receivemsg (string reqdata) {String msgsignature = request.getParameter ("msg_signature"); String TimeStamp = request.getParameter ("TimeStamp"); String nonce = request.getParameter ("nonce"); // данные CipherText, запрошенные POST // String SREQData = // «<mml> <pousername> <! [CDATA [WX5823BF96D3BD56C7]]> </tousername> <scrypt> <! [CD Ata [rypevhkd8qqkfhvq6qleeb4j58tipdvo+rtk1i9qca6am/wvqnlsv5zepeusuix5l5x/0lwf RF0QADHHHHD3QCCCDCUPJ911L3VG3W/SYYVUJTS3TUUKSUXXACCAS0QHXCHRRYT66WISPGLYL42A M6a8dtt+6k4asknmpj48kzjs8qljvd4xgpue06dodnlxauhzm6+kdz+hmzfjyur+ltwgc2hgf5gs IJFF0EKUNXZIQATP7PF5MZXZ3IZOUN1S4ZG4LUNMVW2R+KQCKIW+3IQH03V+BCA9NMELNQBSF6T iwsrxjb3lavgucallcrw8v2t9el4ehzjwrquax5wlvmns0+rupa3k22ncx4xxzs9o0mbh27bo6bp Nelzps+/uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl/t8z1ptdave0lxdq2yoyyh2uypighbzzis2pdbs8r07+qn+e7q ==]]> </encrypt> <GagtId> <! [CDATA [218]] </agml> <mmid> <mmid> <mmid> </agmil> </agmil> <//agmliid> <//agmid> </agmid> </agmid> <//e7q ==]> </encrypt> <агент> <! try {string smsg = wxcpt.decryptmsg (msgsignature, timestamp, nonce, reqdata); // СПРАВЛЕНИЕ Содержимое тега PLACTEXT XML для обработки DocumentBuilderFactory dbf = documentBuilderFactory.newinStance (); DocumentBuilder db = dbf.newdocumentbuilder (); StringReader sr = new StringReader (SMSG); Inputsource - это = новый входной сигнал (SR); Документ документ = db.parse (is); Элемент root = document.getDocumentElement (); Nodelist nodelist1 = root.getelementsbytagname ("content"); if (nodelist1.item (0) == null) вернуть "ok"; String content = nodelist1.item (0) .getTextContent (); System.out.println ("Content:" + Content); } catch (Exception e) {e.printstackTrace (); // Дешифрование не удалось, пожалуйста, проверьте исключение для сбоя} return "ok"; }3.4 Отправить информацию в WeChat
Настройки -> Настройки функции -> Управление разрешением -> Создать новую группу управления; Получить секрет
/** * Этот метод может отправлять сообщения любого типа * * @param msgtype * текст | Изображение | Голос | Видео | Файл | Новости * @param touser * Список идентификации члена (получатели сообщений, несколько получателей разделены '|', и до 1000 поддерживается). Специальный случай: указано как @all, * отправит * @param topy * список идентификационных идентификаторов отдела всем участникам, которые следуют заявлению Enterprise. Многочисленные получатели разделены «|», а до 100 поддерживаются. Не обращайте внимания на этот параметр, когда Touser - @all * @param totag * Список идентификатора тега, несколько получателей разделяются с помощью '|'. Игнорируйте этот параметр, когда touser-это @all * @param content * when msgtype = текст, содержимое текстового сообщения * @param mediaid * when msgtype = image | голос | Видео, идентификатор информации о соответствующем сообщении (-------) * @param @param picurl * Когда msgtype = news, путь изображения * @param safe * Указывает, является ли это конфиденциальным сообщением, 0 указывает нет, 1 указывает «Да», по умолчанию 0 */ public void sendwechatmsg (строка msgtype, строка Touser, String topy, String Totag, строка, строка MediaId, название строки, строка, строка, строка, строка, строка, строка, строка, string rsurl, string rsl, rtring us, url); String access_token = getAccesstoken (); // строка запроса строки string action = create_session_url + access_token; // инкапсулировать запрос отправки сообщения json stringbuffer sb = new StringBuffer (); sb.append ("{"); sb.append ("/" touser/":" + "/" " + touser +"/","); sb.append ("/" toparty/":" + "/" " + toparty +"/","); sb.append ("/" totag/":" + "/" " + totag +"/","); if (msgtype.equals ("text")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" text/":" + "{"); sb.append ("/" content/":" + "/" " + content +"/""); sb.append ("}"); } else if (msgtype.equals ("image")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" image/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaId +"/""); sb.append ("}"); } else if (msgtype.equals ("ocoed")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" ocole/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaId +"/""); sb.append ("}"); } else if (msgtype.equals ("video")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" video/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaid +"/","); sb.append ("/" title/":" + "/" " + title +"/","); sb.append ("/" description/":" + "/" " + description +"/""); sb.append ("}"); } else if (msgtype.equals ("file")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" file/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaId +"/""); sb.append ("}"); } else if (msgtype.equals ("news")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); SB.Append ("/" News/":" + "{"); SB.Append ("/" статьи/":" + "["); sb.append ("{"); sb.append ("/" title/":" + "/" " + title +"/","); sb.append ("/" description/":" + "/" " + description +"/","); sb.append ("/" url/":" + "/" " + url +"/","); sb.append ("/" picurl/":" + "/" " + picurl +"/""); sb.append ("}"); SB.Append ("]"); sb.append ("}"); } sb.append (",/" safe/":" + "/" " + safe +"/","); SB.Append ("/" AgentId/":" + "/" " + 1 +"/","); sb.append ("/" Debug/":" + "/" " +" 1 " +"/""); sb.append ("}"); String json = sb.toString (); try {url = new url (action); Httpsurlconnection http = (httpsurlconnection) url.openconcenection (); http.setrequestmethod ("post"); http.setrequestproperty ("content-type", "Application/json; charset = utf-8"); http.setDoOutput (true); http.setDoinput (true); System.SetProperty ("sun.net.client.defaultconnecttimeout", "30000"); // // Времена подключения 30 секунд system.setProperty ("sun.net.client.defaultreadTimeout", "30000"); // // Читать тайм -аут 30 секунд http.connect (); OutputStream OS = http.getOutputStream (); OS.Write (json.getBytes ("UTF-8")); // пройти в параметре inputstream is = http.getinputstream (); int size = is.vailable (); byte [] jsonbytes = new Byte [size]; is.read (jsonbytes); String result = new String (jsonBytes, "UTF-8"); System.out.println ("Запрос возвращает результат:" + result); os.flush (); os.close (); } catch (Exception e) {e.printstackTrace (); }} // Получить код доступа к интерфейсу public String getAccessToken () {httpclient client = new httpclient (); Postmethod post = new postmethod (access_token_url); post.ReleAseConnection (); post.setrequestheader ("Content-type", "Application/xwww-form-urlencoded; charset = utf-8"); NamevaluePair [] param = {new namevaluePair ("corpid", corpid), new namevaluepair ("corpsecret", secret)}; // установить политику, чтобы не допустить, чтобы ошибки cookie не сообщались о DefaulthTtparams.getDefaultParams (). SetParameter ("http.protocol.cookie-policy", cookiepolicy.browser_compatibility); // Установить параметры для сообщения post post post.setrequestbody (param); String result = ""; try {client.executemethod (post); result = new String (post.getResponseBodyAssTring (). GetBytes ("gbk")); } catch (ioException e) {e.printstackTrace (); } // конвертировать данные в JSON JSONOBJECT JASONOBject; jasonObject = jsonObject.fromObject (result); result = (string) jasonObject.get ("access_token"); post.ReleAseConnection (); System.out.println (результат); результат возврата; } public static void main (string [] args) {stationResource weChat = new stationresource (); // weChat.sendwechatmsgtext ("@all", "2", "", "Уведомление о информационном центре", "0"); weChat.sendwechatmsg («Новости», «@all», «», «», «Тест senmsg», «», «Протестировано», «Действительно протестировано», «http://www.baidu.com», "http://file27.mafengwo.net/m00/b2/12/wkgb6lo0ahwamhl8aav1ybfjdjw20.jpeg", "0"); }4. Разработка завершена. Этот класс должен быть добавлен, чтобы отдохнуть в webx.xml для управления
<!-Restful Support-> <!-Webserivce Service. Если услуга добавлена, путь пакета службы должен быть добавлен в значение PARAM-> <Servlet> <vervlet-name> jax-rs rest servlet </servlet-name> <serlet-class> com.sun.jersey.spi.container.servlet.servletcontainer </servlet-class> <initparam> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>com.base.pf.restful</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JAX-RS REST Servlet</servlet-name> <Url-pattern>/rest/*</url-pattern> </servlet-mapping>
5. Полный код завершен
пакет com.base.pf.restful; импортировать java.io.ioexception; импортировать java.io.inputstream; импортировать java.io.outputstream; Импорт java.io.stringReader; импортировать java.net.url; Импорт javax.net.ssl.httpsurlConnection; Импорт javax.servlet.http.httpservletrequest; Импорт javax.servlet.http.httpservletresponse; импортировать javax.ws.rs.get; импортировать javax.ws.rs.post; Импорт javax.ws.rs.path; Импорт javax.ws.rs.core.context; Импорт javax.xml.parsers.documentbuilder; Импорт javax.xml.parsers.documentbuilderfactory; Импорт net.sf.json.jsonobject; Import org.apache.commons.httpclient.httpclient; Import org.apache.commons.httpclient.namevaluepair; Import org.apache.commons.httpclient.cookiepolicy; Import org.apache.commons.httpclient.methods.postmethod; Import org.apache.commons.httpclient.params.defaulthttpparams; Импорт org.w3c.dom.document; Импорт org.w3c.dom.element; Импорт org.w3c.dom.nodelist; Импорт org.xml.sax.inputsource; импорт com.qq.weixin.mp.aes.aesexception; Импорт com.qq.weixin.mp.aes.wxbizmsgcrypt; /** * Разработка учетной записи WeChat Enterprise * * @author Zhen.l * */@path ("wx") открытый класс stationresource {// http://hichinamobile.xicp.net/security/rest/wx // https://qy.weixin.cq.com Private String token = "spm"; // Enterprise Number-> Application Center-> New Application-> Application-Type Приложение Private String AggentId = "1"; // Enterprise Number-> Application Center-> Нажмите на приложение-> идентификатор приложения Private String EncodingaeSkey = "NT6ZWTVFLYNXOHFOGGOZWDJPAGEFSV8LN5CNEYW7MWL"; // Enterprise Number-> Application Center-> New Application-> Application-Type Приложение Private String Corpis = "WXE49318EB604CF00B"; // Enterprise Number-> Настройки-> Информация о номере Enterprise-> Информация об учетной записи Private String Secret = "M-YFKMGL_KXBVETGINZH3RQWBZ4XB6MFEQXXLK77MKPXZENFDYQ-UGERXDUF8REL"; // Enterprise Number-> Настройки-> Функциональные настройки-> Управление разрешением @context httpservletrequest request; @Context httpservletresponse response; Wxbizmsgcrypt wxcpt = null; Public StatseResource () {try {wxcpt = new wxbizmsgcrypt (token, encodingaeskey, corpid); } catch (aesexception e) {e.printstacktrace (); }} // Получить URL Code Code Private Final Static String Access_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"; // Создать URL-адрес запроса сеанса Private Final Static String Create_session_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="; // Получить код доступа к интерфейсу public String getAccessToken () {httpclient client = new httpclient (); Postmethod post = new postmethod (access_token_url); post.ReleAseConnection (); post.setrequestheader ("Content-type", "Application/xwww-form-urlencoded; charset = utf-8"); NamevaluePair [] param = {new namevaluePair ("corpid", corpid), new namevaluepair ("corpsecret", secret)}; // установить политику, чтобы не допустить, чтобы ошибки cookie не сообщались о DefaulthTtparams.getDefaultParams (). SetParameter ("http.protocol.cookie-policy", cookiepolicy.browser_compatibility); // Установить параметры для post post post.setrequestbody (param); String result = ""; try {client.executemethod (post); result = new String (post.getResponseBodyAssTring (). GetBytes ("gbk")); } catch (ioException e) {e.printstackTrace (); } // конвертировать данные в JSON JSONOBJECT JASONOBject; jasonObject = jsonObject.fromObject (result); result = (string) jasonObject.get ("access_token"); post.ReleAseConnection (); System.out.println (результат); результат возврата; } / * * --------------------------------- Когда предприятие включает режим обратного вызова, номер предприятия отправит запрос GET на URL-адрес проверки * Предположим, что при нажатии на проверку предприятие получает аналогичный запрос: GET * /cgi-bin /wxpush? msg_signature = 5C45FF5E21C57E6AD56BAC8758B79B1D9AC89FD3 * × TAMP * = 1409659589 & NONE = 263014780 & ECHOSTR = P9NAZCZYDTWESHEP1v1V14780 & ECHOSTR = P9NazCyDTYTWESHEP1V1V14780 и echoStr = P9NazCydtyTWESHEP1v1v1v1v1v1v1v1v1v1v1v1478. 2FQYX3ZPB4YKA9SKLD1DSH3IYT3TP3ZNDTP%2B4RPCS8TGAE7OABO%2BFZXVNAQQ%3D%3D * HTTP/1.1 HOST: QY.WEIXIN. Signature (MSG_Signature), TimeStamp (TimeStamp) и string String (Nonce *) и случайные зашифрованные строки (EchoStr), выдвинутые публичной платформой. Обратите внимание на декодирование URL на этом шаге. 2. Проверьте правильность подписи тела сообщения 3. * Дешифрируйте исходный текст EchoStr, рассматривайте исходный текст как ответ запроса GET и верните его на общедоступную платформу. Шаг 2. 3 может быть реализован с использованием функции библиотеки VerifyUrl, предоставленной общедоступной платформой. *// ** * URL обратного вызова, WeChat вызывает этот метод для проверки * * @return */ @get @path ("station") public String verify () {string msgsignature = request.getParameter ("msg_signature"); String TimeStamp = request.getParameter ("TimeStamp"); String nonce = request.getParameter ("nonce"); System.out.println (TimeStamp + "" + nonce); String echoStr = request.getParameter ("echoStr"); String sechoStr = null; try {sechoStr = wxcpt.verifyurl (msgsignature, timestamp, nonce, echostr); } catch (Exception e) {e.printstackTrace (); // проверка URL -файла не удастся, пожалуйста, проверьте исключение по причине ошибки} return sechoStr; } /* * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- MSG_Signature = 477715D11CDB4164915DEBCBA66CB864D751F3E6 * × TAMP = 1409659813 & NONCE = 1372623149 HTTP/1.1 HOST: QY.Wexin. <Tousername> <! [Cdata [wx5823bf96d3bd56c7]]> </tousername *> <Stinrypt> <! [Cdata [rypevhkd8qqkfhvq6qleeb4j58tipdvo * +rtk1i9qca6am/wvqnlsv5zepeusuix5l5x/0lwfrf0qadhhhgd3qczcdcupj911l3vg3w/ * syyvujts3tuuksuxcaccas0qhxchrryt66wispglyl42am6a8dttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttTt +6k4asknmpj48kzjs8qljvd4xgpue06dodnlxauhzm6 * +kdz +hmzfjyur +ltwgc2hgf5gsijff0ekunxziqatp7pf5mzxz3izoun1s4zg4lumnvv2r * +kqckiwiwiwiwiwiw * kqckiw. * kqckiw wrickiw kqckiw wrickiw +3IQH03V +BCA9NMELNQBSF6TIWSRXJB3LAVGUCALLCRW8V2T9EL4EHZJWRQUAX5WLVMNS0 * +RUPA3K22NCX4XXS9O0MBH27BO6BPNELZPS * +/uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl */t8z1ptdave0lxdq2yoyyh2uypighbzzis2pdbs8r07+qn+e7q ==]]> </incrypt> * <AgentId> <! Enterprise получает запрос POST, он должен * 1. Проанализирует параметры на URL, включая подпись тела сообщения (MSG_Signature), TimeStamp (TimeStamp) и строка случайных чисел (nonce) * 2. Убедитесь правильность подписи тела сообщения. * 3. Запрашиваемые данные о сообщении проанализируются XML и расшифровывают содержание тега <crrypt>. Расшифрованный простой текст - это простой текст ответного сообщения пользователя. Пожалуйста, обратитесь к официальному документу для простого текстового формата* Шаг 2 и 3 могут быть реализованы с использованием библиотечной функции Decryptmsg, предоставленной общедоступной платформой. */ @Post @path ("station") public String receivemsg (string reqdata) {String msgsignature = request.getParameter ("msg_signature"); String TimeStamp = request.getParameter ("TimeStamp"); String nonce = request.getParameter ("nonce"); // данные CipherText, запрошенные POST // String SREQData = // «<mml> <pousername> <! [CDATA [WX5823BF96D3BD56C7]]> </tousername> <scrypt> <! [CD Ata [rypevhkd8qqkfhvq6qleeb4j58tipdvo+rtk1i9qca6am/wvqnlsv5zepeusuix5l5x/0lwf RF0QADHHHHD3QCCCDCUPJ911L3VG3W/SYYVUJTS3TUUKSUXXACCAS0QHXCHRRYT66WISPGLYL42A M6a8dtt+6k4asknmpj48kzjs8qljvd4xgpue06dodnlxauhzm6+kdz+hmzfjyur+ltwgc2hgf5gs IJFF0EKUNXZIQATP7PF5MZXZ3IZOUN1S4ZG4LUNMVW2R+KQCKIW+3IQH03V+BCA9NMELNQBSF6T iwsrxjb3lavgucallcrw8v2t9el4ehzjwrquax5wlvmns0+rupa3k22ncx4xxzs9o0mbh27bo6bp Nelzps+/uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl/t8z1ptdave0lxdq2yoyyh2uypighbzzis2pdbs8r07+qn+e7q ==]]> </encrypt> <GagtId> <! [CDATA [218]] </agml> <mmid> <mmid> <mmid> </agmil> </agmil> <//agmliid> <//agmid> </agmid> </agmid> <//e7q ==]> </encrypt> <агент> <! try {string smsg = wxcpt.decryptmsg (msgsignature, timestamp, nonce, reqdata); // СПРАВЛЕНИЕ Содержимое тега PLACTEXT XML для обработки DocumentBuilderFactory dbf = documentBuilderFactory.newinStance (); DocumentBuilder db = dbf.newdocumentbuilder (); StringReader sr = new StringReader (SMSG); Inputsource - это = новый входной сигнал (SR); Документ документ = db.parse (is); Элемент root = document.getDocumentElement (); Nodelist nodelist1 = root.getelementsbytagname ("content"); if (nodelist1.item (0) == null) вернуть "ok"; String content = nodelist1.item (0) .getTextContent (); System.out.println ("Content:" + Content); } catch (Exception e) {e.printstackTrace (); // Дешифрование не удалось, пожалуйста, проверьте исключение для сбоя} return "ok"; } / * * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. Предположим, что компания должна ответить на простой текст пользователя следующим образом: <xml> * <tousername> <! [Cdata [mycreate]]> </tousername> * <facusername> <! <ssgtype> <! [Cdata [text]]> </msgtype> * <stonte> <! [CDATA [это тест]]> </content> * <ssgid> 1234567890123456 </msgid> <gentid> 128 </AgentID> </xml> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Шамп с временем и строка случайного числа (нереей), чтобы генерировать подпись тела сообщений или непосредственно использовать соответствующее значение, проанализированное из URL Post * URL общедоступной платформы. 2. Зашифруйте простой текст, чтобы получить текст шифра. * 3. Используйте текст шифра, TimeStamp, Nonce, сгенерированный на шаге 1 и токен, установленные предприятием на общедоступной платформе для создания подписей тела сообщений. * 4. Перепрысните зашифрованный текст, подпись корпуса сообщения, метка времени и случайные числа в строку в формате XML и отправьте его на предприятие. * Вышеуказанные 2, 3 и 4 шага могут быть реализованы с использованием библиотечной функции Encryptmsg, предоставленной общедоступной платформой. */ // @get // @path ("send") public void sendmsg (строка timestamp, string nonce) {string srespdata = «<mml> <tousername> <! [cdata [mycreate]]> </tousername> <facusername> <! [cdata [wxe49318eb604cf00b]]> </from Имя пользователя> <CreateTime> 1348831860 </createTime> <sgtype> <! [Cdata [text]]> </msgtype> <stonte> <! [Cdata [this является тестом]]> </content> <ssgid> 1234567890123456 </msgid> <gentid> 1 </aggetid> </xml> "; try {string sencryptmsg = wxcpt.encryptmsg (srespdata, timestamp, nonce); System.out.println ("После шифрования sencrytmsg:" + sendryptmsg); response.getWriter (). } catch (Exception e) {e.printstacktrace (); // incryption не удалось} // return srespdata; } /**. Специальный случай: указано как @all, * отправит * @param topy * список идентификационных идентификаторов отдела всем участникам, которые следуют заявлению Enterprise. Многочисленные получатели разделены «|», а до 100 поддерживаются. Не обращайте внимания на этот параметр, когда Touser - @all * @param totag * Список идентификатора тега, несколько получателей разделяются с помощью '|'. Игнорируйте этот параметр, когда touser-это @all * @param content * when msgtype = текст, содержимое текстового сообщения * @param mediaid * when msgtype = image | голос | Видео, идентификатор информации о соответствующем сообщении (-------) * @param @param picurl * Когда msgtype = news, путь изображения * @param safe * Указывает, является ли это конфиденциальным сообщением, 0 указывает нет, 1 указывает «Да», по умолчанию 0 */ public void sendwechatmsg (строка msgtype, строка Touser, String topy, String Totag, строка, строка MediaId, название строки, строка, строка, строка, строка, строка, строка, строка, string rsurl, string rsl, rtring us, url); String access_token = getAccesstoken (); // строка запроса строки string action = create_session_url + access_token; // инкапсулировать запрос отправки сообщения json stringbuffer sb = new StringBuffer (); sb.append ("{"); sb.append ("/" touser/":" + "/" " + touser +"/","); sb.append ("/" toparty/":" + "/" " + toparty +"/","); sb.append ("/" totag/":" + "/" " + totag +"/","); if (msgtype.equals ("text")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" text/":" + "{"); sb.append ("/" content/":" + "/" " + content +"/""); sb.append ("}"); } else if (msgtype.equals ("image")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" image/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaId +"/""); sb.append ("}"); } else if (msgtype.equals ("ocoed")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" ocole/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaId +"/""); sb.append ("}"); } else if (msgtype.equals ("video")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" video/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaid +"/","); sb.append ("/" title/":" + "/" " + title +"/","); sb.append ("/" description/":" + "/" " + description +"/""); sb.append ("}"); } else if (msgtype.equals ("file")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" file/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaId +"/""); sb.append ("}"); } else if (msgtype.equals ("news")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); SB.Append ("/" News/":" + "{"); SB.Append ("/" статьи/":" + "["); sb.append ("{"); sb.append ("/" title/":" + "/" " + title +"/","); sb.append ("/" description/":" + "/" " + description +"/","); sb.append ("/" url/":" + "/" " + url +"/","); sb.append ("/" picurl/":" + "/" " + picurl +"/""); sb.append ("}"); SB.Append ("]"); sb.append ("}"); } sb.append (",/" safe/":" + "/" " + safe +"/","); SB.Append ("/" AgentId/":" + "/" " + AggentId +"/","); sb.append ("/" Debug/":" + "/" " +" 1 " +"/""); sb.append ("}"); String json = sb.toString (); try {url = new url (action); Httpsurlconnection http = (httpsurlconnection) url.openconcenection (); http.setrequestmethod ("post"); http.setrequestproperty ("content-type", "Application/json; charset = utf-8"); http.setDoOutput (true); http.setDoinput (true); System.SetProperty ("sun.net.client.defaultconnecttimeout", "30000"); // // Времена подключения 30 секунд system.setProperty ("sun.net.client.defaultreadTimeout", "30000"); // // Читать тайм -аут 30 секунд http.connect (); OutputStream OS = http.getOutputStream (); OS.Write (json.getBytes ("UTF-8")); // пройти в параметре inputstream is = http.getinputstream (); int size = is.vailable (); byte [] jsonbytes = new Byte [size]; is.read (jsonbytes); String result = new String (jsonBytes, "UTF-8"); System.out.println ("Запрос возвращает результат:" + result); os.flush (); os.close (); } catch (Exception e) {e.printstackTrace (); }} public static void main (string [] args) {stationResource weChat = new stationresource (); // weChat.sendwechatmsgtext ("@all", "2", "", "Уведомление о информационном центре", "0"); weChat.sendwechatmsg («Новости», «@all», «", "", "", "test senmsg", "", "Протестировано", "Действительно протестировано", "http://www.baidu.com", "http://file27.mafengwo.net/m00/b2/12/wkgb6lo0ahwamhl8aav1ybfjdjw20.jpeg", "0"); }}Выше приведено проверка учетной записи WeChat Enterprise/отправить/принять сообщения, введенные вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!