微信JSAPI Ticket接口签名详解


Posted in Javascript onJune 28, 2020

本文实例为大家分享了微信JS接口签名的具体代码,供大家参考,具体内容如下

1、微信 JS 接口签名校验工具

微信JSAPI Ticket接口签名详解

2、具体开发

2.1 获取access_token,然后jsapi_ticket

/**
 * 获取access_token,然后jsapi_ticket
 */
 private String getAccessToken_ticket(String path) {
 String access_token = null; // access_token
 String atime = null;// 获取时间
 String a_expires_in = null;// 有效时间(s)
 String ticket = null;// jsapi_ticket
 String ttime = null;// 得到时间
 String t_expires_in = null;// 有效时间(s)
 String access_tokenStr = TUtils.getAccessToken(APPID,
  API_KEY);
 if (access_tokenStr != null
  && access_tokenStr.indexOf("access_token") != -1) {
  try {
  JSONObject jsonObject = new JSONObject(access_tokenStr);
  access_token = jsonObject.getString("access_token");
  a_expires_in = jsonObject.getString("expires_in");
  atime = getCurrentDateStr();
  } catch (JSONException e) {
  // e.printStackTrace();
  }
 }
 if (access_token != null && !access_token.equals("")) {
  String ticketStr = TicketUtils.getJSAPITicket(access_token);
  // System.out.println("ticketStr:" + ticketStr);
  if (ticketStr != null && ticketStr.indexOf("ticket") != -1) {
  try {
   JSONObject jsonObject = new JSONObject(ticketStr);
   ticket = jsonObject.getString("ticket");
   t_expires_in = jsonObject.getString("expires_in");
   ttime = getCurrentDateStr();
  } catch (JSONException e) {
   // e.printStackTrace();
  }
  }
 }
 String result = null;
 if (ticket != null && !ticket.equals("")) {
  result = "{\"access_token\":\"" + access_token
   + "\",\"a_expires_in\":\"" + a_expires_in
   + "\",\"atime\":\"" + atime + "\",\"ticket\":\"" + ticket
   + "\",\"t_expires_in\":\"" + t_expires_in
   + "\",\"ttime\":\"" + ttime + "\"}";
  if (MyFileUtils.writeIntoText(path, result)) {
  // System.out.println("写入文件成功");
  // System.out.println(result);
  } else {
  System.out.println("写入微信签名文件失败");
  }
 }
 return result;
 }
public static String getAccessToken(String APPID, String APPSECRET) {

String url = "https://api.weixin.qq.com/cgi-bin/token";
 String params = "grant_type=client_credential&appid=" + APPID
  + "&secret=" + APPSECRET;
String resultStr = HttpRequest.sendGet(url, params);
// sendGet:用get方法获取数据 ,具体请参考之间的关于微信的文章 http://www.cnblogs.com/jiduoduo/p/5749363.html

return resultStr;

}


/**
 * 根据access_token获取ticket { "errcode":0, "errmsg":"ok", "ticket":
 * "bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA"
 * , "expires_in":7200 }
 * 
 * @param access_token
 * @return
 */
 public static String getJSAPITicket(String access_token) {
 String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
 String params = "type=jsapi&access_token=" + access_token;
 String resultStr = HttpRequest.sendGet(url, params);

 return resultStr;
 }

2.2具体生成签名signature

public String Wx_Signature() {
 String path = ServletActionContext.getServletContext().getRealPath(
  "/wx/");
 // System.out.println(path);
 try {
  String tokenJSON = MyFileUtils.readText(path);
  // String access_token = null; // access_token
  String atime = null;// 获取时间
  String a_expires_in = null;// 有效时间(s)
  String ticket = null;// jsapi_ticket
  // String ttime = null;// 得到时间
  // String t_expires_in = null;// 有效时间(s)
  String result = tokenJSON;
  if (result == null || result.equals("")) {
  tokenJSON = getAccessToken_ticket(path);
  }
  // System.out.println(result);
  if (tokenJSON != null && !tokenJSON.equals("")
   && tokenJSON.indexOf("access_token") != -1) {
  try {
   JSONObject jsonObject = new JSONObject(tokenJSON);
   // access_token = jsonObject.getString("access_token");//
   // access_token
   atime = jsonObject.getString("atime");// 开始时间
   a_expires_in = jsonObject.getString("a_expires_in");// 有效时间
   ticket = jsonObject.getString("ticket");// jsapi_ticket
   // System.out.println(ticket);
   // ttime = jsonObject.getString("ttime");// 开始时间
   // t_expires_in = jsonObject.getString("t_expires_in");//
   // 有效时间
   String t1 = getCurrentDateStr();
   String t2 = atime;
   // System.out.println(atime);
   // System.out.println(a_expires_in);
   // System.out.println(TimeInterval.getInterval(t2, t1));
   long end_time = Long.parseLong(a_expires_in) - 60;
   if (TimeInterval.getInterval(t2, t1) > end_time) {
   ticket = getAccessToken_ticket(path);
   }
  } catch (JSONException e) {
   msg = e.getMessage();
  }
  } else {

  }
  // System.out.println(ticket);
  String url = getParameter("url");
  String noncestr = TUtils.getRandomString(16);
  String timestamp = System.currentTimeMillis() + "";
  timestamp = timestamp.substring(0, 10);
  String data = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr
   + "×tamp=" + timestamp + "&url=" + url;
  String digest = new SHA1().getDigestOfString(data.getBytes());
  String signature = digest.toLowerCase();// signature
  result = "{\"noncestr\":\"" + noncestr + "\",\"timestamp\":\""
   + timestamp + "\",\"url\":\"" + url + "\",\"signature\":\""
   + signature + "\" ,\"ticket\":\"" + ticket + "\"}";



msg = result;
 } catch (IOException e) {
  msg = e.getMessage();
 }
 return msg 
 }

说明:签名是有调用次数,需要将其cache到服务器的文件中。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js弹出窗口之弹出层的小例子
Jun 17 Javascript
javascript中数组的冒泡排序使用示例
Dec 18 Javascript
关于数据与后端进行交流匹配(点亮星星)
Aug 03 Javascript
AngularJS实现ajax请求的方法
Nov 22 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
May 10 Javascript
es6基础学习之解构赋值
Dec 10 Javascript
vue多层嵌套路由实例分析
Mar 19 Javascript
layui 实现表格某一列显示图标
Sep 19 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
Oct 26 Javascript
vue项目中js-cookie的使用存储token操作
Nov 13 Javascript
vue+spring boot实现校验码功能
May 27 Vue.js
用JS创建一个录屏功能
Nov 11 Javascript
Angular.js自动化测试之protractor详解
Jul 07 #Javascript
vue.js全局API之nextTick全面解析
Jul 07 #Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
Jul 07 #Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
Jul 07 #Javascript
基于rem的移动端响应式适配方案(详解)
Jul 07 #Javascript
详谈js模块化规范
Jul 07 #Javascript
使用JavaScript实现alert的实例代码
Jul 06 #Javascript
You might like
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
封装一个PDO数据库操作类代码
2009/09/09 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
PHP程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
PHP如何使用Memcached
2016/04/05 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
2016/11/05 PHP
php微信开发之谷歌测距
2018/06/14 PHP
PHP常见过waf webshell以及最简单的检测方法
2019/05/21 PHP
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
jquery动画效果学习笔记(8种效果)
2015/11/13 Javascript
关于JavaScript数组你所不知道的3件事
2016/08/24 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
2020/05/06 Javascript
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
python发送HTTP请求的方法小结
2015/07/08 Python
django框架如何集成celery进行开发
2017/05/24 Python
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
2019/07/06 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
2019/08/14 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
用Python去除图像的黑色或白色背景实例
2019/12/12 Python
Python中实现输入一个整数的案例
2020/05/03 Python
Python函数参数定义及传递方式解析
2020/06/10 Python
举例详解CSS3中的Transition
2015/07/15 HTML / CSS
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
英国最大的在线运动补充剂商店:Discount Supplements
2017/06/03 全球购物
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
《三顾茅庐》教学反思
2014/04/10 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书
合作合同协议书
2016/03/21 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
Redis中key的过期删除策略和内存淘汰机制
2022/04/12 Redis