Comment mettre en œuvre des menus personnalisés personnalisés sur WeChat, ce qui suit est une introduction à vous
1. Description globale <r /> Pour une description détaillée, veuillez vous référer aux deux premiers articles.
2. Description de cet article <br /> Cet article est divisé en cinq parties:
* Encapsulation de la classe d'outils AccessTokenUtils
* Lecture et analyse des menus personnalisés et des documents de menu personnalisés
* Analyse et construction de haricots correspondants pour le menu JSON
* Implémentation de menus personnalisés
* Mise en œuvre des menus personnalisés Menu personnalisé Tous les types de menus sont donnés. À la fin de cet article, tous les codes source de démonstration, y compris les quatre premiers articles de cet article, seront donnés.
Encapsulation de la classe d'outils AccessTokenUtils
L'article ci-dessus a été introduit en détail sur l'acquisition et la sauvegarde du calendrier d'accès à AccessTokens. Ici, l'accès emballé est directement donné. Le principe de mise en œuvre et la lecture de documents ne seront pas donnés.
AccessTokenUtils.java
package com.gist.utils; import java.io.file; import java.io.fileInputStream; import java.io.fileoutputStream; import java.io.ioexception; import java.io.inputstreamreader; com.gist.bean.access_token; import com.google.gson.gson; / ** * @author gao yuan </n> e-mail: [email protected] </ n> blog http://blog.csdn.net/wgyscsf </n> * Écriture 2016-4-7 5:44:33 pm * static final long max_time = 7200 * 1000; // wechat permet maximum access_token de validité du temps (ms) private static final string tag = "weixinapitest"; // tag private static final string appid = "wx889b020b3666b0b8"; // appid private static string sect = "6da7676bf394f0a9f15fbf06027856bb"; // key / * * Cette méthode implémente Access_token, enregistre et enregistre Access_token pendant seulement 2 heures. S'il dépasse deux heures, réinstallez-la; S'il ne dépasse pas deux heures, obtenez-le directement. Cette méthode dépend de *: chaîne statique publique getAccessToken (); * * Idée: stockez l'accès obtenu_token et l'heure actuelle dans le fichier, * Lors de l'extraction, déterminez la différence de temps entre l'heure actuelle et l'heure enregistrée dans le stockage. S'il est supérieur à max_time, réacquérirez-le et stockez l'accès obtenu au fichier pour remplacer le contenu d'origine *, et s'il est inférieur à max_time, obtenez-le directement. * / // Pour appeler sans lancer des exceptions, toutes les exceptions sont prises ici. Le code est un peu long. String statique publique getavedAccess_token () {gson gson = new gson (); // jar tiers, gère la conversion de JSON et de la chaîne de beans maccess_token = null; // Access_token qui doit être obtenue; FileOutputStream fos = null; // stream stream fileInputStream fis = null; // File Stream File File = new File ("temp_access_token.Temp"); // Access_Token Enregistrer l'emplacement TRY {// Si le fichier n'existe pas, créer if (! File.exists ()) {file.createwfile (); }} catch (exception e1) {e1.printStackTrace (); } // Si la taille du fichier est égale à 0, cela signifie que la première fois que vous l'utilisez, enregistrez Access_Token if (file.length () == 0) {try {macCess_token = getAccessToken (); // Obtenir AccessToken Access_Token à = new Access_Token (); at.setAccess_token (maccess_token); at.setExpires_in (System.currentTimemillis () + ""); // définir la chaîne de temps de dépôt json = gson.tojson (at); fos = new FileOutputStream (fichier, false); // append fos.write ((json) .getBytes ()); // Enregistrer l'accès et l'heure actuelle dans le fichier fos.close (); return macCess_token; } catch (exception e) {e.printStackTrace (); }} else {// lire le contenu du fichier byte [] b = nouveau octet [2048]; int len = 0; try {fis = new FileInputStream (fichier); len = fis.read (b); } catch (ioException e1) {// TODO GÉNÉRÉ AUTO GÉNÉRÉ BLOC E1.PRINTSTACKTRACE (); } String mjsonAccess_token = new String (b, 0, len); // le contenu du fichier de lecture 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 Remitime = Nowtime - Savetime; // System.out.println (Tag + "Différence horaire:" + REMIMIME + "MS"); if (remimitime <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 à = new Access_token (); at.setAccess_token (maccess_token); at.setExpires_in (System.currentTimemillis () + ""); String json = gson.tojson (at); try {fos = new FileOutputStream (file, false); // append fos.write ((json) .getBytes ()); fos.close (); } catch (ioException e) {// TODO Bloc de capture généré automatiquement e.printStackTrace (); } return macCess_token; }} else {return null; }} return macCess_token; } / * * Obtenez le serveur WeChat AccessToken. Cette partie est cohérente avec getAccess_token (), aucun commentaire n'est ajouté * / public static String getAccessToken () {String urlString = "https://api.weixin.qq.com/cgi-bin/token?grant_type=Client_Credential&appid=" + appid + "& secret =" + Secert; String resLut = null; try {url requl = new url (urlstring); HttpSurlConnection httpsConn = (httpSurlConnection) requrl .OpenConnection (); InputStreamReader ISR = new inputStreamReader (httpsConn.getInputStream ()); char [] chars = nouveau char [1024]; reslut = ""; int len; while ((len = isr.read (chars))! = -1) {reslut + = new String (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; }}}
Lecture et analyse des menus personnalisés et des documents de menu personnalisés
• Menu personnalisé
Interface de menu de création
◦ Interface de requête de menu personnalisée
◦ Menu personnalisé Supprimer l'interface
◦ Custom menu Event Push
Interface de menu personnalisée
◦ Obtenez la configuration du menu du compte officiel
• Adresse du document: http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html
• Le document officiel du site Web donne l'explication suivante:
* L'interface de menu personnalisée peut implémenter différents types de boutons, comme suit: 1. Cliquez: cliquez sur l'événement ...; 2. Voir: événement de saut ...; 3 .... (à propos du menu personnalisé)
* Demande d'appel d'interface Description Méthode de la demande HTTP: POST (Veuillez utiliser le protocole HTTPS) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=access_token (sur le menu personnalisé)
* Exemple de demande de clic et de vue {"bouton": [...]} (à propos du menu personnalisé)
* Description des paramètres ... (à propos du menu personnalisé)
* Créer un menu personnalisé Méthode de demande HTTP: POST (Veuillez utiliser le protocole HTTPS) https://api.weixin.qq.com/cgi-bin/menu/addconditional?Access_token=Access_Token (à propos du menu personnalisé)
* Exemple de demande: {"Button": [...], "MatchRule": {...}} (À propos du menu personnalisé)
* Description des paramètres ... (à propos du menu personnalisé)
* Les développeurs peuvent définir les menus que les utilisateurs voient dans les conditions suivantes (à propos du menu personnalisé):
1. Groupement d'utilisateurs (les besoins de l'entreprise des développeurs peuvent être complétés à l'aide du regroupement des utilisateurs)
2. Sexe
3. Système d'exploitation de téléphonie mobile
4. Région (la région définie par l'utilisateur du client WeChat)
5. Langue (langage défini par l'utilisateur sur le client WeChat)
•comprendre:
◦ Il s'agit à nouveau d'une demande de poste familière, mais je ne comprends pas très bien les mots vagues sur l'appel. Je sais juste que nous devons utiliser le paramètre "? Access_token = access_token", que nous avons obtenu dans l'article précédent. Si nous modifions l'adresse de demande "Access_token" dans le document WeChat vers l'accès_token que nous avons obtenu et visiterons l'URL, nous verrons "{" errcode ": 44002," errmsg ":" vide Post Data Hint: [gdveda0984vr23] "}". Cela signifie probablement que les données de demande de poste vides. Par conséquent, nous devons transmettre des paramètres au serveur WeChat via la forme de la demande de post, et le format de paramètre est également donné sous le document: {"bouton": […]}, nous devons donc transmettre des paramètres au serveur WeChat dans ce format.
◦ Concernant la description des paramètres, nous pouvons voir qu'il y a sept paramètres dans la création de menu personnalisé. En plus de ces sept paramètres dans l'interface de menu personnalisée, il y a huit autres paramètres. En examinant simplement cette partie du document, nous pouvons comprendre que ces huit paramètres sont utilisés pour faire correspondre et filtrer les menus personnalisés.
◦ Dans ce cas, nous devons construire JSON en fonction des exigences du document WeChat pour envoyer cette chaîne de données JSON au serveur WeChat via la demande de poste, et JSON comprend différents types d'événements boutonnés que nous avons créés.
Analyse et construction de haricots correspondants pour menu json
Menu personnalisé Analyse JSON (à l'exclusion du menu personnalisé). Le code suivant est un exemple donné par le document WeChat.
Exemple de demande de clic et de vue
{"Button": [{"type": "cliquez", "nom": "Today's Song", "Key": "v1001_today_music"}, {"name": "menu", "sub_button": [{"type": "voir", "nom": "search", "url": "http:///www.soso.com/". " "Type": "View", "Name": "Video", "URL": "http://v.qq.com/"}, {"type": "cliquez", "nom": "comme nous", "key": "v1001_good"}]}]]} Après l'analyse, nous pouvons voir que cette chaîne de données JSON est divisée en trois calques: "" Button ": [{…}, {…}]", "[{…}, {{" name ": menu," sub_button ": [{}, {}]}]", "{" Type ":" View "," name: ":" vidéo ",", ",", ",", ",", ",", ",", vidéo ",", ",", ",", ",", ", vidéo", ",", ",", ",". "URL": "..."}, {}, {}, {} ", qui peut sembler étourdi.
Cependant, si nous pouvons nous rappeler le menu WeChat que nous voyons en réalité, il sera plus facile à comprendre: Menu de niveau 1: (un menu), les boutons des parents inférieurs; Niveau 2: Bouton parent (1 à 3 boutons parents), les boutons de l'enfant inférieur à cinq; Niveau 3: boutons de l'enfant (boutons 1 à 5 enfants).
Maintenant, nous pouvons voir que JSON et le "menu" que nous comprenons peuvent correspondre un par un. L'objectif est maintenant de savoir comment confirmer le "nom de niveau" de chaque niveau, qui est l'objet JavaBean correspondant en Java.
En même temps, car il y a plusieurs boutons parents dans le menu de premier niveau, il se présente sous la forme d'une liste <menu parent>. Il peut y avoir plusieurs sous-menues sous le bouton parent, qui est également une liste <sous-menu>; Cependant, le bouton parent peut également être un bouton réactif séparé. est un objet de bouton parent séparé. Un subbutton est un objet Subbutton séparé.
En regardant la description du paramètre du menu personnalisé, nous pouvons voir que les boutons sont divisés en boutons de premier niveau ("bouton") et des boutons de second niveau ("sub_button"). Il existe également certains types de données courants, tels que: type de réponse de menu ("type"), titre de menu ("nom"), cliquez sur les paramètres de type ("KEY"), les paramètres de type affichage ("URL"), Media_id Type et View_limited Type Paramètres ("media_id").
• Abstraction de données (pas de secteur, Getter écrit):
// Classe de base de la base de bouton Public Classe BaseButton {Type de chaîne privée; nom de chaîne privé; clé de chaîne privée; URL de chaîne privée; String privé Media_id;} // Bouton sous-bouton public Classe publique Sonbutton étend BaseButton {String privé sub_button;} // Bouton parent Classe publique Public Buttton étend Basebutton {Button de chaîne privée; // peut-être un bouton parent répond directement à @SerializedName ("Sub_button") // pour que le nom du subbutton après GSON PARSES soit "sub_button". Liste <onbutton> Sonbuttons; // il peut y avoir plusieurs sous-boutons} Menu de classe publique {@SerializedName ("Button") Liste privée <atherbutton> FatherButtons;}Ce qui précède est l'analyse du menu personnalisé complet et la construction de la Javabean correspondante.
Pour un menu personnalisé, si vous regardez la documentation de cette section, vous constaterez que c'est à peu près le même que le menu personnalisé, juste plusieurs "configuration" JSONs, le format est comme suit: {"Button": […], "MatchRule": {…}}.
Nous avons constaté que la "correspondance" de JSON et "Button" est du même niveau, et l'analyse et la mise en œuvre sont essentiellement les mêmes que ci-dessus, et la mise en œuvre de JavaBean est directement donnée.
// le JSON correspondant au JSON du match de classe publique JSON correspondant {private String Group_id; Sexe de chaîne privée; String Private String client_platform_type; Private String Country; Province de chaîne privée; Menu de chaîne privée; @seRializedName ("Button") Liste de private <Javapublic> Fatherbutons; Implémentation de menus personnalisés
Tâche, nous implémentons tous les types de réponse aux boutones WeChat:
Tâche (Remarque: "M-0" signifie le bouton parent; "MN" signifie le bouton MTH Parent, le Nth Child Button (M, N ≠ 0)): 1-0: Nom: Cliquez, Cliquez sur Response Cliquez sur l'événement: cliquez sur Push Event. 2-0: Nom: Bouton parent 2. 2-1: Nom: Affichage, Événement de réponse: Sautez sur la page Web; 2-2: Nom: scancode_push, Événement de réponse: scancode_waitmsg, événement de réponse: scancode_waitmsg, événement de réponse: événement push de scancode et la boîte d'invite de "message réception" apparaît; 2-4: Nom: PIC_SYSPHOTO, ÉVÉNEMENT DE RÉPONSE: Fongez le système pour prendre des photos et publier des photos. 2-5: Nom: PIC_PHOTO_OR_ALBUM, ÉVÉNEMENT DE RÉPONSE: Portez et prenez des photos ou publiez des photos sur l'album. 3-0: Nom: Button parent 3. 3-1: Nom: PIC_WEIXIN, ÉVÉNEMENT DE RÉPONSE: Pop-up WeChat Album Sender; 3-2: Nom: Location_Select, Événement de réponse: sélecteur de géolocalisation pop-up; 3-3: Nom: Media_id, Événement de réponse: Message de livraison (sauf le message texte); 3-4: Nom: View_limited, Événement de réponse: sautez l'URL du message graphique.
Implémentez le code source (référencé AccessTokenUtils.java dans la première partie: encapsulation de la classe d'outils AccessTokenUtils)
/ * * Créez un menu personnalisé. * / @Test public void createComMenu () {String Access_token = AccessTokenUtils.getAccessToken (); // Get AccessTokenUtils est une classe encapsulée // API STTICKING nécessite httpsurl Link UrlString = "https://api.weixin..com/cgi/menu/create? Access_token; essayez {// créer une url url requl = new URL (urlstring); // Obtenez le lien httpSurlConnection httpsConn = (httpSurlConnection) requl .OpenConnection (); httpsConn.SetDoOutput (true); // Obtenez le flux de sortie de la connexion pour lire le contenu de réponse OutputStreamWriter OSR = new OutputStreamWriter (httpsConn.getOutputStream ()); osr.write (getMenujson ()); // utilise la méthode externe de cette classe pour getMenujson () osr.close (); // renvoie le résultat inputStreamReader ISR = new inputStreamReader (httpsConn.getInputStream ()); // Lisez le contenu de la réponse du serveur et affichez Char [] chars = new Char [1024]; String resLut = ""; int len; while ((len = isr.read (chars))! = -1) {reslut + = new String (chars, 0, len); } System.out.println ("Retour Résultat:" + Reslut); isr.close (); } catch (ioException e) {e.printStackTrace (); }} public String getMenujson () {gson gson = new gson (); // json proced outil menu menu = new menu (); // menu class list <atherbutton> FatherButtons = new ArrayList <AtherButton> (); // collection de boutons parents dans le menu // ----------- // Button1 Patherbutton fb1 = nouveau pèrebutton (); fb1.setName ("cliquez"); fb1.setType ("cliquez"); fb1.setKey ("10"); // -------------------- // Button Parent2 Fatherbutton FB2 = New FatherButton (); fb2.setName ("Button parent 2"); Liste <onbutton> SonButtons2 = New ArrayList <SonButton> (); // Collection de boutons enfants // Subbutton 2-1 Sonbutton SB21 = New Sonbutton (); sb21.setName ("View"); sb21.setUrl ("http://www.baidu.com"); sb21.setType ("View"); // Subbutton 2-2 Sonbutton SB22 = New Sonbutton (); sb22.setName ("scancode_push"); sb22.setType ("scancode_push"); SB22.SetKey ("22"); // Subbutton 2-3 Sonbutton SB23 = New Sonbutton (); sb23.setName ("scancode_waitmsg"); sb23.setType ("scancode_waitmsg"); SB23.SetKey ("23"); // Subbutton 2-4 Sonbutton SB24 = New Sonbutton (); sb24.setName ("pic_sysphoto"); sb24.setType ("pic_sysphoto"); SB24.SetKey ("24"); // Subbutton 2-4 Sonbutton SB24 = New Sonbutton (); sb24.setName ("pic_sysphoto"); sb24.setType ("pic_sysphoto"); SB24.SetKey ("24"); // Subbutton 2-4 Sonbutton SB24 = New Sonbutton (); sb24.setName ("pic_sysphoto"); SB24.SetKey ("24"); // Subbutton 2-5 Sonbutton SB25 = New Sonbutton (); sb25.setName ("pic_photo_or_album"); sb25.setType ("pic_photo_or_album"); SB25.SetKey ("25"); // Ajouter un bouton enfant au bouton enfant définir SonButtons2.Add (SB21); SonButtons2.Add (SB22); SonButtons2.Add (SB23); SonButtons2.Add (SB24); SonButtons2.Add (SB25); // Placez le bouton enfant sur 2-0 bouton parent définir fb2.setsonButtons (SonButtons2); // -------------------- // Bouton parent 3 Fatherbutton FB3 = nouveau FatherButton (); fb3.setName ("Présidy Button3"); Liste <onbutton> SonButtons3 = new ArrayList <SonButton> (); // Subbutton 3-1 Sonbutton SB31 = New Sonbutton (); sb31.setName ("pic_weixin"); sb31.setType ("pic_weixin"); sb31.setKey ("31"); // Subbutton 3-2 Sonbutton SB32 = New Sonbutton (); SB32.SetName ("LocatSelect"); sb32.setType ("location_select"); SB32.SetKey ("32"); // // subbutton 3-3 ---> ne peut pas être testé car Media_id est requis. Cela nécessite d'appeler l'ID du matériel. // Sonbutton SB33 = New Sonbutton (); // sb33.setName ("media_id"); // sb33.setType ("media_id"); // sb33.setmedia_id ("???"); // // subbutton 3-4 -> ne peut pas être testé car Media_id est requis. Cela nécessite d'appeler l'ID du matériel. // Sonbutton SB34 = New Sonbutton (); // SB34.SetName ("View_limited"); // sb34.setType ("View_limited"); // sb34.setmedia_id ("???"); // Ajouter un bouton enfant à la file d'attente de la file d'attente de bouton enfant SonButtons3.Add (SB31); SonButtons3.Add (SB32); // SonButtons3.Add (SB33); // SonButtons3.Add (SB34); // Placez les boutons enfants à la file d'attente de boutons 3-0 FB3.SetsonButtons (SonButtons3); // --------------------- // Ajoutez le bouton parent à la collection de bouton parent FatherButtons.add (FB1); Fatherbuttons.add (FB2); Fatherbuttons.add (FB3); // Ajoutez la file d'attente du bouton parent au menu de la barre de menu. String json = gson.tojson (menu); System.out.println (JSON); // Test Sortie Retour JSON; } Mise en œuvre de menus personnalisés
• Tâche: afficher différents boutons en fonction du genre (peut être regroupé par sexe, région, système d'exploitation mobile, etc.)
• Modifier le code 1. Étant donné qu'il est implémenté par différents arrière-plans WeChat, l'interface est différente. Cependant, il s'agit toujours d'une demande de poste. Le code n'a pas besoin d'être modifié. Remplacez simplement le sort d'origine.
// le lien httpsurl requis par la chaîne d'api d'épissage urlstring = "https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=" + access_token;
• Modifiez le code 2. Créez simplement un matchrule, définissez une règle de correspondance, puis ajoutez le Matchrule au menu pour terminer la règle de correspondance.
// ----- // Commencez à définir le menu personnalisé ici Matchrule Matchrule = new MatchRule (); MatchRule.SetSEX ("2"); // Boys Menu.SetMatchrule (Matchrule); // ---Téléchargement du code source: http://xiazai.vevb.com/201606/yuanma/weixinapi(vevb.com).rar
Cet article a été compilé dans "Résumé du didacticiel Android WeChat Development" et "Java WeChat Development Tutorial Résumé" accueille tout le monde pour apprendre et lire.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.