获取token,和权限token不同,访问下边的接口获取token(传入appid、appsecret)
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s获取token后访问下面接口,获取ticket(传入access_token)
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi成功返回
返回成功格式
{"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd841ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200}获取ticket
添加时间戳(秒)、随机数
String noncestr = StringUtil.getRandStr(10);//随机数
String timestamp = String.valueOf(System.currentTimeMillis()/1000);根据前段传入的url转换,前段传入时会处理格式(encodeURIComponent方法处理)
url = new String(url.getBytes("ISO8859-1"), "UTF-8");将数据整合:
params.put("jsapi_ticket", ticket);
params.put("noncestr", noncestr);
params.put("timestamp", timestamp);
params.put("url", url);根据ASSIC排序sha1加密
排序方法
public static String createLinkString(Map<String, String> params) {
List<String> keys = new ArrayList<String>(params.keySet());
Collections.sort(keys);
String prestr = "";
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = params.get(key);
if("sign".equals(key)){
continue;
}
if ("".equals(prestr)) {// 拼接时,不包括最后一个&字符
prestr = prestr + key + "=" + value;
} else {
prestr = prestr +"&" +key + "=" + value ;
}
}
return prestr;
}加密方法
public static String encode(String str) {
if (str == null) {
return null;
}
try {
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
messageDigest.update(str.getBytes());
return getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
} 经过排序加密后得到signature
组装数据返回前段供调起js使用
dateMap.put("appId", mpAccount.getAppid());
dateMap.put("timestamp", timestamp);
dateMap.put("nonceStr", noncestr);
dateMap.put("signature", signature);至此调用完成,可以在https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign微信提供的测试地址测试签名是否成功(传入的参数是之前通过JsApiTicket获取的ticket、随机数、时间戳。url)
版权声明:本文为qq_34495753原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。