微信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 相关文章推荐
Javascript 定时器调用传递参数的方法
Nov 12 Javascript
Jquery之美中不足小结
Feb 16 Javascript
js操作label给label赋值及取label的值示例
Nov 07 Javascript
jquery如何获取复选框的值
Dec 12 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
Sep 24 Javascript
实例详解jQuery结合GridView控件的使用方法
Jan 04 Javascript
Bootstrap实现导航栏的2种方式
Nov 28 Javascript
vue数据双向绑定的注意点
Jun 23 Javascript
微信小程序组件 marquee实例详解
Jun 23 Javascript
详解VueJs中的V-bind指令
May 03 Javascript
vue实现分页组件
Jun 16 Javascript
原生js canvas实现鼠标跟随效果
Aug 02 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
yum命令安装php7和相关扩展
2016/07/04 PHP
php实现的二分查找算法示例
2017/06/20 PHP
PHP验证码无法显示的原因及解决办法
2017/08/11 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
给Javascript数组插入一条记录的代码
2007/08/30 Javascript
在Ubuntu上安装最新版本的Node.js
2014/07/14 Javascript
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
jQuery+css实现百度百科的页面导航效果
2014/12/16 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
微信小程序版翻牌小游戏
2018/01/26 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
详解开发react应用最好用的脚手架 create-react-app
2018/04/24 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
在vue中获取wangeditor的html和text的操作
2020/10/23 Javascript
多版本Python共存的配置方法
2017/05/22 Python
python 调用c语言函数的方法
2017/09/29 Python
利用python将pdf输出为txt的实例讲解
2018/04/23 Python
详解如何为eclipse安装合适版本的python插件pydev
2018/11/04 Python
python频繁写入文件时提速的方法
2019/06/26 Python
Python虚拟环境的原理及使用详解
2019/07/02 Python
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
UNDONE手表官网:世界领先的定制手表品牌
2018/11/13 全球购物
美国渔具店:FishUSA
2019/08/07 全球购物
捐款倡议书范文
2014/02/02 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
劳资协议书范本
2014/04/23 职场文书
中班幼儿评语大全
2014/04/30 职场文书
教师节演讲稿
2014/05/06 职场文书
三峡人家导游词
2015/01/31 职场文书
毕业生捐书活动倡议书
2015/04/27 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
青少年法制教育心得体会
2016/01/14 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书