ThinkPHP5实现生成小程序码并更新logo

ThinkPHP5实现生成小程序码并更新logo

  1. 新建控制器Qrcode.php
field('studio_invt_logo,studio_logo,studio_id,studio_invt_applet')->where(['studio_id'=>$uid])->find();
	        // 修改商家logo路径
	        $goods['studio_logo'] = str_replace('__STATIC__', '/public/static', $goods['studio_logo']);
	        // 修改商家小程序logo路径
	        $goods['studio_invt_logo'] = str_replace('__STATIC__', '/public/static', $goods['studio_invt_logo']);
	        // 微信配置
	        $goods_id = time();
	        $url = 'https://'.$_SERVER['HTTP_HOST'];
	        $path = "";
	        // appid
	        $appid = 'xx';
	        // app secret
	        $appsecret = 'xxx';
	        // 传给微信的参数
	        $send = array('scene'=>"$goods_id"."&"."$uid", 'path' =>$path, 'width'=>'300');
	        // 请求微信,获取小程序二维码
	        $resWxQrCode = $this->getWxQrcode($send,$appid,$appsecret);
	
	        // 如果不存在小程序码 && 不存在小程序logo 则用商家logo
	        if (empty($goods['studio_invt_applet']) && empty($goods['studio_invt_logo'])) {
	            // logo图片变圆形
	            // 使用商家logo
	            $default = $url.$goods['studio_logo'];
	            $avatar = file_get_contents($default);
	            // $avatar = file_get_contents($avatarUrl);
	            //返回的是图片数据流
	            $logo = $this->yuanImg($avatar);
	            // 二维码与头像结合
	            $sharePic = $this->qrcodeWithLogo($resWxQrCode,$logo);
	            // 拼接图片路径
	            $img = "/public/qrcode/code".$uid.'_'.$goods_id.'.jpg';
	            // 文件名
	            $urlss = ROOT_PATH.$img;
	            // 保存文件
	            file_put_contents($urlss, $sharePic);
	            // 执行修改
	            db('studio')->where('studio_id',$uid)->update(array('studio_invt_applet'=>$url.$img));
	            // 存入数组
	            $list['studio_invt_applet'] = $url.$img;
	
	        } elseif (empty($goods['studio_invt_applet']) && !empty($goods['studio_invt_logo'])) {
	            // 不存在小程序码 && 存在小程序码logo 则使用使用小程序logo
	
	            // logo图片变圆形
	            // 使用小程序logo
	            $default = $url.$goods['studio_invt_logo'];
	            // echo $default;exit;
	            $avatar = file_get_contents($default);
	            //返回的是图片数据流
	            $logo = $this->yuanImg($avatar);
	            // 二维码与头像结合
	            $sharePic = $this->qrcodeWithLogo($resWxQrCode,$logo);
	            // 拼接图片路径
	            $img = "/public/qrcode/code".$uid.'_'.$goods_id.'.jpg';
	            // 文件名
	            $urlss = ROOT_PATH.$img;
	            // 保存文件
	            file_put_contents($urlss, $sharePic);
	            // 执行修改
	            db('studio')->where('studio_id',$uid)->update(array('studio_invt_applet'=>$url.$img));
	            // 存入数组
	            $list['studio_invt_applet'] = $url.$img;
	
	        } else {
	            // 存在二维码
	            if (session('option') == 1) {
	                // 修改了小程序logo
	                $logos = db('studio')->field('studio_invt_logo,studio_invt_applet')->where(['studio_id'=>$uid])->find();
	                // 修改商家小程序logo路径
	                $logos['studio_invt_logo'] = str_replace('__STATIC__', '/public/static', $logos['studio_invt_logo']);
	                // echo $good['studio_invt_applet'];exit;
	                // logo图片变圆形
	                // 使用小程序logo
	                $default = $url.$logos['studio_invt_logo'];
	                $avatar = file_get_contents($default);
	                //返回的是图片数据流
	                $logo = $this->yuanImg($avatar);
	                // 二维码与头像结合
	                $sharePic = $this->qrcodeWithLogo($resWxQrCode,$logo);
	                // 拼接图片路径
	                $img = "/public/qrcode/code".$uid.'_'.$goods_id.'.jpg';
	                // 文件名
	                $urlss = ROOT_PATH.$img;
	                // 保存文件
	                file_put_contents($urlss, $sharePic);
	                // 执行修改
	                db('studio')->where('studio_id',$uid)->update(array('studio_invt_applet'=>$url.$img));
	                // 存入数组
	                $list['studio_invt_applet'] = $url.$img;
	
	            } else {
	                // 未修改小程序logo,直接取出
	                $list['studio_invt_applet'] = $goods['studio_invt_applet'];
	            }
	
	        }
	        //直接输出图片
	        // echo "";
	        $arr = [
	            'code' => 0,
	            'msg' => '获取成功!',
	            'data' => $list['studio_invt_applet']
	            ];
	        return json($arr);
	    }
	
	       /**
	        * curl方法
	        * @param $url 请求url
	        * @param $data 传送数据,有数据时使用post传递
	        * @param type 为2时,设置json传递
	        */
	        public function curlRequest($url,$data = null , $type = 1){
	            $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);
	                if($type == 2){
	                    curl_setopt($curl, CURLOPT_HTTPHEADER,
	                        array('Content-Type: application/json','Content-Length: ' . strlen($data)));
	                }
	            }
	            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	            curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
	            $output = curl_exec($curl);
	            curl_close($curl);
	            return $output;
	        }
	        /**
	         * 请求微信服务器,生成二维码
	         * @param $data array('scene'=>$setid, 'path' =>'pages/question/question', 'width'=>'100');
	         */
	        public function getWxQrcode($data,$appid,$appsecret){
	            //get access_token
	            $wxTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
	            $access_token = $this->curlRequest($wxTokenUrl);
	            $access_token = json_decode($access_token,true);
	            if(!empty($access_token['errcode']))
	                var_dump(['code'=>2004,'msg'=>'请求微信服务器access_token失败']);
	
	            //get qrcode 微信B接口
	            $wxQrcodeUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=".$access_token['access_token'];
	            $data = json_encode($data,JSON_UNESCAPED_UNICODE);
	            return $this->curlRequest($wxQrcodeUrl,$data);
	        }
	        /**
	         * 在二维码的中间区域镶嵌图片
	         * @param $QR 二维码数据流。比如file_get_contents(imageurl)返回的东东,或者微信给返回的东东
	         * @param $logo 中间显示图片的数据流。比如file_get_contents(imageurl)返回的东东
	         * @return  返回图片数据流
	         */
	        public function qrcodeWithLogo($QR,$logo){
	            $QR   = imagecreatefromstring ($QR);
	            $logo = imagecreatefromstring ($logo);
	            $QR_width    = imagesx ( $QR );//二维码图片宽度
	            $QR_height   = imagesy ( $QR );//二维码图片高度
	            $logo_width  = imagesx ( $logo );//logo图片宽度
	            $logo_height = imagesy ( $logo );//logo图片高度
	            $logo_qr_width  = $QR_width / 2.2;//组合之后logo的宽度(占二维码的1/2.2)
	            $scale  = $logo_width / $logo_qr_width;//logo的宽度缩放比(本身宽度/组合后的宽度)
	            $logo_qr_height = $logo_height / $scale;//组合之后logo的高度
	            $from_width = ($QR_width - $logo_qr_width) / 2;//组合之后logo左上角所在坐标点
	            /**
	             * 重新组合图片并调整大小
	             * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
	            */
	            imagecopyresampled ( $QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height );
	            /**
	             * 如果想要直接输出图片,应该先设header。header("Content-Type: image/png; charset=utf-8");
	             * 并且去掉缓存区函数
	             */
	            //获取输出缓存,否则imagepng会把图片输出到浏览器
	            ob_start();
	            imagepng ( $QR );
	            imagedestroy($QR);
	            imagedestroy($logo);
	            $contents =  ob_get_contents();
	            ob_end_clean();
	            return $contents;
	        }
	        /**
	         * 剪切图片为圆形
	         * @param  $picture 图片数据流 比如file_get_contents(imageurl)返回的东东
	         * @return 图片数据流
	         */
	       public function yuanImg($picture) {
	            $src_img = imagecreatefromstring($picture);
	            $w   = imagesx($src_img);
	            $h   = imagesy($src_img);
	            $w   = min($w, $h);
	            $h   = $w;
	            $img = imagecreatetruecolor($w, $h);
	            //这一句一定要有
	            imagesavealpha($img, true);
	            //拾取一个完全透明的颜色,最后一个参数127为全透明
	            $bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
	            imagefill($img, 0, 0, $bg);
	            $r   = $w / 2; //圆半径
	            $y_x = $r; //圆心X坐标
	            $y_y = $r; //圆心Y坐标
	            for ($x = 0; $x < $w; $x++) {
	                for ($y = 0; $y < $h; $y++) {
	                    $rgbColor = imagecolorat($src_img, $x, $y);
	                    if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) {
	                        imagesetpixel($img, $x, $y, $rgbColor);
	                    }
	                }
	            }
	            /**
	             * 如果想要直接输出图片,应该先设header。header("Content-Type: image/png; charset=utf-8");
	             * 并且去掉缓存区函数
	             */
	            //获取输出缓存,否则imagepng会把图片输出到浏览器
	            ob_start();
	            imagepng ( $img );
	            imagedestroy($img);
	            $contents =  ob_get_contents();
	            ob_end_clean();
	            return $contents;
	        }
	   }  
  1. 修改logo的控制器Invt.php
	getInvtData();
			$data['studio_logo'] = str_replace('__STATIC__', '/public/static', $data['studio_logo']);
			// mp($data);
			$this->assign('data', $data);
			return	$this->fetch();
		}
	
		/**
		 * 修改请帖小程序logo
		 * @return mixed
		 * @throws \think\Exception
		 * @throws \think\exception\PDOException
		 */
		public function updateData(Request $request)
		{
			$data = [];
			$data['studio_invt_applet'] = $request->param('studio_invt_applet');
			// 获取表单上传文件 例如上传了001.jpg
			$file = request()->file('studio_invt_logo');
			// 移动到框架应用根目录/public/uploads/ 目录下
			if($file){
				$info = $file->move(ROOT_PATH . 'public' . DS .'static'. DS . 'studio_invt_logo');
				if($info){
					$image = $info->getFilename();
					$data['studio_invt_logo'] = '__STATIC__/studio_invt_logo/'.date('Ymd',time())."/".$image;
				}else{
					// 上传失败获取错误信息
					return $this->error('图片上传出错');
				}
			}
			// 获取表单上传文件 例如上传了001.jpg
			$file1 = request()->file('studio_invt_ad');
			// 移动到框架应用根目录/public/uploads/ 目录下
			if($file1){
				$info1 = $file1->move(ROOT_PATH . 'public' . DS .'static'. DS . 'studio_invt_ad');
				if($info1){
					$image1 = $info1->getFilename();
					$data['studio_invt_ad'] = '__STATIC__/studio_invt_ad/'.date('Ymd',time())."/".$image1;
				}else{
					// 上传失败获取错误信息
					return $this->error('图片上传出错');
				}
			}
			// 执行修改
			$update = db('studio')->where(['studio_name'=>session('studio_name')])->update($data);
			// 修改成功,将修改的小程序logo复制到
			if($update) {
				session("option",'1');
			} else {
				session("option",'2');
			}
			$this->redirect('studio_admin/Invt/invtSet');
		}
	
		/**
		 * 下载图片
		 */
		public function download($data)
	    {
	        $filename = $data;
	        header("Content-Type: application/force-download");
	        header('Content-Disposition: attachment; filename="下载下来显示的图片名.jpg"');
	        $img = file_get_contents($filename);
	        echo $img;
	    }
	 }   
  1. 调用Qrcode控制器方法的接口
	";
			$obj = $qr->index();
			// print_r($obj);
			echo "showData('".$obj['data']."')";
		}
	}
  1. 模板页面
	{include file="public/header" title="小程序码设置"}
	
	
下载小程序码
点击更新小程序码
{include file="public/footer"}

你可能感兴趣的:(TP5.0)