PHP開發微信公眾號(一)二維碼的獲取


 

要開發微信公眾號,首先進行需要注冊一個,然后認證。這就不用多說了。

當然如果沒有,也可以去申請一個測試號來使用,地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

申請成功后,你會得到一個appID 和 appsecret,這個就相當於你的開發者賬號和密碼。

開發模式如下圖:

1、Access_Token的獲取

對於這個access_token就是一個訪問標識,其實不用想得太高深,它就好比是你進圖書館需要的圖書卡;

如何獲得它?依賴於appid和appsecret,這就像你辦圖書卡,需要身份證號或者學號,還需要輸入密碼。

api接口如下:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appID&secret=appsecret

這個是以get方式請求,會返回一個json數據,包括access_token和expires_in(有效期,一般為7200);

php如何發送get請求,這里就需要封裝一個函數了,使用curl,請先確保自己php的curl模塊開啟且能正常使用:

 1 private function _request($method='get',$url,$data=array(),$ssl=true){  2         //curl完成,先開啟curl模塊  3  //初始化一個curl資源
 4         $curl = curl_init();  5         //設置curl選項
 6         curl_setopt($curl,CURLOPT_URL,$url);//url  7  //請求的代理信息
 8         $user_agent = isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']: 
                      'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 FirePHP/0.7.4'; 9 curl_setopt($curl,CURLOPT_USERAGENT,$user_agent); 10 //referer頭,請求來源 11 curl_setopt($curl,CURLOPT_AUTOREFERER,true); 12 curl_setopt($curl, CURLOPT_TIMEOUT, 30);//設置超時時間 13 //SSL相關 14 if($ssl){ 15 //禁用后,curl將終止從服務端進行驗證; 16 curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false); 17 //檢查服務器SSL證書是否存在一個公用名 18 curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2); 19 } 20 //判斷請求方式post還是get 21 if(strtolower($method)=='post') { 22 /**************處理post相關選項******************/ 23 //是否為post請求 ,處理請求數據 24 curl_setopt($curl,CURLOPT_POST,true); 25 curl_setopt($curl,CURLOPT_POSTFIELDS,$data); 26 } 27 //是否處理響應頭 28 curl_setopt($curl,CURLOPT_HEADER,false); 29 //是否返回響應結果 30 curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); 31 32 //發出請求 33 $response = curl_exec($curl); 34 if (false === $response) { 35 echo '<br>', curl_error($curl), '<br>'; 36 return false; 37 } 38 //關閉curl 39 curl_close($curl); 40 return $response; 41 }

因為后面還會用到post請求,所有這里就需要一個參數判斷是否何種請求。通過這個函數,我們就可以或得到微信公眾號返回的json數據

//獲取access_token,並保存到文件里
    public function getAccessToken($token_file = './access_token'){ //考慮這個access_token是否過期
        $life_time = 7200; //文件存在,並且左后修改時間與當前時間的差小於access_token的有效期,則有效
        if(file_exists($token_file) && time()-filemtime($token_file)<$life_time){ //得到內容
            return file_get_contents($token_file); } $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->_appid}&secret={$this->_appsecret}"; //向該地址發送get請求
        $result = $this->_request('get',$url); //處理響應結果
        if(!$result){ return false; } //存在返回響應結果,返回對象
        $result_obj = json_decode($result); //寫入文件
        file_put_contents($token_file, $result_obj->access_token); return $result_obj->access_token; }

因為這是寫在一個類里面的,appid和appsecret都已經初始化好,所以直接用了它的屬性。

2、獲取到了access_token后,想要生成二維碼,還需要獲取ticket

ticket又是撒?這就像你網上買票,網站發給你的一個取票碼,然后你拿這個取票碼再去取票。同理,我們這里要獲取也要先得到ticket,然后再去獲取二維碼圖片。

 

        protected $_appid; protected $_appsecret; protected $_token;//公眾平台請求開發者時需要標記
    protected $_appkey;//圖靈機器人appkey //標識qrcodeticket的類型,是永久還是臨時
    const QRCODE_TYPE_TEMP = 1; const QRCODE_TYPE_LIMIT = 2; const QRCODE_TYPE_LIMIT_STR = 3; //根據access_token獲取ticket //@param $content 內容 //@param $type qr碼類型 //@param $expire 有效期,如果是臨時類型需指定 //@return string ticket 
    public function getQRCodeTicket($content,$type=2,$expire=604800){ $access_token = $this->getAccessToken(); $url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.$access_token; $type_list = array( self::QRCODE_TYPE_TEMP => 'QR_SCENE', self::QRCODE_TYPE_LIMIT=>'QR_LIMIT_SCENE', self::QRCODE_TYPE_LIMIT_STR=>'QR_LIMIT_STR_SCENE' ); $action_name = $type_list[$type]; //post發送的數據
        switch ($type){ case self::QRCODE_TYPE_TEMP:
                $data_arr['expire_seconds']=$expire; $data_arr['action_name'] = $action_name; $data_arr['action_info']['scene']['scene_id']=$content; break; case self::QRCODE_TYPE_LIMIT:
                $data_arr['action_name'] = $action_name; $data_arr['action_info']['scene']['scene_id'] = $content; break; case self::QRCODE_TYPE_LIMIT_STR:
                $data_arr['action_name'] = $action_name; $data_arr['action_info']['scene']['scene_str'] = $content; break; } $data = json_encode($data_arr); $result = $this->_request('post',$url,$data); if(!$result){ return false; } $result_obj = json_decode($result); return $result_obj->ticket; } 

ticket又分為臨時、永久、永久字符串三種,其中臨時又需要傳遞有效期。永久和永久字符串區別只在於$content傳遞的是帶引號還是不帶引號。

這里通過post提交數據后,就可以獲得ticket。

3、獲得二維碼qrcode

接下來就可以獲取二維碼了

//根據ticket獲取二維碼
    /** * @param int|string $content qrcode內容標識 * @param [type] $file 存儲為文件的地址,如果null直接輸出 * @param integer $type 類型 * @param integer $expire 如果是臨時,標識有效期 * @return [type] */
    
    public function getQRCode($content,$file=NULL,$type=2,$expire=604800){ //獲取ticket
        $ticket = $this->getQRCodeTicket($content,$type=2,$expire=604800); $url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=$ticket"; //發送,取得圖片數據
        $result = $this->_request('get',$url); if($file){ file_put_contents($file,$result); }else{ header('Content-Type:image/jpeg'); echo $result; } }

最后我們只需要實例化定義的類,傳入appid和appsecret,然后調用getQRCode就可以獲取到二維碼了。

 源碼下載:https://github.com/Ivanlovening/wechat


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM