JAVA生成微信JSSDK接口签名

签名生成规则如下:

  • 参与签名的字段包括有效的 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<String, String> params = new HashMap<String, String>();
	params.put("jsapi_ticket", jsapi_ticket);
	params.put("noncestr", noncestr);
	params.put("timestamp", timestamp);
	params.put("url", url);
	//1.1 对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)
	Map<String, String> sortParams = sortAsc(params);
	//1.2 使用URL键值对的格式拼接成字符串
	String str = mapJoin(sortParams, false);
	String signature = new SHA().enc(str);
	Map<String, String> result = new HashMap<String,String>();
	result.put("debug", "false");
	result.put("appId", appid);
	result.put("nonceStr", noncestr);
	result.put("timestamp", timestamp);
	result.put("signature", signature);
	return result;
}


private HashMap<String, String> sortAsc(Map<String, String> map) {
	HashMap<String, String> tempMap = new LinkedHashMap<String, String>();
	List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(map.entrySet());
	//排序
	Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() {
		@Override
		public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
			return o1.getKey().compareTo(o2.getKey());
		}
	});

	for (int i = 0; i < infoIds.size(); i++) {
		Map.Entry<String, String> item = infoIds.get(i);
		tempMap.put(item.getKey(), item.getValue());
	}
	return tempMap;
}


public static String mapJoin(Map<String, String> 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个小时,自己服务器上使用缓存保留一小时,过期后重新获取

转载于:https://my.oschina.net/857359351/blog/883870

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值