当前位置:主页 > PHP开发 > PHP基础 >

php实现生成带二维码图片并强制下载功能

栏目:PHP基础 来源: 微信小程序开发网 阅读: 2018-03-26

/* 下载二维码 */ public function 测试(){ // 接收传递的参数 $$data['keys'] = [ 'b01id'=>trim(I('get.b01id')), 'b02id'=>trim(I('get.b02id')), 'b03id'=>trim(I('get.b03id')), 'brid'=>trim(I('get.brid')), 'unicon'=>trim(I('get.unicon'))]; if(empty($$data['keys']['b01id'])) $$this->error('商户不存在',U('Seller/index'),3); $$res = D('Sellerbrcode')->download($$data); //方法在下面 if(!is_array($$res)) $$this->error($$res,U('Seller/index'),3); if(!empty($$res['error'])) $$this->error($$res['error'],U('Seller/seebrcode?'.$$res['url']),3); // 制作扫码牌 $$bgimg = imagecreatefromstring(file_get_contents($$res['bgimg'])); // 拿到背景图做画布 import('Component/phpqrcode',APP_PATH,'.php'); // 引入二维码生成类 // 如果有扫码123二维码,则生成扫码123二维码 if('' != $$res['codea']){ /* 参数说明: * 参数1:二维码需要保持的值 * 参数2:false代表直接输出,其他则是生成的文件名 * 参数3:纠错级别:L、M、Q、H * 参数4:点的大小,数值越大图片越大 * */ \QRcode::png($$res['codea'], $$res['codeimg'], 'H', 18); /* 使用图片缩放方法 bool imagecopyresized($$dst_im,$$src_im,$$dst_x,$$dst_y,$$src_x,$$src_y,$$dst_w,$$dst_h,$$src_w,$$src_h) dst_im 目标图像链接的资源。 src_im 源图像链接的资源。 dst_x X坐标的目的地。 dst_y y坐标目的地。 src_x X坐标的源点。 src_y y坐标源点。 dst_w 目的地宽度。 dst_h 目标高度。 src_w 源宽度。 src_h 源高度。 * */ $$codeimg = imagecreatefromstring(file_get_contents($$res['codeimg'])); // 拿到二维码图片 $$bg_info = getimagesize($$res['codeimg']); // 得到原二维码图片的大小 imagecopyresized($$bgimg,$$codeimg,1520,550,0,70,700,666,$$bg_info[0],$$bg_info[1]-36); } // 如果存在银联云闪付二维码,则生成银联云闪付二维码图片 if('' != $$res['codeb']){ \QRcode::png($$res['codeb'], $$res['paycodeimg'], 'H', 18); $$codeimg = imagecreatefromstring(file_get_contents($$res['paycodeimg']));// 拿到二维码图片 $$bg_info = getimagesize($$res['paycodeimg']); // 得到原二维码图片的大小 imagecopyresized($$bgimg,$$codeimg,236,536,0,80,750,670,$$bg_info[0],$$bg_info[1]-80); } // 如果存在商户推广二维码,则生成商户推广二维码图片 if('' != $$res['codec']){ \QRcode::png($$res['codec'], $$res['bridimg'], 'H', 18); $$codeimg = imagecreatefromstring(file_get_contents($$res['bridimg'])); // 拿到二维码图片 $$bg_info = getimagesize($$res['bridimg']); // 得到原二维码图片的大小 imagecopyresized($$bgimg,$$codeimg,1375,1288,0,0,230,230,$$bg_info[0],$$bg_info[1]); } // 如果存在商户名称 if('' != $$res['bName']){ // 为了让文字居中,需要计算左偏移量 preg_match_all("/[0-9]{1}/",$$res['bName'],$$len1); // 得到字符串中的字数量 preg_match_all("/[a-zA-Z]{1}/",$$res['bName'],$$len2); // 得到字符串中的字母数量 preg_match_all("/([\x{4e00}-\x{9fa5}]){1}/u",$$res['bName'],$$len3); // 得到字符串中的中文数量 $$left = 610 - (count($$len1[0]) * 16) - (count($$len2[0]) * 15) - (count($$len3[0]) * 28); $$res['filename'] .= '_' . $$res['bName']; // 追加二维码名称 $$black = imagecolorallocate($$bgimg, 0x20, 0x57, 0xa0); // 字体颜色 imagefttext($$bgimg, 42, 0, $$left, 480, $$black,'./Public/font/msyh.ttf',$$res['bName']); } // 如果存在二维码编号,则写入二维码编号 if('' != $$res['brid']){ $$black = imagecolorallocate($$bgimg, 0x3e, 0x75, 0xc7); //字体颜色 imagefttext($$bgimg, 30, 0, 1720,1190, $$black,'./Public/font/msyh.ttf',$$res['brid']); } // 添加银联云闪付logo $$codeimg = imagecreatefromstring(file_get_contents($$res['union'])); // 拿到二维码图片 $$bg_info = getimagesize($$res['union']); // 得到原logo图片的大小 imagecopyresized($$bgimg,$$codeimg,550,760,0,0,120,120*$$bg_info[1]/$$bg_info[0],$$bg_info[0],$$bg_info[1]); // 添加添加扫码123logo $$codeimg = imagecreatefromstring(file_get_contents($$res['logo'])); // 拿到二维码图片 $$bg_info = getimagesize($$res['logo']); // 得到原logo图片的大小 imagecopyresized($$bgimg,$$codeimg,1805,770,0,0,120,120*$$bg_info[1]/$$bg_info[0],$$bg_info[0],$$bg_info[1]); $$res['filename'] .= '_' . date('Y-m-d',time()) . '.png'; // 追加二维码名称 header('Pragma: public'); // required header('Expires: 0'); // no cache header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Cache-Control: private',false); header('Content-Type: application/force-download'); header('Content-Disposition: attachment; filename="'.$$res['filename'].'"'); header('Content-Transfer-Encoding: binary'); header('Connection: close'); imagepng($$bgimg); } /* 生成图片前 拼接数据 */ public function download($$data){ $$tool = D('Tool'); // 得到公共类 $$mysql = M(); $$admin = I('session.admin'); /* 拼接url,方便以下错误时,跳转使用 */ $$show['url'] = 'b01id='.$$data['keys']['b01id']; // 如果传递了用户id,那么判断该用户是否属于该商户 if($$data['keys']['b03id']) $$show['url'].= '&b03id='.$$data['keys']['b03id']; // 如果传递了二维码id if($$data['keys']['b02id']) $$show['url'].= '&b02id='.$$data['keys']['b02id']; // 如果传递了银联云闪付 if($$data['keys']['unicon']) $$show['url'].= '&unicon='.$$data['keys']['unicon']; // 如果传递了推广二维码 if($$data['keys']['brid']) $$show['url'].= '&brid='.$$data['keys']['brid']; // 调用上部方法得到数据 $$data = $$this->seebrcode($$data,$$tool,$$mysql,$$admin,false); if(!is_array($$data)){ return ['error'=>$$data,'url'=>$$show['url']]; } /* 得到要展示的数据 */ $$show['bgimg'] = './Public/img/qrcode/qrcode.png'; // 背景图片地址 $$show['logo'] = './Public/img/qrcode/logo.png'; // 扫码123的logo地址 $$show['union'] = './Public/img/qrcode/unionPay.png'; // 银联logo地址 $$show['codeimg'] = './Public/img/qrcode/code.png'; // 普通二维码生成的保存地址 $$show['paycodeimg'] = './Public/img/qrcode/paycode.png'; // 银联二维码生成的保存地址 $$show['bridimg'] = './Public/img/qrcode/brid.png'; // 商户推广二维码图片的保存地址 $$show['filename'] = '扫码123收款二维码'; // 二维码名称 // 扫码123二维码内容 $$show['codea'] = (!$$data['keys']['b02id']) ? '' : isset($$data['qrcode'][$$data['keys']['b02id']]) ? $$data['url1'].$$data['qrcode'][$$data['keys']['b02id']]['brCode'] : ''; // 扫码123二维码编号 $$show['brid'] = (!$$data['keys']['b02id']) ? '' : isset($$data['qrcode'][$$data['keys']['b02id']]) ? 'NO.'.$$data['keys']['b02id'] : ''; // 银联二维码 $$show['codeb'] = (!$$data['keys']['unicon']) ? '' : isset($$data['qrcode'][$$data['keys']['unicon']]) ? $$data['qrcode'][$$data['keys']['unicon']]['brCode'] : ''; // 商户推广二维码 $$show['codec'] = (!$$data['keys']['brid']) ? '' : isset($$data['download'][$$data['keys']['brid']]) ? $$data['url2'].$$data['download'][$$data['keys']['brid']]['brCode'] : ''; // 商户名称 $$show['bName'] = empty($$data['seller']['bShortName']) ? (empty($$data['seller']['bName']) ? (empty($$data['seller']['bCode']) ? $$data['seller']['b01id'] : $$data['seller']['bCode']) : $$data['seller']['bName'] ) : $$data['seller']['bShortName']; /* 如果存在旧图片,则删除旧图片 */ if(is_file($$res['codeimg'])) unlink($$res['codeimg']); // 删除旧的扫码123二维码图片 if(is_file($$res['paycodeimg'])) unlink($$res['paycodeimg']); // 删除旧的银联云闪付二维码图片 if(is_file($$res['paycodeimg'])) unlink($$res['paycodeimg']); // 删除旧的商户推广二维码图片 return $$show; }

总结