微信开发之获取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 相关文章推荐
对盗链说再见...
Oct 09 PHP
main.php
Dec 09 PHP
PHP iconv 解决utf-8和gb2312编码转换问题
Apr 12 PHP
解析link_mysql的php版
Jun 30 PHP
table标签的结构与合并单元格的实现方法
Jul 24 PHP
php生成缩略图示例代码分享(使用gd库实现)
Jan 20 PHP
MyEclipse常用配置图文教程
Sep 11 PHP
ThinkPHP模板输出display用法分析
Nov 26 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
Jan 07 PHP
Java中final关键字详解
Aug 10 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
Nov 22 PHP
laravel 自定义常量的两种方案
Oct 14 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获取金书网的书名的实现代码
2010/06/11 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
2013/06/03 PHP
PHP中的闭包(匿名函数)浅析
2015/02/07 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
2015/05/12 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
2018/05/12 PHP
用Javascript实现UTF8编码转换成gb2312编码
2006/12/22 Javascript
DOM下的节点属性和操作小结
2009/05/14 Javascript
js 优化次数过多的循环 考虑到性能问题
2011/03/05 Javascript
再次分享18个非常棒的jQuery表格插件
2011/04/10 Javascript
浅谈javascript的原型继承
2012/07/25 Javascript
javascript采用数组实现tab菜单切换效果
2012/12/12 Javascript
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
JavaScript事件委托实例分析
2015/05/26 Javascript
详解能在多种前端框架下使用的表格控件
2017/01/11 Javascript
小程序实现左右来回滚动字幕效果
2018/12/28 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
Python基于正则表达式实现检查文件内容的方法【文件检索】
2017/08/30 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
Python操作配置文件ini的三种方法讲解
2019/02/22 Python
Django框架使用mysql视图操作示例
2019/05/15 Python
Python可变和不可变、类的私有属性实例分析
2019/05/31 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
python 如何将office文件转换为PDF
2020/09/22 Python
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
澳大利亚运动鞋商店:Platypus Shoes
2019/09/27 全球购物
Android interview questions
2016/12/25 面试题
教师求职推荐信范文
2013/11/20 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
工作时间调整通知
2015/04/24 职场文书