1. Personalizar la descripción del menú y el tipo de botón
1. Descripción del menú
1) Los menús personalizados incluyen hasta 3 menús de primer nivel, y cada menú de primer nivel contiene hasta 5 menús de segundo nivel.
2) El menú de primer nivel tiene hasta 4 caracteres chinos, y el menú de segundo nivel tiene hasta 7 caracteres chinos. Las partes adicionales serán reemplazadas por "...".
3) Después de crear un menú personalizado, la estrategia de actualización del menú es que cuando el usuario ingresa a la página de sesión de cuenta oficial o la página oficial de perfil de cuenta, si encuentra que la última solicitud para extraer el menú fue hace 5 minutos, extraerá el menú. Si el menú se actualiza, el menú del cliente se actualizará. Durante la prueba, puede intentar dejar de seguir la cuenta pública y seguirla nuevamente, y puede ver el efecto después de la creación.
2. La interfaz de menú personalizada puede implementar múltiples tipos de botones
1) Haga clic: Después de que el usuario haga clic en el botón Tipo de clic, al hacer clic en el evento PUSH, el servidor WeChat presionará la estructura del evento de tipo de mensaje al desarrollador a través de la interfaz de mensajes (consulte la Guía de la interfaz de mensajes) y traerá el valor de clave completado por el desarrollador en el botón. El desarrollador puede interactuar con el usuario a través del valor de clave personalizado;
2) Ver: Saltar URL Después de que el usuario haga clic en el botón Vista de Tipo, el cliente WeChat abrirá la URL de la página web que llena el desarrollador en el botón, que se puede combinar con la autorización de la página web para obtener la interfaz de información básica del usuario para obtener información básica del usuario.
3) Scancode_push: después de que el usuario haga clic en el botón para el evento de presentación del código de escaneo, el cliente WeChat llamará a la herramienta de escaneo y mostrará el resultado de escaneo después de completar la operación del código de escaneo (si es una URL, ingresará la URL), y el resultado del escaneo se pasará al desarrollador, y el desarrollador puede enviar un mensaje.
4) SCANCODE_WAITMSG: Escanee el código para presionar el evento y el cuadro de solicitud "Mensaje Recibir" aparece. Después de que el usuario haga clic en el botón, el cliente WeChat llamará a la herramienta de escaneo. Después de completar la operación de escaneo, el resultado del código de escaneo se pasa al desarrollador. Al mismo tiempo, la herramienta de escaneo está cerrada, y aparece el cuadro de solicitud "Mensaje de recibir", y luego se puede recibir un mensaje enviado por el desarrollador.
5) PIC_SYSPHOTO: después de que el usuario haga clic en el botón, el cliente WeChat ajustará la cámara del sistema. Después de completar la operación fotográfica, las fotos capturadas se enviarán al desarrollador y llevarán el evento al desarrollador. Al mismo tiempo, la cámara del sistema se cerrará y se puede recibir el mensaje enviado por el desarrollador.
6) PIC_PHOTO_OR_ALBUM: después de que el usuario haga clic en el botón, el cliente WeChat aparecerá el selector para que el usuario seleccione "Toma fotos" o "seleccione del álbum de teléfonos móviles". Después de que el usuario seleccione, pasará por los otros dos procesos.
7) Pic_weixin: después de que el usuario haga clic en el botón en el remitente del álbum de fotos de WeChat, el cliente WeChat ajustará el álbum de fotos de WeChat. Después de completar la operación de selección, la foto seleccionada se enviará al servidor del desarrollador y empujará el evento al desarrollador. Al mismo tiempo, el álbum estará cerrado. Luego, se puede recibir el mensaje enviado por el desarrollador.
8) Ubicación_Select: después de que el usuario haga clic en el botón Cuando el usuario hace clic en el botón, el cliente WeChat llamará a la herramienta de selección de geolocalización. Después de completar la operación de selección, la ubicación geográfica seleccionada se enviará al servidor del desarrollador, y la herramienta de selección de ubicación se cerrará. Luego, se puede recibir el mensaje enviado por el desarrollador.
9) Media_ID: después de que el usuario haga clic en el botón Tipo Media_ID, el servidor WeChat enviará el material correspondiente al ID de material permanente completado por el desarrollador al usuario. Los tipos de material permanente pueden ser imágenes, audio, video y mensajes gráficos. Tenga en cuenta: la ID de material permanente debe ser la ID legal obtenida después de cargar la interfaz "Gestión de material/Agregar material permanente".
10) Ver_LIMITED: salte la URL del mensaje gráfico después de que el usuario haga clic en el botón View_limited Type, el cliente WeChat abrirá la URL del mensaje gráfico correspondiente a la ID de material permanente que llena el desarrollador en el botón. El tipo de material permanente solo admite un mensaje gráfico. Tenga en cuenta: la ID de material permanente debe ser la ID legal obtenida después de cargar la interfaz "Gestión de material/Agregar material permanente".
Nota: Todos los eventos de 3 a 8 solo admiten usuarios de WeChat del iPhone 5.4.1 o superior, y Android 5.4 o superior. Los usuarios de la versión anterior de WeChat no responderán después de hacer clic, y los desarrolladores no pueden recibir los empujes de eventos normalmente. 9 y 10 son tipos de eventos especialmente preparados para cuentas de suscripción en plataformas de terceros que no han sido certificados por WeChat (específicamente, no están aprobados por la certificación de calificación). No tienen empuje de eventos y sus capacidades son relativamente limitadas. No es necesario utilizar otros tipos de cuentas públicas.
2. Crear/consultar/eliminar menús
Demo oficial de clics de clic y vista
{"Botón": [{"tipo": "Click", "Nombre": "Canción de hoy", "Key": "V1001_Today_Music"}, {"Nombre": "Menú", "Sub_Button": [{"Tipo": "View", "Nombre": "Buscar", "Url": "Http://www.SoSo.SoSo/" ", {{ "type": "miniprogram", "name": "wxa", "url": "http://mp.weixin.qqq.com", "appid": "wx286b93c14bbf93aa", "pagepath": "páginas/lunar/index"}, {"tipo": "click", "nombre", "nombre", "", "como us" "Key": "V1001_good"}]}]}Otros tipos (incluidos 9 y 10)
{"botón": [{"nombre": "scancode_waitmsg", "name": "scANCODE with Strem", "Key": "SelfMenu_0_0", "sub_button": []}, {"tipo": "Scancode_push", "Nombre": "Scancode_Push", "Nombre": "Scancode Push Event", "Key" Key "Key" "SelfMenu_0_1", "Sub_Button": []}]}, {"Nombre": "Enviar una imagen", "Sub_Button": [{"tipo": "pic_sysphoto", "nombre": "Fotos del sistema y publicar imágenes", "clave": "SelfMenu_1_0", "sub_button": []}, {"Tipo": "Tipo": ":" "pic_photo_or_album", "name": "take photos or albums to post pictures", "key": "selfmenu_1_1", "sub_button": [ ] }, { "type": "pic_weixin", "name": "WeChat album photos and post pictures", "key": "selfmenu_1_2", "sub_button": [ ] } ] }, {"Nombre": "Enviar ubicación", "Tipo": "Location_Select", "Key": "SelfMenu_2_0"}, {"Tipo": "Media_id", "Nombre": "Imagen", "Media_id": "Media_id1"}, {"Tipo": "View_Limited", "Nombre": "Mensaje gráfico", "Media_id": "Media_id": "Media": "1. Comience a encapsular la clase de entidad de acuerdo con el ejemplo
Botón de menú Clase base BasicButton.java
clase pública BasicButton {Nombre de cadena privada; public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; }} Menú.java
Menú de clase pública {cadena estática final pública click = "hacer clic"; // Haga clic en Menú Public Final Static String View = "Ver"; // Menú URL Public String final estática scancode_waitmsg = "scancode_waitmsg"; // Escanear el código con una cadena estatal final pública de inmediato scancode_push = "scancode_push"; // Escanear el código para impulsar eventos públicos Final static String pic_sysphoto = "pic_sysphoto"; // Sistema para tomar fotos y publicar la cadena estática final pública PIC_PHOTO_OR_ALBUM = "PIC_PHOTO_OR_ALBUM"; // Tome una foto o publique un álbum de fotos Public Final Static String pic_weixin = "pic_weixin"; // Publicar una foto en WeChat public Final Static String Ubication_Select = "Location_Select"; // Enviar ubicación Botón Private BasicButton []; public BasicButton [] getButton () {Botón de retorno; } public void setButton (BasicButton [] botón) {this.Button = Button; }} Ver Button Button Class ViewButton.java. Otros tipos se pueden empaquetar uno por uno de acuerdo con esto.
Public Class ViewButton extiende BasicButton {private String type = menu.view; URL de cadena privada; public String getType () {Tipo de retorno; } public void settype (tipo de cadena) {this.type = type; } public String getUrl () {return url; } public void seturl (url de cadena) {this.url = url; }}El menú de primer nivel contiene la encapsulación del menú de segundo nivel complejoMenu.java
Public Class ComplexMenu extiende BasicButton {private BasicButton [] sub_button; public BasicButton [] getSub_Button () {return sub_button; } public void setSub_Button (BasicButton [] sub_button) {this.sub_button = sub_button; }}2. Complete el embalaje, ensamble el menú
Menú estático privado getMenu () {ViewButton btn11 = new ViewButton (); btn11.setName ("prueba 11"); btn11.seturl ("http://www.qq.com"); ClickButton btn21 = new ClickButton (); btn21.setName ("Prueba 21"); btn21.setkey ("21"); ClickButton btn22 = new ClickButton (); btn22.setName ("prueba 22"); btn22.setkey ("22"); // Menú de nivel 1 (sin menú secundario) ComplexMenu mainbtn1 = new ComplexMenu (); mainbtn1.setName ("Prueba 1"); mainbtn1.setsub_button (nuevo BasicButton [] {btn11}); // Menú de nivel 1 (con menú secundario) ComplexMenu mainbtn2 = new ComplexMenu (); mainBtn2.SetName ("Prueba 2"); mainbtn2.setsub_button (nuevo BasicButton [] {BTN21, BTN22}); Menú menú = nuevo menú (); menú.setButton (nuevo BasicButton [] {MainBtn1, MainBtn2}); menú de devolución; }3. Creación de menús personalizados
/ ** * Menú creado * * @param Elemento del menú del menú * @param Token Authorization Token * @return {"errcode": 0, "errmsg": "ok"} */ public resulteState CreateMenu (menú, menú, string token) {Treemap <String, String> Map = New Treemap <String String, String> (); map.put ("access_token", token); Cadena jsondata = jsonutil.tojson (menú) .ToString (); Resultado de cadena = httprequtil.httpsdefaultExeCute (httprequtil.post_method, wechatconfig.menu_create_url, map, jsondata); return jsonutil.FromJson (resultado, resultState.class); }4. Consulta de menús personalizados
Instancia devuelta
Correspondiente a crear una interfaz, el JSON correcto devuelve el resultado:
{"menú": {"botón": [{"tipo": "clic", "nombre": "Song de hoy", "clave": "v1001_today_music", "sub_button": []}, {"type": "haga clic", "nombre": "perfil de cinger", "clave": "v1001_todayy", "sub_button": ":": ":": ":": ":" Subr. " "Nombre": "menú", "sub_button": [{"tipo": "ver", "nombre": "búsqueda", "url": "http://www.soso.com/", "sub_button": []}, {"tipo": "ver", "nombre": "video", "url": "http://v.qqqqq. "Sub_Button": []}, {"Tipo": "Click", "Nombre": "Like Us", "Key": "V1001_Good", "Sub_Button": []}]}]}} / ** * Obtener menú personalizado * * @param token * @return */ public string getMenu (string token) {Treemap <String, String> MAP = new Treemap <String, String> (); map.put ("access_token", token); String result = httprequtil.httpsdefaultExeCute (httprequtil.get_method, wechatconfig.menu_get_url, map, ""); resultado de retorno; }Menuattr.java
/ ** * Todas las propiedades del menú * @author Phil * */ public class Menuattr extiende BasicMenu {Tipo de cadena privada; URL de cadena privada; clave de cadena privada; Cadena privada sub_button; Método GET/SET} La clase de menú de menú devuelta Menureturn.java
/ ** * La clase de menú devuelta * @author Phil * */ public class Menureturn extiende BasicMenu {private Menuattr [] sub_button; Public Menuattr [] getSub_Button () {return sub_button; } public void setSub_Button (menúattr [] subbutton) {sub_button = subbutton; }}Convertir cadenas con formato JSON a objetos de menú
/ ** * Convierta una cadena en formato JSON a un objeto de menú * @param json * @return */ public list <Smenureturn> ConvertMenu (String JSON) {list <Menureturn> list = new ArrayList <Menureturn> (); if (json! = null &&! "". Equals (json)) {JsonObject Object = jsonObject.ParseObject (json); JSONArray array = object.getJsonObject ("menú"). GetJsonArray ("botón"); for (int i = 0; i <array.size (); i ++) {Menureturn MR = new Menureturn (); mr = array.getObject (i, Menureturn.class); list.add (MR); }} lista de retorno; }Nota: Fastjson usó aquí
Aquí hay un método que debe mejorarse. Por favor dame algún consejo si tienes otros mejores
5. Eliminar el menú personalizado
/ ** * Eliminar menú personalizado * * @param token * @return */ public boolean deletemenu (string token) {boolean falg = true; Treemap <String, String> MAP = new Treemap <String, String> (); map.put ("access_token", token); String result = httprequtil.httpsdefaultExeCute (httprequtil.get_method, wechatconfig.menu_delte_url, map, ""); ResultState state = jsonutil.FromJson (resultado, resultState.class); if (state.getErRcode ()! = 0 || state.getErrmsg ()! = "Ok") {false = false; } return false; }3. Push del evento de menú personalizado
Después de que el usuario haga clic en el menú personalizado, WeChat presionará el evento de clic al desarrollador. Tenga en cuenta que el menú de clics aparece el submenú y no generará un informe. Tenga en cuenta que todos los eventos del tercero al octavo solo admiten usuarios de WeChat del iPhone 5.4.1 o superior, y Android 5.4 o superior. Los usuarios de la versión anterior de WeChat no responderán después de hacer clic, y los desarrolladores no pueden recibir los empujes de eventos normalmente.
1. Analice el paquete de datos XML presionado por WeChat
/*** solicitudes de análisis de WeChat (xml)* XML Ejemplo* <xml> <tousername> <! [CDATA [TOUSER]]> </tousername> <FhiveUsername> <! [CDATA [frontUser]]> </fromUsername> <CreateTime> 123456789 </altetetime> <sgtype> <! [Cdata [event]]> </msgtype> <vent event> <! [Cdata [click]> </event> <eventkey> <! [Cdata [eventKey]]> </ventKey> </ xml> * @param request * @return * @throws excepción de excepción */public estatic map <string> string> parsexml (htttpservletreRequreRequreRequreRequreRequreRequreRequreRequest) El resultado analizado en el mapa hashmap <string, string> map = new Hashmap <String, String> (); // Obtenga la secuencia de entrada de la solicitud InputStream InputStream = request.getInputStream (); // Lea la entrada de transmisión saxreader lector = new saxreader (); Documento documento = lector.read (inputStream); // Obtener el elemento de raíz xml root = document.getRootElement (); // Obtenga todos los nodos infantiles de la lista de elementos raíz <emememento> elementList = root.elements (); // atraviesa todos los nodos infantiles para (elemento e: elementlist) map.put (e.getName (), e.gettext ()); // Libre el recurso inputStream.close (); inputStream = nulo; mapa de retorno; }
2. Use la get (clave) del mapa para obtener valor
Tipo de mensaje de msgtype, evento
Tipo de evento de evento, haga clic
EventKey El valor de la tecla de evento corresponde al valor de clave en la interfaz de menú personalizada
Nota: La clave es el nombre del parámetro
Adjunto: wechatconfig.java
// Cree un menú public static final String menu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create"; // consulta el menú personalizado public static final String menu_get_url = "https://api.weixin.qq.com/cgi-bin/menu/get"; // Eliminar el menú personalizado Public static final cadena menú_delte_url = "https://api.weixin.qq.com/cgi-bin/menu/delete";
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.