微信开发之获取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代码保护--Zend Guard的使用详解
Jun 03 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
Jun 28 PHP
PHP中比较时间大小实例
Aug 21 PHP
PHP中的类型约束介绍
May 11 PHP
php判断用户是否手机访问代码
Jun 08 PHP
php递归函数三种实现方法及如何实现数字累加
Aug 07 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
Nov 10 PHP
详解PHP执行定时任务的实现思路
Dec 21 PHP
thinkphp框架实现数据添加和显示功能
Jun 29 PHP
php连接微软MSSQL(sql server)完全攻略
Nov 27 PHP
PHP实现对图片的反色处理功能【测试可用】
Feb 01 PHP
Laravel框架验证码类用法实例分析
Sep 11 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
也谈截取首页新闻 - 范例
2006/10/09 PHP
PHP页面间传递参数实例代码
2008/06/05 PHP
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
深入php list()函数的详解
2013/06/05 PHP
php中如何防止表单的重复提交
2013/08/02 PHP
PHP模板解析类实例
2015/07/09 PHP
yii2中的rules 自定义验证规则详解
2016/04/19 PHP
详解php反序列化
2020/06/10 PHP
JavaScript EasyPager 分页函数
2011/05/25 Javascript
页面使用密码保护代码
2013/04/10 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
javascript简单链式调用案例分析
2017/05/10 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
[04:09]2018年度DOTA2社区贡献奖-完美盛典
2018/12/16 DOTA
python打开网页和暂停实例
2014/09/30 Python
Python实现将sqlite数据库导出转成Excel(xls)表的方法
2017/07/17 Python
Python中pip更新和三方插件安装说明
2018/07/08 Python
基于Django统计博客文章阅读量
2019/10/29 Python
python 弧度与角度互转实例
2020/04/15 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
德国机场停车位比较和预订网站:Ich-parke-billiger
2018/01/08 全球购物
医药学专业大学生职业生涯规划书论文
2014/01/21 职场文书
社区学习十八大感想
2014/01/22 职场文书
教师读书活动总结
2014/05/07 职场文书
项目建议书范文
2014/05/12 职场文书
总经理助理岗位职责
2015/01/31 职场文书
经费申请报告范文
2015/05/18 职场文书
任命书格式范文
2015/09/22 职场文书
sentinel支持的redis高可用集群配置详解
2022/04/01 Redis