下面是针对“微信公众号开发之设置自定义菜单实例代码【java版】”的完整攻略:
概述
本文主要介绍使用 Java 编写微信公众号自定义菜单的示例代码。自定义菜单包括一级菜单和二级菜单,每个一级菜单下可以有多个二级菜单,一级菜单最多包含3个二级菜单。
步骤
步骤一:获取授权
首先,您需要前往微信公众平台申请账号并通过审核。审核通过后,就可以在管理后台获取到 AppID
和 AppSecret
。
步骤二:导入相关包
在 Java 环境下开发微信公众号需要进行接口签名、HTTP请求的调用和 JSON数据解析等操作,我们需要导入相关的包。
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
步骤三:生成Signature
在此处,我们需要在 Java 环境中使用 SHA1
算法对字符串进行加密,并获取签名。示例代码如下:
private static String SHA1(String decript) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update(decript.getBytes());
byte[] messageDigest = digest.digest();
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString();
}
private static String getSignature(String token, String timestamp, String nonce) throws NoSuchAlgorithmException {
List<String> list = new ArrayList<String>();
list.add(token);
list.add(timestamp);
list.add(nonce);
Collections.sort(list, new Comparator<String>() {
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
StringBuilder sb = new StringBuilder();
for (String s : list) {
sb.append(s);
}
return SHA1(sb.toString());
}
步骤四:获取 Access_Token
使用微信 API 需要频繁地获取 access_token
,而其又对每天的获取次数有限制。我们在获取 access_token
时应该使用缓存机制。
private static String getAccessToken(String appId, String appSecret) throws JSONException, Exception {
String accessTokenCache = getCache("access_token");
if (accessTokenCache != null && !"".equals(accessTokenCache)) {
JSONObject jsonCache = new JSONObject(accessTokenCache);
long cacheTime = jsonCache.getLong("time");
if (System.currentTimeMillis() / 1000L - cacheTime < jsonCache.getLong("expires_in")) {
return jsonCache.getString("access_token");
}
}
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
HttpGet httpGet = new HttpGet(url);
JSONObject result = new JSONObject(EntityUtils.toString(httpClient.execute(httpGet).getEntity()));
putCache("access_token", result.toString());
return result.getString("access_token");
}
步骤五:创建自定义菜单
有了 access_token
,我们可以通过调用微信 API 创建自定义菜单了。一级菜单最多为3个,每个菜单最多包含5个二级菜单。
private static void createMenu(String token) throws JSONException, Exception {
String url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + token;
HttpPost httpPost = new HttpPost(url);
JSONArray buttonArray = new JSONArray();
JSONObject mainButton1 = new JSONObject();
mainButton1.put("name", "菜单按钮1");
mainButton1.put("type", "click");
mainButton1.put("key", "menu1-key1");
buttonArray.put(mainButton1);
JSONObject mainButton2 = new JSONObject();
mainButton2.put("name", "菜单按钮2");
mainButton2.put("sub_button", new JSONArray()
.put(new JSONObject().put("name", "按钮2-1").put("type", "click").put("key", "menu2-1-key1"))
.put(new JSONObject().put("name", "按钮2-2").put("type", "click").put("key", "menu2-2-key1"))
);
buttonArray.put(mainButton2);
JSONObject mainButton3 = new JSONObject();
mainButton3.put("name", "菜单按钮3");
mainButton3.put("type", "view");
mainButton3.put("url", "https://www.baidu.com/");
buttonArray.put(mainButton3);
JSONObject menu = new JSONObject();
menu.put("button", buttonArray);
httpPost.setEntity(new UrlEncodedFormEntity(Collections.singletonList(new BasicNameValuePair("data", menu.toString())), HTTP.UTF_8));
httpClient.execute(httpPost);
}
步骤六:运行代码
有了以上代码,我们可以直接运行程序来创建微信自定义菜单了。
public static void main(String[] args) throws Exception {
String token = getAccessToken("[your_appid]", "[your_appsecret]");
createMenu(token);
}
示例
以上就是本文的完整攻略。下面我将给出两个关于微信公众号菜单的示例。
示例一:单击菜单
JSONObject mainButton1 = new JSONObject();
mainButton1.put("name", "设备绑定");
mainButton1.put("type", "click");
mainButton1.put("key", "bind_device");
上述代码演示的是菜单类型为“click”的一级菜单。当用户点击此菜单时,微信服务器将会以 POST 消息的方式推送一个事件给公众号,公众号可以用普通消息回复此消息。
示例二:查看网页
JSONObject mainButton3 = new JSONObject();
mainButton3.put("name", "访问官网");
mainButton3.put("type", "view");
mainButton3.put("url", "http://www.example.com/");
上述代码演示的是菜单类型为“view”的一级菜单。当用户点击此菜单时,微信客户端将打开在菜单中配置的网页 URL。
希望以上内容对您有所帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信公众号开发之设置自定义菜单实例代码【java版】 - Python技术站