企業公衆號增加對接h5頁面底部菜單

登錄微信公衆號後臺  如果自定義菜單可以直接用,就可以在這裏創建

我的方式:通過代碼

根據微信接口文檔 https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.html

需要直接跳轉h5頁面 已有對應 URL

使用 創建菜單接口

  1. 新建一個信任管理類  (網上找的)
package com.bootdo.sharebus.token;

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class MyX509TrustManager implements X509TrustManager {

	// 對於https請求,我們需要一個證書信任管理器
	// 檢查客戶端證書
	public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
	}

	// 檢查服務器端證書
	public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
	}

	// 返回受信任的X509證書數組
	public X509Certificate[] getAcceptedIssuers() {
		return null;
	}
}

2.建立Token實體類存儲 獲取的access_token

package com.bootdo.sharebus.token;

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;
	}
}

3.創建token獲取類

package com.bootdo.sharebus.token;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.bootdo.sharebus.utils.SendRequest;
import com.bootdo.sharebus.utils.WeixinParamUtil;

import net.sf.json.JSONException;
import net.sf.json.JSONObject;

public class TokenUtil {
	private static Logger log = LoggerFactory.getLogger(TokenUtil.class);

	// 憑證獲取(GET)https請求方式: GET
	// grant_type 獲取access_token填寫client_credential appid 第三方用戶唯一憑證 secret
	// 第三方用戶唯一憑證密鑰,即appsecret
	// https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
	public final static String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
			+ WeixinParamUtil.appId + "&secret=" + WeixinParamUtil.appSecret + "";

	public final static String access_token = getToken().getAccessToken();

	public final static String expires_in = "";

	/**
	 * 獲取接口訪問憑證
	 * 
	 * @return
	 */
	public static Token getToken() {
		Token token = null;
		String requestUrl = token_url;
		// 發起GET請求獲取憑證֤
		JSONObject jsonObject = SendRequest.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 = null;
				// 獲取token失敗
				log.error("獲取token失敗 errcode:{} errmsg:{}", jsonObject.getInt("errcode"),
						jsonObject.getString("errmsg"));
			}
		}
		return token;
	}
}

4.MD5加密工具

package com.bootdo.sharebus.utils;

import java.security.MessageDigest;

public class MD5Util {

	/***
	 * MD5加碼 生成32位md5碼
	 */
	public static String string2MD5(String inStr) {
		MessageDigest md5 = null;
		try {
			// 引用 java.security.MessageDigest公共類
			// getInstance("MD5")方法 設置加密格式
			md5 = MessageDigest.getInstance("MD5"); // 此句是核心
		} catch (Exception e) {
			System.out.println(e.toString());
			e.printStackTrace();
			return "";
		}
		char[] charArray = inStr.toCharArray();
		byte[] byteArray = new byte[charArray.length];

		for (int i = 0; i < charArray.length; i++)
			byteArray[i] = (byte) charArray[i];
		byte[] md5Bytes = md5.digest(byteArray);
		StringBuffer hexValue = new StringBuffer();
		for (int i = 0; i < md5Bytes.length; i++) {
			int val = ((int) md5Bytes[i]) & 0xff;
			if (val < 16)
				hexValue.append("0");
			hexValue.append(Integer.toHexString(val));
		}
		return hexValue.toString();

	}

	/**
	 * 加密解密算法[可逆] 執行一次加密,執行兩次解密
	 */
	public static String convertMD5(String inStr) {

		char[] a = inStr.toCharArray();
		for (int i = 0; i < a.length; i++) {
			a[i] = (char) (a[i] ^ 't');
		}
		String s = new String(a);
		return s;

	}

	// 測試主函數
	public static void main(String args[]) {
		String s = new String("tangfuqiang");
		System.out.println("原始:" + s);
		System.out.println("MD5後:" + string2MD5(s));
		System.out.println("加密的:" + convertMD5(s));
		System.out.println("解密的:" + convertMD5(convertMD5(s)));

	}
}

5.發送request請求

package com.bootdo.sharebus.utils;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.bootdo.sharebus.token.MyX509TrustManager;

import net.sf.json.JSONObject;

public class SendRequest {

	private static Logger log = LoggerFactory.getLogger(SendRequest.class);

	/**
	 * 發送https請求
	 * 
	 * @param requestUrl    請求地址
	 * @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.SecureRandom());
			// 從上述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);
			}

			// 輸出返回結果
			System.out.println(buffer);

			// 釋放資源
			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;
	}

}

6.微信公衆號相關參數

package com.bootdo.sharebus.utils;

/**
 * 公衆號參數
 * 
 * @author dell
 *
 */
public class WeixinParamUtil {

	// 開發者ID(AppID)
	public final static String appId = "wx1413ae43cb87af94";

	// 開發者密碼(AppSecret)
	public final static String appSecret = "b085048a2e07b9736a1794da6f33faa8";

	public final static String nonce_str = String.valueOf(Math.random()).substring(2, 15);

	public final static String stringSignTemp = "appId=wx1413ae43cb87af94&login_type=weixin&nonce_str=" + nonce_str
			+ "&parkscode=cx&appSecret=b085048a2e07b9736a1794da6f33faa8";

	public final static String sign = MD5Util.string2MD5(stringSignTemp).toUpperCase();
	// 共享巴士url
	public final static String busUrl = "http://m.feparks.com/mobile/bush5/index?appId=wx1413ae43cb87af94&login_type=weixin&nonce_str="
			+ nonce_str + "&parkscode=cx&sign=" + sign;
	// 按鈕菜單
	public final static String menu = "{\"button\":[{\"type\":\"view\",\"name\":\"共享巴士\",\"url\":\"" + busUrl + "\"}]}";

	// 創建菜單
	public static String createUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=";

	// 刪除菜單
	public static String deleteUrl = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=";

	// 查詢菜單
	public static String queryUrl = "https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=";

	public static void main(String[] args) {
		System.out.println(nonce_str);
		System.out.println(stringSignTemp);
		System.out.println(sign);
		System.out.println(busUrl);
		System.out.println(menu);
	}
}

7.測試類

package zhgl.test.sharebus;

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;

import org.junit.Test;

import com.bootdo.sharebus.token.MyX509TrustManager;
import com.bootdo.sharebus.token.TokenUtil;
import com.bootdo.sharebus.utils.WeixinParamUtil;

public class ShareBusTest {

	@Test
	public void test() throws Exception {
//		String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
//				+ WeixinParamUtil.appId + "&secret=" + WeixinParamUtil.appSecret + "";

		// 查詢菜單
//		String tokenUrl = "https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token="
//				+ TokenUtil.access_token;

		// 刪除菜單
		String tokenUrl = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=" + TokenUtil.access_token;

		// 創建菜單
//		String tokenUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + TokenUtil.access_token;

		String outputStr = WeixinParamUtil.menu;
		System.out.println(tokenUrl);
		// 建立連接
		URL url = new URL(tokenUrl);
		HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();

		// 創建SSLContext對象,並使用我們指定的信任管理器初始化
		TrustManager[] tm = { new MyX509TrustManager() };
		SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
		sslContext.init(null, tm, new java.security.SecureRandom());
		// 從上述SSLContext對象中得到SSLSocketFactory對象
		SSLSocketFactory ssf = sslContext.getSocketFactory();

		httpUrlConn.setSSLSocketFactory(ssf);
		httpUrlConn.setDoOutput(true);
		httpUrlConn.setDoInput(true);

		// 設置請求方式(GET/POST)
		httpUrlConn.setRequestMethod("GET");

		// 當outputStr不爲null時向輸出流寫數據
		if (null != outputStr) {
			OutputStream outputStream = httpUrlConn.getOutputStream();
			// 注意編碼格式
			outputStream.write(outputStr.getBytes("UTF-8"));
			outputStream.close();
		}

		// 取得輸入流
		InputStream inputStream = httpUrlConn.getInputStream();
		InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
		BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
		// 讀取響應內容
		StringBuffer buffer = new StringBuffer();
		String str = null;
		while ((str = bufferedReader.readLine()) != null) {
			buffer.append(str);
		}
		bufferedReader.close();
		inputStreamReader.close();
		// 釋放資源
		inputStream.close();
		httpUrlConn.disconnect();
		// 輸出返回結果
		System.out.println(buffer);
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章