微信开发之获取JSAPI TICKET


Posted in PHP onJuly 07, 2017

一、获取流程

1、获取 access_token

2、通过access_token换取 jsapi_ticket

3、签名算法

签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。

二、具体实现方式

1、获取access_token

/**
 * [getAccessToken description] 获取access_token
 * @return [type] [description] */private function getAccessToken() {
  $data = $this->getFile($this->accessTokenFile);  if(time() - $data['time'] > 0){
    $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appID}&secret={$this->appsecret}";
    $re = $this->httpGet($url);
    $access_token = $re['access_token'];    
    if(isset($access_token)){
      $data['access_token'] = $access_token;
      $data['time'] = time() + 7200;
      $this->setFile($this->accessTokenFile,json_encode($data));
    }
  }else{
    $access_token = $data['access_token'];
  }  return $access_token;
}

access_token 的有效时间是7200s,故可以采用文件存储的方法进行保存,避免多次请求;

2、获取jsapi_ticket

/**
 * [getJsapiTicket description] 获取jsapi_ticket
 * @return [type] [description] */private function getJsapiTicket() {
  $access_token = $this->getAccessToken();
  $jsapi_ticket = $this->getFile($this->jsapiTicketFile);  if(time() - $jsapi_ticket['time'] > 0) {
    $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$access_token}&type=jsapi";
    $re = $this->httpGet($url);
    $this->preArr($re);
    $jsapi_ticket = $re['ticket'];    
    if(isset($jsapi_ticket)){
      $data['jsapi_ticket'] = $jsapi_ticket;
      $data['time'] = time() + 7200;
      $this->setFile($this->jsapiTicketFile, json_encode($data));
    }
  }else{
    $jsapi_ticket = $jsapi_ticket['jsapi_ticket'];
  }  return $jsapi_ticket;
}

通过access_token进行交换,得到jsapi_ticket,有效期也是7200s;

3、生成签名

/**
 * [getSignpackage description] 获取签名
 * @return [type] [description] */public function getSignpackage(){
  $jsapi_ticket = $this->getJsapiTicket();  // 注意 URL 一定要动态获取,不能 hardcode.
  $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
  $noncestr = $this->createNonceStr();
  $timestamp = time();

  $string1 = "jsapi_ticket={$jsapi_ticket}&noncestr={$noncestr}×tamp={$timestamp}&url={$url}";
  $signature = sha1($string1);  
  $signPackage = array(    
    'appId'   => $this->appID,    
    'nonceStr' => $noncestr,    
    'timestamp' => $timestamp,    
    'signature' => $signature,
  );  
  return $signPackage;
}

签名算法

使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1:

对string1进行sha1签名,得到signature:

注意事项:

1.签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。

2.签名用的url必须是调用JS接口页面的完整URL。

3.出于安全考虑,开发者必须在服务器端实现签名的逻辑。

 详情参考:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183

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

PHP 相关文章推荐
php 动态多文件上传
Jan 18 PHP
PHP中foreach循环中使用引用要注意的地方
Jan 02 PHP
仿AS3实现PHP 事件机制实现代码
Jan 27 PHP
PHP 中检查或过滤IP地址的实现代码
Nov 27 PHP
一个简洁的PHP可逆加密函数(分享)
Jun 06 PHP
php判断当前操作系统类型
Oct 28 PHP
PHP设计模式之工厂模式与单例模式
Sep 28 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
Feb 08 PHP
在php的yii2框架中整合hbase库的方法
Sep 20 PHP
PHP array_reduce()函数的应用解析
Oct 28 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 PHP
实例讲解PHP表单
Jun 10 PHP
Yii2第三方类库插件Imagine的安装和使用
Jul 06 #PHP
一个实用的php验证码类
Jul 06 #PHP
万能的php分页类
Jul 06 #PHP
PHP 实现从数据库导出到.csv文件方法
Jul 06 #PHP
php文件上传类的分享
Jul 06 #PHP
PHP图片水印类的封装
Jul 06 #PHP
php生出随机字符串
Jul 06 #PHP
You might like
php中生成随机密码的自定义函数代码
2013/10/21 PHP
php读取文件内容的三种可行方法示例介绍
2014/02/08 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
PHP内置函数生成随机数实例
2019/01/18 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
javascript StringBuilder类实现
2008/12/22 Javascript
实现连缀调用的map方法(prototype)
2009/08/05 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
利用jquery实现瀑布流3种案例
2016/09/18 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
2016/12/30 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
2017/09/23 jQuery
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
在微信小程序中使用图表的方法示例
2019/04/25 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
[01:08:56]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第一场 2月7日
2021/03/11 DOTA
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
django中cookiecutter的使用教程
2020/12/03 Python
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
一篇.NET面试题
2014/09/29 面试题
音乐学院硕士生的自我评价分享
2013/11/01 职场文书
自荐书格式
2013/12/01 职场文书
总经理秘书岗位职责
2014/03/17 职场文书
2014年个人总结范文
2015/03/09 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
python代码实现扫码关注公众号登录的实战
2021/11/01 Python
JavaScript 定时器详情
2021/11/11 Javascript