溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

微信公眾賬號(hào)開(kāi)發(fā)自定義菜單的示例分析

發(fā)布時(shí)間:2021-09-14 10:13:49 來(lái)源:億速云 閱讀:101 作者:小新 欄目:移動(dòng)開(kāi)發(fā)

小編給大家分享一下微信公眾賬號(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è)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI