WeChatにカスタムパーソナライズされたメニューを実装する方法、以下はあなたへの紹介です
1.グローバル説明<BR />詳細な説明については、最初の2つの記事を参照してください。
2。この記事の説明<br />この記事は5つの部分に分かれています。
*ツールクラスAccessTokenutilsのカプセル化
*カスタムメニューとパーソナライズされたメニュードキュメントの読み取りと分析
*メニューJSONの対応する豆の分析と構築
*カスタムメニューの実装
*パーソナライズされたメニューの実装WeChatカスタムメニューすべてのタイプのメニューが与えられます。この記事の最後に、この記事の最初の4つの記事を含むすべてのデモソースコードが示されます。
ツールクラスAccessTokenutilsのカプセル化
上記の記事は、AccessTokensの取得とタイミングの節約について詳しく紹介されています。ここでは、パッケージ化されたAccessTokenutilsが直接与えられます。実装の原則とドキュメントの読み取りは与えられません。
AccessTokenutils.java
パッケージ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.net.url; Import javax.net.ssl.ssl.ssl.ssl.ssl.ssl.ssl.ssl.ssl.ssl.ssl.ssl.ssl.ssl.ssl.httpsurlconty; com.gist.bean.access_token; import com.google.gson.gson;/** * @author gao yuan </n>電子メール:[email protected] </n> blog http://blog.csdn.net/wgyscsf </n> * writing期間2016-4-4-7 5:44:44:44:44:33 AccessTokenutils {private static final long max_time = 7200 * 1000; // wechatは最大アクセス_token妥当性時間(MS)プライベート静的な最終文字列= "weixinapitest"; // private static final string appid = "wx889b0202020b36666b0b8"; "6DA7676BF394F0A9F15FBF06027856BB"; // key/ * *このメソッドはAccess_tokenを実装し、Access_Tokenを2時間だけ保存し、保存します。 2時間を超える場合は、それを再取得します。 2時間を超えない場合は、直接取得します。この方法は *:public static string getAccesStoken()に依存します。 * *アイデア:取得したAccess_Tokenとファイルに現在の時間を保存します。 max_timeよりも大きい場合は、それを再取得し、取得したファイルへのアクセスを保存して元のコンテンツ*を置き換え、max_timeよりも少ない場合は、直接取得します。 */ //例外を投げることなく電話するために、すべての例外がここに巻き込まれます。コードは少し長いです。 public static string getsavedaccess_token(){gson gson = new gson(); //サードパーティのjar、jsonおよびbeans string string maccess_token = null; // access_tokenの変換を取得する必要があります。 fileoutputStream fos = null; //出力ストリームfileinputStream fis = null; //入力ストリームファイル= new file( "temp_access_token.temp"); // access_token save location {//ファイルが存在しない場合、if(!file.exists()){file.createnewfile(); }} catch(例外e1){e1.printstacktrace(); } //ファイルサイズが0に等しい場合、それを使用するのは初めてであることを意味します。Access_TOKENを保存することを意味します(file.length()== 0){try {maccess_token = getAccessToken(); at.setaccess_token(maccess_token); at.setexpires_in(system.currenttimemillis() + ""); // dopitive time string json = gson.tojson(at); fos = new fileoutputStream(file、false); // append fos.write((json).getBytes()); 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 auto-feenated catch block 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 = nowtime -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(); 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(file、false); // append fos.write((json).getbytes()); fos.close(); } catch(ioException e){// todo auto-fenated catch block e.printstacktrace(); } return maccess_token; }} else {return null; }} return maccess_token; } / * * WeChat Server AccessTokenを取得します。この部分はgetaccess_token()と一致しており、コメントは追加されていません*/public static string getaccestoken(){string urlstring = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="文字列reslut = null; try {url requrl = new url(urlstring); httpsurlconnection httpsconn =(httpsurlconnection)requrl .openconnection(); inputStreamReader ISR = new inputStreamReader(httpsconn.getInputStream()); char [] chars = new 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.getacs_token(); } else {return null; }}}
カスタムメニューとパーソナライズされたメニュードキュメントの読み取りと分析
•カスタムメニュー
◦メニューインターフェイスを作成します
◦カスタムメニュークエリインターフェイス
◦カスタムメニューインターフェイスを削除します
◦カスタムメニューイベントプッシュ
◦個人化されたメニューインターフェイス
◦公式アカウントのメニュー構成を獲得します
•ドキュメントアドレス:http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html
•公式ウェブサイトのドキュメントは、次の説明を示しています。
*カスタムメニューインターフェイスは、次のように、さまざまなタイプのボタンを実装できます。1。クリック:イベント...をクリックします。 2。ビュー:ジャンプイベント...; 3 ....(カスタムメニューについて)
*インターフェイスコールリクエスト説明httpリクエスト方法:投稿(httpsプロトコルを使用してください)https://api.weixin.qq.com/cgi-bin/menu/create?access_token = access_token(カスタムメニューについて)
*クリックと表示のリクエストの例{"button":[...]}(カスタムメニューについて)
*パラメーター説明...(カスタムメニューについて)
*パーソナライズされたメニューHTTPリクエスト方法を作成:投稿(httpsプロトコルを使用してください)https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token = access_token(パーソナライズされたメニューについて)
*リクエスト例:{"button":[...]、 "matchrule":{...}}(パーソナライズされたメニューについて)
*パラメーターの説明...(パーソナライズされたメニューについて)
*開発者は、ユーザーが次の条件(パーソナライズされたメニューについて)を通して見るメニューを設定できます。
1.ユーザーグループ(開発者のビジネスニーズは、ユーザーグループ化の助けを借りて完了することができます)
2。性別
3。携帯電話オペレーティングシステム
4。リージョン(WeChatクライアントのユーザーが設定した地域)
5。言語(WeChatクライアントのユーザーが設定する言語)
•理解する:
◦また、おなじみの投稿リクエストですが、電話に関するあいまいな言葉はよくわかりません。前の記事で取得したパラメーター「?access_token = access_token」を使用する必要があることを知っています。 WeChatドキュメントのリクエストアドレス「Access_Token」を取得したAccess_Tokenに変更し、URLにアクセスすると、「 "errcode":44002、 "errmsg": "空の投稿ヒント:[gdveda0984vr23]"}」が表示されます。おそらく、空のPOST要求データを意味します。したがって、POSTリクエストの形式を介してパラメーターをWeChatサーバーに渡す必要があり、パラメーター形式はドキュメントの下にも示されています。{"button":[…]}。
◦パラメーターの説明に関しては、カスタムメニューの作成に7つのパラメーターがあることがわかります。パーソナライズされたメニューインターフェイスのこれらの7つのパラメーターに加えて、別の8つのパラメーターがあります。ドキュメントのこの部分を単に見るだけで、これらの8つのパラメーターがパーソナライズされたメニューのマッチングとフィルタリングに使用されていることを理解できます。
◦ただし、WECHATドキュメントの要件に従ってJSONを構築して、この一連のJSONデータをPOSTリクエストを介してWECHATサーバーに送信する必要があります。JSONには、作成したさまざまな種類のボタンイベントが含まれています。
メニューJSONの対応する豆の分析と構造
カスタムメニューJSON分析(パーソナライズされたメニューを除く)。次のコードは、WeChatドキュメントで与えられた例です。
クリックと表示のリクエストの例
{"button":[{"type": "click"、 "name": "Today's Song"、 "key": "v1001_today_music"}、{"name": "menu"、 "sub_button":[{"type": "view"、 "name": "search"、 "" "Type": "View"、 "name": "video"、 "url": "http://v.qq.com/"}、{"type": "click"、 "name": "like us"、 "key"}]}}}分析後、この一連のJSONデータが3つのレイヤーの3つのレイヤーに分割されていることがわかります: "" button ":[{…}、{…}]"、 "[{…}、{{" name ":menu、" sub_button ":[{}、{}]}]"、 "{" type ":" ":" "" "type": "" "" type ":" "" view "" 「url」: "..."}、{}、{}、{} "、めまいがするかもしれません。
ただし、実際に表示されるWeChatメニューを思い出すことができれば、理解しやすくなります。レベル1:メニュー(1つのメニュー)、1〜3つの親ボタン。レベル2:親ボタン(1〜3の親ボタン)、1〜5の子ボタン。レベル3:チャイルドボタン(1〜5の子ボタン)。
これで、JSONと「メニュー」が1つずつ対応できることがわかります。現在の焦点は、各レベルの「レベル名」を確認する方法です。これは、Javaの対応するJavabeanオブジェクトです。
同時に、最初のレベルのメニューの下に複数の親ボタンがあるため、リスト<親メニュー>の形式です。親ボタンの下に複数のサブメニューがある場合があります。これは<submenu>のリストでもあります。ただし、親ボタンは別のレスポンシブボタンである場合があります。別の親ボタンオブジェクトです。サブボタンは別のサブボタンオブジェクトです。
カスタムメニューのパラメーターの説明を見ると、ボタンが第1レベルのボタン( "ボタン")とセカンドレベルのボタン( "sub_button")に分割されていることがわかります。メニュー応答タイプ( "タイプ")、メニュータイトル( "name")、[タイプパラメーター( "key")、ビュータイプパラメーター( "url")、media_idタイプ、view_limitedタイプパラメーター( "media_id")などの一般的なデータ型もあります。
•データの抽象化(セッターなし、getterの書かれていません):
//ボタンベースクラスパブリッククラスBaseButton {プライベート文字列タイプ。プライベート文字列名;プライベート文字列キー。プライベート文字列URL; private string media_id;} //サブボタンパブリッククラスのソンボットン拡張basebutton {private string sub_button;} // parent class public class fatherbuttonはbasebutton {private string button; // parent name( "sub_button")に直接応答します。リスト<Sonbutton> Sonbuttons; //複数のサブボタンがある場合があります}パブリッククラスメニュー{@serializedname( "button")プライベートリスト<父ビタン> fatherbuttons;}上記は、完全なカスタムメニューの分析と、対応するJavabeanの構築です。
パーソナライズされたメニューの場合、このセクションのドキュメントを見ると、カスタムメニューとほぼ同じであることがわかります。
JSONと「ボタン」の「一致」は同じレベルであり、分析と実装は基本的に上記と同じであり、Javabeanの実装が直接与えられることがわかりました。
//一致するJSONパブリッククラスのマッチルールのJSONに対応するJSON {private string group_id; private string sex; private string client_platform_type; private string country; private string City;} // menu.javapublic classメニュー( "@serializedname("カスタムメニューの実装
タスク、すべてのWeChatボタン応答タイプを実装します。
タスク(注:「M-0」とは親ボタンを意味します。「MN」とは、mth親ボタン、nth子ボタン(M、n≠0))を意味します:1-0:名前:クリック、応答クリックイベント:[プッシュイベント]をクリックします。 2-0:名前:親ボタン2。2-1:名前:表示、応答イベント:Webページへのジャンプ。 2-2:名前:scancode_push、応答イベント:scancode_waitmsg、応答イベント:scancode_waitmsg、応答イベント:scancodeプッシュイベントと「メッセージ受信」プロンプトボックスがポップアップします。 2-4:名前:pic_sysphoto、応答イベント:システムをポップアップして写真を撮って写真を投稿します。 2-5:名前:pic_photo_or_album、Response Event:ポップアップして写真を撮ったり、アルバムに写真を投稿したりします。 3-0:名前:親ボタン3。3-1:名前:pic_weixin、応答イベント:ポップアップwechatアルバム送信者。 3-2:名前:Location_Select、Response Event:ポップアップジオロケーションセレクター。 3-3:name:media_id、response event:配信メッセージ(テキストメッセージを除く); 3-4:名前:View_Limited、Response Event:グラフィックメッセージURLをジャンプします。
ソースコードを実装します(最初の部分で参照されるAccessTokenutils.java:ツールクラスAccessTokenutilsのカプセル化)
/ * *カスタムメニューを作成します。 */@test public void createcommmenu(){string access_token = accesstokenutils.getaccestoken(); // get accesstokenutilsはカプセル化されたクラス// stitching apiが必要ですhttpsurl link string urlstring = "https://api.weixin.q 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]を表示します。文字列reslut = ""; int len; while((len = isr.read(chars))!= -1){reslut += new String(chars、0、len); } system.out.println( "return result:" + reslut); isr.close(); } catch(ioexception e){e.printstacktrace(); }} public String getMenujson(){gson gson = new gson(); // json処理ツールメニュー= newメニュー(); //メニュークラスリスト<fatherbutton> fatherbuttons = new arraylist <fatherbutton>; fb1.setname( "click"); fb1.settype( "click"); fb1.setkey( "10"); // -------------------- // parent button2 fatherbutton fb2 = new fatherbutton(); 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 = 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"); //チャイルドボタンを子ボタンに追加しますsonbuttons2.add(sb21); sonbuttons2.add(sb22); sonbuttons2.add(sb23); sonbuttons2.add(sb24); sonbuttons2.add(sb25); //チャイルドボタンを2-0の親ボタンに設定しますfb2.setsonbuttons(sonbuttons2); // -------------------- //親ボタン3 fatherbutton fb3 = new fatherbutton(); fb3.setname( "presidy button3");リスト<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 ---> media_idが必要なため、テストできません。これには、マテリアルIDを呼び出す必要があります。 // sonbutton sb33 = new Sonbutton(); // sb33.setname( "media_id"); // sb33.settype( "media_id"); // sb33.setmedia_id( "???"); // // Subbutton 3-4-> media_idが必要なため、テストできません。これには、マテリアルIDを呼び出す必要があります。 // sonbutton sb34 = new 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)に配置します。 // --------------------- //親ボタンを親ボタンコレクションに追加する父Buttons.add(fb1); fatherbuttons.add(fb2); fatherbuttons.add(fb3); //メニューバーメニューに親ボタンキューを追加します。文字列json = gson.tojson(メニュー); System.out.println(json); //テスト出力return json; }パーソナライズされたメニューの実装
•タスク:性別に応じてさまざまなボタンを表示します(性別、地域、モバイルオペレーティングシステムなどによってグループ化できます)
•コード1を変更します。異なるWeChatの背景によって実装されるため、インターフェイスは異なります。ただし、まだPOSTリクエストです。コードを変更する必要はありません。元のUrlstringを交換するだけです。
//スプライシングAPI文字列urlstring = "https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token =" + access_token;
•コード2を変更します。マッチルールを作成し、マッチングルールを設定し、マッチルールをメニューに追加してマッチングルールを完了します。
// ----- //ここでパーソナライズされたメニューの設定を開始するMatchRule MatchRule = new MatchRule(); matchRule.setSex( "2"); // boys menu.setmatchrule(matchrule); // -----
ソースコードのダウンロード:http://xiazai.vevb.com/201606/yuanma/weixinapi(vevb.com).rar
この記事は「Android Wechat Development Tutorial Summary」にまとめられており、「Java Wechat Development Tutorial Summary」は、すべての人を学び、読むことを歓迎します。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。