当前位置: 首页 > news >正文

JAVA生成微信JSSDK接口签名

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

签名生成规则如下:

  • 参与签名的字段包括有效的 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

相关文章:

  • 工作总结-发送修改数据的请求时,修改数据成功,但是报非安全https请求,响应失败...
  • 陈松松:一个视频如何获得不同视频网站的排名秘诀
  • [译]自主权身份简介
  • [Linux] PHP程序员玩转Linux系列-telnet轻松使用邮箱
  • Linux程序接口实验:取进程标志及用户信息
  • SHELL编程练习-批量创建删除用户和组
  • angular学习第一篇-----环境搭建
  • 回溯算法入门及经典案例剖析(初学者必备宝典)
  • Linux系统的LOG日志文件及入侵后日志的清除
  • C# int? 关键字
  • 4-机器学习启蒙- 聚类和相似度模型
  • 1.2—Spring项目快速搭建—2.基于Spring Tool Suite搭建
  • “box-shadow”属性(转)
  • SQL Server 使用 Pivot 和 UnPivot 实现行列转换
  • 博通孔海泉:一个完全无线连接的市场要解决4个问题
  • [译]如何构建服务器端web组件,为何要构建?
  • 【刷算法】从上往下打印二叉树
  • If…else
  • leetcode388. Longest Absolute File Path
  • leetcode98. Validate Binary Search Tree
  • Mocha测试初探
  • Python_网络编程
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • tweak 支持第三方库
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 反思总结然后整装待发
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 聊聊directory traversal attack
  • 排序算法学习笔记
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • scrapy中间件源码分析及常用中间件大全
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #Linux(make工具和makefile文件以及makefile语法)
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (6)设计一个TimeMap
  • (7)STL算法之交换赋值
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (poj1.2.1)1970(筛选法模拟)
  • (笔试题)分解质因式
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)EOS中账户、钱包和密钥的关系
  • ***检测工具之RKHunter AIDE
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET Core引入性能分析引导优化
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET 服务 ServiceController