要開發微信公眾號,首先進行需要注冊一個,然后認證。這就不用多說了。
當然如果沒有,也可以去申請一個測試號來使用,地址: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