微信开发之获取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字符转义相关函数小结(php下的转义字符串)
Apr 12 PHP
php中判断字符串是否全是中文或含有中文的实现代码
Sep 16 PHP
php实现图形显示Ip地址的代码及注释
Jan 20 PHP
2014年最新推荐的10款 PHP 开发框架
Aug 01 PHP
PHP使用memcache缓存技术提高响应速度的方法
Dec 26 PHP
几行代码轻松实现PHP文件打包下载zip
Mar 01 PHP
php基于数组函数实现关联表的编辑操作示例
Jul 04 PHP
PHP的cookie与session原理及用法详解
Sep 27 PHP
laravel框架数据库配置及操作数据库示例
Oct 10 PHP
PHP时间类完整代码实例
Feb 26 PHP
php命令行模式代码实例详解
Feb 26 PHP
你真的了解PHP中的引用符号(&)吗
May 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
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
php查询及多条件查询
2017/02/26 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
DOM2非标准但却支持很好的几个属性小结
2012/01/21 Javascript
使用js如何实现全选与全不选
2013/12/30 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
2014/12/16 Javascript
详解JavaScript中的表单验证
2015/06/16 Javascript
Javascript简单实现面向对象编程继承实例代码
2015/11/27 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
bootstrap日历插件datetimepicker使用方法
2016/12/14 Javascript
详解在Angular项目中添加插件ng-bootstrap
2017/07/04 Javascript
JavaScript中关于class的调用方法
2017/11/28 Javascript
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
用JS实现选项卡
2020/03/23 Javascript
vue+iview实现分页及查询功能
2020/11/17 Vue.js
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
Python过滤列表用法实例分析
2016/04/29 Python
django 使用 request 获取浏览器发送的参数示例代码
2018/06/11 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
详解HTML5通讯录获取指定多个人的信息
2016/12/20 HTML / CSS
C语言面试题
2013/05/19 面试题
酒店司机岗位职责
2013/12/14 职场文书
学校四群教育实施方案
2014/06/12 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
酒店保洁员岗位职责
2015/02/26 职场文书
教你怎么用Python实现GIF动图的提取及合成
2021/06/15 Python