Развитие общественного счета WeChat, как правило, направлено на предприятия и организации. Люди могут подать заявку только на учетные записи подписки, а интерфейсы, которые они называют, ограничены. Давайте кратко опишем шаги по доступу к общественному аккаунту :
1. Прежде всего, вам нужен адрес электронной почты для регистрации на официальной платформе WeChat официальной учетной записи;
Методы регистрации включают в себя подписку, официальные счета, мини -программы и корпоративные счета. Люди, мы можем выбрать только учетные записи подписки здесь.
2. После регистрации мы входим в официальную платформу учетной записи ---> Разработка ---> Базовая конфигурация. Вам нужно заполнить URL и токен здесь. URL -адрес - это интерфейс, где мы используем сервер;
3. Если программа Java Web Server составлена и развернута на сервере и может быть запущена, вы можете отладить интерфейс онлайн на официальной учетной записи WeChat:
1) Выберите соответствующий интерфейс
2) Система будет генерировать таблицу параметров для этого интерфейса. Вы можете напрямую заполнить соответствующее значение параметра в текстовом поле (красная звездочка указывает, что это поле требуется)
3) Нажмите кнопку «Проверка задачи», чтобы получить соответствующую информацию о отладке
Например: шаги, чтобы получить Access_token:
1) Тип интерфейса: базовая поддержка
2) Список интерфейсов: get access_token interface/token
3) Заполните соответствующие параметры: Grant_type, Appid, секрет
4) Нажмите, чтобы проверить проблему
5) Результат и подсказка будут возвращены после успешной проверки, и результат: 200 OK, запрос: Запрос успешный означает, что проверка успешно
У нас есть больше проверки здесь, так это отладка интерфейса сообщений: текстовые сообщения, сообщения с изображениями, голосовые сообщения, видео -сообщения и т. Д.
4. Если вы не понимаете интерфейс, вы можете перейти к разработке-> Инструменты разработчика-> Документы разработчика в запросе
5. Разрешения на интерфейс: учетные записи подписки в основном имеют базовую поддержку, прием сообщений и некоторые интерфейсы в веб -службах.
Ниже мы в основном говорим о случае получения сообщений по учетным записям :
1. Вам нужно подать заявку на личную подписку на WeChat
2. URL-сервер и развертывание кода на стороне сервера (вы можете использовать Tencent Cloud или Alibaba Cloud Server)
1) AccountsServlet.java Class для проверки обработки сообщений с сервера WeChat и WeChat Server
Пакет cn.jon.wechat.servlet; импортировать java.io.ioexception; Импорт java.io.printwriter; Импорт javax.servlet.servletexception; Импорт javax.servlet.http.httpservlet; Импорт javax.servlet.http.httpservletrequest; Импорт javax.servlet.http.httpservletresponse; импортировать cn.jon.wechat.service.accountsservice; импортировать cn.jon.wechat.utils.signutil; Общедоступный класс AccountsServlet расширяет httpservlet {public accountsservlet () {super (); } public void destry () {super.destroy (); // Поместите свой код здесь}/ *** Подтвердить, что запрос поступает с сервера WeChat*/ public void Doget (httpservletrequest, httpservletresponse response) throws servletexception, ioexception {System.out.println («Запускает интерфейс -тест !!!); // WeChat шифровать сигнатуру сигнатуры строки = request.getParameter ("Signature"); // TimeStamp String TimeStamp = request.getParameter ("TimeStamp"); // случайное число string nonce = request.getParameter ("nonce"); // случайная строка string echoStr = request.getParameter ("echoStr"); Printwriter Out = response.getWriter (); // Проверьте запрос, проверив подпись. Если проверка является успешной, вернуть EchoStr как есть, указывая на то, что доступ успешен, в противном случае доступ к выходу из строя, если (Signutil.CheckSignature (подпись, временная метка, нере)) {out.print (echoStr); } out.close (); out = null; // response.encoderedirecturl ("success.jsp"); } /*** Сообщения процесса, отправленные сервером WeChat* /public void dopost (httpservlectrequest, httpservletresponse response) Throws ServletException, ioException {// получение, обработка и ответа на запрос сообщения. Setcharacterencoding ("utf-8"); response.setcharacterencoding ("UTF-8"); // Вызов основного типа бизнеса для принятия сообщений и сообщений процесса string respmessage = accountsservice.processrequest (request); // Сообщение ответа PrintWriter Out = response.getWriter (); out.print (respmessage); out.close (); } public void init () Throws ServletException {// Поместите свой код здесь}} 2) CINGUTIL.JAVA класс, класс инструментов проверки запроса, токен должен соответствовать токену, заполненному в WeChat
Пакет cn.jon.wechat.utils; Импорт java.security.messagedigest; Импорт java.security.nosuchalgorithmexception; импортировать java.util.arrays; импортировать java.util.iterator; импортировать java.util.map; импортировать java.util.set; импортировать java.util.concurrent.concurrenthashmap; /*** Класс инструмента проверки запроса* @author Jon*/public Class Signutil {// Соответствует токену в конфигурации WeChat Private Static String Token = ""; Public Static Boolean CheckSignature (STRING Signature, String TimeStamp, String nonce) {string [] array = new String [] {token, timestamp, nonce}; //Arrays.sort(Arra); StringBuilder SB = new StringBuilder (); for (int i = 0; i <arra.length; i ++) {sb.append (arra [i]); } MessagegeIgest md = null; String stnstr = null; try {md = messagegest.getinstance ("sha-1"); byte [] digest = md.digest (sb.tostring (). getbytes ()); stnstr = bytetostr (digest); } catch (nosuchalgorithmexception e) {// todo автоматически сгенерированный блок e.printstacktrace (); } // Свободная память sb = null; // Сравните зашифрованную строку SHA1 с подписью, определив, что запрос поступает из weChat return stnstr! = Null? Stnstr.equals (signature.touppercase ()): false; } / ** * преобразовать байтовые массивы в шестнадцатеричную строку * @param digestarra * @return * / private static String bytetoStr (byte [] digestarra) {// todo автоматически генерируемый метод Stub string digeststr = ""; for (int i = 0; i <digestarra.length; i ++) {digeststr+= bytetohexstr (digestarra [i]); } return digeststr; } / *** конвертировать байты в шестнадцатеричную строку* / частная статическая строка BytetoHexstr (byte dbyte) {// todo Автогенерированный метод Stub char [] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; char [] tmparr = new char [2]; tmparr [0] = Digit [(dbyte >>> 4) & 0x0f]; tmparr [1] = Digit [dbyte & 0x0f]; String s = new String (tmparr); возврат S; } public static void main (string [] args) { /*byte dbyte = 'a'; System.out.println (bytetohexstr (dbyte));*/ map <string, string> map = new conturrenthashmap <string, string> (); map.put ("4", "Zhangsan"); map.put ("100", "lisi"); Set set = map.keyset (); Итератор iter = set.iterator (); while (iter.hasnext ()) {// string keyv = (string) iter.next (); String key = (string) iter.next (); System.out.println (map.get (key)); // System.out.println (map.get (iter.next ())); } /*for (int i = 0; i <map.size (); i ++) {}* /}} 3) Класс сервисов AccountsService.java, в основном для запроса сообщений и обработки ответов, и когда пользователи следуют вашей официальной учетной записи, они могут устанавливать сообщения Push -по умолчанию
Пакет cn.jon.wechat.service; импортировать java.util.date; импортировать java.util.map; Импорт javax.servlet.http.httpservletrequest; Импорт cn.jon.wechat.message.req.imagemessage; Импорт cn.jon.wechat.message.req.linkmessage; Импорт cn.jon.wechat.message.req.locationmessage; Импорт cn.jon.wechat.message.req.videomessage; Импорт cn.jon.wechat.message.req.voecemessage; Импорт cn.jon.wechat.message.resp.textmessage; Импорт cn.jon.wechat.utils.messageutil; / *** Разреация, отделить уровень управления от слоя бизнес -логики, в основном дело с запросами и ответа* @author Jon*/ public Class AccountsService {public Static String ProcessRequest (httpserveltrequest) {string respmessage = null; // Содержимое текстового сообщения, возвращаемое строкой по умолчанию respcontent = "Исключение обработки запросов, попробуйте позже!"; try {// xml -запрос карты анализа <string, string> requestmap = messageutil.parexml (request); // учетная запись отправителя (open_id) string fromusername = requestmap.get ("fromusername"); // Строка публичной учетной записи tousername = requestmap.get ("tousername"); // тип сообщения string msgtype = requestmap.get ("msgtype"); // Ответить на это текстовое сообщение по умолчанию TextMessage defaultTextMessage = new TextMessage (); DefaultTextMessage.setTouserName (FromSusername); defaulttextmessage.setfromusername (tousername); DefaultTextMessage.SetCreatEtime (new Date (). getTime ()); DefaultTextMessage.setMsgType (messageUtil.messsage_type_text); defaulttextmessage.setfuncflag (0); // Поскольку значение атрибута HREF должно быть вызвано двойными кавычками, это конфликт с двойными цитатами самой строки, DefaultTextMessage.SetContent должен быть сбежал («Добро пожаловать в <a href =/" http://blog.csdn.net/j086924/ "> блог Джона </a>!"); // defaultTextMessage.setContent (getMainMenu ()); // конвертировать объект текстового сообщения в xml string respmessage = messageutil.textmessagetoxml (defaulttextmessage); // Текстовое сообщение if (msgtype.equals (messageutil.messsage_type_text)) {// respcontent = "Привет, вы отправляете текстовое сообщение!"; // Ответить на текстовое сообщение TextMessage TextMessage = new TextMessage (); // textmessage.settousername (tousername); // textmessage.setfromusername (fromusername); // ПРИМЕЧАНИЕ ЗДЕСЬ, в противном случае сообщение нельзя ответить пользователю TextMessage.setTouserName (fromUsername); TextMessage.SetFromuserName (TouserName); TextMessage.SetCreatetime (new Date (). getTime ()); textmessage.setmsgtype (messageutil.messsage_type_text); TextMessage.setFuncflag (0); respcontent = "Привет, отправленное вами сообщение:"+requestmap.get ("content"); TextMessage.SetContent (RespContent); respmessage = messageutil.textmessageToxml (TextMessage); } // Сообщение изображения else if (msgtype.equals (messageutil.messsage_type_image)) {ImageMessage ImageSessage = new ImageMessage (); ImageMessage.setTouserName (от ususername); ImageMessage.setFromuserName (tousername); ImageMessage.setCreatetime (new Date (). getTime ()); ImageMessage.setMsgType (messageUtil.messsage_type_image); //respcontent=requestmap.get("picurl "); ImageMessage.setPicurl ("http://img24.pplive.cn//2013/07//24//12103112092_230x306.jpg"); respmessage = messageUtil.imagemessageToxml (ImageMessage); } // географическое местоположение else if (msgtype.equals (messageutil.messsage_type_location)) {locationmessage locationmessage = new locationmessage (); locationmessage.settousername (от ususername); locationmessage.setfromusername (tousername); locationmessage.setCreatetime (new Date (). getTime ()); locationmessage.setmsgtype (messageutil.messsage_type_location); locationmessage.setLocation_x (requestmap.get ("location_x")); locationmessage.setLocation_y (requestmap.get ("location_y")); locationmessage.setscale (requestmap.get ("Scale")); locationmessage.setlabel (requestmap.get ("label")); respmessage = messageUtil.locationMessageToxml (locationMessage); } // видео -сообщения else if (msgtype.equals (messageutil.messsage_type_video)) {videomessage videomessage = new Videomessage (); VideOmessage.SetTOUSERNAME (FROMUSERNAME); Videomessage.setFromuserName (TouserName); videomessage.setCreatetime (new Date (). getTime ()); videomessage.setmsgtype (messageutil.messsage_type_video); VideOmessage.setMediAid (requestMap.get ("MediaId")); videomessage.setthumbmediaid (requestmap.get ("thumbmediaid")); respmessage = messageUtil.videomessageToxml (Videomessage); } // Сообщение ссылки else if (msgtype.equals (messageutil.messsage_type_link)) {linkmessage linkmessage = new Linkmessage (); linkmessage.settousername (fromusername); linkmessage.setfromusername (tousername); linkmessage.setCreatetime (new Date (). getTime ()); linkmessage.setmsgtype (messageutil.messsage_type_link); linkmessage.settitle (requestmap.get ("title")); linkmessage.setDescription (requestmap.get ("description")); linkmessage.seturl (requestmap.get ("url")); respmessage = messageutil.linkmessageToxml (linkmessage); } // Голосовое сообщение else if (msgtype.equals (messageutil.messsage_type_voice)) {voicemessage voicemessage = new voicemessage (); voicemessage.settousername (fromusername); voicemessage.setfromusername (tousername); voicemessage.setCreatetime (new Date (). getTime ()); voicemessage.setmsgtype (messageutil.messsage_type_voice); voicemessage.setmediaid (requestmap.get ("mediaid")); voicemessage.setformat (requestmap.get ("format")); respmessage = messageutil.voemessageToxml (voicemessage); } // uevent push else if (msgtype.equals (messageutil.messsage_type_event)) {// type type string eventtype = requestmap.get ("event"); // подписаться if (eventtype.equals (messageutil.event_type_subscribe)) {respcontent = "Спасибо за внимание!"; } // unsubScribe else if (eventType.equals (messageUtil.event_type_unsubscribe)) {// system.out.println ("unsubscribe"); } else if (eventType.equals (messageUtil.event_type_click)) {// Custom Menu Message System.out.println ("Обработка сообщений на заказ"); }}} catch (Exception e) {// todo Автогенерированный блок улова e.printstacktrace (); } return respmessage; } public Static String getMainMenu () {StringBuffer buffer = new StringBuffer (); buffer.append («Привет, я Джон, пожалуйста, ответьте на службу выбора номеров:»). Append ("/n"); buffer.append ("1. мой блог"). Append ("/n"); buffer.append ("/n"); Buffer.Append ("2. Song On Demand"). Append ("/n"); buffer.append ("3. Classic Game"). Append ("/n"); buffer.append («4. чат и воспроизводить карты»). Append ("/n/n"); buffer.append ("reply"+"0"+"Показать меню справки"); return buffer.tostring (); }} 4) Согласно классу справочного класса MessageUtil.java, включая постоянное определение и преобразование и обработку сообщений XML
Пакет cn.jon.wechat.utils; импортировать java.io.inputstream; Импорт java.io.writer; импортировать java.util.hashmap; импортировать java.util.list; импортировать java.util.map; Импорт javax.servlet.http.httpservletrequest; Импорт org.dom4j.document; Импорт org.dom4j.element; Импорт org.dom4j.io.saxReader; Импорт cn.jon.wechat.message.req.imagemessage; Импорт cn.jon.wechat.message.req.linkmessage; Импорт cn.jon.wechat.message.req.locationmessage; Импорт cn.jon.wechat.message.req.videomessage; Импорт cn.jon.wechat.message.req.voecemessage; Импорт cn.jon.wechat.message.req.voecemessage; Импорт cn.jon.wechat.message.resp.textmessage; Импорт cn.jon.wechat.message.resp.musicmessage; Импорт cn.jon.wechat.message.resp.textmessage; Импорт cn.jon.wechat.message.resp.textmessage; Импорт cn.jon.wechat.message.resp.textmessage; Импорт cn.jon.wechat.message.resp.textmessage; Импорт com.thoutworks.xstream.xstream; Import Com.ThoughTworks.xstream.core.util.quickwriter; Import Com.ThoughTworks.xstream.io.hierarchicalStreamWriter; Import Com.ThoughTworks.xstream.io.xml.prettyprintwriter; Import Com.ThoughtWorks.xstream.io.xml.xppdriver; / *** Различные классы обработки сообщений* @author Jon*/ public class messageUtil {/ *** Тип текста*/ public static final String messsage_type_text = "text"; / *** Тип музыки*/ public Static Final String Messsage_type_music = "Music"; / *** Тип изображения*/ public Static Final String Messsage_type_news = "News"; / *** Тип видео*/ public static final String messsage_type_video = "видео"; / *** Тип изображения*/ public static final String messsage_type_image = "image"; / *** Тип ссылки*/ public static final String messsage_type_link = "link"; / *** Тип географического местоположения*/ public Static Final String Messsage_type_location = "location"; / *** Аудио -тип*/ public static final String messsage_type_voice = "Voice"; / *** push type*/ public static final String messsage_type_event = "event"; / ** * Тип события: подписка (подписаться) */ public Static Final Final String Event_type_subscribe = "Подписаться"; / ** * Тип события: UNSOUBSCRIBE (USOUBSCRIBE) */ Public Static Final String Event_type_unsubscribe = "UnsubScribe"; / ** * Тип события: нажмите (Custom Menu Click Event) */ public Static Final String Event_type_click = "click"; /** * * * Запрос на диапазон XML Отправлено WeChat */@SuppressWarnings ("unchecked") Общедоступная статическая карта <строка, строка> parexml (httpservletrequest) выбрасывает исключение {// хранилище // Получить поток ввода из запроса inputStream inputStream = request.getInputStream (); // Читать входной поток SaxReader Reader = new SaxReader (); Document Document = reader.read (inputStream); // Получить элемент элемента xml root root = document.getRootelement (); // Получить все дочерние узлы списка элементов корневых элементов <element> elementlist = root.elements (); // Переливание всех дочерних узлов для получения содержания класса информации для (element elem: elementlist) {reqmap.put (elem.getName (), elem.getText ()); } // Выпустить ресурс inputstream.close (); inputStream = null; вернуть reqmap; } / ** * Преобразовать сообщение ответа в XML, чтобы вернуть * текстовый объект в XML * / public Static String TextMessAgeToxml (TextMessage TextMessage) {xstream.alias ("xml", textmessage.getClass ()); вернуть xstream.toxml (textmessage); } / ** * Преобразование голосового объекта в xml * * / public static String voicemessagetoxml (voicemessage voicemessage) {xstream.alias ("xml", voicemessage.getClass ()); вернуть xstream.toxml (voicemessage); } / ** * Преобразование видеообъекта в XML * * / public Static String VideomessAgeToxml (VideOmessage Videomessage) {xstream.alias ("xml", videomessage.getClass ()); вернуть xstream.toxml (Videomessage); } / ** * Преобразование музыкальных объектов в xml * * / public static String musicmessagetoxml (musicmessage musicmessage) {xstream.alias ("xml", musicmessage.getclass ()); return xstream.toxml (musicmessage); } / ** * Преобразование графических объектов в xml * * / public static String newsmessagetoxml (Newsmessage Newsmessage) {xstream.alias ("xml", newsmessage.getClass ()); xstream.alias ("item", new article (). getClass ()); вернуть xstream.toxml (newsmessage); } / ** * Преобразовать объект изображения в XML * * / public Static String ImageSeSsageToxml (ImageMessage ImageMessage) {xstream.alias ("xml", imageMessage.getClass ()); return xstream.toxml (ImageMessage); } / ** * Преобразовать объект ссылки в XML * * / public Static String LinkMessAgeToxml (linkmessage linkmessage) {xstream.alias ("xml", linkmessage.getClass ()); вернуть xstream.toxml (linkmessage); } / ** * Преобразовать объект геолокации в XML * * / public Static String locationMessagetoxMl (locationMessage locationMessage) {xstream.alias ("xml", locationmessage.getClass ()); return xstream.toxml (locationmessage); } /*** Разверните XStream для поддержки блоков CDATA** /private static xstream xstream = new xstream (new xppdriver () {public hierarchcalstreamwriter createwriter (writer out) {return new prettyprintwriter (Out) {// Добавить cdata Tags undececked @ssuprspressepressed @ssuprvessed void startnode (string name, class clazz) {super.startnode (имя, clazz); }}); } 5) BaseMessage.java Base Base Class (включая: разработчик WeChat Account, учетная запись пользователя, время создания, тип сообщения, переменная идентификатора сообщения), текст, видео и сообщения изображения унаследован в этом базовом классе, и на этом основании он будет расширять свои собственные переменные и может быть определена на основе различных атрибутов сообщений в документе разработчика.
Пакет cn.jon.wechat.message.req; /** * Базовый класс сообщений (обычная пользовательская учетная запись) * @author Jon */public class basemessage {// разработчик WeChat ID Private String Tousername; // учетная запись отправителя (One OpenID) частная строка от UsuserName; // Время создания сообщений (целое число) частное долгое время времени; // Тип сообщения (Text/Image/Location/Link ...) Private String MSGTYPE; // идентификатор сообщения 64-битный целое число частной строки MSGID; public basemessage () {super (); // TODO Автогенерированный конструктор stub} public basemessage (String tousername, String fromusername, Long CreateTime, String msgtype, String msgid) {super (); Tousername = tousername; Fromusername = fromusername; CreateTime = createTime; Msgtype = msgtype; Msgid = msgid; } 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 getMsgid () {return msgid; } public void setMsgid (String msgid) {msgid = msgid; }} 6) TextMessage.java Текстовое сообщение, унаследованное от базового класса в 5, расширяя атрибуты контента
Пакет cn.jon.wechat.message.req; /*** Текстовое сообщение* @author Jon*/public Class TextMessage Extends baseMessage {// Содержимое сообщества частная строка содержимого; public String getContent () {return Content; } public void setContent (String Content) {this.content = content; }}7) ImageMessage.java Image Сообщение
Пакет cn.jon.wechat.message.req; /*** Сообщение изображения* @author Jon*/public Class ImageSessage Extends baseMessage {// pic link Private String picurl; public String getPicurl () {return picurl; } public void setPicurl (String picurl) {picurl = picurl; }} 8) Videomessage.java Видеосвязь
Пакет cn.jon.wechat.message.req; Public Class Videomessage Extens BaseMessage {Private String MediaID; частная строка Thumbmediaid; public String getMediAid () {return mediaId; } public void setMediAid (String MediaId) {this.Mediaid = mediaID; } public String getThumbMediAid () {return thumbmediaid; } public void setThumbMediAid (String ThumbMediAid) {this.ThumbMediAid = ThumbMediAID; }}Другие классы сообщений могут быть завершены сами по себе на основе документации разработчика. Кроме того, разработчики также могут подать заявку на общедоступную тестовую учетную запись платформы для проверки соответствующего содержания разработки.
Эта статья была составлена в «Резюме для разработки Android WeChat», и «Резюме по разработке Java WeChat» приветствует всех учиться и читать.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.