微信开发之获取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 格式化数字的时候注意数字的范围
Apr 13 PHP
shopex主机报错误请求解决方案(No such file or directory)
Dec 27 PHP
php列出一个目录下的所有文件的代码
Oct 09 PHP
使用php get_headers 判断URL是否有效的解决办法
Apr 27 PHP
PHP Session 变量的使用方法详解与实例代码
Sep 11 PHP
phpphp图片采集后按原路径保存图片示例
Feb 18 PHP
php ci框架中加载css和js文件失败的解决方法
Mar 03 PHP
php与flash as3 socket通信传送文件实现代码
Aug 16 PHP
php中current、next与reset函数用法实例
Nov 17 PHP
php中简单的对称加密算法实现
Jan 05 PHP
PHP生成加减算法方式的验证码实例
Mar 12 PHP
PHP registerXPathNamespace()函数讲解
Feb 03 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
PHP5中MVC结构学习
2006/10/09 PHP
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
学习php分页代码实例
2013/10/24 PHP
php实例分享之mysql数据备份
2014/05/19 PHP
php实现从上传文件创建缩略图的方法
2015/04/02 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
浅谈php中curl、fsockopen的应用
2016/12/10 PHP
php实现简单的守护进程创建、开启与关闭操作
2019/08/13 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
javascript编程起步(第五课)
2007/01/10 Javascript
JS模拟面向对象全解(二、类型与赋值)
2011/07/13 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
javascript常用的方法分享
2015/07/01 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
垃圾回收器的相关知识点总结
2018/05/13 Javascript
微信小程序实现复选框效果
2018/12/28 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
JS中间件设计模式的深入探讨与实例分析
2020/04/11 Javascript
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
关于Python中异常(Exception)的汇总
2017/01/18 Python
详解Python中的测试工具
2019/06/09 Python
python3 实现口罩抽签的功能
2020/03/11 Python
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
毕业求职自荐信格式是什么
2013/11/19 职场文书
高中微机老师自我鉴定
2014/02/16 职场文书
电子信息工程自荐信
2014/05/26 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
关于学习的决心书
2015/02/05 职场文书
交通安全教育主题班会
2015/08/12 职场文书
python urllib库的使用详解
2021/04/13 Python
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL
项目中Nginx多级代理是如何获取客户端的真实IP地址
2022/05/30 Servers