程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> eaglephp使用微信api接口開發微信框架

eaglephp使用微信api接口開發微信框架

編輯:PHP綜合

適用平台:window/Linux
依賴項目:EaglePHP框架

包含微信5.0 API基礎接口、自定義菜單、高級接口,具體如下:
1、接收用戶消息。
2、向用戶回復消息。
3、接受事件推送。
4、會話界面自定義菜單。
5、語音識別。
6、客服接口。
7、OAuth2.0網頁授權。
8、生成帶參數二維碼。
9、獲取用戶地理位置。
10、獲取用戶基本信息。
11、獲取關注者列表。
12、用戶分組。

復制代碼 代碼如下:
<?php
/**
 * 微信公眾平台API
 */
class WeixinChat
{

 private $token;

 private $appid;

 private $appsecret;

 private $access_token;

 // 接收的數據
 private $_receive = array();

 private $_reply = '';

 // 接口錯誤碼
 private $errCode = '';

 // 接口錯誤信息
 private $errMsg = '';

 // 微信oauth登陸獲取code
 const CONNECT_OAUTH_AUTHORIZE_URL = 'https://open.weixin.qq.com/connect/oauth2/authorize?';

 // 微信oauth登陸通過code換取網頁授權access_token
 const SNS_OAUTH_ACCESS_TOKEN_URL = 'https://api.weixin.qq.com/sns/oauth2/access_token?';

 // 微信oauth登陸刷新access_token(如果需要)
 const SNS_OAUTH_REFRESH_TOKEN_URL = 'https://api.weixin.qq.com/sns/oauth2/refresh_token?';

 // 通過ticket換取二維碼
 const SHOW_QRCODE_URL = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?';

 // 微信oauth登陸拉取用戶信息(需scope為 snsapi_userinfo)
 const SNS_USERINFO_URL = 'https://api.weixin.qq.com/sns/userinfo?';

 // 請求api前綴
 const API_URL_PREFIX = 'https://api.weixin.qq.com/cgi-bin';

 // 自定義菜單創建
 const MENU_CREATE_URL = '/menu/create?';

 // 自定義菜單查詢
 const MENU_GET_URL = '/menu/get?';

 // 自定義菜單刪除
 const MENU_DELETE_URL = '/menu/delete?';

 // 獲取 access_token
 const AUTH_URL = '/token?grant_type=client_credential&';

 // 獲取用戶基本信息
 const USER_INFO_URL = '/user/info?';

 // 獲取關注者列表
 const USER_GET_URL = '/user/get?';

 // 查詢分組
 const GROUPS_GET_URL = '/groups/get?';

 // 創建分組
 const GROUPS_CREATE_URL = '/groups/create?';

 // 修改分組名
 const GROUPS_UPDATE_URL = '/groups/update?';

 // 移動用戶分組
 const GROUPS_MEMBERS_UPDATE_URL = '/groups/members/update?';

 // 發送客服消息
 const MESSAGE_CUSTOM_SEND_URL = '/message/custom/send?';

 // 創建二維碼ticket
 const QRCODE_CREATE_URL = '/qrcode/create?';

 

 /**
  * 初始化配置數據
  * @param array $options
  */
 public function __construct($options)
 {
  $this->token = isset($options['token']) ? $options['token'] : '';
  $this->appid = isset($options['appid']) ? $options['appid'] : '';
  $this->appsecret = isset($options['appsecret']) ? $options['appsecret'] : '';
 }

 
 /**
  * 獲取發來的消息
  * 當普通微信用戶向公眾賬號發消息時,微信服務器將POST消息的XML數據包到開發者填寫的URL上。
  */
 public function getRev()
 {
  $postStr = file_get_contents('php://input');
  if($postStr)
  {
   $this->_receive = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
   //Log::info(var_export($this->_receive, true));
  }
  return $this;
 }

 
 /**
  * 獲取微信服務器發來的消息
  */
 public function getRevData()
 {
  return $this->_receive;
 }

 
 /**
  * 獲取接收者
  */
 public function getRevTo()
 {
  return isset($this->_receive['ToUserName']) ? $this->_receive['ToUserName'] : false;
 }

 
 /**
  * 獲取消息發送者(一個OpenID)
  */
 public function getRevFrom()
 {
  return isset($this->_receive['FromUserName']) ? $this->_receive['FromUserName'] : false;
 }

 
 /**
  * 獲取接收消息創建時間 (整型)
  */
 public function getRevCTime()
 {
  return isset($this->_receive['CreateTime']) ? $this->_receive['CreateTime'] : false;
 }

 
 /**
  * 獲取接收消息類型(text、image、voice、video、location、link、event)
  */
 public function getRevType()
 {
  return isset($this->_receive['MsgType']) ? $this->_receive['MsgType'] : false;
 }

 
 /**
  * 獲取接收消息編號
  */
 public function getRevId()
 {
  return isset($this->_receive['MsgId']) ? $this->_receive['MsgId'] : false;
 }

 
 /**
  * 獲取接收消息文本
  * 通過語音識別接口,用戶發送的語音,將會同時給出語音識別出的文本內容。(需申請服務號的高級接口權限)
  */
 public function getRevText()
 {
  if(isset($this->_receive['Content'])) return trim($this->_receive['Content']);
  elseif(isset($this->_receive['Recognition'])) return trim($this->_receive['Recognition']);
  else return false;
 }

 
 /**
  * 獲取接收圖片消息
  */
 public function getRevImage()
 {
  if(isset($this->_receive['PicUrl'])){
   return array(
        'picUrl' => $this->_receive['PicUrl'],  //圖片鏈接
     'mediaId' => $this->_receive['MediaId'] //圖片消息媒體id,可以調用多媒體文件下載接口拉取數據。
       );
  }
  return false;
 }

 
 /**
  * 獲取接收語音消息
  */
 public function getRevVoice()
 {
  if(isset($this->_receive['MediaId'])){
   return array(
        'mediaId' => $this->_receive['MediaId'],  //語音消息媒體id,可以調用多媒體文件下載接口拉取數據。
     'format' => $this->_receive['Format'] //語音格式,如amr,speex等
       );
  }
  return false;
 }

 
 /**
  * 獲取接收視頻消息
  */
 public function getRevVideo()
 {
  if(isset($this->_receive['MediaId'])){
   return array(
        'mediaId' => $this->_receive['MediaId'],       //視頻消息媒體id,可以調用多媒體文件下載接口拉取數據。
     'thumbMediaId' => $this->_receive['ThumbMediaId']  //視頻消息縮略圖的媒體id,可以調用多媒體文件下載接口拉取數據。
       );
  }
  return false;
 } 

 
 /**
  * 獲取用戶地理位置
  */
 public function getRevLocation()
 {
  if(isset($this->_receive['Location_X'])){
   return array(
        'locationX' => $this->_receive['Location_X'],  //地理位置維度
     'locationY' => $this->_receive['Location_Y'],  //地理位置經度
     'scale' => $this->_receive['Scale'], //地圖縮放大小
     'label' => $this->_receive['Label'] //地理位置信息
       );
  }
  //開通了上報地理位置接口的公眾號,用戶在關注後進入公眾號會話時,會彈框讓用戶確認是否允許公眾號使用其地理位置。
  //彈框只在關注後出現一次,用戶以後可以在公眾號詳情頁面進行操作。
  elseif(isset($this->_receive['Latitude']))
  {
   return array(
        'latitude' => $this->_receive['Latitude'],  //地理位置緯度
     'longitude' => $this->_receive['Longitude'], //地理位置經度
      'precision' => $this->_receive['Precision'] // 地理位置精度
       );
  }
  return false;
 }

 
 /**
  * 獲取接收鏈接消息
  */
 public function getRevLink()
 {
  if(isset($this->_receive['Title'])){
   return array(
        'title' => $this->_receive['Title'],  //消息標題
     'description' => $this->_receive['Description'],  //消息描述
     'url' => $this->_receive['Url'] //消息鏈接
       );
  }
  return false;
 }

 
 /**
  * 獲取接收事件類型
  * 事件類型如:subscribe(訂閱)、unsubscribe(取消訂閱)、click
  */
 public function getRevEvent()
 {
  if(isset($this->_receive['Event']))
  {
   return array(
     'event' => strtolower($this->_receive['Event']),
     'key'=> isset($this->_receive['EventKey']) ? $this->_receive['EventKey'] : ''
       );
  }
  return false;
 }

 
 /**
  * 設置回復文本消息
  * @param string $content
  * @param string $openid
  */
 public function text($content='')
 {
  $textTpl = "<xml>
      <ToUserName><![CDATA[%s]]></ToUserName>
      <FromUserName><![CDATA[%s]]></FromUserName>
      <CreateTime>%s</CreateTime>
      <MsgType><![CDATA[%s]]></MsgType>
      <Content><![CDATA[%s]]></Content>
     </xml>";

  $this->_reply = sprintf($textTpl,
         $this->getRevFrom(),
         $this->getRevTo(),
         Date::getTimeStamp(),
         'text',
         $content
        );
  return $this;
 }

 
 /**
  * 設置回復音樂信息
  * @param string $title
  * @param string $desc
  * @param string $musicurl
  * @param string $hgmusicurl
  */
 public function music($title, $desc, $musicurl, $hgmusicurl='')
 {
  $textTpl = '<xml>
      <ToUserName><![CDATA[%s]]></ToUserName>
      <FromUserName><![CDATA[%s]]></FromUserName>
      <CreateTime>%s</CreateTime>
      <MsgType><![CDATA[%s]]></MsgType>
      <Music>
       <Title><![CDATA[%s]]></Title>
       <Description><![CDATA[%s]]></Description>
       <MusicUrl><![CDATA[%s]]></MusicUrl>
       <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
      </Music>
     </xml>';
  //<ThumbMediaId><![CDATA[%s]]></ThumbMediaId>

  $this->_reply = sprintf($textTpl,
         $this->getRevFrom(),
         $this->getRevTo(),
         Date::getTimeStamp(),
         'music',
         $title,
         $desc,
         $musicurl,
         $hgmusicurl
        );
  return $this;
 }

 
 /**
  * 回復圖文消息
  * @param array
  */
 public function news($data)
 {
  $count = count($data);
  $subText = '';
  if($count > 0)
  {
   foreach($data as $v)
   {
    $tmpText = '<item>
      <Title><![CDATA[%s]]></Title>
      <Description><![CDATA[%s]]></Description>
      <PicUrl><![CDATA[%s]]></PicUrl>
      <Url><![CDATA[%s]]></Url>
      </item>';

    $subText .= sprintf(
        $tmpText, $v['title'],
        isset($v['description']) ? $v['description'] : '',
        isset($v['picUrl']) ? $v['picUrl'] : '',
        isset($v['url']) ? $v['url'] : ''
       );
   }
  }

  $textTpl = '<xml>
      <ToUserName><![CDATA[%s]]></ToUserName>
      <FromUserName><![CDATA[%s]]></FromUserName>
      <CreateTime><![CDATA[%s]]></CreateTime>
      <MsgType><![CDATA[news]]></MsgType>
      <ArticleCount><![CDATA[%d]]></ArticleCount>
      <Articles>%s</Articles>
     </xml>';

  $this->_reply = sprintf(
       $textTpl,
       $this->getRevFrom(),
       $this->getRevTo(),
       Date::getTimeStamp(),
       $count,
       $subText
      );
  return $this;
 }

 
 /**
  * 回復消息
  * @param array $msg
  * @param bool $return
  */
 public function reply()
 {
  header('Content-Type:text/xml');
  echo $this->_reply;
  exit;
 }

 
 /**
  * 自定義菜單創建
  * @param array 菜單數據
  */
 public function createMenu($data)
 {
  if(!$this->access_token && !$this->checkAuth()) return false;

  $result = curlRequest(self::API_URL_PREFIX.self::MENU_CREATE_URL.'access_token='.$this->access_token, $this->jsonEncode($data), 'post');
  if($result)
  {
   $jsonArr = json_decode($result, true);
   if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
   else return true;
  }

  return false;
 }

 
 /**
  * 自定義菜單查詢
  */
 public function getMenu()
 {
  if(!$this->access_token && !$this->checkAuth()) return false;

  $result = curlRequest(self::API_URL_PREFIX.self::MENU_GET_URL.'access_token='.$this->access_token);
  if($result)
  {
   $jsonArr = json_decode($result, true);
   if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
   else return $jsonArr;
  }

  return false;
 }

 
 /**
  * 自定義菜單刪除
  */
 public function deleteMenu()
 {
  if(!$this->access_token && !$this->checkAuth()) return false;

  $result = curlRequest(self::API_URL_PREFIX.self::MENU_DELETE_URL.'access_token='.$this->access_token);
  if($result)
  {
   $jsonArr = json_decode($result, true);
   if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
   else return true;
  }

  return false;
 }

 
 /**
  * 獲取用戶基本信息
  * @param string $openid 普通用戶的標識,對當前公眾號唯一
  */
 public function getUserInfo($openid)
 {
  if(!$this->access_token && !$this->checkAuth()) return false;

  $result = curlRequest(self::API_URL_PREFIX.self::USER_INFO_URL.'access_token='.$this->access_token.'&openid='.$openid);
  if($result)
  {
   $jsonArr = json_decode($result, true);
   if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
   else return $jsonArr;
  }

  return false;
 }

 
 /**
  * 獲取關注者列表
  * @param string $next_openid 第一個拉取的OPENID,不填默認從頭開始拉取
  */
 public function getUserList($next_openid='')
 {
  if(!$this->access_token && !$this->checkAuth()) return false;

  $result = curlRequest(self::API_URL_PREFIX.self::USER_GET_URL.'access_token='.$this->access_token.'&next_openid='.$next_openid);
  if($result)
  {
   $jsonArr = json_decode($result, true);
   if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
   else return $jsonArr;
  }

  return false;
 }

 
 /**
  * 查詢分組
  */
 public function getGroup()
 {
  if(!$this->access_token && !$this->checkAuth()) return false;

  $result = curlRequest(self::API_URL_PREFIX.self::GROUPS_GET_URL.'access_token='.$this->access_token);
  if($result)
  {
   $jsonArr = json_decode($result, true);
   if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
   else return $jsonArr;
  }

  return false;
 }

 
 /**
  * 創建分組
  * @param string $name 分組名字(30個字符以內)
  */
 public function createGroup($name)
 {
  if(!$this->access_token && !$this->checkAuth()) return false;
  $data = array('group' => array('name' => $name));
  $result = curlRequest(self::API_URL_PREFIX.self::GROUPS_CREATE_URL.'access_token='.$this->access_token, $this->jsonEncode($data), 'post');
  if($result)
  {
   $jsonArr = json_decode($result, true);
   if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
   else return true;
  }

  return false;
 }

 
 /**
  * 修改分組名
  * @param int $id 分組id,由微信分配
  * @param string $name 分組名字(30個字符以內)
  */
 public function updateGroup($id, $name)
 {
  if(!$this->access_token && !$this->checkAuth()) return false;

  $data = array('group' => array('id' => $id, 'name' => $name));
  $result = curlRequest(self::API_URL_PREFIX.self::GROUPS_UPDATE_URL.'access_token='.$this->access_token, $this->jsonEncode($data), 'post');
  if($result)
  {
   $jsonArr = json_decode($result, true);
   if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
   else return true;
  }

  return false;
 }

 
 /**
  * 移動用戶分組
  *
  * @param string $openid 用戶唯一標識符
  * @param int $to_groupid 分組id
  */
 public function updateGroupMembers($openid, $to_groupid)
 {
  if(!$this->access_token && !$this->checkAuth()) return false;

  $data = array('openid' => $openid, 'to_groupid' => $to_groupid);
  $result = curlRequest(self::API_URL_PREFIX.self::GROUPS_MEMBERS_UPDATE_URL.'access_token='.$this->access_token, $this->jsonEncode($data), 'post');
  if($result)
  {
   $jsonArr = json_decode($result, true);
   if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
   else return true;
  }

  return false;
 }

 
 /**
  * 發送客服消息
  * 當用戶主動發消息給公眾號的時候(包括發送信息、點擊自定義菜單clike事件、訂閱事件、掃描二維碼事件、支付成功事件、用戶維權),
  * 微信將會把消息數據推送給開發者,開發者在一段時間內(目前為24小時)可以調用客服消息接口,通過POST一個JSON數據包來發送消息給普通用戶,在24小時內不限制發送次數。
  * 此接口主要用於客服等有人工消息處理環節的功能,方便開發者為用戶提供更加優質的服務。
  *
  * @param string $touser 普通用戶openid
  */
 public function sendCustomMessage($touser, $data, $msgType = 'text')
 {
  $arr = array();
  $arr['touser'] = $touser;
  $arr['msgtype'] = $msgType;
  switch ($msgType)
  {
   case 'text': // 發送文本消息
    $arr['text']['content'] = $data;
    break;

   case 'image': // 發送圖片消息
    $arr['image']['media_id'] = $data;
    break;

   case 'voice': // 發送語音消息
    $arr['voice']['media_id'] = $data;
    break;

   case 'video': // 發送視頻消息
    $arr['video']['media_id'] = $data['media_id']; // 發送的視頻的媒體ID
    $arr['video']['thumb_media_id'] = $data['thumb_media_id']; // 視頻縮略圖的媒體ID
    break;

   case 'music': // 發送音樂消息
    $arr['music']['title'] = $data['title'];// 音樂標題
    $arr['music']['description'] = $data['description'];// 音樂描述
    $arr['music']['musicurl'] = $data['musicurl'];// 音樂鏈接
    $arr['music']['hqmusicurl'] = $data['hqmusicurl'];// 高品質音樂鏈接,wifi環境優先使用該鏈接播放音樂
    $arr['music']['thumb_media_id'] = $data['title'];// 縮略圖的媒體ID
    break;

   case 'news': // 發送圖文消息
    $arr['news']['articles'] = $data; // title、description、url、picurl
    break;
  }

  if(!$this->access_token && !$this->checkAuth()) return false;

  $result = curlRequest(self::API_URL_PREFIX.self::MESSAGE_CUSTOM_SEND_URL.'access_token='.$this->access_token, $this->jsonEncode($arr), 'post');
  if($result)
  {
   $jsonArr = json_decode($result, true);
   if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
   else return true;
  }

  return false;
 }

 

 /**
  * 獲取access_token
  */
 public function checkAuth()
 {

  // 從緩存中獲取access_token
  $cache_flag = 'weixin_access_token';
  $access_token = cache($cache_flag);
  if($access_token)
  {
   $this->access_token = $access_token;
   return true;
  }

  // 請求微信服務器獲取access_token
  $result = curlRequest(self::API_URL_PREFIX.self::AUTH_URL.'appid='.$this->appid.'&secret='.$this->appsecret);
  if($result)
  {
   $jsonArr = json_decode($result, true);
   if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0))
   {
    $this->error($jsonArr);
   }
   else
   {
    $this->access_token = $jsonArr['access_token'];
    $expire = isset($jsonArr['expires_in']) ? intval($jsonArr['expires_in'])-100 : 3600;
    // 將access_token保存到緩存中
    cache($cache_flag, $this->access_token, $expire, Cache::FILE);
    return true;
   }
  }
  return false;
 }

 
 /**
  * 微信oauth登陸->第一步:用戶同意授權,獲取code
  * 應用授權作用域,snsapi_base (不彈出授權頁面,直接跳轉,只能獲取用戶openid),
  * snsapi_userinfo (彈出授權頁面,可通過openid拿到昵稱、性別、所在地。並且,即使在未關注的情況下,只要用戶授權,也能獲取其信息)
  * 直接在微信打開鏈接,可以不填此參數。做頁面302重定向時候,必須帶此參數
  *
  * @param string $redirect_uri 授權後重定向的回調鏈接地址
  * @param string $scope 應用授權作用域 0為snsapi_base,1為snsapi_userinfo
  * @param string $state 重定向後會帶上state參數,開發者可以填寫任意參數值
  */
 public function redirectGetOauthCode($redirect_uri, $scope=0, $state='')
 {
  $scope = ($scope == 0) ? 'snsapi_base' : 'snsapi_userinfo';
  $url = self::CONNECT_OAUTH_AUTHORIZE_URL.'appid='.$this->appid.'&redirect_uri='.urlencode($redirect_uri).'&response_type=code&scope='.$scope.'&state='.$state.'#wechat_redirect';
  redirect($url);
 }

 
 /**
  * 微信oauth登陸->第二步:通過code換取網頁授權access_token
  *
  * @param string $code
  */
 public function getSnsAccessToken($code)
 {
  $result = curlRequest(self::SNS_OAUTH_ACCESS_TOKEN_URL.'appid='.$this->appid.'&secret='.$this->appsecret.'&code='.$code.'&grant_type=authorization_code');
  if($result)
  {
   $jsonArr = json_decode($result, true);
   if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
   else return $jsonArr;
  }

  return false;
 }

 
 /**
  * 微信oauth登陸->第三步:刷新access_token(如果需要)
  * 由於access_token擁有較短的有效期,當access_token超時後,可以使用refresh_token進行刷新,
  * refresh_token擁有較長的有效期(7天、30天、60天、90天),當refresh_token失效的後,需要用戶重新授權。
  *
  * @param string $refresh_token 填寫通過access_token獲取到的refresh_token參數
  */
 public function refershToken($refresh_token)
 {
  $result = curlRequest(self::SNS_OAUTH_REFRESH_TOKEN_URL.'appid='.$this->appid.'&grant_type=refresh_token&refresh_token='.$refresh_token);
  if($result)
  {
   $jsonArr = json_decode($result, true);
   if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
   else return $jsonArr;
  }

  return false;
 }

 
 /**
  * 微信oauth登陸->第四步:拉取用戶信息(需scope為 snsapi_userinfo)
  * 如果網頁授權作用域為snsapi_userinfo,則此時開發者可以通過access_token和openid拉取用戶信息了。
  *
  * @param string $access_token 網頁授權接口調用憑證,注意:此access_token與基礎支持的access_token不同
  * @param string $openid 用戶的唯一標識
  */
 public function getSnsUserInfo($access_token, $openid)
 {
  $result = curlRequest(self::SNS_USERINFO_URL.'access_token='.$access_token.'&openid='.$openid);
  if($result)
  {
   $jsonArr = json_decode($result, true);
   if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
   else return $jsonArr;
  }

  return false;
 }

 
 /**
  * 創建二維碼ticket
  * 每次創建二維碼ticket需要提供一個開發者自行設定的參數(scene_id),分別介紹臨時二維碼和永久二維碼的創建二維碼ticket過程。
  *
  * @param int $scene_id 場景值ID,臨時二維碼時為32位整型,永久二維碼時最大值為1000
  * @param int $type 二維碼類型,0為臨時,1為永久
  * @param int $expire 該二維碼有效時間,以秒為單位。 最大不超過1800。
  */
 public function createQrcode($scene_id, $type=0, $expire=1800)
 {
  if(!$this->access_token && !$this->checkAuth()) return false;

  $data = array();
  $data['action_info'] = array('scene' => array('scene_id' => $scene_id));
  $data['action_name'] = ($type == 0 ? 'QR_SCENE' : 'QR_LIMIT_SCENE');
  if($type == 0) $data['expire_seconds'] = $expire;

  $result = curlRequest(self::API_URL_PREFIX.self::QRCODE_CREATE_URL.'access_token='.$this->access_token, $this->jsonEncode($data), 'post');
  if($result)
  {
   $jsonArr = json_decode($result, true);
   if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
   else return $jsonArr;
  }

  return false;
 }

 
 /**
  * 通過ticket換取二維碼
  * 獲取二維碼ticket後,開發者可用ticket換取二維碼圖片。請注意,本接口無須登錄態即可調用。
  * 提醒:TICKET記得進行UrlEncode
  * ticket正確情況下,http 返回碼是200,是一張圖片,可以直接展示或者下載。
  * 錯誤情況下(如ticket非法)返回HTTP錯誤碼404。
  *
  * @param string $ticket
  */
 public function getQrcodeUrl($ticket)
 {
  return self::SHOW_QRCODE_URL.'ticket='.urlencode($ticket);
 }

 
 /**
  * 記錄接口產生的錯誤日志
  */
 public function error($data)
 {
  $this->errCode = $data['errcode'];
  $this->errMsg = $data['errmsg'];
  Log::info('WEIXIN API errcode:['.$this->errCode.'] errmsg:['.$this->errMsg.']');
 }

 
 /**
  * 將數組中的中文轉換成json數據
  * @param array $arr
  */
 public function jsonEncode($arr) {
     $parts = array ();
        $is_list = false;
        //Find out if the given array is a numerical array
        $keys = array_keys ( $arr );
        $max_length = count ( $arr ) - 1;
        if (($keys [0] === 0) && ($keys [$max_length] === $max_length )) { //See if the first key is 0 and last key is length - 1
            $is_list = true;
            for($i = 0; $i < count ( $keys ); $i ++) { //See if each key correspondes to its position
               if ($i != $keys [$i]) { //A key fails at position check.
                  $is_list = false; //It is an associative array.
                  break;
               }
            }
        }
                foreach ( $arr as $key => $value ) {
                        if (is_array ( $value )) { //Custom handling for arrays
                                if ($is_list)
                                        $parts [] = $this->jsonEncode ( $value ); /* :RECURSION: */
                                else
                                        $parts [] = '"' . $key . '":' . $this->jsonEncode ( $value ); /* :RECURSION: */
                        } else {
                                $str = '';
                                if (! $is_list)
                                        $str = '"' . $key . '":';
                                //Custom handling for multiple data types
                                if (is_numeric ( $value ) && $value<2000000000)
                                        $str .= $value; //Numbers
                                elseif ($value === false)
                                $str .= 'false'; //The booleans
                                elseif ($value === true)
                                $str .= 'true';
                                else
                                        $str .= '"' . addslashes ( $value ) . '"'; //All other things
                                // :TODO: Is there any more datatype we should be in the lookout for? (Object?)
                                $parts [] = $str;
                        }
                }
                $json = implode ( ',', $parts );
                if ($is_list)
                        return '[' . $json . ']'; //Return numerical JSON
                return '{' . $json . '}'; //Return associative JSON
        }

       
 /**
  * 檢驗簽名
  */
 public function checkSignature()
 {
        $signature = HttpRequest::getGet('signature');
        $timestamp = HttpRequest::getGet('timestamp');
        $nonce = HttpRequest::getGet('nonce');

  $token = $this->token;
  $tmpArr = array($token, $timestamp, $nonce);
  sort($tmpArr);
  $tmpStr = implode($tmpArr);
  $tmpStr = sha1($tmpStr);

  return ($tmpStr == $signature ? true : false);
 }

 
 /**
  * 驗證token是否有效
  */
 public function valid()
 {
  if($this->checkSignature()) exit(HttpRequest::getGet('echostr'));
 }

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved