這篇文章分享微信公用帳號開發自訂選單的經驗摘要
开发公司的微信公众账号,在没人指导没有人商量的情况下没少查资料、逛论坛。其中有多少酸甜苦辣,相信能进来看见我的帖子的能体会的到。一年多来为了应付公司的各种需求没时间整理,今天我就把详细的流程写下来供同样遇到问题的参考。微信公众账号几种分类相信大家都有了解。 订阅号我表示无能为力。除非你能认证通过。废话少说开撸。 自定义菜单操作流程其实很简单 ,就是执行一段Java程序 将你公众账号的appid和封装的菜单发送到腾讯服务器,腾讯服务器会根据你请求参数appid和封装的菜单添加到对应的公众账号,一定要罗嗦一句, 在Java 程序中执行一次 main 方法就可以,下次修改重新执行,不过会有缓存,取消重新关注就可以了。 1 新建按钮基类 public class Button { //按钮名称 private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 2,根据业务需求新建不同的按钮类 /** * view类型的按钮 点击跳转链接 * */ 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 根據捕捉到的key處理對應的業務
*
*/
public class ClickButton extends Button {
## private String type;
private String key;
public String getType() {
setType(String type) {
this.type = type;
}
public String getKey() {## ## }
public void setKey(String key) {
this.key = key;
建立符合類型的按鈕, 說白了就是建立主選單容器
/**
* 複合型別的按鈕
*
*/
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 建立選單類, 用來盛裝三個主選單/* * * 選單 */public class Menu { private Button[] button; public Button[] getButton() { return button ; } public void setButton(Button[] button) { this.button = button;## }
#}
5 建立呼叫憑證類別Token 為執行main方法呼叫騰訊介面做準備
/**
* 憑證
*
*/
public class Token {
# // 介面存取憑證
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 為呼叫騰訊介面做準備
(1)建立通用工具類別
/**
* 一般工具類別
*
*/
public class CommonUtil {
private static Logger log = LoggerFactory.getLogger(CommonUtil.class);
/**
* 取得介面存取憑證
*
* @param appid 憑證
## * @param appsecret 金鑰## * @return
*/
# public static Token getToken(String appid, String appsecret
# public static Token getToken(String appid, String appsecret ) { // 憑證取得(GET) 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); //發起GET請求取得憑證 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;
}
/**
* 發送https請求
*
# * @param requestUrl 請求位址
* @param requestMethod 請求方式(GET、POST)
* @param requestMethod 請求方式(GET、POST)
# * @param outputStr 提交的資料
* @return JSONObject(透過JSONObject.get(key)的方式取得json物件的屬性值)
# */
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
try {
// 建立SSLContext對象,並使用我們指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.
sslContext.init(null, tm, new java.security. )); // 從上述SSLContext物件得到SSLSocketFactory物件 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);
// 設定請求方式(GET/POST)
conn.setRequestMethod(requestMethod);
// 當outputStr不為null時向輸出流寫資料
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
# // 注意編碼格式
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
# }
// 從輸入流讀取回傳內容
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("連線逾時:{}", ce);
} catch (Exception e) {
log.error("https請求例外:{}", e);
}
return jsonObject ;
}
}
(2)建立信任管理器
package com.test.util;
import java. security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
/**
* 信任管理器
*
*/
public class MyX509TrustManager implements X509TrustManager {
// 檢查客戶端憑證
public void checkClientTrusted(X509Certificate[] chain, String authType) throws Certate(X509Certificate[] chain, String authType) throws Certate#cefate##ificate#cc # }
// 檢查伺服器端憑證
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
# //傳回受信任的X509憑證陣列
public X509Certificate[] getAcceptedIssuers() {
return null;
# }
}
# return null;
## }
}
7 以上工作做完就可以建立自訂選單了。建立自訂選單管理類別。賦值 appId 和 appSecret 運行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);
/**
* 定義選單結構
* @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});//微信規定最多五個子選單
ComplexButton mainBtn2 = new ComplexButton();
mainBtn2.setName("主選單2");
mainBtn2 .setSub_button(new Button[] { btn3});
ComplexButton mainBtn3 = new ComplexButton();
mainBtn3.setName("主選單3");
## .setSub_button(new Button[] {btn4});
Menu menu = new Menu();
menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 });
return menu;
}
public static void main(String[] args) {
// 公用帳號唯一憑證
1
String appId = "";
//公用帳號唯一憑證金鑰
String appSecret = "";
// 呼叫介面取得憑證
### Token token = CommonUtil.getToken(appId, appSecret);###### if (null != token) {###// 建立選單
boolean result = createMenu(getMenu(), token.getAccessToken());
// 判斷選單建立結果
if (result )
log.info("選單建立成功!");
else
log.info("選單建立失敗!");
}
}
/**
* 建立選單
*
* @param menu 選單實例
* @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);
// 將選單物件轉換成json字串
String jsonMenu = JSONObject.fromObject(menu).toString();
# //發起POST請求建立選單
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("建立選單失敗errcode:{} errmsg:{}", errorCode, errorMsg);
}
}
return result;
}
}
以上是微信公眾帳號開發自訂選單的經驗總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!