微信开发之获取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安全配置方法
Jun 16 PHP
《PHP编程最快明白》第八讲:php启发和小结
Nov 01 PHP
使用PHP导出Word文档的原理和实例
Oct 21 PHP
php表单敏感字符过滤类
Dec 08 PHP
初识ThinkPHP控制器
Apr 07 PHP
php数据访问之增删改查操作
May 09 PHP
完美利用Yii2微信后台开发的系列总结
Jul 18 PHP
php微信开发之带参数二维码的使用
Aug 03 PHP
浅析php中array_map和array_walk的使用对比
Nov 20 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
Nov 25 PHP
PHP工厂模式、单例模式与注册树模式实例详解
Jun 03 PHP
php在linux环境中如何使用redis详解
Dec 15 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 分库分表hash算法
2009/11/12 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
Apache服务器下防止图片盗链的办法
2015/07/06 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
php的对象传值与引用传值代码实例讲解
2021/02/26 PHP
激活 ActiveX 控件
2006/10/09 Javascript
Prototype使用指南之hash.js
2007/01/10 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
javascript的创建多行字符串的7种方法
2014/04/29 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
PHP+mysql+Highcharts生成饼状图
2015/05/04 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
整理关于Bootstrap警示框的慕课笔记
2017/03/29 Javascript
checkbox:click事件触发span元素内容改变的方法
2017/09/11 Javascript
jQuery.parseJSON()函数详解
2019/02/28 jQuery
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
jQuery实现简单全选框
2020/09/13 jQuery
python算法学习之基数排序实例
2013/12/18 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
简单了解Django模板的使用
2017/12/20 Python
Sanic框架应用部署方法详解
2018/07/18 Python
python将dict中的unicode打印成中文实例
2020/05/11 Python
Python selenium爬取微博数据代码实例
2020/05/22 Python
意大利大型购物中心:Oliviero.it
2017/10/19 全球购物
美国花园雕像和家居装饰网上商店:Design Toscano
2019/03/09 全球购物
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
法学毕业生自荐信
2013/11/13 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
React + Threejs + Swiper 实现全景图效果的完整代码
2021/06/28 Javascript