菜单

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

2017年11月30日 - PHPer

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

 

 代码如下

<?php

namespaceHome\Model;

useThink\Model;

classWechatModelextendsModel {

private$_token=”//令牌

    private$appid;

    private$appsecret;

  publicfunction__construct()

  {

    $this->appid = C(‘APPID’);//公众号的appid

    $this->appsecret = C(‘APPSECRET’);//公众号的秘钥

  }

  //调用js-sdk的签名包

  publicfunctiongetSignPackage() {

  $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;

 }

 //使用会员卡领取的签名包

 publicfunctiongetHuiYuanSignPackage() {

  $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

 publicfunctiongetApiTicket(){

 $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;

 }

 //获取随机字符串

 privatefunctioncreateNonceStr($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

  publicfunctiongetAccessToken(){

  //将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接口的临时票据)

  privatefunctiongetJsApiTicket() {

  // 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

  publicfunctionopenId(){

  $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

  publicfunctiongetOpenId($openid,$access_token)

  {

    $userInfo=$this->getUserInfo($openid,$access_token);

    return$userInfo;

  }

   publicfunctionsnsapi_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;

  }

publicfunctionopenidAccess_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”;

    returnjson_decode($this->httpGet($url),true);

  }

  //获取用户信息

  publicfunctiongetUserInfo($openid,$access_token){

  $url=”https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN “;

    returnjson_decode($this->httpGet($url),true);

   //请求

  }

privatefunctionhttpGet($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;

 }

}

 

发表评论

电子邮件地址不会被公开。