Как получить и ответить на сообщения от WeChat Development API, я представлю вас ниже
1. Объяснение
* Этот пример разработан и продемонстрирован в соответствии с документом по разработке WeChat: http://mp.weixin.qq.com/wiki/home/index.html Последняя версия (4/3/2016 5:34:36).
* Редактирование платформы: myeclipse10.7+win32+jdk1.7+tomcat7.0
* Сервер: Alibaba Cloud Windows Server 2008 64bits
* Требования к платформе: метод аннотации использования сервлета, Требования к платформе: J2EE6.0+, JDK6.0+, Tomcat7.0+
* Демо фокусируется больше на анализе API.
* Для инструкций по тестированию каждый тестовый пример является независимым и не зависит от других методов. Не рассматривайте упаковку.
* Демонстрация проводится как можно больше в соответствии с требованиями API. Цель: Понять, как используется документ, и достичь влияния обучения из одного примера и применения его к другим.
* Требования к знаниям: солидный фонд Java, понимание знаний о коммуникации HTTP, достаточно понимания Javaweb, JSON Analysis
* Эта часть демонстрационного исходного кода будет дана в конце каждой статьи. После анализа API все демонстрационные исходные коды будут предоставлены в форме пакета исходного кода.
* Текущее время: 4/3/2016 5:32:57, на этот раз преобладает.
2. Документируйте оригинальное управление текстовым и массивом (аннотация)
• Адрес документа: http://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html
• Управление сообщениями
◦ Завладеть сообщением нормальное сообщение
◦ Завладевать наступление события сообщения
◦ Отправить сообщение-ответное сообщение
◦ Отправить инвертифрование сообщения и дешифрование при пассивном ответе
◦ Сообщение об обслуживании сообщений о сообщении
◦ Согласно сообщению интерфейс
◦ Согласно сообщению интерфейс сообщений
◦ Спецификация сообщений
◦ Получить автоматическую конфигурацию ответа для официальной учетной записи
3. Документ Понимание
• Получить сообщения
◦ Документ объясняет это: Когда обычный пользователь WeChat отправляет сообщение в общедоступную учетную запись, сервер WeChat будет упаковывать данные XML сообщения POST сообщением на URL -адрес разработчика.
«Понимание: сервер WeChat возвращает сообщение, отправленное пользователем для Req в форме постороннего потока. Когда мы хотим получить сообщение, отправленное пользователем, мы можем получить его через req.getinputstream (). Конечно, мы можем выполнить необходимый анализ на основе формата XML обратного сообщения в документе.
◦
выполнить:
/** В этой части мы получаем информацию, отправляемую пользователем, и разрабатываем ее в <K, V> для отображения* /// Проанализировать информацию, отправленную пользователем. InputStream IS = req.getInputStream (); // Получить потоку запроса // сохранить анализированный результат в карте HashMap <String, String> Map = New HashMap <String, String> (); // parse xml, проанализировано полученный результат возврата в текстовую информацию, которую мы используем для Saxreader Reader = new SaxReader ();// третий порядок jar-gar-garer xml] документ документ = null; try {document = reader.read (is);} catch (documentException e1) {// todo AutoGenerated Catch Block e1.printStackTrace ();} // Получить элемент элемента root root root xml. (Элемент e: elementList) map.put (e.getName (), e.getText ()); // Тест выводный набор <string> keyset = map.keyset (); // После анализа вывода теста информация, отправленная пользователем, отправляется пользовательской системой. for (String клавиша: keyset) {System.out.println (key + ":" + map.get (key));} system.out.println (Tag + ": завершить анализ информации, отправленной пользователем"); • Отправить сообщение
◦ Документ объясняет это: Когда пользователь отправляет сообщение в официальную учетную запись (или когда событие нажимается на конкретную операцию пользователя), будет сгенерирован запрос POST. Разработчик может вернуть конкретную структуру XML в пакете ответов (GET), чтобы ответить на сообщение (теперь поддерживает ответ на ответ, изображения, изображения, текст, голос, видео и музыка). Строго говоря, отправка пассивных ответных сообщений на самом деле не является интерфейсом, а ответом на сообщение, отправленное на сервер WeChat.
«Понимание: когда пользователь отправляет запрос, будет сгенерирован запрос сообщения, и мы можем ответить на сообщения через ответный ответ. Тем не менее, содержание ответа имеет строгие требования к формату. Только когда требования к формату будут выполнены в процессе WeChat Server и возвращать его пользователю. Просмотрев модуль документа «Управление сообщениями», мы видим, что в WeChat есть различные сообщения, и каждый тип сообщения имеет свои собственные требования к конкретным форматам. Мы должны следовать требованиям для возврата конкретной информации пользователю обычно. Мы стараемся отвечать пользователям с текстовой информацией и графическими сообщениями в требуемом формате документа. Фокус: создайте необходимые параметры в соответствии с требованиями документа. Специальное примечание: параметры чувствительны к случаю.
◦ Приведите 1-повторный на обычные текстовые сообщения:
// Пример 1: Отправьте нормальное текстовое сообщение, пожалуйста, проверьте формат XML документа о «Ответить текстовое сообщение» // Шаг 1: Создайте необходимые параметры TextMsg TextMSG = new TextMSG (); TextMSG.SetTouserNam TextMSG.SetFromuserName (map.get ("tousername")); TextMSG.SetCreatEtime (new Date (). getTime ()); // Время создания сообщений (Integer) TextMSG.SetMsGTYPE («Текст»); // Текст текст Сообщения TextMSG.SetContent («I Am Im Sermer to Server») Формат, распознанный WeChat [Baidu: Xstream Bean to xml] xstream xstream = new xstream (); xstream.alias ("xml", textmsg.getclass ()); String textmsg2xml = xstream.toxml (textmsg); system.out.println (textmsg2xml); Информация на сервер WeChat, и сервер пересылает его на пользователь PrintWriter PrintWriter = resp.getWriter (); printWriter.print (TextMSG2XML); ◦ Приведите 2-повторное в текстовое сообщение:
// Пример 2, отправьте графические и текстовые сообщения. Пожалуйста, проверьте формат XML документа «Ответьте на текстовое сообщение» // Шаг 1: Создайте параметры, требуемые ответами в список текстовых сообщений <sitive> статьи = новый ArrayList <siture> (); статья A = Новая статья (); A.Settitle («Я - название изображения»); A.Seturl («WWW.Baidu.com»); a.setpicurl ("http://b.hiphotos.baidu.com/image/pic/item/08f790529822720ea5d058ba7ccb0a46f21fab50.jpg"); // Адрес. PicAndTextMsg = new PicAndTextMsg (); PicAndTextMsg.SetTouserName (map.get ("fromUsername")); // Отправить и получить сообщение «Пользователь», просто противоположный picAndtextmsg.setfromusername (map.get ("tousername"); picandTextMsg.setCreateTime (new Date () getTime (); PicAndTextMsg.SetMsgType ("News"); // Графическое и текст PicAndTextMsg.Setarticles (статьи); // Второй шаг состоит в том, чтобы преобразовать построенную информацию в формат XML, распознанный WeChat [Baidu: Xstream Bean в XML] XStream Xstream = new Xstream (); Xstream.alias ("xml", picandTextmsg.getClass (); xstream.alias ("xml", picandtextmsg.getclas PicAndTextMsg2xml = xstream.toxml (picAndTextMsg); System.out.println (PicAndTextMsg2xml); // Третий шаг - отправить информацию о формате XML на сервер weChat, а сервер (picAndTextmsgmlStextmsGSGMLSTTEXTMSMMLSTTEXTMSMSGSGMLSTTEXTMSMSGSGMLSTTEXTMSGSMSGSMLSTTEXTMSM Все исходные коды операции в этой части могут быть использованы напрямую
• coreservlet.java (включая доступ к серверу, получение сообщений пользователя, ответа на обычные текстовые сообщения и ответ на графические сообщения. Сторонние банки: dom4j, xstream)
пакет com.gist.servlet; импорт java.io.ioexception; импорт java.io.inputstream; импорт java.io.printwriter; import java.security.messagedigest; импорт java.security.nosuchalgorithmexception; импорт java.util.arraylist; импорт. java.util.hashmap; import java.util.list; import java.util.map; импорт java.util.set; import javax.servlet.servletexception; импорт javax.servlet.annotation.webservlet; импорт javax.servlet.http.httpservlet; javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; импорт org.dom4j.document; импорт org.dom4j.documentexception; импорт org.dom4j.element; импорт org.dom.od.io.saxreader; com.gist.bean.picandtextmsg; import com.thoughtworks.xstream.xstream;/** * @author gao yuan </n> Электронная почта: [email protected] </n> блог http://blog.csdn.net/wgyscs </n> *. */@Webservlet ("/coreservlet") открытый класс Coreservlet расширяет httpservlet {private static final long serialversionuid = 1l; String Tag = "coreservlet"; / * * Шаг 2: Проверьте обоснованность адреса сервера После того, как разработчик представляет информацию, сервер WeChat отправит запрос GET на URL-адрес адресу заполненного сервера. * Запрос GET содержит четыре параметра: подпись, временная метка, nonce, echoStr * Разработчик проверяет запрос путем проверки подписи (ниже метод проверки). Если вы подтвердите, что запрос GET находится с сервера WeChat, верните содержимое параметра EchoStr, как есть. *, доступ вступит в силу и успешно станет разработчиком, в противном случае доступ потерпит неудачу. * * Процесс шифрования/проверки выглядит следующим образом: 1. Сортировка Словаря Ордена токена, временной метки и Nonce 2. * Сплайсировать три строки параметров в строку для шифрования SHA1 3. Строки после разработчика получает зашифрованные строки, можно сравнить с сортировкой) сортирующим порой */ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * переменные для формирования последовательностей. Метод состоит в том, чтобы сформировать последовательность от малого до крупного в алфавитном порядке или в порядке малых и больших чисел. */ @Override Protected void Doget (httpservletRequest req, httpservletresponse resp) throws servletexception, ioexception {// установить кодирование req.setcharacterencoding ("utf-8"); Resp.SetContentType ("html/text; charset = utf-8"); Resp.setcharacterencoding ("UTF-8"); // Получить выходной поток printwriter printwriter = resp.getWriter (); // Установите глобальный токен, разработчик устанавливает его сам. API объясняет это: токен может быть заполнен по желанию разработчиком, // используется в качестве сигнатуры генерации (токен будет сравниваться с токеном, содержащимся в URL интерфейса для проверки безопасности) String Token = "wgyscsf"; // Согласно описанию API, получите вышеуказанные четыре параметра STRING Signature = REQ.GETPARAMETER ("Signature"); String TimeStamp = req.getParameter ("TimeStamp"); String nonce = req.getParameter ("nonce"); String echoStr = req.getParameter ("echoStr"); // // Temp: временная печать, смотрите ситуацию параметра возврата // System.out.println (Tag + ": Signature:" + Signature + ", TimeStamp:" // + timestamp + ", nonce:" + nonce + ", echostr:" + echostr); // доступ в соответствии с «процессом шифрования/проверки», упомянутым API. Есть три шага в общей сложности // Шаг 1: Сортировка Словаря «Порядок токена», «Времена», «Нез» три параметра String [] parms = new String [] {token, timestamp, nonce}; // Поместите строки, которые необходимо сортировать словарь в массив Splice Splice. Строки для Shrams1 Sprestres1 Строки Splice. шифрование // Сплайс строковой строки parmsstring = ""; // Обратите внимание, что он не может = null здесь. for (int i = 0; i <parms.length; i ++) {parmsstring+= parms [i]; } // SHA1 Шифрование строки mparms = null; // зашифрованный результат MessageDigest Digest = null; try {digest = java.security.messagedigest.getInstance ("sha"); } catch (nosuchalgorithmexception e) {// todo автоматически сгенерированный блок e.printstacktrace (); } digest.update (parmsstring.getbytes ()); Byte MessageDigest [] = digest.digest (); // Создать шестигранную строку stringbuffer hexstring = new StringBuffer (); // преобразовать байтовые массивы в шестнадцатеричный номер для (int i = 0; i <messagedigest.length; i ++) {string shahex = integer.tohexstring (messagedigest [i] & 0xff); if (shahex.length () <2) {hexstring.append (0); } hexstring.append (shahex); } mparms = hexstring.toString (); // Результат шифрования/ * * * * В противном случае доступ потерпит неудачу. */ // Шаг 3: Разработчик получает зашифрованную строку и может сравнить ее с подписью, чтобы определить, что запрос происходит от успешного доступа WeChat. // System.out.println (Tag + ":" + mparms + "--->" + signature); if (mparms.equals (signature)) {// system.out.println (Tag + ":" + mparms + "---->" + signature); printwriter.write (echostr); } else {// access не удастся, не нужно записывать обратно // System.out.println (Tag + "Access Faile"); }} / * * Проверьте документ API для отправки и получения сообщений и нажимать в основном один и тот же формат сообщения. Как в следующем формате: <xml> * <tousername> <! [Cdata [touser]]> </tousername> * <fromusername> <! [Cdata [fromuser]]> </fromusername> * <createtime> 1348831860 </createtime> <sgtype> <! <SOTED> <! [CDATA [Это тест]]> </content> * <ssgid> 1234567890123456 </msgid> </xml> Затем мы можем выполнить унифицированную обработку. * / / * * Давайте сначала получим поток ввода и посмотрим информацию в потоке ввода. Тестируя поток распечатки, мы видим, что каждый раз, когда пользователь запрашивает, мы получаем запрос REQ. Формат запроса находится в формате XML, который объясняется в документе. * / / * * Обратите внимание, что req.getInputStream () может быть извлечен только один раз и может быть прочитана только один раз. Если вы хотите прочитать его несколько раз, вам нужно найти другой способ. Для простоты * мы получаем REQ.GetInputStream () только один раз и больше не распечатывайте информацию о выводе. Непосредственно распечатайте анализированную информацию. */ @Override Protected void Dopost (httpservletRequest req, httpservletresponse resp) throws servletexception, ioexception {// установить кодирование req.setcharacterencoding ("utf-8"); Resp.SetContentType ("html/text; charset = utf-8"); Resp.setcharacterencoding ("UTF-8"); /** В этой части мы получаем информацию, отправляемую пользователем, и разрабатываем ее в <K, V> для отображения*/ // Проанализируйте информацию, отправляемую пользователем inputStream IS = req.getInputStream (); // Получить поток запросов // сохраняет проанализированные результаты в карте hashmap <String, String> map = new Hashmap <String> ();); // Подготовки XML, анализируя полученный результат возврата XML в текстовую информацию, которую мы используем для SaxReader Reader = New SaxReader (); // Сторонний JAR: DOM4J [BAIDU: SAXREADER PARSING XML] документ DOCUMT = NULL; try {document = reader.read (is); } catch (documentException e1) {// todo автоматически сгенерированный блок e1.printstacktrace (); } // Получить XML -элемент элемента корневого элемента root = document.getRootelement (); // Получить все дочерние узлы списка элементов корневых элементов <element> elementlist = root.elements (); // Переносить все дочерние узлы для (элемент e: elementlist) map.put (e.getName (), e.getText ()); // тест выходной набор <string> keyset = map.keyset (); // Тестирование выходного сообщения, отправленное пользователем после системы анализа. for (String клавиша: keyset) {System.out.println (key + ":" + map.get (key)); } System.out.println (Tag + ": конец анализа информации, отправленной пользователем"); / * * В этой части мы пытаемся ответить на текстовую информацию и графические сообщения пользователю в соответствии с необходимым форматом документа. Фокус: создайте необходимые параметры в соответствии с требованиями документа. Специальное примечание: параметры чувствительны к случаю. */ // // Пример 1: Отправьте нормальное текстовое сообщение, пожалуйста, проверьте формат XML документа о «Ответить текстовое сообщение» // // // Шаг 1: Создайте требуемые параметры в соответствии с информацией текста ответа // TextMSG TextMSG = new TextMSG (); // TextMSG.SetTouserName (map.get ("fromUsername")); // Отправить и получать сообщение «Пользователь» точно противоположное // textmsg.setfromusername (map.get ("tousername")); // TextMSG.SetCreatEtime (new Date (). getTime ()); // Время создания сообщений (Integer) // TextMSG.SetMsgType ("text"); // Сообщение типа текста // textMsg.setContent («Я - сервер ответ пользователю»); // // // // // // Второй шаг состоит в том, чтобы преобразовать построенную информацию в формат XML, распознанный WeChat [Baidu: Xstream Bean в XML] // xstream xstream = new xstream (); // xstream.alias ("xml", textmsg.getclass ()); // String TextMSG2XML = xStream.Toxml (TextMSG); // System.out.println (TextMSG2XML); // // // // // // // третий шаг - отправить информацию о формате XML на сервер WeChat, а сервер направляет ее пользователю // printWriter PrintWriter = resp.getWriter (); // printWriter.print (TextMSG2XML); // // Пример 2, Отправить графические и текстовые сообщения. Пожалуйста, проверьте документ о формате XML «Ответьте на текстовое сообщение» // Шаг 1: Создайте требуемые параметры в соответствии с ответами в список текстовых сообщений <статья> статьи = new ArrayList <Stare> (); Статья A = новая статья (); A.SetTitle («Я - название изображения»); a.seturl ("www.baidu.com"); // Этот адрес после нажатия на изображение и прыжки A.setpicurl ("http://b.hiphotos.baidu.com/image/pic/item/08f790529822720EA5D058BA7CCB0A46F21F50.JPG. A.SetDescription («Я - описание изображения»); Статьи. Адд (а); PicAndTextMsg picandTextMsg = new PicAndTextMsg (); PicAndTextMsg.SetTouserName (map.get ("fromUsername")); // Отправить и получать сообщение «Пользователь» прямо противоположного PicandTextMsg.setFromuserName (map.get ("tousername")); PicAndTextMsg.SetCreatEtime (new Date (). getTime ()); // Время создания сообщений (Integer) PicAndTextMSG.SetMsgType ("News"); // Сообщение графического типа PicAndTextMsg.setArticLecount (1); PicAndTextMsg.setarticles (статьи); // Второй шаг состоит в том, чтобы преобразовать построенную информацию в формат XML, распознанный WeChat [Baidu: Xstream Bean в XML] XStream Xstream = new Xstream (); xstream.alias ("xml", picandtextmsg.getclass ()); xstream.alias ("item", a.getClass ()); String picandTextMsg2xml = xstream.toxml (picandTextMsg); System.out.println (PicAndTextMSG2XML); // Третий шаг состоит в том, чтобы отправить информацию о формате XML на сервер WeChat, а сервер направляет ее на пользователь PrintWriter PrintWriter = resp.getWriter (); printwriter.print (picandtextmsg2xml); }}
• testmsg.java (обычное текстовое сообщение Бин)
пакет com.gist.bean;/** * @author gao yuan </n> Электронная почта: [email protected] </n> блог http://blog.csdn.net/wgyscsf </n>> * Период написания 2016-4-4 2:09:27 pm */public classg {private строка Tousername; Приватная строка от Ususername; Частное длинное творчество; частная строка MSGTYPE; @Override public String toString () {return "textMsg [tousername =" + tousername + ", fromusername =" + fromUsername + ", createTime =" + createTime + ", msgtype =" + msgtype + ", content =" + "]"] "; } частное строковое содержимое; public TextMSG (String Tousername, String Fromusername, Long CreateTime, String msgtype, String Content) {super (); Tousername = tousername; Fromusername = fromusername; CreateTime = createTime; Msgtype = msgtype; Content = Content; } public TextMSG () {super (); } public String getTouserName () {return tousername; } public void cettelousername (String tousername) {tousername = tousername; } public String getFromuserName () {return fromUserName; } public void setFromuserName (String fromUsername) {fromUserName = fromUserName; } public long getCreatetime () {return createTime; } public void setCreatetime (long createTime) {createTime = createTime; } public String getMsgType () {return msgtype; } public void setMsgType (String msgtype) {msgtype = msgtype; } public String getContent () {return Content; } public void setContent (String Content) {content = content; }}
• article.java (статья в виде текстового сообщения)
пакет com.gist.bean;/** * @author gao yuan </n> электронная почта: [email protected] </n> блог http://blog.csdn.net/wgyscsf </n> * * Период написания 2016-4-4 2:47:08 PM */Public Class Article {Private String TITL; @Override public String toString () {return "item [title =" + title + ", description =" + description + ", picurl =" + picurl + ", url =" + url + "]"; } public String getTitle () {return title; } public void settitle (строка заголовка) {title = title; } public String getDescription () {return description; } public void setDescription (строка описание) {description = description; } public String getPicurl () {return picurl; } public void setPicurl (String picurl) {picurl = picurl; } public String getUrl () {return url; } public void seturl (string url) {url = url; } частная строка описание; частная струна Picurl; Private String URL;}
• PicandTextMsg.java (графическое текстовое сообщение)
пакет com.gist.bean; импорт java.util.list;/** * @author gao yuan </n> электронная почта: [email protected] </n> блог http://blog.csdn.net/wgyscsf </n> * Письменное период 2016-4-4 2:47:08 PM */Public PickNtextMextmerSger; Приватная строка от Ususername; Частное длинное творчество; частная строка MSGTYPE; Частный int articlecount; частный список <статья> статьи; @Override public String toString () {return "picAndTextMsg [tousername =" + tousername + ", fromUsername =" + fromUsername + ", createTime =" + createTime + ", msgtype =" + msgtype + ", articlecount =" + articlecount + ", artculs =" + "]"] "]"] "]"] "]"] "]"] "]"] } public String getTouserName () {return tousername; } public void cettelousername (String tousername) {tousername = tousername; } public String getFromuserName () {return fromUserName; } public void setFromuserName (String fromUsername) {fromUserName = fromUserName; } public long getCreatetime () {return createTime; } public void setCreatetime (long createTime) {createTime = createTime; } public String getMsgType () {return msgtype; } public void setMsgType (String msgtype) {msgtype = msgtype; } public int getArticleCount () {return articleCount; } public void setarticleCount (int articleCount) {articleCount = articleCount; } public List <ctite> getarticles () {return article; } public void Setarticles (List <статья> статьи) {статьи = статьи; }}
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.