企业公众号增加对接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);
	}
}

 

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