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

2、具体开发

2.1 获取access_token,然后jsapi_ticket

  1. /**
  2. * 获取access_token,然后jsapi_ticket
  3. */
  4. private String getAccessToken_ticket(String path) {
  5. String access_token = null; // access_token
  6. String atime = null;// 获取时间
  7. String a_expires_in = null;// 有效时间(s)
  8. String ticket = null;// jsapi_ticket
  9. String ttime = null;// 得到时间
  10. String t_expires_in = null;// 有效时间(s)
  11. String access_tokenStr = TUtils.getAccessToken(APPID,
  12. API_KEY);
  13. if (access_tokenStr != null
  14. && access_tokenStr.indexOf("access_token") != -1) {
  15. try {
  16. JSONObject jsonObject = new JSONObject(access_tokenStr);
  17. access_token = jsonObject.getString("access_token");
  18. a_expires_in = jsonObject.getString("expires_in");
  19. atime = getCurrentDateStr();
  20. } catch (JSONException e) {
  21. // e.printStackTrace();
  22. }
  23. }
  24. if (access_token != null && !access_token.equals("")) {
  25. String ticketStr = TicketUtils.getJSAPITicket(access_token);
  26. // System.out.println("ticketStr:" + ticketStr);
  27. if (ticketStr != null && ticketStr.indexOf("ticket") != -1) {
  28. try {
  29. JSONObject jsonObject = new JSONObject(ticketStr);
  30. ticket = jsonObject.getString("ticket");
  31. t_expires_in = jsonObject.getString("expires_in");
  32. ttime = getCurrentDateStr();
  33. } catch (JSONException e) {
  34. // e.printStackTrace();
  35. }
  36. }
  37. }
  38. String result = null;
  39. if (ticket != null && !ticket.equals("")) {
  40. result = "{\"access_token\":\"" + access_token
  41. + "\",\"a_expires_in\":\"" + a_expires_in
  42. + "\",\"atime\":\"" + atime + "\",\"ticket\":\"" + ticket
  43. + "\",\"t_expires_in\":\"" + t_expires_in
  44. + "\",\"ttime\":\"" + ttime + "\"}";
  45. if (MyFileUtils.writeIntoText(path, result)) {
  46. // System.out.println("写入文件成功");
  47. // System.out.println(result);
  48. } else {
  49. System.out.println("写入微信签名文件失败");
  50. }
  51. }
  52. return result;
  53. }
  1. public static String getAccessToken(String APPID, String APPSECRET) {
  2.  
  3. String url = "https://api.weixin.qq.com/cgi-bin/token";
  4. String params = "grant_type=client_credential&appid=" + APPID
  5. + "&secret=" + APPSECRET;
  6. String resultStr = HttpRequest.sendGet(url, params);
    // sendGet:用get方法获取数据 ,具体请参考之间的关于微信的文章 http://www.cnblogs.com/jiduoduo/p/5749363.html
  7.  
  8. return resultStr;
  9.  
  10. }
  1. /**
  2. * 根据access_token获取ticket { "errcode":0, "errmsg":"ok", "ticket":
  3. * "bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA"
  4. * , "expires_in":7200 }
  5. *
  6. * @param access_token
  7. * @return
  8. */
  9. public static String getJSAPITicket(String access_token) {
  10. String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
  11. String params = "type=jsapi&access_token=" + access_token;
  12. String resultStr = HttpRequest.sendGet(url, params);
  13.  
  14. return resultStr;
  15. }

2.2具体生成签名signature

  1. public String Wx_Signature() {
  2. String path = ServletActionContext.getServletContext().getRealPath(
  3. "/wx/");
  4. // System.out.println(path);
  5. try {
  6. String tokenJSON = MyFileUtils.readText(path);
  7. // String access_token = null; // access_token
  8. String atime = null;// 获取时间
  9. String a_expires_in = null;// 有效时间(s)
  10. String ticket = null;// jsapi_ticket
  11. // String ttime = null;// 得到时间
  12. // String t_expires_in = null;// 有效时间(s)
  13. String result = tokenJSON;
  14. if (result == null || result.equals("")) {
  15. tokenJSON = getAccessToken_ticket(path);
  16. }
  17. // System.out.println(result);
  18. if (tokenJSON != null && !tokenJSON.equals("")
  19. && tokenJSON.indexOf("access_token") != -1) {
  20. try {
  21. JSONObject jsonObject = new JSONObject(tokenJSON);
  22. // access_token = jsonObject.getString("access_token");//
  23. // access_token
  24. atime = jsonObject.getString("atime");// 开始时间
  25. a_expires_in = jsonObject.getString("a_expires_in");// 有效时间
  26. ticket = jsonObject.getString("ticket");// jsapi_ticket
  27. // System.out.println(ticket);
  28. // ttime = jsonObject.getString("ttime");// 开始时间
  29. // t_expires_in = jsonObject.getString("t_expires_in");//
  30. // 有效时间
  31. String t1 = getCurrentDateStr();
  32. String t2 = atime;
  33. // System.out.println(atime);
  34. // System.out.println(a_expires_in);
  35. // System.out.println(TimeInterval.getInterval(t2, t1));
  36. long end_time = Long.parseLong(a_expires_in) - 60;
  37. if (TimeInterval.getInterval(t2, t1) > end_time) {
  38. ticket = getAccessToken_ticket(path);
  39. }
  40. } catch (JSONException e) {
  41. msg = e.getMessage();
  42. }
  43. } else {
  44.  
  45. }
  46. // System.out.println(ticket);
  47. String url = getParameter("url");
  48. String noncestr = TUtils.getRandomString(16);
  49. String timestamp = System.currentTimeMillis() + "";
  50. timestamp = timestamp.substring(0, 10);
  51. String data = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr
  52. + "&timestamp=" + timestamp + "&url=" + url;
  53. String digest = new SHA1().getDigestOfString(data.getBytes());
  54. String signature = digest.toLowerCase();// signature
  55. result = "{\"noncestr\":\"" + noncestr + "\",\"timestamp\":\""
  56. + timestamp + "\",\"url\":\"" + url + "\",\"signature\":\""
  57. + signature + "\" ,\"ticket\":\"" + ticket + "\"}";
  58.         msg = result;
  59. } catch (IOException e) {
  60. msg = e.getMessage();
  61. }
  62. return msg
  63. }

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

JSAPI_Ticket签名的更多相关文章

  1. 微信--获取jsapi_ticket 然后在计算出signature

    最近做微信公众号,记录一下,仅供参看. 关于jsapi_ticket微信公众号有相关说明: 生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临 ...

  2. 微信开发---------jsapi_ticket拿不到的问题。

    今天代码没动,出现的问题是分享朋友圈,朋友,分享到QQ,我设置的分享链接都失效了.找来找去也不知道什么原因,没办法就只有一个个打印参数并查看文档,先把jssdk页面上的debug设置为true(微信原 ...

  3. 微信js获得签名signature

    服务器端: 1 获取微信js accessToken 备注:access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token. 开发者需要进行妥善保存.access_ ...

  4. node实现创建服务器获取wx jssdk签名

    // system module var http = require("http"); var https = require("https"); var u ...

  5. 关于微信的jsapi_ticket的获取方法;

    对于一个从前端转到后端的开发人员来说,这个玩意儿开始的时候是有点郁闷:不过明白原理之后就简单了, 获取jsapi_ticket:必须先获取access_token; 微信开发文档说access_tok ...

  6. 微信网页签名失败(invalid signature)

    签名失败,建议按以下步骤排查 确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验. 确认con ...

  7. 转:微信开发之使用java获取签名signature(贴源码,附工程)

    微信开发之使用java获取签名signature(贴源码,附工程) 标签: 微信signature获取签名 2015-12-29 22:15 6954人阅读 评论(3) 收藏 举报  分类: 微信开发 ...

  8. 微信开发之获取jsapi_ticket

    一.获取流程 1.获取 access_token 2.通过access_token换取 jsapi_ticket 3.签名算法 签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有 ...

  9. JSSDK实现微信自定义分享---java 后端获取签名信息

    一.首先说下关于微信Access_token的问题,微信Access_token分为2中: 1.授权token获取方式: 这种token需要code值(如何获取code值查看官方文档) "h ...

随机推荐

  1. 【翻译习作】 Windows Workflow Foundation程序开发-前言

    Windows Workflow Foundation程序开发-基于XAML和C#的WF实战技术与例程 ——C#程序员的WF功能与编程接口技术指导 前言 Windows Workflow Founda ...

  2. flash上传在spring mvc中出现的问题2

    转载请注明: TheViper http://www.cnblogs.com/TheViper  这两天本屌在做flash拼图上传遇到点坑 上传原理很简单,就是把上图右边画布区域BitmapData. ...

  3. iis 站点部署后 Microsof .Net Framework异常

    最近在部署站点到 iis 中时,遇到 iis 崩溃的问题,一打开部署好 的站点后,就出现 Microsoft .Net Framework 异常的消息提示,具体的 异常情况如下: 于是在网上查找了很多 ...

  4. php和apache安装心得

    又一次安装apache和php~~ 又一次心碎的体验~ 本想参考之前的apache配置之间进行安装(在windows 下编辑,然后传到linux上),怎耐,一直有问题,打开浏览器直接进行下载.发现是浏 ...

  5. h5 吸顶效果 顶部悬浮

    window.onscroll = function(){ var scrollTop = document.documentElement.scrollTop || document.body.sc ...

  6. mjrefresh源码分析

    最近想自己写个下拉刷新的库,但是始终感觉无从下手,想想总是容易的.原理也很简单,真正要下手写的时候,呵呵.不得不说ios封装得很好,网上可以用的成熟的库也很多,也正是因为如此很多开发者也忽略了很多底层 ...

  7. rsync 实现实时增量备份

    Rsync + Crontab实现定时文件同步(首次全量+后续增量) 2015-04-14 19:02:11 标签:增量更新 rsync crontab 原创作品,允许转载,转载时请务必以超链接形式标 ...

  8. JAVA设计模式--strategy(策略者模式)

    概念策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The Strategy Pattern defines a fa ...

  9. SpringMVC序列化Long转成String

    问题:由于JS中Number的精度为16位(最大位17位,第17位精度不准),我们的ID用的Number 18位,传到客户端会丢失最后两位: 解决方式:Long序列化成String,传到客户端: 注意 ...

  10. 如何更新Linux源

    首先需要自己收藏几个可以得到Linux源的站点,比如:http://mirrors.163.com/ (163的镜像站):可以百度搜索[Linux镜像站]: 下面这些镜像站,转自:http://www ...