メニューを作成するとき、データは JSON に基づいて送信されるため、JSON が使用されます。 クリックしてダウンロードします。
パブリック プラットフォーム開発ドキュメントには次の手順が記載されています。
注意してください:
1.最大 3 それぞれの第 1 レベルのメニューには、最大 5 つの第 2 レベルのメニューが含まれます。
2. 第 1 レベルのメニューには最大 4 文字、第 2 レベルのメニューには最大 7 文字の中国語を含めることができます。余分な部分は「...」に置き換えられます。
3. カスタム メニューを作成した後、WeChat クライアントのキャッシュのため、WeChat クライアントがそれを表示するまでに 24 時間かかります。テストする場合は、公開アカウントのフォローを解除してから再度フォローしてみると、作成後の効果を確認できます。
カスタム メニュー インターフェイスは、次のようなさまざまなタイプのボタンを実装できます:
1. クリック: クリック プッシュ イベント ユーザーがクリック タイプ ボタンをクリックした後、WeChat サーバーはメッセージ タイプ イベント
構造を開発者にプッシュします。メッセージ インターフェイス (メッセージ インターフェイス ガイドを参照) を使用して、開発者が入力したキー値をボタンに表示し、ユーザーの後のビュー: URL をカスタマイズします。ビュー タイプ ボタンをクリックすると、WeChat 顧客の端末は、開発者が
ボタンに入力した Web ページ URL を開きます。これを Web ページ認証インターフェイスと組み合わせて、ユーザーの基本情報を取得することができます。
3. scancode_push: ユーザーがスキャン コード プッシュ イベントのボタンをクリックすると、スキャン コード操作が完了すると、WeChat クライアントがスキャン ツールを起動し、スキャン結果が表示されます (URL の場合は、その URL が表示されます)。を入力すると)、スキャン コードが表示され、結果が開発者に渡され、開発者はメッセージを送信できます。
4. scancode_waitmsg: コードをスキャンしてイベントをプッシュし、「メッセージ受信」プロンプト ボックスを表示します。ユーザーがボタンをクリックすると、コード スキャン操作の完了後に WeChat クライアントがスキャン ツールを起動します。コードスキャンが開発者に送信され、同時にスキャンツールをしまうと、「メッセージ
受信中」プロンプトボックスが表示され、開発者からメッセージを受け取る場合があります。
5. pic_sysphoto: ユーザーがボタンをクリックすると、システムが起動し、写真操作が完了すると、
撮影した写真が開発者に送信されます。イベントを開発者にプッシュすると同時に、システム カメラが開発者からメッセージを受信する場合があります。
6. pic_photo_or_album: ユーザーが写真を撮るかアルバムに写真を送信するボタンをクリックすると、WeChat クライアントはユーザーが「写真を撮る」か「携帯電話のアルバムから選択」を選択するためのセレクターをポップアップします。 。ユーザーが選択した後、他の 2 つのプロセスを実行します。
7. pic_weixin: ユーザーがポップアップ表示される WeChat フォト アルバム送信者のボタンをクリックすると、選択操作が完了すると WeChat クライアントが WeChat フォト アルバムを呼び出し、選択した写真が開発者のサーバーに送信されます。イベントは開発者にプッシュされます。同時にフォト アルバムを閉じると、後で送信者からメッセージを受け取る可能性があります。
8. location_select: ユーザーがポップアップ地理的位置セレクターのボタンをクリックすると、選択操作が完了すると、WeChat クライアントは地理的位置選択ツールを起動し、選択された地理的位置が開発者のサーバーに送信されます。場所の選択は終了します。
ツール、後ほど開発者からメッセージが届く場合があります。
9. media_id: ユーザーが
media_id タイプ ボタンをクリックしてメッセージ (テキスト メッセージを除く) を送信すると、WeChat サーバーは開発者によって入力された永続マテリアル ID に対応するマテリアルをユーザーに送信します。
は、写真、音声、ビデオ、グラフィック メッセージにすることができます。注意: 永久マテリアル ID は、「マテリアル管理/永久マテリアルの追加」
インターフェースを通じてアップロードした後に取得した法的 ID である必要があります。 10. view_limited: 画像とテキスト メッセージの URL にジャンプします。ユーザーが view_limited タイプのボタンをクリックすると、WeChat クライアントは、開発者がボタンに入力した永続的なマテリアル ID に対応する画像とテキスト メッセージの URL を開きます。マテリアル タイプは画像とテキスト メッセージのみをサポートします。注意: 永久マテリアル ID は、「マテリアル管理/永久マテリアルの追加」インターフェースを介してアップロードした後に取得した法的 ID である必要があります。
3 から 8 までのすべてのイベントは、WeChat iPhone 5.4.1 以降、および Android 5.4 以降のみをサポートしており、古いバージョンの WeChat ユーザーはクリック後に応答せず、開発者はイベントを正常に受信できないことに注意してください。 9 と 10 は、WeChat によって認定されていないサードパーティ プラットフォームのサブスクリプション アカウント (具体的には、資格認定に合格しなかったアカウント) のために特別に用意されたイベント タイプであり、イベント プッシュがなく、その機能は比較的限定されています。他の種類の公開アカウント 使用する必要はありません。
1.カスタムメニューはhttpリクエストメソッドを使用するため、httpsプロトコルを使用する必要があります。 https および json データを処理するメソッド クラスを作成します。
パッケージ com.cc.wechat.util の下に新しいクラスを作成します。
---CommonUtil.java:
package com.cc.wechat.util; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.URL; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; /** * 公众平台通用接口工具类 * @author ICHN * 2015-09-04 */ public class CommonUtil { /** * 发起https请求并获取结果 * @param requestUrl 请求地址 * @param requestMethod 请求方式(GET、POST) * @param outputStr 提交的数据 * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) */ public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) { StringBuffer sb = new StringBuffer(); // 创建SSLContext对象,并使用我们指定的信任管理器初始化 TrustManager[] tm = {new MyX509TrustManager()}; try { SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = new URL(requestUrl); HttpsURLConnection httpsUrlConnection = (HttpsURLConnection)url.openConnection(); httpsUrlConnection.setSSLSocketFactory(ssf); httpsUrlConnection.setDoInput(true); httpsUrlConnection.setDoOutput(true); httpsUrlConnection.setUseCaches(false); // 设置请求方式(GET/POST) httpsUrlConnection.setRequestMethod(requestMethod); //对请求方式进行判断 equalsIgnoreCase不区分大小写 if("GET".equalsIgnoreCase(requestMethod)) { //建立连接 httpsUrlConnection.connect(); } //当有数据需要提交时 if(null != outputStr) { OutputStream os = httpsUrlConnection.getOutputStream(); // 注意编码格式,防止中文乱码 os.write(outputStr.getBytes("UTF-8")); os.close(); } //将返回的输入流转换成字符串 InputStream is = httpsUrlConnection.getInputStream(); InputStreamReader isr = new InputStreamReader(is, "UTF-8"); BufferedReader br = new BufferedReader(isr); String strLine = null; while((strLine = br.readLine()) != null) { sb.append(strLine); } br.close(); isr.close(); //释放资源 is.close(); is = null; } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } }
package com.cc.wechat.menu; /** * 菜单按钮 * @author ICHN */ public class Button { //菜单标题,不超过16个字节,子菜单不超过40个字节 private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.cc.wechat.menu; /** * click类型按钮 * @author ICHN * */ public class ClickButton extends Button{ //菜单的响应动作类型 private String type; //菜单KEY值,用于消息接口推送,不超过128字节 private String key; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } }
package com.cc.wechat.menu; /** * 二级菜单数组 * 个数应为1~5个 * @author ICHN * */ public class ComplexButton extends Button { //二级菜单数组 private Button[] sub_button; public Button[] getSub_button() { return sub_button; } public void setSub_button(Button[] sub_button) { this.sub_button = sub_button; } }
package com.cc.wechat.menu; /** * 菜单 * @author ICHN * */ public class Menu { private Button[] button; public Button[] getButton() { return button; } public void setButton(Button[] button) { this.button = button; } }
package com.cc.wechat.menu; /** * view类型按钮 * @author ICHN * */ public class ViewButton extends Button { //菜单的响应动作类型 private String type; //网页链接,用户点击菜单可打开链接,不超过256字节 private String url; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } }
---GetAccessToken.java:
package com.cc.wechat.test; import com.cc.wechat.util.CommonUtil; /** * 获取access_token * @author ICHN * 测试账号的appID和appsecret * * access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。 * 开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。 * access_token的有效期目前为2个小时,需定时刷新, * 重复获取将导致上次获取的access_token失效 */ public class GetAccessToken { public static void main(String[] args) { //打印出access_token System.out.println(CommonUtil.httpsRequest( "&secret=此处填写appsecret", "GET", null ) ); } }
2. メニューの作成と削除:
---MenuTest.java:
package com.cc.wechat.test; import net.sf.json.JSONObject; import com.cc.wechat.menu.Button; import com.cc.wechat.menu.ClickButton; import com.cc.wechat.menu.ComplexButton; import com.cc.wechat.menu.Menu; import com.cc.wechat.util.CommonUtil; /** * 执行菜单的创建 * @author ICHN * */ public class MenuTest { public static void main(String[] args) { /** * 按钮类型就两种: * click类型 * view类型 */ /** *click类型 * 二级菜单1 * 所包含的二级菜单: * clickButton_11 * ... * 可以定义5个 */ ClickButton clickButton_11 = new ClickButton(); //设置按钮名称 clickButton_11.setName(""); //设置按钮类别 尊照微信开发文档给出的定义 clickButton_11.setType(""); //设置按钮key值 clickButton_11.setKey(""); //.....可以定义5个..... /** * 二级菜单2 * 所包含的二级菜单: * clickButton_21 * ... */ ClickButton clickButton_21 = new ClickButton(); clickButton_21.setName(""); clickButton_21.setType(""); clickButton_21.setKey(""); /** * 定义一个一级菜单数组, * 个数应为1~3个 */ ClickButton button_3 = new ClickButton(); button_3.setName(""); button_3.setType(""); button_3.setKey(""); /** * 上面的二级菜单定义好后, * 用一个带二级菜单的按钮(ComplexButton)装起来 */ //一级菜单1 ComplexButton complexButton1 = new ComplexButton(); complexButton1.setName("一级菜单1"); complexButton1.setSub_button(new Button[] {clickButton_11}); //一级菜单2 ComplexButton complexButton2 = new ComplexButton(); complexButton2.setName(""); complexButton2.setSub_button(new Button[] {clickButton_21}); //一级菜单3定义在上面 //用一个menu(相当于总菜单,在最外层)来把上面的菜单装起来 Menu menu = new Menu(); menu.setButton(new Button[] {complexButton1, complexButton2, button_3}); //把menu转换为json数组 String jsonMenu = JSONObject.fromObject(menu).toString(); /** * 创建和删除都是采用https协议 * http请求方式:POST(请使用https协议) */ //创建菜单接口 //https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN String createRequest = CommonUtil.httpsRequest( //requestUrl "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=此处填写上面GetAccessToken类获取的access_token", //requestMethod "POST", //outputStr jsonMenu ); //打印出创建状态信息(同时执行创建) //System.out.println(createRequest); //删除菜单接口 //https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN String deleteResult = CommonUtil.httpsRequest( "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=此处填写上面GetAccessToken类获取的access_token", "POST", jsonMenu ); //打印出删除状态信息(同时执行删除) System.out.println(deleteResult); } }
以上がWeChatパブリックプラットフォーム開発におけるカスタムメニューの作成と削除の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。