程式碼來源:http://www.eaglephp.com 適用平台:window/Linux 依賴項目:EaglePHP框架
包含微信5.0 API基礎介面、自訂選單、進階接口,具體如下: 1、接收用戶訊息。 2、向用戶回覆訊息。 3、接受事件推送。 4、會話介面自訂選單。 5、語音辨識。 6、客服介面。 7、OAuth2.0網頁授權。 8、產生帶參數二維碼。 9、取得使用者地理位置。 10、取得使用者基本資訊。 11、取得追蹤者清單。 12、用戶分組。
-
/**
- * 微信公眾平台API
- *
- * @author maojianlw@139.com
- * [url=home.php?mod=space&uid=17823]@LINK[/url] http:// www.eaglephp.com
- */
- class WeixinChat
- {
-
- private $token
- {
-
- private $token > private $appid;
-
- private $appsecret;
-
- private $access_token;
-
- // 接收的資料
- private $_ceive = array();
- private $_reply = '';
-
- // 介面錯誤碼
- private $errCode = '';
-
- // 介面錯誤訊息
- private $errMerrMsg = ' ';
-
- // 微信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?'; const SNS_OAUTH_REFRESH_TOKEN_URL = 'https://api.weixin.qq.com/sns/oauth2/refresh_token?';
-
- // 透過ticket換取二維碼
- constdUR_L🎜> '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 USERGET_URL = ' /user/get?';
-
- // 查詢分組
- const GROUPS_GET_URL = '/groups/get?';
-
- // 建立分組
- const GROUPS_CREATE_URL = '/groupATE_URL = '/group /create?';
-
- // 修改分組名稱
- const GROUPS_UPDATE_URL = '/groups/update?';
-
- // 行動用戶分組
- congroupst GRPS_MEMBERS_UP/ATE_ /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
- 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 函數> 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->_reive
- {
- return isset($this->_reive
- {
- return isset($this->_rece. ['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,可以呼叫多媒體檔案下載介面來拉取資料。
- * 取得接收語音訊息
- */
- public function getRevVoice()
- {
- if(isset($this->_receive['MediaId'])){
- return array(
- 'mediaId' = > $this->_receive['MediaId'], //語音訊息媒體id,可以呼叫多媒體檔案下載介面來拉取資料。格式,如amr,speex等
- );
- }
- return false;
- }
-
-
- /**
- * 取得接收視訊訊息
- */
- public function getRev( )
- {
- if(isset($this->_receive['MediaId'])){
- return array(
- 'mediaId' => $this->_receive['MediaId'], //視訊訊息媒體id,可以呼叫多媒體檔案下載介面拉取資料。
- 'thumbMediaId' => $this->_receive['ThumbMediaId'] //視訊訊息縮圖的媒體id,可以呼叫多媒體檔案下載介面拉取資料。
- );
- }
- return false;
- }
-
-
- /**
- * 取得使用者地理位置
- */
- public function getRevLocation()*/
- 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()
- * 取得接收事件類型
- * 事件類型如:subscribe(訂閱)、unsubscribe(取消訂閱)、click
- */
- public function getRevLink()
-
- if(isset($this->_receive['Title'])){
- return array(
- 'title' => $this->_receive['Title'], //訊息標題
- 'description' => $this->_receive['Description'], //訊息描述
- 'url' => $this->_receive['Url'] //訊息連結
- );
- }
- return false;
- }
-
-
- /**
- * 設定回覆文字訊息
- * @param string $content
- * @param string $openid
- */
- 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 $title
- * @param string $desc
- * @param string $musicurl
- * @param string $hgmusicurl
- */
- public function text($content='')
- {
- $textTpl = "
-
-
- %s
-
-
-
";
-
- $this-> _reply = sprintf($textTpl,
- $this->getRevFrom(),
- $this->getRevTo(),
- Date::getTimeStamp(),
- 'text',
- $ content
- );
- return $this;
- }
-
-
- /**
- * 回覆圖文訊息
- * @param array
- */
- public function music($title, $desc, $musicurl, $musicurl, $hgmusicurl='')
- {
- $textTpl = '
-
-
- %s
-
-
-
-
-
-
-
-
';
- //
-
- $this->_reply = sprintf($textTpl,
- $this->getRevFrom(),
- $this- >getRevTo(),
- Date::getTimeStamp(),
- 'music',
- $title,
- $desc,
- $musicurl,
- $hgmusicurl
- );
- return $this;
- }
-
-
- /***/
- public function news($data)
- {
- $count = count( $data);
- $subText = '';
- if($count > 0)
- {
- foreach($data as $v)
- {
- $tmpText = '
-
-
-
-
- ';
-
- $subText . = sprintf(
- $tmpText, $v['title'],
- isset($v['description']) ? $v['description'] : '',
- isset($v[ 'picUrl']) ? $v['picUrl'] : '',
- isset($v['url']) ? $v['url'] : ''
- );
- } }
-
- $textTpl = '
-
-
-
-
-
- %s文章>
- ';
-
- $this->_reply = sprintf(
- $textTpl,
- $this->getRevFrom(),
- $this->getRevTo() ,
- Date::getTimeStamp(),
- $count,
- $subText
- );
- return $this;
- }
-
-
- /**
- * 回覆訊息
- * @param array $msg
- * @param bool $return
- */
- public function reply()
- {
- header('Contentd. -Type:text/xml');
- echo $this->_reply;
- exit;
- }
-
-
- /**
- * 自訂選單建立
- * @param array 選單資料
- */
- 公用函數createMenu($data)
- {
- if(!$this->access_token && !$this ->checkAuth()) return false;
-
- $result = curlRequest(self::API_URL_PREFIX.URL_PREFIX. ::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 getMe( > {
- if(!$this->access_token && !$this->checkAuth()) return false;
-
- $result = curlRequest(self::API_URL_PREFIX.self::MENU_GET_URLken. '.$this->access_token);
- if($result)
- {
- $jsonArr = json_decode($result, true);
- if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
- 否則回傳 $jsonArr;
- }
-
- 回傳false;
- }
-
-
- /**
- * 自訂選單刪除
- */
- public function deleteMenu()
- {
- if(!$this->access_token & acc $this->checkAuth()) return false;
-
- $result = curlRequest(self::API_URL_PREFIX.self::MENU_DELETE_URL.'access_token='.$this->access_token);
- if($this->access_token); {
- $jsonArr = json_decode($result, true);
- if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
- 否則回傳true;
- }
-
- 回傳false;
- }
-
-
- /**
- * 取得使用者基本資訊
- * @param string $openid 一般使用者的標識,對目前公眾號唯一
- */
- public function getUserInfo($openid)
- {
- if(!$this->access_token && !$this->checkAuth()) return false;
-
- $resultAuth()) return false;
-
- $result =curlRequest(self::API_URL_PREFIX.self::USER_INFO_URL.'access_token='.$this->access_token.'&openid='.$openid);
- if($result)
- {
- $jsonArrsonArr = 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,不填預設從頭開始拉取
- */ ($next_openid='')
- {
- if(!$this->access_token && !$this->checkAuth()) return false;
-
- $ result =curlRequest(self::IX_URL_PREF21 .self::USER_GET_URL.'access_token='.$this->access_token.'&next_openid='.$next_openid);
- if($result)
- {
- $jsonArr = json_decode($resr );
- if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr);
- 否則回傳 $jsonArr;
- }
-
- return false;
- }
-
-
- /* *
- * 查詢分組
- */
- public function getGroup()
- {
- if(!$this->access_token & access! $this->checkAuth()) return false;
-
- $result = curlRequest(self::API_URL_PREFIX.self::GROUPS_GET_URL.'access_token='.$this->access_tokenPS_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);
- 否則回傳$jsonArr;
- }
-
- 回傳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 ;
- }
-
- 回傳false;
- }
-
-
- /**
- * 修改分組名稱
- * @param int $id 分組id,由微信分配
- * @param string $name 分組名稱(30個字元以內)
- */
- public function updateGroup($ id $name)
- public function updateGroup($ id $name)
- public function updateGroup($ id $name)
- public function updateGroup($ id $name)
- public function updateGroup($ id $name)
- 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);
- 否則回傳true;
- }
-
- 回傳false;
- }
-
- 回傳false;
- }
-
- 回傳false;
- }
-
- 回傳false;
- }
-
- 回傳false;
- }
- }
-
-
- /**
- * 行動用戶分組
- *
- * @param string $openid 使用者唯一識別碼
- * @param int $to_groupid 分組id
- */
- public function updateGroupMembers($openid, $to_groupid)
- {
- if(!$ this-this>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 ($結果,true); if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this->error($jsonArr); 回傳 true; } 回傳false; } / ** * 發送客服訊息 * 當使用者主動向公眾號傳送訊息時(包含傳送訊息、點選選單自訂圖示)事件、訂閱事件、二維碼掃描碼事件、付款成功事件、使用者維權), * 微信會把訊息資料給開發者,每隔一段時間可以間歇期的開發者(目前為24小時)呼叫客服訊息接口,透過POST一個JSON資料包來傳送訊息給一般用戶,在24小時內不限制發送次數。提供更優質的服務。
- *
- * @param string $touser 一般使用者openid
- */
- public function sendCustomMessage($touser, $data, $msgType = 'text')
- { $arr🎜> $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(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 = 'wewem' > $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['access_token '];
- $expire = isset($jsonArr['expires_in']) ? intval($jsonArr['expires_in'])-100 : 3600;
- // 將access_token儲存到快取中
- cache
- // 儲存access_tokenaccess_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=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.'appKEN_URL.'appid >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 refershken(**
- * 微信oauth登陸->第四步:拉取使用者資訊(需scope為snsapi_userinfo)
- * 如果網頁授權作用域為snsapi_userinfo,則此時開發者可以透過access_token和openid拉取使用者資訊了。
- *
- * @param string $access_token 網頁授權介面呼叫憑證,注意:此access_token與基礎支援的access_token不同
- * @param string $openid 使用者的唯一識別
- */
- public function refershken(**
- * 建立二維碼ticket
- * 每次建立二維碼ticket需要提供一個開發者自行設定的參數(scene_id),分別介紹臨時二維碼和永久二維碼的建立二維碼ticket過程。
- *
- * @param int $scene_id 場景值ID,暫存二維碼時為32位元整型,永久二維碼時最大值為1000
- * @param int $type 二維碼類型,0為暫存,1為永久
- * @param int $expire 此二維碼有效時間,以秒為單位。 最大不超過1800。
- */
- public function refersh.
- {
- $result = curlRequest(self::SNS_OAUTH_REFRESH_TOKEN_URL.'appid='.$this->appid.'&grant_type=refresh_token&refresh_token='.$refresh_token); {
- $jsonArr = json_decode($result, true);
- if(!$jsonArr || (isset($jsonArr['errcode']) && $jsonArr['errcode'] > 0)) $this ->error($jsonArr);
- else return $jsonArr;
- }
-
- return false;
- }
-
-
- /**
- }
-
-
- /***/
- public function getSnsUserInfo($access_token, $openid)
- {
- $result = curlRequest(self::SNS_USERINFO_URL.'access_token='.$access_token.'open&id='.openopen&id='.$id); 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 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(> 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
- */
- * @param string $ticket
- */
- * @param string $ticket
- */
- public function getQrcodeUrl($ticket)
- {
- return self::SHOW_QRCODE_UR🎜> {
- return self::SHOW_QRCODE_URL。 );
- }
-
-
- /**
- * 記錄介面產生的錯誤日誌
- */
- 公用函數錯誤($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;
- //判斷給定的陣列是否為數值陣列
- $keys = array_keys ( $arr );
- $max_length = count ( $arr ) - 1 ;
- if (($keys [0] === 0) && ($keys [$max_length] === $max_length )) { //查看第一個key是否為0,最後一個key是否為0 is length - 1
- $is_list = true;
- for($i = 0; $i if ($i != $keys [$i]) { //某個鍵在位置檢查時失敗。
- $is_list = false; //這是一個關聯陣列。
- break;
- }
- }
- }
- foreach ( $arr as $key => $value ) {
- if (is_array ( $ value )) { //陣列的自定義處理
- if ($is_list)
- $parts [] = $this->jsonEncode ( $value ); /* :RECURSION: */
- else
- $parts [] = '"' . $key . '":' . $this->jsonEncode ( $value ); /* :RECURSION: */
- } else {
- $str = '';
- if (! $is_list)
- $str = '"' . $key . '":';
- //多種資料型別的自訂處理
- if (is_numeric ( $value ) && $value $str .= $value; //數字
- elseif ($value === false)
- $str .= 'false'; //布林值
- elseif ($value === true)
- $str .= 'true';
- else
- $str .= '"' .addslashes ($value ) .'" '; //所有其他事情
- // :TODO : 我們還應該尋找更多的資料類型嗎? (物件?)
- $parts [] = $str;
- }
- }
- $json = implode ( ',', $parts );
- if ($is_list)
- 返回'[' 。 $json . ']'; //回傳數字JSON
- return '{' . $json . '}'; //回傳關聯JSON
- }
-
-
- /**
- * 檢驗簽章
- */
- public function checkSignature()
- {
- $signature = HttpRequest::getGet('簽名');
- $timestamp = HttpRequest::getGet('timestamp');
- $timestamp = HttpRequest::getGet('timestamp');
-
- $nonce = HttpRequest::getGet('nonce');
-
- $token = $this->; token;
- $tmpArr = array($token, $timestamp, $nonce);
- 排序($tmpArr);
- $tmpStr = implode($tmpArr);
- $tmpStr = sha1($ tmpStr);
-
- return ($tmpStr == $signature ? true : false);
- }
-
-
- /**
- * 驗證token是否有效
*/ 公用函數有效() { if($this->checkSignature()) exit:(HttpRequest:(HttpRequest:(HttpRequest:(HttpRequest:(HttpRequest:(HttpRequest:(HttpRequest) :getGet('echostr')); } |
}