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

<?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&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;
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值