如何获取小程序二维码

举报
原来是咔咔 发表于 2022/03/27 01:50:47 2022/03/27
1.2k+ 0 0
【摘要】 首先我们先获取到token,拿到token后再去调获取二维码的接口 这里需要注意的是,返回的图片是一堆乱码,需要使用base65_encode来解密,输出成图片即可 /* * author:咔咔 * wechat:fangkangfk * time:2018.9.13 * 获取小程序二维码 ...

首先我们先获取到token,拿到token后再去调获取二维码的接口

这里需要注意的是,返回的图片是一堆乱码,需要使用base65_encode来解密,输出成图片即可


          /*
       * 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);//关闭
          }
  
 

那么问题来了怎么将获取二维码显示在小程序界面呢!

        var array = wx.base64ToArrayBuffer(data);
        var base64 = wx.arrayBufferToBase64(array); 

        that.setData({ kaka: "data:image/png;base64," + base64 }); 

上边的三段代码特别重要


      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
             // })
            });
          },
  
 

文章来源: blog.csdn.net,作者:咔咔-,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/fangkang7/article/details/82688152

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。