微信开发之获取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的中问验证码
Nov 25 PHP
PHP PDO函数库详解
Apr 27 PHP
PHP将XML转数组过程详解
Nov 13 PHP
thinkphp文件处理类Dir.class.php的用法分析
Dec 08 PHP
php获取从html表单传递数组的方法
Mar 20 PHP
PHP中把数据库查询结果输出为json格式简单实例
Apr 09 PHP
php实现格式化多行文本为Js可用格式
Apr 15 PHP
微信公众号开发之语音消息识别php代码
Aug 08 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
PHP常用字符串函数小结(推荐)
Aug 05 PHP
PHP 模拟登陆功能实例详解
Sep 10 PHP
laravel5环境隐藏index.php后缀(apache)的方法
Oct 12 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 session处理的定制
2009/03/16 PHP
php筛选不存在的图片资源
2015/04/28 PHP
java模拟PHP的pack和unpack类
2016/04/13 PHP
Laravel与CI框架中截取字符串函数
2016/05/08 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
2017/05/12 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
新手入门常用代码集锦
2007/01/11 Javascript
WordPress 插件——CoolCode使用方法与下载
2007/07/02 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
仅img元素创建后不添加到文档中会执行onload事件的解决方法
2011/07/31 Javascript
jQuery渐变发光导航菜单的实例代码
2013/03/27 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
2017/05/11 Javascript
webpack学习--webpack经典7分钟入门教程
2017/06/28 Javascript
使用JavaScript根据图片获取条形码的方法
2017/07/04 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
2018/07/09 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
2020/12/10 Vue.js
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
对pandas中apply函数的用法详解
2018/04/10 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
python用requests实现http请求代码实例
2019/10/31 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
解决TensorFlow模型恢复报错的问题
2020/02/06 Python
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
华为python面试题
2016/05/03 面试题
《掌声》教学反思
2014/02/23 职场文书
意向书范本
2014/07/29 职场文书
户籍证明书标准模板
2014/09/10 职场文书
民主评议党员总结
2014/10/20 职场文书
公司给客户的感谢信
2015/01/23 职场文书
介绍信范文
2015/01/31 职场文书
python 解决微分方程的操作(数值解法)
2021/05/26 Python
如何更改Win11声音输出设备?Win11声音输出设备四种更改方法
2022/04/08 数码科技