在上一篇文章中我们已经绑定好域名了,接下来最主要的任务就是第三个步骤:通过config接口注入权限验证配置
下图是微信公众平台
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名,见附录1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
这几个值主要就是生成签名复杂一点,其他的参数都好取,我们主要讲解如何获取签名(示例中获取的 AccessToken并没有进行缓存):
底层dao方法:
//获取签名需要用到的一系列方法
//获取AccessToken
public static String getAccessToken() { // runBatch(){
String access_token = "";
String grant_type = "client_credential";//获取access_token填写client_credential
//这个url链接地址和参数皆不能变
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type="+grant_type+"&appid="+Constants.APP_ID+"&secret="+Constants.APPSECRET;
try {
URL urlGet = new URL(url);
HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
http.setRequestMethod("GET"); // 必须是get方式请求
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒
http.connect();
InputStream is = http.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
String message = new String(jsonBytes, "UTF-8");
JSONObject demoJson = JSONObject.fromObject(message);
System.out.println("JSON字符串:"+demoJson);
access_token = demoJson.getString("access_token");
} catch (Exception e) {
e.printStackTrace();
}
return access_token;
}
//获取Ticket
public static String getTicket(String access_token) {
String ticket = null;
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+ access_token +"&type=jsapi";//这个url链接和参数不能变
try {
URL urlGet = new URL(url);
HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
http.setRequestMethod("GET"); // 必须是get方式请求
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒
http.connect();
InputStream is = http.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
String message = new String(jsonBytes, "UTF-8");
JSONObject demoJson = JSONObject.fromObject(message);
System.out.println("JSON字符串:"+demoJson);
ticket = demoJson.getString("ticket");
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return ticket;
}
//拿到了jsapi_ticket之后就要参数名排序和拼接字符串,并加密了。以下为sha1的加密算法
public static String SHA1(String decript) {
try {
MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
digest.update(decript.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
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();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
//获取签名
public static String getQianMing(String accessToken,String jsapi_ticket,String noncestr,String timestamp,String url){
String str= "jsapi_ticket="+jsapi_ticket+"&noncestr="+noncestr+"×tamp="+timestamp+"&url="+url;
System.out.println("str"+str);
//6、将字符串进行sha1加密
String signature =SHA1(str);
System.out.println("参数:"+str+"\n签名:"+signature);
return signature;
}
control层写的方法:
// 调用微信接口 需要用到的配置参数
@SuppressWarnings({ "rawtypes", "unchecked" })
@RequestMapping("pageConfig.jspx")
public void pageConfig(String url, HttpServletRequest request,
HttpServletResponse response, ModelMap model) {
Map map = new HashMap();
String appId=Constants.APP_ID;
String accessToken=WeixinUtil.getAccessToken(); //access_token
String jsapi_ticket=WeixinUtil.getTicket(accessToken); //jsapi_ticket
String noncestr = UUID.randomUUID().toString().replace("-", "").substring(0, 16); //随机字符串
String timestamp = String.valueOf(System.currentTimeMillis() / 1000); //时间戳
String signature=WeixinUtil.getQianMing(accessToken, jsapi_ticket, noncestr, timestamp, url); //生成签名
try {
map.put("appId", appId);
map.put("timestamp", timestamp);
map.put("nonceStr", noncestr);
map.put("signature", signature);
map.put("success", Boolean.valueOf(true));
map.put("message", "正确");
} catch (Exception e) {
e.printStackTrace();
map.put("message", "错误");
}
ResponseUtils.renderJson(response, StrUtils.toJsonStr(map));
}
html页面上调用的部分关键代码:
分享到朋友圈方法要注意两点:
link中的redirect_uri中的值必须进行转义,类似:& //都是不认的,必须进行转义才能用;还有一点,链接中带的参数只能有一个,有两个以上的话转发之后也会丢失的,只会携带一个参数,建议需要用多个参数的话,可以把值拼串,用到的时候在分解。
后台方法都写好以后,我们就开始进行测试了,要调用微信分享接口的链接必须是用域名进行访问,微信客户端访问的时候会弹出提示信息的,如果看到 config:ok 的提示的时候,说明配置已经成功了,分享到朋友圈也就成功了一大半,点击分享到朋友圈接口,看一下分享的内容是不是自定义的方法。