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

5年以前  |  阅读数:886 次  |  编程语言:PHP 

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


    <?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&timestamp;=$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〈=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分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例