微信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 相关文章推荐
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
Mar 14 Javascript
JS下高效拼装字符串的几种方法比较与测试代码
Apr 15 Javascript
myFocus slide3D v1.1.0 使用方法与下载
Jan 12 Javascript
JavaScript实现更改网页背景与字体颜色的方法
Feb 02 Javascript
javascript中SetInterval与setTimeout的定时器用法
Aug 24 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
Dec 29 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
Feb 12 Javascript
JavaScript如何实现组合列表框中元素移动效果
Mar 01 Javascript
Bootstrap表单使用方法详解
Feb 17 Javascript
jQuery图片缩放插件smartZoom使用实例详解
Aug 25 jQuery
vue 实现搜索的结果页面支持全选与取消全选功能
May 10 Javascript
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
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
PHP Ajax中文乱码问题解决方法
2009/02/27 PHP
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
PHP获取客户端及服务器端IP的封装类
2016/07/21 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
InnerHtml和InnerText的区别分析
2009/03/13 Javascript
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
2015/07/01 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
用JS生成UUID的方法实例
2016/03/30 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
bootstrap日历插件datetimepicker使用方法
2016/12/14 Javascript
Angularjs修改密码的实例代码
2017/05/26 Javascript
NodeJS链接MySql数据库的操作方法
2017/06/27 NodeJs
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
2017/12/28 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
[01:14]辉夜杯战队访谈宣传片—NEWBEE.Y
2015/12/26 DOTA
matplotlib绘图实例演示标记路径
2018/01/23 Python
Python 如何优雅的将数字转化为时间格式的方法
2019/09/26 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
pygame实现成语填空游戏
2019/10/29 Python
Python Matplotlib简易教程(小白教程)
2020/07/28 Python
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
运动会稿件100字
2014/02/21 职场文书
授权委托书格式范文
2014/08/02 职场文书
停车位租赁协议书
2014/09/24 职场文书
三严三实对照检查材料思想汇报
2014/09/28 职场文书
工伤事故证明
2014/10/20 职场文书
商务信函英语问候语
2015/11/10 职场文书
运动会班级口号霸气押韵
2015/12/24 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书
JavaScript 定时器详情
2021/11/11 Javascript
漫画「狩龙人拉格纳」公开TV动画预告图
2022/03/22 日漫