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"}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sheliutao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值