如何獲取小程序二維碼

首先咱們先獲取到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
        // })
      });

    },

相關文章
相關標籤/搜索