ThinkPHP5實現生成小程序碼並更新logo

ThinkPHP5實現生成小程序碼並更新logo

  1. 新建控制器Qrcode.php
<?php
	namespace app\studio_admin\controller;
	
	use  think\Controller;
	use think\Request;
	use app\studio_admin\controller\Invt;
	
	class Qrcode extends Check
	{
	    /**
	     * 小程序碼
	     * @return [type] [description]
	     */
		public function index()
	    {
	        // 商家id
	        $uid = session('studio_sid');
	        // 查詢商家數據 商家logo 商家小程序logo 商家小程序碼
	        $goods = db('studio')->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 "<img src='data:image/png;base64,".base64_encode($sharePic)."'>";
	        $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
	<?php
	namespace app\studio_admin\controller;
	
	use think\Request;
	use app\studio_admin\controller\Qrcode;
	
	class Invt extends Check
	{
		/**
		 * 請帖設置
		 *
		 * @return \think\Response
		 */
		public function invtSet()
		{
			$studio = model('StudioData');
			$data = $studio->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控制器方法的接口
	<?php
	namespace app\studio_admin\controller;
	
	use app\studio_admin\controller\Qrcode;
	
	class Test extends Check
	{
	
		public function index()
		{
			header('Access-Control-Allow-Origin: *');
			header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
			header('Access-Control-Allow-Methods: GET, POST, PUT');
			$qr = new Qrcode();
			// echo "<pre>";
			$obj = $qr->index();
			// print_r($obj);
			echo "showData('".$obj['data']."')";
		}
	}
  1. 模板頁面
	{include file="public/header" title="小程序碼設置"}
	<style type="text/css">
		.logo{
			width: 150px;
			height: 150px;
			/*border: 1px solid black;*/
			float: left;
			margin-left:10%
		}
		.my_form{
			width:45%
		}
		.change_logo{
			position: absolute;
			bottom: 0;
			margin-left: 2%;
		}
		body,html,select,option{font-family:'微軟雅黑';}
		.box{width:600px;margin:10px auto;}
		.box select{width:115px;}
	</style>
	<div class="ibox-content" style="margin-top: 5%;border-top: 0">
		<form method="post" class="form-horizontal" action="{:url('studio_admin/invt/updateData')}" style="margin:0 auto;width: 65%;" enctype="multipart/form-data">
			<div class="form-group">
				<label class="col-sm-2 control-label">商家名稱</label>
				<div class="col-sm-10" style="width: 70%;margin-left: 6%">
					<input type="text" class="form-control my_form" value="{$data.studio_name}">
				</div>
			</div>
			<div class="hr-line-dashed"></div>
			<div class="form-group" style="margin-bottom: 3%;position: relative;">
				<label class="col-sm-2 control-label">商家小程序logo</label>
				<img class="logo" src="{$data['studio_invt_logo']|default=$data['studio_logo']}">
				<input type="file" name="studio_invt_logo" style="display: none;">
				<div style="position: absolute;bottom: 0;display: inline-block;margin-left: 1%;width: 20%;margin-bottom: 10px;">
					<button type="button" class="change_logo">更改logo</button>
				</div>
			</div>
			<div class="hr-line-dashed"></div>
			<div class="form-group" style="margin-bottom: 3%;position: relative;">
				<label class="col-sm-2 control-label">商家小程序碼</label>
				<input type="hidden" name="studio_invt_applet" value="" id="applet">
				<img class="logos" src="{$data['studio_invt_applet']|default=''}" style="margin-left: 5%">
				<div style="position: absolute;bottom: 0;display: inline-block;margin-left: 1%;width: 20%;margin-bottom: 10px;">
					<button type="button" "fn();">更新小程序碼</button>
	
				</div>
	<!-- 			<form action="{:url('studio_admin/invt/download')}" style="margin-top: 10px">
						<input type="submit" value="下載小程序碼">
					</form> -->
					<a href="{:url('studio_admin/invt/download')}?data={$data['studio_invt_applet']}">下載小程序碼</a>
			</div>
					<div style="width: 20%;margin-left: 35%">
					<span style="color: red">點擊更新小程序碼</span>
			</div>
			<div class="hr-line-dashed"></div>
			<div class="form-group" style="margin-bottom: 3%;position: relative;">
				<label class="col-sm-2 control-label">商家廣告圖</label>
				<img class="ad_logo" src="{$data['studio_invt_ad']|default=''}" width="300" height="150" style="margin-left: 8%">
				<input type="file" name="studio_invt_ad" style="display: none;">
				<div style="position: absolute;bottom: 0;display: inline-block;margin-left: 1%;width: 20%;">
					<button type="button" class="change_logo1">更改廣告</button>
				</div>
			</div>
			<div class="hr-line-dashed"></div>
			<div class="form-group">
				<div class="col-sm-4 col-sm-offset-2" style="float: initial;margin:0 auto">
					<button class="btn btn-primary" type="submit">保存</button>
				</div>
			</div>
		</form>
	</div>
	
	<script type="text/javascript">
		function localView(from) {
			var file = from.files[0]
			var url = null ;
			if (window.createObjectURL!=undefined) {
				url = window.createObjectURL(file) ;
			} else if (window.URL!=undefined) {
				url = window.URL.createObjectURL(file) ;
			} else if (window.webkitURL!=undefined) {
				url = window.webkitURL.createObjectURL(file) ;
			}
			return url
		}
		function fn() {
			window.location.replace('http://www.xxx.com/index.php/studio_admin/invt/invtset');
		}
		$(function(){
	
			$('.change_logo').click(function(){
	
				$("input[name=studio_invt_logo]").click();
	
			});
	
	
			$("input[name=studio_invt_logo]").change(function(){
				var imgUrl = localView(this);
				$(".logo").attr("src",imgUrl);
			});
	
			function demo()
			{
				var url = 'https://www.xxxx.com/studio_admin/test';
				$.ajax({
					url: url,
					type: "GET",
					dataType: "jsonp",
					jsonpCallback: "showData",
					success: function(data) {
						$('.logos').attr('src',data);
						$('#applet').attr('value',data);
					}
				});
			}
			demo();
	
			$('.change_logo1').click(function(){
	
				$("input[name=studio_invt_ad]").click();
	
			});
	
	
			$("input[name=studio_invt_ad]").change(function(){
				var imUrl = localView(this);
				$(".ad_logo").attr("src",imUrl);
			});
		});
	</script>
	
	{include file="public/footer"}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章