微信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 相关文章推荐
html读出文本文件内容
Jan 22 Javascript
浅谈javascript中的作用域
Apr 07 Javascript
JQuery 常用方法和事件详细介绍
Apr 18 Javascript
JQuery实现表格中相同单元格合并示例代码
Jun 26 Javascript
JavaScript获取页面中表单(form)数量的方法
Apr 03 Javascript
js实现按钮颜色渐变动画效果
Aug 20 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
Sep 19 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
Sep 02 Javascript
对angularJs中2种自定义服务的实例讲解
Sep 30 Javascript
微信小程序dom操作的替代思路实例分析
Dec 06 Javascript
Vue实例的对象参数options的几个常用选项详解
Nov 08 Javascript
ES5和ES6中类的区别总结
Dec 21 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
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
angularJS 入门基础
2015/02/09 Javascript
javascript中eval函数用法分析
2015/04/25 Javascript
JavaScript中的Math.atan2()方法使用详解
2015/06/15 Javascript
jquery插件格式实例分析
2016/06/16 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
Bootstrap jquery.twbsPagination.js动态页码分页实例代码
2017/02/20 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
2017/04/14 Javascript
JavaScript实现的搜索及高亮显示功能示例
2017/08/14 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
深入理解使用Vue实现Context-Menu的思考与总结
2019/03/09 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
javascript+Canvas实现画板功能
2020/06/23 Javascript
Node.js 深度调试方法解析
2020/07/28 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
python算法学习之计数排序实例
2013/12/18 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
Python TKinter如何自动关闭主窗口
2020/02/26 Python
Python计算指定日期是今年的第几天(三种方法)
2020/03/26 Python
Python连接mysql数据库及简单增删改查操作示例代码
2020/08/03 Python
Python高阶函数与装饰器函数的深入讲解
2020/11/10 Python
打造高效课堂实施方案
2014/03/22 职场文书
班主任评语大全
2014/04/26 职场文书
超市商业计划书
2014/05/04 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
依法行政工作汇报材料
2014/10/28 职场文书
5.12护士节活动总结
2015/02/10 职场文书
倡议书范文大全
2015/04/28 职场文书
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS