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


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中逗号与点号的区别
Aug 05 PHP
PHP 使用pcntl和libevent 实现Timer功能
Oct 27 PHP
php中simplexml_load_string使用实例分享
Feb 13 PHP
一个经典的PHP文件上传类分享
Nov 18 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
Dec 16 PHP
php模拟登陆的实现方法分析
Jan 09 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
Mar 12 PHP
深入解析PHP的Laravel框架中的event事件操作
Mar 21 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
May 20 PHP
PHP实现执行外部程序的方法详解
Aug 17 PHP
php 读取文件夹下所有图片、文件的实例
Oct 17 PHP
Yii2.0实现的批量更新及批量插入功能示例
Jan 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 开源AJAX框架14种
2009/08/24 PHP
PHP防止跨域提交表单
2013/11/01 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
Laravel 5 学习笔记
2015/03/06 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
jQuery中closest和parents的区别分析
2015/05/07 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
javascript十六进制数字和ASCII字符之间的转换方法
2016/12/27 Javascript
BootStrap学习系列之布局组件(下拉,按钮组[toolbar],上拉)
2017/01/03 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
2017/02/10 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
nodejs实现聊天机器人功能
2019/09/19 NodeJs
微信小程序实现分享商品海报功能
2019/09/30 Javascript
微信小程序中data-key属性之数据传输(经验总结)
2020/08/22 Javascript
Python常用内置模块之xml模块(详解)
2017/05/23 Python
Python简单实现socket信息发送与监听功能示例
2018/01/03 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
Python和Anaconda和Pycharm安装教程图文详解
2020/02/04 Python
Pycharm中使用git进行合作开发的教程详解
2020/11/17 Python
美国零售商店:Blue&Cream
2017/04/07 全球购物
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
英国空调、除湿机和通风设备排名第一:Air Con Centre
2019/02/25 全球购物
Blank NYC官网:夹克、牛仔裤等
2020/12/16 全球购物
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
历史学专业毕业生求职信
2013/09/27 职场文书
银行工作检查书范文
2014/01/31 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
教你使用Python pypinyin库实现汉字转拼音
2021/05/27 Python
python中super()函数的理解与基本使用
2021/08/30 Python
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS