php实现生成带二维码图片并强制下载功能
发布:smiling 来源: PHP粉丝网 添加日期:2021-09-04 22:27:21 浏览: 评论:0
本文主要和大家分享php生成带二维码图片并强制下载实现代码,希望能帮助到大家实现一个自己的二维码。
- /* 下载二维码 */
- 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(emptyempty($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(!emptyempty($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']
- = emptyempty($data['seller']['bShortName']) ? (emptyempty($data['seller']['bName']) ? (emptyempty($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;
- }
Tags: php生成二维码
相关文章
- ·php生成二维码中文乱码问题解决方法(2014-09-20)
- ·php生成带logo二维码方法小结(2019-10-04)
- ·PHP如何实现自定义生成二维码,扫描后跳转地址(2020-03-28)
- ·PHP生成二维码的两个方法和实例(2021-03-05)
- ·php生成二维码时出现中文乱码的解决方法(2021-05-03)
- ·使用PHP生成二维码的方法汇总(2021-06-13)
- ·php生成带logo二维码方法小结(2021-07-27)
- ·php生成Android客户端扫描可登录的二维码(2021-08-05)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)