So implementieren Sie benutzerdefinierte personalisierte Menüs auf WeChat, Folgendes ist eine Einführung für Sie
1. Globale Beschreibung <br /> Für eine detaillierte Beschreibung finden Sie die ersten beiden Artikel.
2. Beschreibung dieses Artikels <br /> Dieser Artikel ist in fünf Teile unterteilt:
* Einkapselung von Werkzeugklassen AccessTokenutils
* Lesen und Analyse von benutzerdefinierten Menüs und personalisierten Menüdokumenten
* Analyse und Konstruktion entsprechender Bohnen für Menü JSON
* Implementierung von benutzerdefinierten Menüs
* Implementierung von personalisierten Menüs Wechat Custom -Menü Alle Arten von Menüs werden angegeben. Am Ende dieses Artikels werden alle Demo -Quellcodes einschließlich der ersten vier Artikel in diesem Artikel angegeben.
Einkapselung von Werkzeugklassen AccessTokenutils
Der obige Artikel wurde ausführlich über die Erwerbs- und Timing -Einsparung von AccessTokens eingeführt. Hier werden die verpackten AccessTokenutils direkt angegeben. Das Implementierungsprinzip und das Lesen von Dokumenten werden nicht angegeben.
AccessTokenutils.java
Paket com.gist.utils; import java.io.file; import Java.io.fileinputstream; Import Java.io.fileOutputStream; Import Java.io.ioException; Import Java.io.inputStreamreader; Import Java.url; com.gist.bean.access_token; import com.google.gson.gson;/** * @author gao yuan Static Final Long MAX_Time = 7200 * 1000; // WeChat Ermöglicht maximal Access_Token Validitätszeit (MS) private statische endgültige String -Tag = "WexInapitest"; // Tag private statische String String Appid = "WX889B020B3666B0B8"; // Appid private static endgültiges String SECERT = "6DA7676BF394F0A9F15FBF06027856BB"; // KEY/ * * Diese Methode implementiert Access_Token, Speichern und Speichern von Access_Token für nur 2 Stunden. Wenn es zwei Stunden überschreitet, ist es wieder auftreten. Wenn es nicht zwei Stunden überschreitet, erhalten Sie es direkt. Diese Methode hängt von *: Public Static String getAccessToken () ab; * * Idee: Speichern Sie den erhaltenen Access_Token und die aktuelle Zeit in der Datei * Beim Extrahieren bestimmen Sie den Zeitunterschied zwischen der aktuellen Zeit und der im Speicher aufgezeichneten Zeit. Wenn es größer als max_time ist, setze es wieder auf und speichere den erhaltenen Zugriff auf die Datei, um den ursprünglichen Inhalt*zu ersetzen*. Wenn er weniger als max_time ist, erhalten Sie diese direkt. */ // Um anrufen zu können, ohne Ausnahmen zu werfen, werden alle Ausnahmen hier gefangen. Der Code ist etwas lang. Public static String getedAccess_token () {gson gson = new gson (); // Drittanbieter jar, überträgt die Konvertierung von JSON- und Beans-String maccess_token = null; // access_token, der erhalten werden muss; FileOutputStream fos = null; // Ausgabe von Stream FileInputStream fis = null; // Stream -Datei eingeben. }} catch (Ausnahme e1) {e1.printstacktrace (); } // Wenn die Dateigröße gleich 0 ist, bedeutet dies, dass beim ersten Mal, wenn Sie sie verwenden, Access_Token if (file.length () == 0) {try {maccess_token = getAccessToken (); // AccessToken Access_Token bei = New Access_Token () erhalten; at.setaccess_token (maccess_token); at.setExpires_in (System.currentTimemillis () + ""); // Setzen Sie die Einzahlungszeit String json = gson.tojson (at); fos = new FileOutputStream (Datei, false); // append fos.write ((json) .getBytes ()); // AccessToken und aktuelle Zeit in der Datei fos.close () speichern; RECHTEN SIE MACCESS_TOKEN; } catch (Ausnahme e) {e.printstacktrace (); }} else {// Dateiinhalts -Byte [] b = new byte [2048]; int len = 0; try {fis = new FileInputStream (Datei); len = fis.read (b); } catch (ioException e1) {// Todo automatisch generiertes Catch-Block e1.printstacktrace (); } String mjsonaccess_token = new String (b, 0, len); // Der Inhalt der Lesendatei access_token access_token = gson.fromjson (mjsonaccess_token, new access_token (). GetClass ()); if (access_token.getExpires_in ()! lange heutzutage = System.currentTimemillis (); Langes Remiantime = Now Time - Savetime; // system.out.println (Tag + "Zeitunterschied:" + remiantime + "ms"); if (remiantime <max_time) {access_token at = gson.fromjson (mjsonaccess_token, new access_token (). getClass ()); maccess_token = at.getaccess_token (); RECHTEN SIE MACCESS_TOKEN; } else {maccess_token = getAccessToken (); Access_token at = new access_token (); at.setaccess_token (maccess_token); at.setExpires_in (System.currentTimemillis () + ""); String json = gson.tojson (at); try {fos = new FileOutputStream (Datei, false); // fos.write (json) .getBytes ()); fos.close (); } catch (ioException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } return maccess_token; }} else {return null; }} return maccess_token; } / * * Holen Sie sich den WeChat Server AccessToken. This part is consistent with getAccess_token(), no comments are added*/ 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 requrl = new URL (urlstring); HttpsurlConnection httpsConn = (httpsurlConnection) requrl .OpenConnection (); InputStreamReader ISR = NEU InputStreamReader (httpsconn.getInputStream ()); char [] chars = new char [1024]; reslut = ""; Int len; while ((len = isr.read (chars))! = -1) {reslut += new String (Zeichen, 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; }}} Lesen und Analyse von benutzerdefinierten Menüs und personalisierten Menüdokumenten
• Benutzerdefiniertes Menü
◦Create Menüschnittstelle
◦Custom -Menü -Abfrageschnittstelle
◦Custom -Menü Löschen der Schnittstelle
◦Custom -Menüereignis Druck
◦personalisierte Menüschnittstelle
◦Greifen Sie die Menükonfiguration des offiziellen Kontos
• Dokumentenadresse: http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html
• Das offizielle Website -Dokument enthält die folgende Erklärung:
* Die benutzerdefinierte Menüschnittstelle kann wie folgt verschiedene Schaltetypen implementieren: 1. Klicken: Klicken Sie auf Ereignis ...; 2. Blick: Sprungereignis ...; 3 .... (über das benutzerdefinierte Menü)
* Schnittstellenanforderungsanforderung Beschreibung HTTP-Anforderungsmethode: Post (Bitte verwenden Sie das HTTPS-Protokoll) https://api.weixin.qq.com/cgi-ner/menu/create?access_token=access_token (um benutzerdefiniertes Menü) (um benutzerdefiniertes Menü)
* Beispiel für die Anforderung für Klick und Anzeige {"Schaltfläche": [...]} (zum benutzerdefinierten Menü)
* Parameterbeschreibung ... (zum benutzerdefinierten Menü)
* Erstellen Sie ein personalisiertes Menü HTTP-Anforderungsmethode: Post (Bitte verwenden Sie das HTTPS-Protokoll) https://api.weixin.qq.com/cgi-ner/menu/addconditional?access_token=access_token (über personalisiertes Menü) (über personalisiertes Menü)
* Anfrage Beispiel: {"Button": [...], "Matchrule": {...}} (über das personalisierte Menü)
* Parameterbeschreibung ... (über das personalisierte Menü)
* Entwickler können die Menüs festlegen, die Benutzer die folgenden Bedingungen durchsehen (über das personalisierte Menü):
1. Benutzergruppe (Die Geschäftsanforderungen von Entwicklern können mit Hilfe der Benutzergruppe erfüllt werden)
2. Geschlecht
3. Mobiltelefonbetriebssystem
4. Region (die Region, die der Benutzer im WeChat -Client festgelegt hat)
5. Sprache (Sprache vom Benutzer im WeChat -Client festgelegt)
•verstehen:
◦T ist wieder eine vertraute Postanfrage, aber ich verstehe die vagen Worte über den Anruf nicht ganz. Ich weiß nur, dass wir den Parameter verwenden müssen "? Access_Token = Access_Token", den wir im vorherigen Artikel erhalten haben. Wenn wir die Anforderungsadresse "Access_Token" im WeChat -Dokument in den von uns erhaltenen Access_Token ändern und die URL besuchen, sehen wir "{" Errcode ": 44002," errmsg ":" leerer Postdaten Hinweis: [Gdveda0984vr23] "}". Dies bedeutet wahrscheinlich, dass leere Daten nach Anfragen von Anfragen angewendet werden. Daher müssen wir die Parameter über die Form der Postanforderung an den WeChat -Server übergeben, und das Parameterformat ist auch unter dem Dokument angegeben: {"Button": […]}, daher müssen wir in diesem Format Parameter an den WeChat -Server übergeben.
◦ In Bezug auf die Parameterbeschreibung können wir feststellen, dass die kundenspezifische Menüerstellung sieben Parameter enthält. Zusätzlich zu diesen sieben Parametern in der personalisierten Menüschnittstelle gibt es weitere acht Parameter. Indem wir uns diesen Teil des Dokuments einfach ansehen, können wir verstehen, dass diese acht Parameter zum Matching und Filter für personalisierte Menüs verwendet werden.
◦ Jetzt müssen wir JSON gemäß den Anforderungen des WeChat -Dokuments konstruieren, um diese Zeichenfolge von JSON -Daten über die Postanforderung an den WeChat -Server zu senden, und JSON enthält verschiedene Arten von Schaltflächenereignissen, die wir erstellt haben.
Analyse und Konstruktion entsprechender Bohnen für Menü JSON
Benutzerdefinierte Menü JSON -Analyse (ohne personalisiertes Menü). Der folgende Code ist ein Beispiel im WeChat -Dokument.
Beispiel für die Anfrage für Klick und Ansicht
{ "button":[ { "type":"click", "name":"Today's song", "key":"V1001_TODAY_MUSIC" }, { "name":"menu", "sub_button":[ { "type":"view", "name":"search", "url":"http://www.soso.com/" }, { "Typ": "Ansicht", "Name": "Video", "url": "http://v.qq.com/"}, {"Typ": "Klicken Sie", "Name": "Like Us", "Key": "v1001_good"}]}]}}}}}}} After analysis, we can see that this string of json data is divided into three layers: ""button":[{…},{…}]", "[{…},{{"name":menu, "sub_button":[{},{}]}]", "{"type":"view", "name:":"video", "URL": "..."}, {}, {}, {} ", was möglicherweise schwindelig aussieht.
Wenn wir uns jedoch an das WeChat -Menü erinnern können, das wir in der Realität sehen, ist es einfacher zu verstehen: Stufe 1: Menü (ein Menü), die niedrigeren ein bis drei übergeordneten Schaltflächen; Stufe 2: übergeordnete Taste (1 bis 3 übergeordnete Tasten), die unteren Schaltflächen mit einem bis fünf untergeordneten; Stufe 3: Kinderknöpfe (1 bis 5 Kinderknöpfe).
Jetzt können wir sehen, dass JSON und das "Menü", das wir verstehen, voneinander entsprechen können. Der Fokus ist nun, wie Sie den "Ebenennamen" jeder Ebene bestätigen können, nämlich das entsprechende Javabäe -Objekt in Java.
Gleichzeitig befindet sich im Menü erster Stufe mehrere übergeordnete Schaltflächen in Form eines List <-Elternmenü>. Unter der übergeordneten Taste kann es mehrere Untermenü geben, was auch eine Liste <submenu> ist. Die übergeordnete Taste kann jedoch auch eine separate Responsive -Taste sein. ist ein separates übergeordnetes Schaltflächenobjekt. Ein Untertonton ist ein separates Subbutton -Objekt.
Wenn Sie sich die Parameterbeschreibung zum benutzerdefinierten Menü ansehen, können wir feststellen, dass die Schaltflächen in Tasten der ersten Ebene ("Taste") und in Tasten der zweiten Ebene ("sub_button") unterteilt sind. Es gibt auch einige gängige Datentypen, wie z. B.: Menü -Antworttyp ("Typ"), Menütitel ("Name"), klicken Sie auf Typparameter ("Schlüssel"), Ansichtsparameter anzeigen ("url"), media_id type und view_limited Typparameter ("media_id").
• Datenabstraktion (kein Setter, Getter geschrieben):
// Button Basisklasse öffentliche Klasse Basebutton {private String -Typ; privater Zeichenfolge Name; privater Stringschlüssel; private String -URL; private String media_id;} // sub button öffentliche Klasse Sonbutton erweitert den Basebutton {private String sub_button;} // übergeordnete Button öffentliche Klasse Vaterbutton erweitert den Basebutton {private String -Button; // Vielleicht reagiert ein Elternknopf direkt auf @Serializedn ("sub_button") // Subbutton -Subbutton -Subbutton After. Liste <Sonbutton> Sonbuttons; // Es kann mehrere Subbuttons geben} Menü der öffentlichen Klasse {@serializedName ("Button") Private Liste <vaterbutton> fatherbuttons;}Die oben genannte ist die Analyse des vollständigen benutzerdefinierten Menüs und die Konstruktion des entsprechenden Javabäer.
Für ein personalisiertes Menü, wenn Sie sich die Dokumentation in diesem Abschnitt ansehen, werden Sie feststellen, dass es ungefähr das gleiche wie das benutzerdefinierte Menü ist. Nur mehrere "Konfiguration" Jsons lautet das Format wie folgt: {"Button": […], "MatchRule": {…}}.
Wir fanden heraus, dass die "Übereinstimmung" von JSON und "Button" auf der gleichen Ebene und die Analyse und Implementierung im Grunde genommen die gleichen wie oben sind, und die Implementierung von Javabäen wird direkt angegeben.
// Der JSON entspricht dem JSON des Matching JSON Public Class Matchrule {private String gruppe_id; private String Sex; private String client_platform_type; private String Country; private String -Provinz; private String City; private String -Sprache;} // MOTUE MUTUE.javapublic Class -Menü {@-Serializedname ("Button") privates "). Implementierung von benutzerdefinierten Menüs
Aufgabe implementieren wir alle WeChat -Schaltfläche Antworttypen:
Aufgabe (Hinweis: "M-0" bezeichnet die übergeordnete Taste; "Mn" bezeichnet die Schaltfläche MH-übergeordnetes, die Taste des N-ten untergeordneten (m, n ≠ 0)): 1-0: Name: Klicken Sie auf die Antwort, klicken Sie auf Ereignis: Klicken Sie auf Ereignis. 2-0: Name: Übergeordnete Schaltfläche 2. 2-1: Name: Ansicht, Antwortereignis: Springen Sie zur Webseite; 2-2: Name: scancode_push, Antwortereignis: scancode_waitmsg, Antwortereignis: scancode_waitmsg, Antwortereignis: Scancode Push-Ereignis und das Eingabed-Box "Nachricht empfangen" auftauchen; 2-4: Name: pic_SySphoto, Antwortereignis: Pop-Up des Systems, um Fotos zu machen und Bilder zu posten. 2-5: Name: PIC_PHOTO_OR_ALBUM, Antwortereignis: Pop-Up und machen Sie Bilder oder posten Sie Bilder auf dem Album. 3-0: Name: Übergeordnete Schaltfläche 3. 3-1: Name: PIC_WIXIN, Antwortereignis: Pop-up Wechat Album Sender; 3-2: Name: location_select, Antwortereignis: Popup Geolocation Selector; 3-3: Name: Media_id, Antwortereignis: Zustellungsnachricht (außer Textnachricht); 3-4: Name: View_Limited, Antwortereignis: Springen Sie die Grafiknachricht-URL.
Implementieren Sie den Quellcode (Referenz AccessTokenutils.java Im ersten Teil: Kapselung der Werkzeugklassen AccessTokenutils)
/ * * Erstellen Sie ein benutzerdefiniertes Menü. */@Test public void createCommMenu () {String Access_Token = AccessTokenutils.getAccessToken (); // AccessTokenutils ist eine eingekapselte Klasse // Abnutzung API erfordert httpsurl link string urlstring = "https:/.Weicin.qqq.com/cgi-arkiK..com/cgi-ört Access_token; Versuchen Sie {// Erstellen Sie eine URL URL requrl = new URL (urlstring); // den Link httpSurlConnection httpsConn = (httpSurlConnection) requrl .OpenConNection (); httpsconn.setDooutput (true); // den Ausgangsstrom der Verbindung abrufen, um den Antwortinhalt OutputStreamWriter OSR = New OutputStreamWriter (httpsconn.getOutputStream ()) zu lesen; osr.write (getMenujson ()); // Verwenden Sie die externe Methode dieser Klasse, um GetMenujson () osr.close (); // Rückgabe des Ergebnis InputStreamReader isr = new InputStreamReader (httpsconn.getInputStream ()); // Lesen Sie den Antwortinhalt des Servers und zeigen Sie char [] chars = new char [1024] an. String reslut = ""; Int len; while ((len = isr.read (chars))! = -1) {reslut += new String (Zeichen, 0, len); } System.out.println ("Rückgabeergebnis:" + reslut); isr.close (); } catch (ioException e) {e.printstacktrace (); }} public String getMenujson () {gson gson = new gson (); // json Processing-Toolmenü = New Menu (); // Menüklasseliste <vaterbutton> vaterbuttons = new ArrayList <vaterbutton> (); // übergeordnete Button-Sammlung im Menü // --------------- // Parent Button1 Fatherb. FB1.SetName ("Click"); FB1.SetType ("Click"); fb1.setKey ("10"); // -------------------- // Elternknopf 2 Vaterbutton fb2 = neuer Vaterbutton (); fb2.setName ("übergeordnete Schaltfläche 2"); Liste <Sonbutton> sonbuttons2 = NeuarrayList <Sonbutton> (); // Sammlung von Kinderknöpfen // Subbutton 2-1 Sonbutton SB21 = New Sonbutton (); sb21.setName ("view"); sb21.seturl ("http://www.baidu.com"); SB21.SetType ("Ansicht"); // 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_SySthoto"); SB24.SetType ("pic_SySthoto"); sb24.setKey ("24"); // Subbutton 2-4 Sonbutton SB24 = New Sonbutton (); sb24.setName ("pic_SySthoto"); SB24.SetType ("pic_SySthoto"); sb24.setKey ("24"); // Subbutton 2-4 Sonbutton SB24 = New Sonbutton (); sb24.setName ("pic_SySthoto"); sb24.setKey ("24"); // Subbutton 2-5 Sonbutton SB25 = neuer Sonbutton (); sb25.setName ("pic_photo_or_album"); sb25.SetType ("pic_photo_or_album"); sb25.setKey ("25"); // Child -Taste zur Kindertaste hinzufügen Sonbuttons2.Add (SB21); Sonbuttons2.Add (SB22); Sonbuttons2.Add (SB23); Sonbuttons2.Add (SB24); Sonbuttons2.Add (SB25); // Kinderschaltfläche auf 2-0 übergeordnete Taste einstellen FB2.SETSONBUTTONS (Sonbuttons2); // -------------------- // Elternknopf 3 Vaterbutton fb3 = neuer Vaterbutton (); fb3.setName ("Presidy Button3"); Liste <Sonbutton> 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 ("locatelect"); sb32.setType ("location_select"); sb32.setKey ("32"); // // Subbutton 3-3 ---> kann nicht getestet werden, da Media_id erforderlich ist. Dies erfordert das Aufrufen der materiellen ID. // Sonbutton SB33 = neuer Sonbutton (); // sb33.setName ("media_id"); // SB33.SetType ("media_id"); // sb33.setmedia_id ("???"); // // Subbutton 3-4-> kann nicht getestet werden, da Media_id erforderlich ist. Dies erfordert das Aufrufen der materiellen ID. // Sonbutton SB34 = New Sonbutton (); // sb34.setName ("view_limited"); // sb34.settype ("view_limited"); // sb34.setmedia_id ("???"); // Child -Taste zur Kindertaste hinzufügen Sonbuttons3.Add (SB31); Sonbuttons3.Add (SB32); // Sonbuttons3.Add (SB33); // Sonbuttons3.Add (SB34); // Kinderschaltflächen auf 3-0 übergeordnete Schaltfläche FB3.SetSonbuttons (Sonbuttons3) setzen; // ---------------------- // Fügen Sie die übergeordnete Schaltfläche zur übergeordneten Schaltfläche Fatherbuttons.add (FB1) hinzu; fatherbuttons.add (fb2); fatherbuttons.add (fb3); // Fügen Sie die übergeordnete Schaltfläche zum Menüleistenmenü hinzu. String json = gson.tojson (Menü); System.out.println (JSON); // Testausgabe return JSON; } Umsetzung personalisierter Menüs
• Aufgabe: Zeigen Sie verschiedene Schaltflächen entsprechend dem Geschlecht an (können nach Geschlecht, Region, mobilem Betriebssystem usw. gruppiert werden).
• Code ändern 1. Da er mit unterschiedlichen WeChat -Hintergründen implementiert wird, ist die Schnittstelle unterschiedlich. Es ist jedoch immer noch eine Postanfrage. Der Code muss nicht geändert werden. Ersetzen Sie einfach die ursprüngliche URLString.
// Der Httpsurl-Link, der vom Splicing API String urlstring = "https://api.wexin.qq.com/cgi-ner/menu/addconditional?access_token=" + Access_token;
• Ändern Sie den Code 2. Erstellen Sie einfach eine Matchrule, legen Sie eine Matching -Regel fest und fügen Sie das MatchRule zum Menü hinzu, um die Übereinstimmung zu vervollständigen.
// ------ // Starten Sie das personalisierte Menü hier matchRule matchrule = new Matchrule (); Matchrule.setSex ("2"); // Boys Menu.setMatchRule (MatchRule); // ---Quellcode herunterladen: http://xiazai.vevb.com/201606/yuanma/weixinapi(vevb.com).rar
Dieser Artikel wurde in "Android Wechat Development Tutorial Summary" zusammengestellt, und "Java Wechat Development Tutorial Summary" begrüßt alle zum Lernen und Lesen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.