首页 > 编程知识 正文

微信公众号jssdk,微信jssdk验证失败

时间:2023-05-05 19:36:00 阅读:267186 作者:2536

签名生成规则如下:

参与签名的字段包括有效的 jsapi_ticket(获取方式详见微信 JSSDK 文档), noncestr (随机字符串,由开发者随机生成),timestamp (由开发者生成的当前时间戳), url(当前网页的URL,不包含#及其后面部分。注意:对于没有只有域名没有 path 的 URL ,浏览器会自动加上 / 作为 path,如打开 http://qq.com 则获取到的 URL 为 http://qq.com/)。

对所有待签名参数按照字段名的 ASCII 码从小到大排序(字典序)后,使用 URL 键值对的格式(即key1=value1&key2=value2…)拼接成字符串 string1。这里需要注意的是所有参数名均为小写字符。

接下来对 string1 作 sha1 加密,字段名和字段值都采用原始值,不进行 URL 转义。即 signature=sha1(string1)。

/**

*获取JSSDK签名

*url:当前页面的完整URL,包括参数

**/

public Map getJsApiConfig(String url){

String jsapi_ticket = "获取jsapi_ticket";

String noncestr = UUID.randomUUID().toString().replace("-", "");

String timestamp = "" + System.currentTimeMillis() / 1000;

Map params = new HashMap();

params.put("jsapi_ticket", jsapi_ticket);

params.put("noncestr", noncestr);

params.put("timestamp", timestamp);

params.put("url", url);

//1.1 对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)

Map sortParams = sortAsc(params);

//1.2 使用URL键值对的格式拼接成字符串

String str = mapJoin(sortParams, false);

String signature = new SHA().enc(str);

Map result = new HashMap();

result.put("debug", "false");

result.put("appId", appid);

result.put("nonceStr", noncestr);

result.put("timestamp", timestamp);

result.put("signature", signature);

return result;

}

private HashMap sortAsc(Map map) {

HashMap tempMap = new LinkedHashMap();

List> infoIds = new ArrayList>(map.entrySet());

//排序

Collections.sort(infoIds, new Comparator>() {

@Override

public int compare(Map.Entry o1, Map.Entry o2) {

return o1.getKey().compareTo(o2.getKey());

}

});

for (int i = 0; i < infoIds.size(); i++) {

Map.Entry item = infoIds.get(i);

tempMap.put(item.getKey(), item.getValue());

}

return tempMap;

}

public static String mapJoin(Map map, boolean valueUrlEncode) {

StringBuilder sb = new StringBuilder();

for (String key : map.keySet()) {

if (map.get(key) != null && !"".equals(map.get(key))) {

try {

String temp = (key.endsWith("_") && key.length() > 1) ? key.substring(0, key.length() - 1) : key;

sb.append(temp);

sb.append("=");

//获取到map的值

String value = map.get(key);

//判断是否需要url编码

if (valueUrlEncode) {

value = URLEncoder.encode(map.get(key), "utf-8").replace("+", "%20");

}

sb.append(value);

sb.append("&");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

}

if (sb.length() > 0) {

sb.deleteCharAt(sb.length() - 1);

}

return sb.toString();

}

jsapi_ticket和access_token一样,有效时间为2个小时,自己服务器上使用缓存保留一小时,过期后重新获取

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。