微信公眾帳號開發自訂選單的經驗總結

高洛峰
發布: 2017-03-22 16:10:45
原創
1963 人瀏覽過

這篇文章分享微信公用帳號開發自訂選單的經驗摘要

    开发公司的微信公众账号,在没人指导没有人商量的情况下没少查资料、逛论坛。其中有多少酸甜苦辣,相信能进来看见我的帖子的能体会的到。一年多来为了应付公司的各种需求没时间整理,今天我就把详细的流程写下来供同样遇到问题的参考。微信公众账号几种分类相信大家都有了解。 订阅号我表示无能为力。除非你能认证通过。废话少说开撸。
     
    自定义菜单操作流程其实很简单 ,就是执行一段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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!