首先咱們先獲取到token,拿到token後再去調獲取二維碼的接口
這裏須要注意的是,返回的圖片是一堆亂碼,須要使用base65_encode來解密,輸出成圖片便可php
/* * author:咔咔 * wechat:fangkangfk * time:2018.9.13 * 獲取小程序二維碼 * */ /** * 獲取 access_tonken * @param string $token_file 用來存儲token的臨時文件 */ private function _getToken($token_file='./access_token') { // 考慮過時問題,將獲取的access_token存儲到某個文件中 $life_time = 7200; if (file_exists($token_file) && time()-filemtime($token_file)<$life_time) { // 存在有效的access_token return file_get_contents($token_file); } // 目標URL: $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".Config::get('appid')."&secret=".Config::get('appsecret'); //向該URL,發送GET請求 $result = $this->request($url); if (!$result) { return false; } // 存在返回響應結果 $result_obj = json_decode($result); // 寫入 file_put_contents($token_file, $result_obj->access_token); return $result_obj->access_token; } /* 獲取二維碼 */ public function getQrcode(){ $userId = $this->request->param('user_id'); $member_app_id = $this->request->param('appid'); $token = $this->getToken($member_app_id); $url = "https://api.weixin.qq.com/wxa/getwxacode?access_token=".$token; $data = [ 'path' =>"pages/network/network?userId=".$userId, 'scene'=>'1001', 'width'=>430, 'auto_color'=>false, ]; $data=json_encode($data); $res = $this->request($url,$data); $data='image/png;base64,'.base64_encode($res); $imageName = rand(1111,9999).'.png'; if (strstr($data,",")){ $image = explode(',',$data); $image = $image[1]; } $path = "/attachs/uploads/".date("Ymd",time()); if (!is_dir($path)){ //判斷目錄是否存在 不存在就建立 mkdir($path,0777,true); } $imageSrc= $path."/". $imageName; //圖片名字 $r = file_put_contents(ROOT_PATH .$imageSrc, base64_decode($image));//返回的是字節數 if (!$r) { // return json(['data'=>null,"code"=>1,"msg"=>"圖片生成失敗"]); }else{ $send = ['code'=>200,'msg'=>'圖片生成成功','path'=>'https://'.$_SERVER['HTTP_HOST'].$imageSrc]; // return json(['data'=>1,"code"=>0,"msg"=>"圖片生成成功"]); } $this->result($send,200,'獲取二維碼成功','json'); } //發起請求 public static function request($url, $data=array()){ $ch = curl_init();//初始化 //curl_setopt();//設置 //設置 curl_setopt($ch,CURLOPT_URL,$url); //須要獲取的 URL 地址 curl_setopt($ch,CURLOPT_HEADER,0); //啓用時會將頭文件的信息做爲數據流輸出, 此處禁止輸出頭信息 curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //獲取的信息以字符串返回,而不是直接輸出 curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,30); //鏈接超時時間 curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); //避免https 的ssl驗證 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSLVERSION, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); if($data){ curl_setopt($ch, CURLOPT_POST, 1); //post請求 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//post參數 } //執行 $data = curl_exec($ch);//執行 不輸出 內容返回給它 //判斷是否請求成功 if(curl_errno($ch)){//錯誤碼 echo 'curl error: '.curl_error($ch);//錯誤信息 } $response = curl_getinfo($ch); switch($response['http_code']){ case 200: return $data; break; default: exit('程序異常'); } curl_close($ch);//關閉 } //發起請求 public static function request($url, $data=array()){ $ch = curl_init();//初始化 //curl_setopt();//設置 //設置 curl_setopt($ch,CURLOPT_URL,$url); //須要獲取的 URL 地址 curl_setopt($ch,CURLOPT_HEADER,0); //啓用時會將頭文件的信息做爲數據流輸出, 此處禁止輸出頭信息 curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //獲取的信息以字符串返回,而不是直接輸出 curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,30); //鏈接超時時間 curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); //避免https 的ssl驗證 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSLVERSION, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); if($data){ curl_setopt($ch, CURLOPT_POST, 1); //post請求 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//post參數 } //執行 $data = curl_exec($ch);//執行 不輸出 內容返回給它 //判斷是否請求成功 if(curl_errno($ch)){//錯誤碼 echo 'curl error: '.curl_error($ch);//錯誤信息 } $response = curl_getinfo($ch); switch($response['http_code']){ case 200: return $data; break; default: exit('程序異常'); } curl_close($ch);//關閉 }
那麼問題來了怎麼將獲取二維碼顯示在小程序界面呢!json
var array = wx.base64ToArrayBuffer(data);
var base64 = wx.arrayBufferToBase64(array); 小程序
that.setData({ kaka: "data:image/png;base64," + base64 }); api
上邊的三段代碼特別重要app
saveImageToAlbum: function() { var user_id = wx.getStorageSync('user_id'); var that = this; wxb.Post('/api/automatic.manage/getQrcode',{ user_id: user_id },function(data){ console.log(data) var array = wx.base64ToArrayBuffer(data); var base64 = wx.arrayBufferToBase64(array); that.setData({ kaka: "data:image/png;base64," + base64 }); // that.setData({ // qrcode: data.data // }) }); },