Cara menerapkan menu pribadi khusus di WeChat, berikut ini adalah pengantar untuk Anda
1. Deskripsi Global <BR /> Untuk deskripsi terperinci, silakan merujuk ke dua artikel pertama.
2. Deskripsi artikel ini <Br /> Artikel ini dibagi menjadi lima bagian:
* Encapsulation of Tool Class AccessTokenutils
* Membaca dan analisis menu khusus dan dokumen menu yang dipersonalisasi
* Analisis dan konstruksi kacang yang sesuai untuk menu json
* Implementasi Menu Kustom
* Implementasi menu yang dipersonalisasi WeChat Custom Menu Semua jenis menu diberikan. Di akhir artikel ini, semua kode sumber demo termasuk empat artikel pertama dalam artikel ini akan diberikan.
Enkapsulasi kelas alat accesstokenutils
Artikel di atas telah diperkenalkan secara rinci tentang akuisisi dan penghematan waktu AccessTokens. Di sini, AccessTokenutils yang dikemas secara langsung diberikan. Prinsip implementasi dan pembacaan dokumen tidak akan diberikan.
AccessTokenutils.java
Paket com.gist.utils; impor java.io.file; import java.io.fileInputStream; import java.io.fileoutputStream; import java.io.ioException; import java.io.inputStreamreader; impor java.net.url; impor javax.net.netsssspsl.netleck; com.gist.bean.access_token; import com.google.gson.gson;/** * @author gao yuan </n> Email: [email protected] </n> Blog http://blog.csdn.net/wgyscsf </n> * Periode Penulisan 2016-4:4- private static final long max_time = 7200 * 1000; // weChat memungkinkan maksimum access_token validity time (ms) private static final string tag = "weixinapitest"; // Tag private static final string appid = "wx889b020b366b0b8"; // appid private string final secer = "6DA7676BF394F0A9F15FBF06027856BB"; // KUNCI/ * * Metode ini mengimplementasikan Access_Token, Simpan, dan Menyimpan Access_Token hanya 2 jam. Jika melebihi dua jam, peroleh kembali; Jika tidak melebihi dua jam, dapatkan secara langsung. Metode ini tergantung pada *: string statis publik getAccessToken (); * * Ide: Simpan akses_token yang diperoleh dan waktu saat ini dalam file, * Saat mengekstraksi, tentukan perbedaan waktu antara waktu saat ini dan waktu yang dicatat dalam penyimpanan. Jika lebih besar dari max_time, peroleh kembali, dan simpan akses yang diperoleh ke file untuk mengganti konten asli*, dan jika kurang dari max_time, dapatkan secara langsung. */ // Untuk menelepon tanpa melempar pengecualian, semua pengecualian ditangkap di sini. Kode agak panjang. Public Static String getsavedAccess_Token () {gson gson = baru gson (); // toples pihak ketiga, menangani konversi json dan string kacang maccess_token = null; // access_token yang perlu diperoleh; FileOutputStream fos = null; // output stream FileInputStream fis = null; // input arsip aliran file = file baru ("temp_access_token.temp"); // access_token lokasi simpan. }} catch (Exception e1) {e1.printstacktrace (); } // Jika ukuran file sama dengan 0, itu berarti bahwa pertama kali Anda menggunakannya, simpan access_token if (file.length () == 0) {coba {maccess_token = getAccessToken (); // Dapatkan accessToken access_token at = new access_token (); at.setAccess_token (maccess_token); at.setexpires_in (System.CurrentTimeMillis () + ""); // Setel string waktu setoran json = gson.toJson (at); fos = FileOutputStream baru (file, false); // Tambahkan fos.write ((json) .getbytes ()); // simpan waktu accessToken dan saat ini ke dalam file fos.close (); return maccess_token; } catch (Exception e) {E.PrintStackTrace (); }} else {// Baca file konten file [] b = byte baru [2048]; int len = 0; coba {fis = new fileInputStream (file); len = fis.read (b); } catch (IoException E1) {// TODO AUTO-ENCEALATED Catch Block E1.PrintStackTrace (); } String mjsonAccess_token = string baru (b, 0, len); // Konten file baca access_token access_token = gson.fromjson (mjsonaccess_token, access_token baru (). GetClass ()); if (access_token.getExpires_in ()! = null) {long saveTime = long.parselong (access_token.getExpires_in ()); long nowtime = system.currentTimemillis (); Long RemianTime = Nowtime - Savetime; // System.out.println (Tag + "Perbedaan Waktu:" + RemianTime + "MS"); if (remiantime <max_time) {access_token at = gson.fromjson (mjsonaccess_token, access_token baru (). 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.CurrentTimeMillis () + ""); String json = gson.toJson (at); coba {fos = fileoutputStream baru (file, false); // tambahkan fos.write ((json) .getbytes ()); fos.close (); } catch (ioException e) {// TODO AUTO-ENCEALATED Catch Block E.PrintStackTrace (); } return maccess_token; }} else {return null; }} return maccess_token; } / * * Dapatkan WeChat Server AccessToken. Bagian ini konsisten dengan getAccess_token (), tidak ada komentar yang ditambahkan*/public static string getAccessToken () {string urlstring = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "& Secret =") String reslut = null; coba {url requrl = URL baru (urlString); HttpsurlConnection httpsconn = (httpsurlconnection) reqUrl .openconnection (); InputStreamReader isr = inputStreamReader baru (httpsconn.getInputStream ()); char [] chars = char baru [1024]; reslut = ""; int len; while ((len = isr.read (chars))! = -1) {reslut += string baru (chars, 0, len); } isr.close (); } catch (ioException e) {e.printstacktrace (); } Gson gson = GSON baru (); Access_token access_token = gson.fromjson (reslut, access_token baru (). GetClass ()); if (access_token.getAccess_token ()! = null) {return access_token.getAccess_token (); } else {return null; }}}
Membaca dan analisis menu khusus dan dokumen menu yang dipersonalisasi
• Menu khusus
◦Mentifkan antarmuka menu
◦ Antarmuka Menu Querycustom
◦Custom menu menghapus antarmuka
◦ Dorong Acara Menu Kustom
◦ Antarmuka menu yang bersahabat
◦ Dapatkan konfigurasi menu akun resmi
• Alamat dokumen: http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html
• Dokumen situs web resmi memberikan penjelasan berikut:
* Antarmuka menu khusus dapat menerapkan berbagai jenis tombol, sebagai berikut: 1. Klik: Klik Event ...; 2. Lihat: Lompat acara ...; 3 .... (Tentang Menu Kustom)
* Antarmuka Permintaan Panggilan Deskripsi HTTP Metode Permintaan: Posting (Silakan gunakan protokol https) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=access_token (tentang menu kustom)
* Contoh Permintaan untuk Klik dan Lihat {"Tombol": [...]} (Tentang Menu Kustom)
* Deskripsi Parameter ... (Tentang Menu Kustom)
* Buat Menu Personalisasi HTTP Metode Permintaan: Posting (silakan gunakan protokol https) https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=access_token (tentang menu yang dipersonalisasi)
* Permintaan contoh: {"tombol": [...], "matchrule": {...}} (tentang menu yang dipersonalisasi)
* Deskripsi parameter ... (Tentang menu yang dipersonalisasi)
* Pengembang dapat mengatur menu yang dilihat pengguna melalui kondisi berikut (tentang menu yang dipersonalisasi):
1. Pengelompokan Pengguna (Kebutuhan bisnis pengembang dapat diselesaikan dengan bantuan pengelompokan pengguna)
2. Jenis kelamin
3. Sistem Operasi Ponsel
4. Wilayah (wilayah yang ditetapkan oleh pengguna di klien WeChat)
5. Bahasa (Bahasa yang ditetapkan oleh Pengguna di Klien WeChat)
•memahami:
◦ Ini adalah permintaan posting yang akrab lagi, tetapi saya tidak begitu mengerti kata -kata yang tidak jelas tentang panggilan tersebut. Saya hanya tahu bahwa kita perlu menggunakan parameter "? Access_token = access_token", yang telah kita peroleh di artikel sebelumnya. Jika kita mengubah alamat permintaan "access_token" dalam dokumen WeChat ke akses_token yang kita peroleh, dan kunjungi URL, kita akan melihat "{" errcode ": 44002," errmsg ":" Petunjuk data pos kosong: [gdveda0984vr23] "}". Ini mungkin berarti data permintaan pos kosong. Oleh karena itu, kita perlu meneruskan parameter ke server WeChat melalui bentuk permintaan pos, dan format parameter juga diberikan di bawah dokumen: {"tombol": [...]}, jadi kita perlu meneruskan parameter ke server WeChat dalam format ini.
◦ Mengenai deskripsi parameter, kita dapat melihat bahwa ada tujuh parameter dalam pembuatan menu khusus. Selain tujuh parameter ini di antarmuka menu yang dipersonalisasi, ada delapan parameter lainnya. Dengan hanya melihat bagian dokumen ini, kita dapat memahami bahwa delapan parameter ini digunakan untuk mencocokkan dan memfilter untuk menu yang dipersonalisasi.
◦ Sekarang, kita perlu membangun JSON sesuai dengan persyaratan dokumen WeChat untuk mengirim string data JSON ini ke server WeChat melalui permintaan POST, dan JSON mencakup berbagai jenis acara tombol yang kami buat.
Analisis dan konstruksi kacang yang sesuai untuk menu json
Menu Kustom JSON Analisis (tidak termasuk menu yang dipersonalisasi). Kode berikut adalah contoh yang diberikan oleh dokumen WeChat.
Contoh Permintaan Klik dan Lihat
{"Tombol": [{"type": "klik", "name": "lagu hari ini", "kunci": "v1001_today_music"}, {"name": "menu", "sub_button", {{"type": "view", "name": "Search", "Url": "http:" {{{{{{{{{{{" "type": "view", "name": "video", "url": "http://v.qq.com/"}, {"type": "klik", "name": "seperti kami", "kunci": "v1001_good"}]}]} Setelah analisis, kita dapat melihat bahwa string data JSON ini dibagi menjadi tiga lapisan: "" tombol ": [{...}, {...}]", "[{...}, {{" name ": menu," Sub_button ": [{}, {{}]}]", "{" Tipe ",", ",", "VIED", "VIED", "VIED", " "url": "..."}, {}, {}, {} ", yang mungkin terlihat pusing.
Namun, jika kita dapat mengingat menu WeChat yang kita lihat dalam kenyataan, akan lebih mudah untuk dipahami: Level 1: Menu (satu menu), yang lebih rendah dari tombol induk; Level 2: Tombol induk (1 hingga 3 tombol induk), tombol satu hingga lima anak yang lebih rendah; Level 3: Tombol anak (1 hingga 5 tombol anak).
Sekarang, kita dapat melihat bahwa JSON dan "menu" yang kami pahami dapat sesuai satu per satu. Fokusnya sekarang adalah bagaimana mengkonfirmasi "nama level" dari setiap level, yang merupakan objek Javabean yang sesuai di Java.
Pada saat yang sama, karena ada beberapa tombol induk di bawah menu tingkat pertama, itu dalam bentuk daftar <menu induk>. Mungkin ada beberapa submenu di bawah tombol induk, yang juga merupakan daftar <wrowenu>; Namun, tombol induk juga dapat menjadi tombol responsif yang terpisah. adalah objek tombol induk yang terpisah. Subbutton adalah objek subbutton yang terpisah.
Melihat deskripsi parameter tentang menu khusus, kita dapat melihat bahwa tombol dibagi menjadi tombol tingkat pertama ("tombol") dan tombol tingkat kedua ("Sub_button"). Ada juga beberapa tipe data yang umum, seperti: tipe respons menu ("type"), judul menu ("name"), klik tipe parameter ("key"), lihat parameter jenis ("url"), tipe media_id dan parameter tipe view_limited ("media_id").
• Abstraksi Data (No Setter, Getter Ditulis):
// Tombol Basis kelas Public Class Basebutton {private string type; nama string pribadi; kunci string pribadi; URL string pribadi; private String media_id;} //Sub button public class SonButton extends BaseButton { private String sub_button;}//Parent button public class FatherButton extends BaseButton { private String button;//Maybe a parent button responds directly to @SerializedName("sub_button")//To ensure that the name of the subbutton after Gson parses is "sub_button", please search for private Daftar <SonButton> sonbuttons; // Mungkin ada beberapa subbuttons} menu kelas publik {@serializedName ("Tombol") Daftar Pribadi <TridsButton> bapa -besaran;}Di atas adalah analisis menu khusus lengkap dan konstruksi Javabean yang sesuai.
Untuk menu yang dipersonalisasi, jika Anda melihat dokumentasi di bagian ini, Anda akan menemukan bahwa itu kira -kira sama dengan menu khusus, hanya beberapa "konfigurasi" JSONS, formatnya adalah sebagai berikut: {"Tombol": [...], "Matchrule": {...}}.
Kami menemukan bahwa "kecocokan" JSON dan "tombol" memiliki tingkat yang sama, dan analisis dan implementasi pada dasarnya sama seperti di atas, dan implementasi Javabean secara langsung diberikan.
//The json corresponding to the json of the matching json public class MatchRule {private String group_id;private String sex;private String client_platform_type;private String country;private String province;private String city;private String language;}//Modify Menu.javapublic class Menu {@SerializedName("button")private List<FatherButton> fatherButtons;private MatchRule matchrule;} Implementasi Menu Kustom
Tugas, kami mengimplementasikan semua jenis respons tombol WeChat:
Tugas (Catatan: "M-0" berarti tombol induk; "MN" berarti tombol induk MTH, tombol anak ke-n (m, n ≠ 0)): 1-0: Nama: Klik, Klik Klik Acara: Klik Acara Push. 2-0: Nama: Tombol induk 2. 2-1: Nama: Lihat, Peristiwa Respons: Lompat ke halaman web; 2-2: Nama: scancode_push, acara respons: scancode_waitmsg, acara respons: scancode_waitmsg, acara respons: acara push scancode dan kotak prompt "penerima pesan" muncul; 2-4: Nama: pic_sysphoto, acara respons: Pop up sistem untuk mengambil foto dan posting gambar. 2-5: Nama: pic_photo_or_album, acara respons: Pop up dan ambil gambar atau posting gambar di album. 3-0: Nama: Tombol induk 3. 3-1: Nama: pic_weixin, Acara Respons: Pop-up Pengirim Album WeChat; 3-2: Nama: Lokasi_Select, Acara Respons: Pemilih Geolokasi Pop-up; 3-3: Nama: media_id, acara respons: pesan pengiriman (kecuali pesan teks); 3-4: Nama: View_Limited, Acara Respons: Lompat URL Pesan Grafis.
Laksanakan Kode Sumber (Reference AccessTokenutils.java di bagian pertama: Encapsulation of Tool Class AccessTokenUtils)
/ * * Buat menu khusus. */@Test public void createCommMenu () {string access_token = accessTokenutils.getAccessToken (); // Dapatkan AccessTokenUtils adalah kelas yang dienkapsulasi // jahitan API membutuhkan httpsurl string urlstring = "https://api.weixin.qqq.cook.com/coke.croK? Access_token; Coba {// Buat URL URL reqUrl = URL baru (URLString); // Dapatkan tautan httpsurlConnection httpsconn = (httpsurlConnection) reqUrl .openconnection (); httpsconn.setDoOutput (true); // Dapatkan aliran output koneksi untuk membaca respons konten outputStreamWriter osr = outputStreamWriter baru (httpsconn.getoutputStream ()); osr.write (getmenujson ()); // Gunakan metode eksternal kelas ini untuk getMenujson () osr.close (); // kembalikan hasil inputStreamReader isr = inputStreamReader baru (httpsconn.getInputStream ()); // Baca konten respons server dan tampilkan char [] chars = char baru [1024]; String reslut = ""; int len; while ((len = isr.read (chars))! = -1) {reslut += string baru (chars, 0, len); } System.out.println ("Hasil Pengembalian:" + Reslut); isr.close (); } catch (ioException e) {e.printstacktrace (); }} public String getMenujson () {gson gson = new gson (); // json memproses menu alat menu = menu baru (); // Daftar kelas menu <padingbutton> bapa-rintik = new arraylist baru <padingbutton> (); // kumpulan orang tua dalam menu // ------------------------------------------------------------------------------------------------------ fb1.setname ("klik"); fb1.setType ("klik"); fb1.setkey ("10"); // -------------------- // Button Parent2 FatherButton fb2 = new padybutton (); fb2.setname ("tombol induk 2"); Daftar <SonButton> sonbuttons2 = ArrayList baru <sonbutton> (); // Koleksi tombol anak // Subbutton 2-1 Sonbutton SB21 = SonButton baru (); 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"); // Tambahkan tombol anak ke tombol anak set SonButtons2.Add (SB21); sonbuttons2.add (SB22); sonbuttons2.add (SB23); sonbuttons2.add (SB24); sonbuttons2.add (SB25); // Masukkan tombol anak ke tombol 2-0 Parent Set FB2.SetsonButtons (SonButtons2); // -------------------- // Tombol induk 3 PAYSBUTTON FB3 = NEW BATHTBUTTON (); fb3.setname ("Presidy Button3"); Daftar <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 ("locatselect"); SB32.SetType ("location_select"); SB32.SetKey ("32"); // // Subbutton 3-3 ---> tidak dapat diuji karena media_id diperlukan. Ini membutuhkan panggilan ID materi. // sonbutton sb33 = sonbutton baru (); // sb33.setname ("media_id"); // sb33.setType ("media_id"); // sb33.setMedia_id ("???"); // // Subbutton 3-4-> tidak dapat diuji karena media_id diperlukan. Ini membutuhkan panggilan ID materi. // sonbutton sb34 = sonbutton baru (); // sb34.setname ("view_limited"); // sb34.setType ("view_limited"); // sb34.setMedia_id ("???"); // Tambahkan tombol anak ke tombol anak antrian sonbuttons3.add (SB31); sonbuttons3.add (SB32); // sonbuttons3.add (SB33); // sonbuttons3.add (SB34); // Masukkan tombol anak ke 3-0 tombol orang tua antrian FB3.setsonbuttons (sonbuttons3); // --------------------- // Tambahkan tombol induk ke Tombol Induk Koleksi Tadel Padat Besar (FB1); Tadelsbuttons.Add (FB2); TadyButtons.Add (FB3); // Tambahkan antrian tombol induk ke menu menu menu. String json = gson.toJson (menu); System.out.println (JSON); // Tes Output Return JSON; } Implementasi menu yang dipersonalisasi
• Tugas: Menampilkan tombol yang berbeda sesuai dengan jenis kelamin (dapat dikelompokkan berdasarkan jenis kelamin, wilayah, sistem operasi seluler, dll.)
• Modifikasi Kode 1. Karena diimplementasikan oleh latar belakang WeChat yang berbeda, antarmuka berbeda. Namun, ini masih merupakan permintaan pos. Kode tidak perlu diubah. Cukup ganti urlstring asli.
// tautan httpsurl yang diperlukan oleh splicing API string urlString = "https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=" + access_token;
• Ubah Kode 2. Cukup buat Matchrule, atur aturan yang cocok, dan kemudian tambahkan Matchrule ke menu untuk menyelesaikan aturan yang cocok.
// ----- // Mulai mengatur menu yang dipersonalisasi di sini matchrule matchrule = new matchrule (); matchrule.setsex ("2"); // boys menu.setMatchRule (matchrule); // --- --- ---Unduh Kode Sumber: http://xiazai.vevb.com/201606/yuanma/weixinapi(vevb.com).rar
Artikel ini telah dikompilasi menjadi "Ringkasan Tutorial Pengembangan Android WeChat", dan "Java WeChat Development Tutorial Ringkasan" menyambut semua orang untuk dipelajari dan dibaca.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.