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和ACCESS写聊天室(七)
Oct 09 PHP
php magic_quotes_gpc的一点认识与分析
Aug 18 PHP
php 日期和时间的处理-郑阿奇(续)
Jul 04 PHP
php ctype函数中文翻译和示例
Mar 21 PHP
ThinkPHP多表联合查询的常用方法
Mar 24 PHP
php文件上传简单实现方法
Jan 24 PHP
php使用curl简单抓取远程url的方法
Mar 13 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
May 13 PHP
Yii2框架使用计划任务的方法
May 25 PHP
php图像处理函数imagecopyresampled用法详解
Dec 02 PHP
PHP用swoole+websocket和redis实现web一对一聊天
Nov 05 PHP
详解Go与PHP的语法对比
May 29 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
BBS(php & mysql)完整版(二)
2006/10/09 PHP
使用JSON实现数据的跨域传输的php代码
2011/12/20 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
jquery实现的网页自动播放声音
2014/04/30 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
angular.bind使用心得
2015/10/26 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
2016/08/31 Javascript
AngularJS 购物车全选/取消全选功能的实现方法
2017/08/14 Javascript
vue实现的树形结构加多选框示例
2019/02/02 Javascript
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
vue实现百度语音合成的实例讲解
2019/10/14 Javascript
详解Python读取配置文件模块ConfigParser
2017/05/11 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
Python适配器模式代码实现解析
2019/08/02 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
浅谈HTML5新增和废弃的标签
2019/04/28 HTML / CSS
俄罗斯优惠券网站:BIGLION
2017/05/21 全球购物
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
英国领先的票务代理商之一:The Ticket Factory
2019/02/09 全球购物
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
SQL Server数据库笔试题和答案
2016/02/04 面试题
会计毕业生自我鉴定
2013/11/04 职场文书
小区消防演习方案
2014/02/21 职场文书
专科生就业求职信
2014/06/22 职场文书
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript