微信封装的调用微信签名包的类库


Posted in PHP onJune 08, 2017

废话不多说了,直接给大家贴代码了,具体代码如下所示:

<?php
namespace Home\Model;
use Think\Model;
class WechatModel extends Model {
private $_token = ''; //令牌
    private $appid;
    private $appsecret;
  public function __construct()
  {
    $this->appid = C('APPID');//公众号的appid
    $this->appsecret = C('APPSECRET');//公众号的秘钥
  }
  //调用js-sdk的签名包
  public function getSignPackage() {
  $jsapiTicket = $this->getJsApiTicket();
  // 注意 URL 一定要动态获取,不能 hardcode.(获取当前网页的url)
  $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
  //时间戳
  $timestamp = time();
  //随机字符串获取
  $nonceStr = $this->createNonceStr();
  // 这里参数的顺序要按照 key 值 ASCII 码升序排序
  $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
  //生成字符串是用来签名用的
  $signature = sha1($string);
  $signPackage = array(
   "appId"   => $this->appid,
   "nonceStr" => $nonceStr,
   "timestamp" => $timestamp,
   "url"    => $url,
   "signature" => $signature,
   "rawString" => $string
  );
  return $signPackage; 
 }
 //使用会员卡领取的签名包
 public function getHuiYuanSignPackage() {
  $apiTicket = $this->getApiTicket();
  // 注意 URL 一定要动态获取,不能 hardcode.(获取当前网页的url)
  $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
  //时间戳
  $timestamp = time();
  //随机字符串获取
  // $nonceStr = $this->createNonceStr();
  // 这里参数的顺序要按照 key 值 ASCII 码升序排序
  $string = $timestamp.$apiTicket."car_id";//card_id为自己创建的会员卡的id
  //生成字符串是用来签名用的
  $signature = sha1($string);
  $signPackage = array(
   "timestamp" => $timestamp,
   "signature" => $signature,
  );
  return $signPackage; 
 }
 //获取会员卡的api_ticket
 public function getApiTicket(){
 $data = json_decode(file_get_contents("api_ticket.json"));
  if ($data->expire_time < time()) {
   $accessToken = $this->getAccessToken();
   $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=wx_card&access_token=$accessToken";
   $res = json_decode($this->httpGet($url));
   $ticket = $res->ticket;
   if ($ticket) {
    $data->expire_time = time() + 7000;
    $data->jsapi_ticket = $ticket;
    $fp = fopen("api_ticket.json", "w");
    fwrite($fp, json_encode($data));
    fclose($fp);
   }
  } else {
   $ticket = $data->jsapi_ticket;
  }
  return $ticket;
 }
 //获取随机字符串
 private function createNonceStr($length = 16) {
  $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  $str = "";
  for ($i = 0; $i < $length; $i++) {
   $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
  }
  return $str;
 }
  //获取Access Token
  public function getAccessToken(){
  //将json字符串转换为json对象(json_encode是将数组转换为json字符串,json_decode("",true) 如果加true是将json字符串转化为php数组,不加true转换为PHP对象)
  $data = json_decode(file_get_contents("access_token.json"));
  if ($data->expire_time < time()) {
   // 如果是企业号用以下URL获取access_token
   $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appid&secret=$this->appsecret";
   $res = json_decode($this->httpGet($url));
   $access_token = $res->access_token;
 if ($access_token) {
    $data->expire_time = time() + 7000;
    $data->access_token = $access_token;
    $fp = fopen("access_token.json", "w");
    fwrite($fp, json_encode($data));
    fclose($fp);
 }
  } else {
   $access_token = $data->access_token;
  }
  return $access_token;
  }
 //获取jsapi_ticket(jsapi_ticket是公众号用于调用微信JS接口的临时票据)
  private function getJsApiTicket() {
  // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
  $data = json_decode(file_get_contents("jsapi_ticket.json"));
  if ($data->expire_time < time()) {
   $accessToken = $this->getAccessToken();
   // 如果是企业号用以下 URL 获取 ticket
   // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
   $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
   $res = json_decode($this->httpGet($url));
   $ticket = $res->ticket;
   if ($ticket) {
    $data->expire_time = time() + 7000;
    $data->jsapi_ticket = $ticket;
    $fp = fopen("jsapi_ticket.json", "w");
    fwrite($fp, json_encode($data));
    fclose($fp);
   }
  } else {
   $ticket = $data->jsapi_ticket;
  }
  return $ticket;
 }
  //获取用户的openid
  public function openId(){
  $url = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
    if (!isset($_GET['code'])) {
     //获取组装的url
      $openidUrl = $this->snsapi_base($url);
      redirect($openidUrl);
    }else{
      $openidAccess_token = $this->openidAccess_token($_GET['code']);
      return $openidAccess_token;
    }
  }
   //获取微信用户的opnid
  public function getOpenId($openid,$access_token)
  {
    $userInfo = $this->getUserInfo($openid,$access_token);
    return $userInfo;
  }
   public function snsapi_base($redirect_uri, $scope = "snsapi_userinfo", $state = 0)
  {
    $appId = $this->appid;
    $url = "https://open.weixin.qq.com/connect/oauth2/authorize";
    $url .= "?appid=$appId";
    $url .= "&redirect_uri=http://$redirect_uri";
    $url .= "&response_type=code";
    $url .= "&scope=$scope";
    $url .= "&state=$state#wechat_redirect";
    return $url;
  }
public function openidAccess_token($code){
    $appId = $this->appid;
    $appSecret= $this->appsecret;
    $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appId&secret=$appSecret&code=$code&grant_type=authorization_code";
    return json_decode($this->httpGet($url),true);
  }
  //获取用户信息
  public function getUserInfo($openid, $access_token){
  $url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN ";
    return json_decode($this->httpGet($url),true);
   //请求
  }
private function httpGet($url) {
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl, CURLOPT_TIMEOUT, 500);
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($curl, CURLOPT_URL, $url);
  $res = curl_exec($curl);
  curl_close($curl);
  return $res;
 }
}

以上所述是小编给大家介绍的微信封装的调用微信签名包的类库,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
php+mysql事务rollback&amp;commit示例
Feb 08 PHP
PHP获取表单textarea数据中的换行问题
Sep 10 PHP
基于PHP文件操作的详细诠释
Jun 21 PHP
php数组去重复数据示例
Feb 25 PHP
PHP生成条形图的方法
Dec 10 PHP
php从csv文件读取数据并输出到网页的方法
Mar 14 PHP
8个必备的PHP功能开发
Oct 02 PHP
Laravel搭建后台登录系统步骤详解
Jul 26 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
Nov 26 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
Mar 16 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
Dec 29 PHP
微信公众号实现会员卡领取功能
Jun 08 #PHP
php图像验证码生成代码
Jun 08 #PHP
php面向对象的用户登录身份验证
Jun 08 #PHP
php实现用户注册密码的crypt加密
Jun 08 #PHP
php封装一个异常的处理类
Jun 08 #PHP
php简单构造json多维数组的方法示例
Jun 08 #PHP
php显示页码分页类的封装
Jun 08 #PHP
You might like
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
PHP+MySQL修改记录的方法
2015/01/21 PHP
PHP程序员不应该忽略的3点
2015/10/09 PHP
鼠标移动到一张图片时变为另一张图片
2006/12/05 Javascript
利用cookie记住背景颜色示例代码
2013/11/04 Javascript
禁用Enter键表单自动提交实现代码
2014/05/22 Javascript
探寻Javascript执行效率问题
2014/11/12 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
JS实现判断数组是否包含某个元素示例
2019/05/24 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
2020/04/13 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
Djang中静态文件配置方法
2015/07/30 Python
python中字符串内置函数的用法总结
2018/09/13 Python
python 多线程中子线程和主线程相互通信方法
2018/11/09 Python
Pyinstaller 打包exe教程及问题解决
2019/08/16 Python
django框架F&amp;Q 聚合与分组操作示例
2019/12/12 Python
使用python的turtle函数绘制一个滑稽表情
2020/02/28 Python
关于python中的xpath解析定位
2020/03/06 Python
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
金融专业个人求职信
2013/09/22 职场文书
财务管理专业自荐信范文
2013/12/24 职场文书
大学毕业生求职自荐信
2014/02/20 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
毕业生党员个人总结
2015/02/14 职场文书
业务内勤岗位职责
2015/04/13 职场文书
办公室规章制度范本
2015/08/04 职场文书
应届生们该怎么书写求职信?
2019/07/05 职场文书
关于感恩的素材句子(38句)
2019/11/11 职场文书
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技