生成微信小程序码


一、前言

1、官方开发文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/qr-code.html

2、项目要上线才可以生成哦

二、生成二维码方法(Tp5.0版)

//生成企业二维码
public function createCompanyEwm(){

    $post =input();

    if(!isset($post['id'])||empty($post['token'])){
        $param = array(
          'code' => 0,
          'msg'  =>'参数错误!',
         
        );
        return json($param);
    }

    $peizhi = [];
   //获取配置
    $peizhi['appid']=Db::name('config')->where(['name'=>'appid'])->value('value');
    $peizhi['appsecret']=Db::name('config')->where(['name'=>'appsercet'])->value('value');
    $peizhi['qn_domain']=Db::name('config')->where(['name'=>'qn_domain'])->value('value');

    $token_content=file_get_contents("common_token.txt");//用于存储access_token

    if($token_content==''){//获取新的access_token
      
        $token_result=$this ->get_new_token($peizhi);
        $res= $token_result['res'];
        $new = $token_result['new'];
        //判断失败
        if(!$new['access_token']){
          $param = array(
            'code' => 0,
            'msg'  =>'获取token失败!',
            'new'=>$new
          );
          return json($param);
        }

        $access_token=$new['access_token'];
        //更新token缓存
        
        $maxTime=time()+intval($new['expires_in']);
        $access_arr=str_replace('}', ",\"maxTime\":".$maxTime."}", $res);
        file_put_contents("common_token.txt",$access_arr);
     
      }else{

        $token_arr=json_decode($token_content,true);

        if(intval($token_arr['maxTime'])<time()){

          $token_result=$this ->get_new_token($peizhi);
          $res= $token_result['res'];
          $new = $token_result['new'];

          if(!$new['access_token']){
            $param = array(
              'code' => 0,
              'msg'  =>'获取token失败!',
              'errcode'=>$new['errcode']
            );
            return json($param);
          }

          $access_token=$new['access_token'];

          $maxTime=time()+intval($new['expires_in']);
          $access_arr=str_replace('}', ",\"maxTime\":".$maxTime."}", $res);

          file_put_contents("common_token.txt",$access_arr);

        }else{

          $access_token=$token_arr['access_token'];

        }

      }


     if($access_token==''||strlen($access_token)<10){
          $param = array(
            'code' => 0,
            'msg'  =>'获取token失败!',
           
          );
          return json($param);
      }

      $url="https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=".$access_token;

      $data=array(
        'scene'=>intval($post['id']).','.trim($post['token']),
        'page'=>'pages/details/details',
        'width'=>430,
        'auto_color'=>true,
        'is_hyaline'=>false
      );

        
      //header("Content-type: image/jpg");
      $ewm_res= $this->api_notice_increment($url,json_encode($data));


      $dejson_ewm_res=json_decode($ewm_res,1);

        if($dejson_ewm_res['errcode']==41030){
            $param = array(
                'code' => 0,
                'msg'  =>'所传page页面不存在,或者小程序没有发布',
                'dejson_ewm_res'=>$dejson_ewm_res
               
            );
            return json($param);

        }
        if($dejson_ewm_res['errcode']==45009){
                $param = array(
                'code' => 0,
                'msg'  =>'调用分钟频率受限(目前5000次/分钟,会调整),如需大量小程序码,建议预生成。',
                'dejson_ewm_res'=>$dejson_ewm_res
               
            );
            return json($param);

        }


      if($dejson_ewm_res['errcode']==40001){//token无效


        $token_result=$this ->get_new_token($peizhi);
        $res= $token_result['res'];
        $new = $token_result['new'];
        $access_token=$new['access_token'];

        $maxTime=time()+intval($new['expires_in']);
        $access_arr=str_replace('}', ",\"maxTime\":".$maxTime."}", $res);

        file_put_contents("common_token.txt",$access_arr);
        
        $url="https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=".$access_token;

        //header("Content-type: image/jpg");

        $ewm_res= $this->api_notice_increment($url,json_encode($data));

      }
      $img=$this->change_picture($ewm_res);
      $base64_img=$this->base64EncodeImage($img);
      $this->delDirAndFile('./public/uploads/temporary/');

      error_reporting(0);
      //上传到七牛
      $Qiniu=new Qiniu();
      $data=json_decode($Qiniu->liuUpload($base64_img),true);
      $data['url']='http://'.$peizhi['qn_domain'].'/'.$data['hash'];
      $file_exists=file_exists_get($data['url']);
      if(!$file_exists){
           return json(['code'=>0,'msg'=>'生成失败!']);
      }

      //数据存入数据库
      $companyObj = new CompanyModel();
      $flag = $companyObj->editCompany(['id'=>$post['id'],'ewm'=>$data['url'],'addtime'=>time()]);
      
      $param = array(
          'code' => 1,
          'msg'  =>'获取成功',
          'data'=>$data,
      );

      return json($param);

}

 //获取新的token
  function get_new_token($peizhi){
    $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$peizhi['appid']."&secret=".$peizhi['appsecret'];
    $res= httpRequest($url);
    $new = json_decode($res,1);
    $result=array('res'=>$res,'new'=>$new);
    return $result;
  }
  
  //网络requst
  function httpRequest($url,$data = null){
      $curl = curl_init();
      curl_setopt($curl, CURLOPT_URL, $url);
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
      curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
      if (!empty($data)){
       curl_setopt($curl, CURLOPT_POST, 1);
       curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
      }
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
     //执行
      $output = curl_exec($curl);
      curl_close($curl);
      return $output;
  }

  /**
   * 网络请求-用于获取二维码函数
   * @param  [type] $url  [description]
   * @param  [type] $data [description]
   * @return [type]       [description]
   */
  function api_notice_increment($url, $data){
      $ch = curl_init();
      $header = ["Content-type: image/jpg"];
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
      curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
      curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
      curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      $tmpInfo = curl_exec($ch);
      curl_close($ch);

      return $tmpInfo;
  }

  //二进制二维码图片buffer,保存为临时图片
  public function change_picture($imgs){
      $path="./public/uploads/temporary/";
      if(!is_dir($path)){
          mkdir($path);
      }
      $new_file = "./public/uploads/temporary/" .'ewm'.date('Y-m-d',time()).getRandomString(8).".jpg"; //生成图片的名字
      if(!empty($imgs)){
          $file = fopen($new_file,"w");//打开文件准备写入
          fwrite($file,$imgs);//写入
          fclose($file);//关闭
      }
      return $new_file;
  }

3、小程序获取参数

Page({
  onLoad(query) {
    // scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scene
    const scene = decodeURIComponent(query.scene)
  }
})

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM