微信JSAPI Ticket接口签名详解

发布时间 - 2026-01-11 02:13:34    点击率:

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

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

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
   + "&timestamp=" + 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到服务器的文件中。

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


# 微信  # JS  # 签名  # 微信封装的调用微信签名包的类库  # 微信开发之获取JSAPI TICKET  # 微信JSAPI支付操作需要注意的细节  # 微信支付java版本之JSAPI支付+发送模板消息  # 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法  # Java通过JsApi方式实现微信支付  # 是有  # 将其  # 大家分享  # 具体内容  # 请参考  # 大家多多  # equals  # printStackTrace  # JSONException  # ticketStr  # System  # getJSAPITicket  # TicketUtils  # catch  # JSONObject  # indexOf  # amp 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用IIS7快速搭建并优化网站站点?  🚀拖拽式CMS建站能否实现高效与个性化并存?  如何为不同团队 ID 动态生成多个独立按钮  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  Python3.6正式版新特性预览  如何用已有域名快速搭建网站?  网站制作价目表怎么做,珍爱网婚介费用多少?  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  Laravel如何使用Service Container和依赖注入?(代码示例)  EditPlus中的正则表达式实战(6)  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  如何快速生成ASP一键建站模板并优化安全性?  如何生成腾讯云建站专用兑换码?  音乐网站服务器如何优化API响应速度?  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  如何在IIS中新建站点并配置端口与物理路径?  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  JS中对数组元素进行增删改移的方法总结  微信小程序 input输入框控件详解及实例(多种示例)  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  C#如何调用原生C++ COM对象详解  如何在Windows 2008云服务器安全搭建网站?  如何快速生成橙子建站落地页链接?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  文字头像制作网站推荐软件,醒图能自动配文字吗?  php打包exe后无法访问网络共享_共享权限设置方法【教程】  如何用虚拟主机快速搭建网站?详细步骤解析  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  如何用PHP快速搭建高效网站?分步指南  详解jQuery中的事件  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  如何在万网主机上快速搭建网站?  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  微信小程序 scroll-view组件实现列表页实例代码  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  ,怎么在广州志愿者网站注册?  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  如何在云虚拟主机上快速搭建个人网站?  常州企业网站制作公司,全国继续教育网怎么登录?  Laravel如何实现API版本控制_Laravel版本化API设计方案  独立制作一个网站多少钱,建立网站需要花多少钱?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  微信推文制作网站有哪些,怎么做微信推文,急?  Laravel如何为API生成Swagger或OpenAPI文档  如何在建站主机中优化服务器配置?