微信开发之获取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 多维数组排序(usort,uasort)
Jun 30 PHP
一个PHP的QRcode类与大家分享
Nov 13 PHP
php中的Base62类(适用于数值转字符串)
Aug 12 PHP
标准PHP的AES加密算法类
Mar 12 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
Apr 20 PHP
PHP session文件独占锁引起阻塞问题解决方法
May 12 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
Dec 18 PHP
php实现给一张图片加上水印效果
Jan 02 PHP
thinkphp3.x中session方法的用法分析
May 20 PHP
PHP实现一维数组与二维数组去重功能示例
May 24 PHP
详解Laravel设置多态关系模型别名的方式
Oct 17 PHP
PHP使用Redis队列执行定时任务实例讲解
Mar 24 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
PHPLog php 程序调试追踪工具
2009/09/09 PHP
PHP逐行输出(ob_flush与flush的组合)
2012/02/04 PHP
PHP错误提示的关闭方法详解
2013/06/23 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
js字符编码函数区别分析
2011/12/28 Javascript
js中substring和substr的定义和用法
2014/05/05 Javascript
jQuery实现的自动加载页面功能示例
2016/09/04 Javascript
简单实现nodejs上传功能
2017/01/14 NodeJs
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
老生常谈javascript的面向对象思想
2017/08/22 Javascript
Vue-路由导航菜单栏的高亮设置方法
2018/03/17 Javascript
centos 上快速搭建ghost博客方法分享
2018/05/23 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
2019/12/20 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
js实现电灯开关效果
2021/01/19 Javascript
[02:24]DOTA2亚洲邀请赛 NAVI战队出场宣传片
2015/02/07 DOTA
python中global与nonlocal比较
2014/11/21 Python
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
Python实现简单网页图片抓取完整代码实例
2017/12/15 Python
python仿抖音表白神器
2019/04/08 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
openCV提取图像中的矩形区域
2020/07/21 Python
理肤泉美国官网:La Roche-Posay
2018/01/17 全球购物
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
大学生见习报告范文
2014/11/03 职场文书
2015年资料员工作总结
2015/04/25 职场文书
银行反洗钱宣传活动总结
2015/05/08 职场文书
观看《信仰》心得体会
2016/01/15 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题
muduo TcpServer模块源码分析
2022/04/26 Redis