Как внедрить пользовательские персонализированные меню на WeChat, следующее приведено для вас введение
1. Глобальное описание <br /> Для получения подробного описания, пожалуйста, обратитесь к первым двум статьям.
2. Описание этой статьи <br /> Эта статья разделена на пять частей:
* Инкапсуляция класса инструментов AccessTokenutils
* Чтение и анализ пользовательских меню и персонализированных меню документов
* Анализ и строительство соответствующих бобов для меню JSON
* Внедрение пользовательских меню
* Реализация персонализированных меню WeChat Custom Menu Все типы меню даны. В конце этой статьи будут даны все демонстрационные исходные коды, включая первые четыре статьи в этой статье.
Инкапсуляция класса инструментов AccessTokenutils
Приведенная выше статья была подробно описана о приобретении и сохранении времени AccessTokens. Здесь предоставлена упакованные AccessTokenutils. Принцип реализации и чтение документов не будут предоставлены.
Accesstokenutils.java
пакет com.gist.utils; импорт java.io.file; import java.io.fileinputstream; import java.io.fileoutputstream; import java.io.ioexception; import java.io.inputStreamReader; import java.net.url; import javax.net.sslcureDecter; import.net.url; import javax.net.ssl.httpremread; com.gist.bean.access_token; import com.google.gson.gson;/** * @author gao yuan </n> электронная почта: [email protected] </n> http://blog.csdn.net/wgyscsf </n> * http:/4-7 5:444:3333. Статический окончательный длинный max_time = 7200 * 1000; // weChat позволяет максимально access_token Время долидности (MS) Частная статическая конечная строка tag = "weixinapitest"; // Tag Private Static Lints Appid = "WX889B020B3666B0B8 "6DA7676BF394F0A9F15FBF06027856BB"; // КЛЮЧ/ * * Этот метод реализует Access_token, сохраняет и сохраняет access_token только в течение 2 часов. Если он превышает два часа, повторно приобретайте его; Если он не превышает два часа, получите его напрямую. Этот метод зависит от *: public static String getAccessToken (); * * Идея: храните полученный access_token и текущее время в файле, * При извлечении определите разницу во времени между текущим временем и временем, записанным в хранилище. Если он больше, чем max_time, повторно приобретайте его и сохраните полученный доступ к файлу для замены исходного содержимого*, и если оно меньше, чем max_time, получите его напрямую. */ // Чтобы позвонить, не бросая исключения, все исключения пойманы здесь. Код немного длинный. Public Static String getaVedaccess_token () {gson gson = new gson (); // сторонняя jar, обрабатывает преобразование json и beans string maccess_token = null; // access_token, которое необходимо получить; FileOutputStream fos = null; // Выходная потоковая потоковая передача fileInputStream fis = null; // file file file = new file ("temp_access_token.temp"); // access_token sociation sociation try {// Если файл не существует, создать if (! File.exists ()) {file.createNewFile (); }} catch (Exception e1) {e1.printstacktrace (); } // Если размер файла равен 0, это означает, что в первый раз, когда вы используете его, сохраните access_token if (file.length () == 0) {try {maccess_token = getAccesstoken (); // get accessToken access_token at = new Access_token (); at.setaccess_token (maccess_token); at.setexpires_in (system.currenttimemillis () + ""); // Установить строку времени депозита json = gson.tojson (at); fos = new FileOutputStream (file, false); // Приложение fos.write ((json) .getbytes ()); // Сохранить AccessToken и текущее время в файл fos.close (); return maccess_token; } catch (Exception e) {e.printstackTrace (); }} else {// Читать содержимое файла byte [] b = new Byte [2048]; int len = 0; try {fis = new FileInputStream (file); len = fis.read (b); } catch (ioException e1) {// todo автоматически сгенерированный блок e1.printstacktrace (); } String mjsonaccess_token = new String (b, 0, len); // Содержимое файла чтения Access_token Access_token = gson.fromjson (mjsonaccess_token, new Access_token (). GetClass ()); if (access_token.getexpires_in ()! = null) {long savetime = long.parselong (access_token.getexpires_in ()); long nowtime = system.currenttimemillis (); Long Remiantime = сейчас - Savetime; // System.out.println (Tag + "Разница во времени:" + remiantime + "ms"); if (remiantime <max_time) {access_token at = gson.fromjson (mjsonaccess_token, new Access_token (). getClass ()); maccess_token = at.getaccess_token (); return maccess_token; } else {maccess_token = getAccessToken (); Access_token at = new Access_token (); at.setaccess_token (maccess_token); at.setexpires_in (system.currenttimemilsis () + ""); String json = gson.tojson (at); try {fos = new FileOutputStream (file, false); // Приложение fos.write ((json) .getbytes ()); fos.close (); } catch (ioException e) {// todo автоматически сгенерированный блок e.printstacktrace (); } вернуть maccess_token; }} else {return null; }} return maccess_token; } / * * Получите AccestOken сервера WeChat. Эта часть согласуется с getAccess_token (), комментариев не добавлено*/public static String getAccessToken () {string urlString = "https://api.wexin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "& secret =" + secert; String reslut = null; try {url requrl = new url (urlString); Httpsurlconnection httpsconn = (httpsurlconnection) requrl .openconcenection (); InputStreamReader ISR = новый inputStreamReader (httpsconn.getInputStream ()); char [] chars = new char [1024]; Reslut = ""; int len; while ((len = isr.read (chars))! = -1) {reslut += новая строка (chars, 0, len); } isr.close (); } catch (ioException e) {e.printstackTrace (); } Gson gson = new gson (); Access_token access_token = gson.fromjson (reslut, new access_token (). GetClass ()); if (access_token.getaccess_token ()! = null) {return access_token.getaccess_token (); } else {return null; }}}
Чтение и анализ пользовательских меню и персонализированных меню документов
• Пользовательское меню
◦ Create Menu Interface
° Custom Menu Interface Interface Interface
° Custom Menu Удалить интерфейс
° Custom Menu Event off
◦ Личность интерфейса меню
Configuration Menu Configuration of Office Account
• Адрес документа: http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html
• Официальный документ веб -сайта дает следующее объяснение:
* Интерфейс пользовательского меню может реализовать различные типы кнопок, следующим образом: 1. Нажмите: нажмите Event ...; 2. Просмотр: Jump Event ...; 3 .... (о пользовательском меню)
* Интерфейс-запрос на звонок Описание HTTP Метод запроса: post (пожалуйста, используйте протокол https) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=access_token (о пользовательском меню)
* Пример запроса для нажатия и просмотра {"кнопка": [...]} (о пользовательском меню)
* Описание параметра ... (о пользовательском меню)
* Создать персонализированное меню http Метод запроса: post (пожалуйста, используйте протокол https) https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=access_token (о персонализированном меню)
* Пример запроса: {"кнопка": [...], "matchrule": {...}} (о персонализированном меню)
* Описание параметра ... (о персонализированном меню)
* Разработчики могут установить меню, которые пользователи видят в следующих условиях (о персонализированном меню):
1. Группировка пользователей (бизнес -потребности разработчиков может быть завершены с помощью группировки пользователей)
2. Пол
3. Операционная система мобильного телефона
4. регион (регион, установленная пользователем в клиенте WeChat)
5. Язык (Язык, установленный пользователем на клиенте WeChat)
•понимать:
◦ - это знакомый запрос на почту снова, но я не совсем понимаю расплывчатые слова о вызове. Я просто знаю, что нам нужно использовать параметр "? Access_token = access_token", который мы получили в предыдущей статье. Если мы изменим адрес запроса «access_token» в документе WeChat на access_token, который мы получили, и посетим URL, мы увидим «{» errcode »: 44002,« errmsg »:« Пустое послание данных: [Gdveda0984vr23] ». Это, вероятно, означает, что пустые данные запроса поста. Поэтому нам необходимо передавать параметры на сервер WeChat через форму запроса POST, а формат параметров также приведен ниже документа: {«Кнопка»: […]}, поэтому нам нужно передавать параметры на сервер WeChat в этом формате.
◦ Что касается описания параметра, мы видим, что в создании пользовательских меню есть семь параметров. В дополнение к этим семи параметрам в интерфейсе персонализированного меню существует еще восемь параметров. Просто посмотрев на эту часть документа, мы можем понять, что эти восемь параметров используются для сопоставления и фильтрации для персонализированных меню.
◦ Теперь нам нужно построить JSON в соответствии с требованиями документа WeChat, чтобы отправить эту строку данных JSON на сервер WeChat через запрос POST, а JSON включает в себя различные типы событий кнопок, которые мы создали.
Анализ и строительство соответствующих бобов для меню JSON
Пользовательский меню JSON Анализ (за исключением персонализированного меню). Следующий код является примером, приведенным документом WeChat.
Пример запроса на клик и просмотр
{«Кнопка»: [{"type": "click", "name": "сегодняшняя песня", "ключ": "v1001_today_music"}, {"name": "menu", "sub_button": [{"type": "View", "name": "search", "url": "http://ww.sosososos". «type»: «View», «name»: «видео», «URL»: «http://v.qq.com/"}, {"type": "click", "name": "как мы", "ключ": "v1001_good"}]}]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} После анализа мы видим, что эта строка данных JSON разделена на три слоя: «кнопка»: [{…}, {…}] "," [{…}, {{"name": menu, "sub_button": [{}, {}]}] "," {"type": "View", ":" ",", ",", ",", ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": ":": "" "url": "..."}, {}, {}, {} ", что может выглядеть головокружение.
Однако, если мы сможем вспомнить меню WeChat, которое мы видим в реальности, его будет легче понять: Уровень 1: меню (одно меню), нижние кнопки от одного до трех родительских кнопок; Уровень 2: родительская кнопка (от 1 до 3 родительских кнопок), нижние кнопки от одного до пяти дочерних кнопок; Уровень 3: Дочерние кнопки (от 1 до 5 дочерних кнопок).
Теперь мы видим, что JSON и «меню», которые мы понимаем, могут соответствовать одному за другим. Теперь основное внимание уделяется тому, как подтвердить «имя уровня» каждого уровня, который является соответствующим объектом Javabean в Java.
В то же время, поскольку в меню первого уровня есть несколько родительских кнопок, он находится в форме списка <manu Menu>. Под родительской кнопкой может быть несколько подменю, которая также является списком <saper>; Тем не менее, родительская кнопка также может быть отдельной кнопкой отзывчиков. это отдельный родительский объект кнопки. Подразбаттон - это отдельный объект подмножества.
Глядя на описание параметра о пользовательском меню, мы видим, что кнопки разделены на кнопки первого уровня («кнопка») и кнопки второго уровня («sub_button»). Существуют также некоторые общие типы данных, такие как: тип ответа меню («Тип»), заголовок меню («Имя»), нажмите «Параметры типа» («Ключ»), параметры типа просмотра («URL»), тип Media_ID и параметры типа View_Limited («media_id»).
• Абстракция данных (без установки, getter написан):
// кнопка базового класса открытый класс BaseButton {Private String Type; Приватное название строки; частный ключ строки; частная строковая URL; private String media_id;} // sub -кнопка открытый класс Sonbutton Extends basebutton {private String sub_button;} // родительская кнопка открытого класса Patherbutton Extends basebutton {private String Button; // может быть родительская кнопка непосредственно на @serializedname («sub_button») // для обеспечения того, чтобы поиск подборочного подбора «pretemon» - «Подставка», пожалуйста, на подборе подчиненного »,« пожалуйста »,« пожалуйста », пожалуйста, на подборе подчиненного« pretivetton », пожалуйста, является подготовкой на подборе. Список <sonbutton> sonbuttons; // может быть несколько подборов} Меню открытого класса {@serializedname ("Кнопка") Частный список <ThoneButton> Отецбуттоны;}Выше приведено анализ полного пользовательского меню и строительства соответствующего Javabean.
Для персонализированного меню, если вы посмотрите на документацию в этом разделе, вы обнаружите, что он примерно такой же, как пользовательское меню, просто несколько «конфигурация» jsons, формат заключается в следующем: {«Кнопка»: […], «matchrule»: {…}}.
Мы обнаружили, что «совпадение» JSON и «Кнопка» имеет одинаковый уровень, а анализ и реализация в основном такие же, как и выше, и реализация Javabean напрямую дается.
// JSON, соответствующий JSON соответствующего MATCHRULE json Public Class {Private String Group_ID; Private String Sex; Private String client_platform_type; Private String Country; Private String Province; Private String City; Private String Language;} // Модифицировать меню. matchrule;} Внедрение пользовательских меню
Задача, мы реализуем все типы ответов на кнопки WeChat:
Задача (примечание: «M-0» означает кнопку «Родитель»; «Mn» означает кнопку MTH Parent, кнопку N-го дочернего ребенка (M, N ↓ 0)): 1-0: Имя: Нажмите, нажмите, нажмите Событие: Нажмите событие. 2-0: Имя: Кнопка Родителя 2. 2-1: Имя: Просмотр, Ответ Событие: Прыжок на веб-страницу; 2-2: имя: scancode_push, Событие ответа: scancode_waitmsg, Событие ответа: scancode_waitmsg, событие ответа: событие Scancode Push и открытие подсказок «Сообщение»; 2-4: Имя: PIC_SYSPOTO, Ответ Событие: всплыть систему, чтобы сфотографировать и публиковать фотографии. 2-5: Имя: PIC_PHOTO_OR_ALBUM, Ответ Событие: всплыть и делать фотографии или публиковать фотографии на альбоме. 3-0: Имя: Кнопка Родителя 3. 3-1: Имя: PIC_WEIXIN, Ответ Событие: Посчетное сообщение WeChat Sender; 3-2: имя: location_select, Ответ Событие: всплывающий селектор геолокации; 3-3: Имя: Media_id, Событие ответа: сообщение о доставке (кроме текстового сообщения); 3-4: Имя: View_Limited, Ответ Событие: ПРИМЕРКА URL-адрес графического сообщения.
Реализуйте исходный код (ссылка на AccestOkenTillis.java в первой части: инкапсуляция класса инструментов AccessTokenutils)
/ * * Создать пользовательское меню. */@Test public void createcommmenu () {string access_token = accesstokenutils.getaccesstoken (); // get accesstokenutils-это инкапсулированный класс // api httpsurl link urlstring = "https://api.weixin.qq.com/cci-bintrish Access_token; try {// создать URL url requrl = new URL (urlString); // Получить ссылку httpsurlconnection httpsconn = (httpsurlconnection) requrl .openconnection (); httpsconn.setDoOutput (true); // Получить выходной поток подключения для чтения контента ответа outputStreamWriter OSR = new OutputStreamWriter (httpsconn.getOutputStream ()); osr.write (getmenujson ()); // Использовать внешний метод этого класса для getMenujson () osr.close (); // возвращать результат inputStreamReader isr = new InputStreamReader (httpsconn.getInputStream ()); // Читать содержимое ответа сервера и отображение char [] chars = new char [1024]; String reslut = ""; int len; while ((len = isr.read (chars))! = -1) {reslut += новая строка (chars, 0, len); } System.out.println ("return result:" + Reslut); isr.close (); } catch (ioException e) {e.printstackTrace (); }} public String getMenujson () {gson gson = new gson (); // json обработка меню меню = новое меню (); // Список классов меню <Thoundbutton> Pathonbuttons = new Arraylist <dhonebutton> () ;// родительская коллекция пуговиц в меню // ---------------- // parent button1 wathenbutton fb1 = newtton; fb1.setName ("Щелкни"); fb1.settype ("Щелк"); fb1.setkey ("10"); // -------------------- // родительская пуговица2 patherbutton fb2 = new Patherbutton (); fb2.setname ("родительская кнопка 2"); Список <sonbutton> sonbuttons2 = new Arraylist <sonbutton> (); // Сборник детских кнопок // subbutton 2-1 Sonbutton sb21 = new Sonbutton (); sb21.setname ("view"); sb21.seturl ("http://www.baidu.com"); sb21.settype ("view"); // subbutton 2-2 Sonbutton SB22 = новый Sonbutton (); sb22.setname ("scancode_push"); sb22.settype ("scancode_push"); SB22.setKey ("22"); // subbutton 2-3 Sonbutton SB23 = новый Sonbutton (); sb23.setname ("scancode_waitmsg"); sb23.settype ("scancode_waitmsg"); SB23.setKey ("23"); // subbutton 2-4 Sonbutton SB24 = новый Sonbutton (); sb24.setname ("pic_sysphoto"); sb24.settype ("pic_sysphoto"); SB24.SetKey ("24"); // subbutton 2-4 Sonbutton SB24 = новый Sonbutton (); sb24.setname ("pic_sysphoto"); sb24.settype ("pic_sysphoto"); SB24.SetKey ("24"); // subbutton 2-4 Sonbutton SB24 = новый Sonbutton (); sb24.setname ("pic_sysphoto"); SB24.SetKey ("24"); // subbutton 2-5 Sonbutton SB25 = новый Sonbutton (); sb25.setname ("pic_photo_or_album"); sb25.settype ("pic_photo_or_album"); SB25.SetKey ("25"); // Добавить кнопку ребенка в кнопку «Установить кнопку» Sonbuttons2.add (SB21); Sonbuttons2.add (SB22); Sonbuttons2.add (SB23); Sonbuttons2.add (SB24); Sonbuttons2.add (SB25); // Поместите кнопку ребенка в 2-0 кнопку для родительской кнопки FB2.setsonbuttons (sonbuttons2); // -------------------- // Родительская кнопка 3 Отец. fb3.setname ("Presidy Button3"); Список <sonbutton> sonbuttons3 = new Arraylist <sonbutton> (); // subbutton 3-1 Sonbutton SB31 = новый Sonbutton (); sb31.setname ("pic_weixin"); sb31.settype ("pic_weixin"); sb31.setkey ("31"); // subbutton 3-2 Sonbutton SB32 = новый Sonbutton (); sb32.setname ("locateSelect"); sb32.settype ("location_select"); SB32.setKey ("32"); // // subbutton 3-3 ---> не может быть проверен, потому что требуется media_id. Это требует вызова идентификатора материала. // Sonbutton SB33 = новый Sonbutton (); // sb33.setname ("media_id"); // sb33.settype ("media_id"); // sb33.setmedia_id ("???"); // // subbutton 3-4-> не может быть протестирована, потому что требуется media_id. Это требует вызова идентификатора материала. // Sonbutton SB34 = новый Sonbutton (); // sb34.setname ("view_limited"); // sb34.settype ("view_limited"); // sb34.setmedia_id ("???"); // Добавить кнопку ребенка к детской кнопке очередь Sonbuttons3.add (SB31); Sonbuttons3.add (SB32); // sonbuttons3.add (SB33); // sonbuttons3.add (SB34); // Поместите детские кнопки в очередь кнопок 3-0 FB3.Setsonbuttons (Sonbuttons3); // -------------------------- // Добавить кнопку родительской кнопки в кнопку «Коллекция родительской». Отец Буттонов.Д. (FB2); Отец Буттонов.Д. (FB3); // Добавить родительскую очередь кнопок в меню меню меню .setfatherbuttons (отец -буттоны); String json = gson.tojson (меню); System.out.println (json); // Тест вывод возврата json; } Внедрение персонализированных меню
• Задача: отображать разные кнопки в соответствии с полом (можно сгруппировать по полу, региону, мобильной операционной системе и т. Д.)
• Изменить код 1. Поскольку он реализован различными фонами WeChat, интерфейс отличается. Тем не менее, это по -прежнему пост -запрос. Код не должен быть изменен. Просто замените оригинальное UrlString.
// ссылка httpsurl, требуемая сплайсинговой string urlstring = "https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=" + access_token;
• Измените код 2. Просто создайте Matchrule, установите правило соответствия, а затем добавьте MatchRule в меню, чтобы завершить правило соответствия.
// ------ // Начните установить персонализированное меню здесь matchrule matchrule = new matchrule (); matchrule.setsex ("2"); // Мальчики menu.setmatchrule (matchrule); // ---Скачать исходный код: http://xiazai.vevb.com/201606/yuanma/weixinapi(vevb.com).rar
Эта статья была составлена в «Резюме для разработки Android WeChat», и «Резюме по разработке Java WeChat» приветствует всех учиться и читать.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.