微信开发之获取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+mysql)
Nov 23 PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
Jun 11 PHP
php遍历所有文件及文件夹的方法深入解析
Jun 08 PHP
基于PHP创建Cookie数组的详解
Jul 03 PHP
有关于PHP中常见数据类型的汇总分享
Jan 06 PHP
PHP程序员基本要求和必备技能
May 09 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
php邮件发送的两种方式
Apr 28 PHP
PHP错误处理函数
Apr 03 PHP
php实现将HTML页面转换成word并且保存的方法
Oct 14 PHP
thinkPHP数据库增删改查操作方法实例详解
Dec 06 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
Oct 15 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
BBS(php & mysql)完整版(五)
2006/10/09 PHP
php通过strpos查找字符串出现位置的方法
2015/03/17 PHP
不要小看注释掉的JS 引起的安全问题
2008/12/27 Javascript
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
JS实现字符串转日期并比较大小实例分析
2015/12/09 Javascript
js+html5实现的自由落体运动效果代码
2016/01/28 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
JavaScript中boolean类型之三种情景实例代码
2016/11/21 Javascript
微信小程序之仿微信漂流瓶实例
2016/12/09 Javascript
浅析vue数据绑定
2017/01/17 Javascript
vuejs实现递归树型菜单组件
2018/01/13 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
jQuery使用each遍历循环的方法
2018/09/19 jQuery
使用vue2.0创建的项目的步骤方法
2018/09/25 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
用pyqt5 给按钮设置图标和css样式的方法
2019/06/24 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
文明工地标语
2014/06/16 职场文书
机械设计制造及其自动化专业求职信
2014/06/17 职场文书
学校教师安全责任书
2014/07/23 职场文书
领导干部作风建设剖析材料
2014/10/11 职场文书
介绍信的写法
2015/01/31 职场文书
基于python实现银行管理系统
2021/04/20 Python
python调试工具Birdseye的使用教程
2021/05/25 Python
Python实现对齐打印 format函数的用法
2022/04/28 Python
Hive常用日期格式转换语法
2022/06/25 数据库
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS