您好,登錄后才能下訂單哦!
小編給大家分享一下微信公眾賬號(hào)開(kāi)發(fā)自定義菜單的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
開(kāi)發(fā)公司的微信公眾賬號(hào),在沒(méi)人指導(dǎo)沒(méi)有人商量的情況下沒(méi)少查資料、逛論壇。其中有多少酸甜苦辣,相信能進(jìn)來(lái)看見(jiàn)我的帖子的能體會(huì)的到。一年多來(lái)為了應(yīng)付公司的各種需求沒(méi)時(shí)間整理,今天我就把詳細(xì)的流程寫(xiě)下來(lái)供同樣遇到問(wèn)題的參考。微信公眾賬號(hào)幾種分類相信大家都有了解。 訂閱號(hào)我表示無(wú)能為力。除非你能認(rèn)證通過(guò)。廢話少說(shuō)開(kāi)擼。 自定義菜單操作流程其實(shí)很簡(jiǎn)單 ,就是執(zhí)行一段Java程序 將你公眾賬號(hào)的appid和封裝的菜單發(fā)送到騰訊服務(wù)器,騰訊服務(wù)器會(huì)根據(jù)你請(qǐng)求參數(shù)appid和封裝的菜單添加到對(duì)應(yīng)的公眾賬號(hào),一定要羅嗦一句, 在Java 程序中執(zhí)行一次 main 方法就可以,下次修改重新執(zhí)行,不過(guò)會(huì)有緩存,取消重新關(guān)注就可以了。 1 新建按鈕基類 public class Button { //按鈕名稱 private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 2,根據(jù)業(yè)務(wù)需求新建不同的按鈕類 /** * view類型的按鈕 點(diǎn)擊跳轉(zhuǎn)鏈接 * */ public class ViewButton extends Button { private String type; 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; } } /** * click類型的按鈕 類似于input type = 'button' 指定key 根據(jù)捕獲到的key處理相應(yīng)的業(yè)務(wù) * */ public class ClickButton extends Button { private String type; 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; } } 3 創(chuàng)建符合類型的按鈕 , 說(shuō)白了就是創(chuàng)建主菜單容器 /** * 復(fù)合類型的按鈕 * */ 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; } } 4 創(chuàng)建菜單類, 用于盛放 三個(gè)主菜單 /** * 菜單 */ public class Menu { private Button[] button; public Button[] getButton() { return button; } public void setButton(Button[] button) { this.button = button; } } 5 創(chuàng)建調(diào)用憑證類Token 為執(zhí)行main方法調(diào)用騰訊接口做準(zhǔn)備 /** * 憑證 * */ public class Token { // 接口訪問(wèn)憑證 private String accessToken; // 憑證有效期,單位:秒 private int expiresIn; public String getAccessToken() { return accessToken; } public void setAccessToken(String accessToken) { this.accessToken = accessToken; } public int getExpiresIn() { return expiresIn; } public void setExpiresIn(int expiresIn) { this.expiresIn = expiresIn; } } 以下代碼我只做類的描述。具體代碼功能看注釋。 6 為調(diào)用騰訊接口做準(zhǔn)備 (1)創(chuàng)建通用工具類 /** * 通用工具類 * */ public class CommonUtil { private static Logger log = LoggerFactory.getLogger(CommonUtil.class); /** * 獲取接口訪問(wèn)憑證 * * @param appid 憑證 * @param appsecret 密鑰 * @return */ public static Token getToken(String appid, String appsecret) { // 憑證獲?。℅ET) String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"; Token token = null; String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret); // 發(fā)起GET請(qǐng)求獲取憑證 JSONObject jsonObject = httpsRequest(requestUrl, "GET", null); if (null != jsonObject) { try { token = new Token(); token.setAccessToken(jsonObject.getString("access_token")); token.setExpiresIn(jsonObject.getInt("expires_in")); } catch (JSONException e) { // 獲取token失敗 token = null; } } return token; } /** * 發(fā)送https請(qǐng)求 * * @param requestUrl 請(qǐng)求地址 * @param requestMethod 請(qǐng)求方式(GET、POST) * @param outputStr 提交的數(shù)據(jù) * @return JSONObject(通過(guò)JSONObject.get(key)的方式獲取json對(duì)象的屬性值) */ public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) { JSONObject jsonObject = null; try { // 創(chuàng)建SSLContext對(duì)象,并使用我們指定的信任管理器初始化 TrustManager[] tm = { new MyX509TrustManager() }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 從上述SSLContext對(duì)象中得到SSLSocketFactory對(duì)象 SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = new URL(requestUrl); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setSSLSocketFactory(ssf); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); // 設(shè)置請(qǐng)求方式(GET/POST) conn.setRequestMethod(requestMethod); // 當(dāng)outputStr不為null時(shí)向輸出流寫(xiě)數(shù)據(jù) if (null != outputStr) { OutputStream outputStream = conn.getOutputStream(); // 注意編碼格式 outputStream.write(outputStr.getBytes("UTF-8")); outputStream.close(); } // 從輸入流讀取返回內(nèi)容 InputStream inputStream = conn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; StringBuffer buffer = new StringBuffer(); while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } // 釋放資源 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); inputStream = null; conn.disconnect(); jsonObject = JSONObject.fromObject(buffer.toString()); } catch (ConnectException ce) { log.error("連接超時(shí):{}", ce); } catch (Exception e) { log.error("https請(qǐng)求異常:{}", e); } return jsonObject; } } (2)創(chuàng)建信任管理器 package com.test.util; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.X509TrustManager; /** * 信任管理器 * */ public class MyX509TrustManager implements X509TrustManager { // 檢查客戶端證書(shū) public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } // 檢查服務(wù)器端證書(shū) public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } // 返回受信任的X509證書(shū)數(shù)組 public X509Certificate[] getAcceptedIssuers() { return null; } } 7 以上工作做完就可以創(chuàng)建自定義菜單了。創(chuàng)建自定義菜單管理類。賦值 appId 和 appSecret 運(yùn)行main方法, 搞定。 package com.test.menu; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.sf.json.JSONObject; import com.test.bean.Button; import com.test.bean.ComplexButton; import com.test.bean.Menu; import com.test.bean.Token; import com.test.bean.ViewButton; import com.test.util.CommonUtil; /** * 菜單管理器類 * */ public class MenuManager { private static Logger log = LoggerFactory.getLogger(MenuManager.class); /** * 定義菜單結(jié)構(gòu) * @return */ private static Menu getMenu() { //定義子菜單 ViewButton btn1 = new ViewButton(); btn1.setName("子菜單1"); btn1.setType("view"); btn1.setUrl("http://www.baidu.com"); ViewButton btn2 = new ViewButton(); btn2.setName("子菜單2"); btn2.setType("view"); btn2.setUrl("http://www.baidu.com"); ViewButton btn3 = new ViewButton(); btn3.setName("子菜單3"); btn3.setType("view"); btn3.setUrl("http://www.baidu.com"); ViewButton btn4 = new ViewButton(); btn4.setName("子菜單4"); btn4.setType("view"); btn4.setUrl("http://www.baidu.com"); ComplexButton mainBtn1 = new ComplexButton(); mainBtn1.setName("主菜單1"); mainBtn1.setSub_button(new Button[] { btn1,btn2});//微信規(guī)定最多五個(gè)子菜單 ComplexButton mainBtn2 = new ComplexButton(); mainBtn2.setName("主菜單2"); mainBtn2.setSub_button(new Button[] { btn3}); ComplexButton mainBtn3 = new ComplexButton(); mainBtn3.setName("主菜單3"); mainBtn3.setSub_button(new Button[] {btn4}); Menu menu = new Menu(); menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 }); return menu; } public static void main(String[] args) { // 公眾賬號(hào)唯一憑證 1 <br> String appId = ""; //公眾賬號(hào)唯一憑證密鑰 String appSecret = ""; // 調(diào)用接口獲取憑證 Token token = CommonUtil.getToken(appId, appSecret); if (null != token) { // 創(chuàng)建菜單 boolean result = createMenu(getMenu(), token.getAccessToken()); // 判斷菜單創(chuàng)建結(jié)果 if (result) log.info("菜單創(chuàng)建成功!"); else log.info("菜單創(chuàng)建失敗!"); } } /** * 創(chuàng)建菜單 * * @param menu 菜單實(shí)例 * @param accessToken 憑證 * @return true成功 false失敗 */ public static boolean createMenu(Menu menu, String accessToken) { boolean result = false; String menu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN"; String url = menu_create_url.replace("ACCESS_TOKEN", accessToken); // 將菜單對(duì)象轉(zhuǎn)換成json字符串 String jsonMenu = JSONObject.fromObject(menu).toString(); // 發(fā)起POST請(qǐng)求創(chuàng)建菜單 JSONObject jsonObject = CommonUtil.httpsRequest(url, "POST", jsonMenu); if (null != jsonObject) { int errorCode = jsonObject.getInt("errcode"); String errorMsg = jsonObject.getString("errmsg"); if (0 == errorCode) { result = true; } else { result = false; log.error("創(chuàng)建菜單失敗 errcode:{} errmsg:{}", errorCode, errorMsg); } } return result; } }
以上是“微信公眾賬號(hào)開(kāi)發(fā)自定義菜單的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。