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


Posted in PHP onFebruary 24, 2018

本文主要和大家分享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(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;
}

总结

以上所述是小编给大家介绍的php生成带二维码图片并强制下载实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
如何获得PHP相关资料
Oct 09 PHP
不用mod_rewrite直接用php实现伪静态化页面代码
Oct 04 PHP
php中使用preg_replace函数匹配图片并加上链接的方法
Feb 06 PHP
深入php多态的实现详解
Jun 09 PHP
php仿QQ验证码的实例分析
Jul 01 PHP
PHP Session 变量的使用方法详解与实例代码
Sep 11 PHP
php实现将Session写入数据库
Jul 26 PHP
简单了解PHP编程中数组的指针的使用
Nov 30 PHP
ThinkPHP使用Smarty第三方插件方法小结
Mar 19 PHP
php进行ip地址掩码运算处理的方法
Jul 11 PHP
Laravel框架自定义公共函数的引入操作示例
Apr 16 PHP
关于laravel 子查询 & join的使用
Oct 16 PHP
php递归函数怎么用才有效
Feb 24 #PHP
php格式文件打开的四种方法
Feb 24 #PHP
Docker搭建自己的PHP开发环境
Feb 24 #PHP
php爬取天猫和淘宝商品数据
Feb 23 #PHP
Laravel如何使用Redis共享Session
Feb 23 #PHP
Laravel 实现密码重置功能
Feb 23 #PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 #PHP
You might like
深入理解JavaScript系列(3) 全面解析Module模式
2012/01/15 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
2012/12/02 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
jquery访问ashx文件示例代码
2014/08/11 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
总结javascript中的六种迭代器
2016/08/16 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
vue2组件之select2调用的示例代码
2017/10/12 Javascript
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
2017/12/28 Javascript
JS实现数组深拷贝的方法分析
2019/03/06 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
JS指定音频audio在某个时间点进行播放
2020/11/28 Javascript
vue 数据操作相关总结
2020/12/17 Vue.js
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
Python实现的计算器功能示例
2018/04/26 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
Python Django实现layui风格+django分页功能的例子
2019/08/29 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
关于Python Tkinter Button控件command传参问题的解决方式
2020/03/04 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
Python 在局部变量域中执行代码
2020/08/07 Python
如何解决python多种版本冲突问题
2020/10/13 Python
让你相见恨晚的十个Python骚操作
2020/11/18 Python
司机的工作范围及职责
2013/11/13 职场文书
八年级英语教学反思
2014/01/09 职场文书
初中班主任寄语
2014/04/04 职场文书
奖学金发言稿(范文)
2019/08/21 职场文书
如何用Navicat操作MySQL
2021/05/12 MySQL
Vue图片裁剪组件实例代码
2021/07/02 Vue.js
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python