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 相关文章推荐
yii框架源码分析之创建controller代码
Jun 28 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
Jul 01 PHP
php使用递归计算文件夹大小
Dec 24 PHP
php文件缓存类用法实例分析
Apr 22 PHP
thinkPHP中多维数组的遍历方法
Jan 09 PHP
php将print_r处理后的数据还原为原始数组的解决方法
Nov 02 PHP
PHP面向对象程序设计OOP继承用法入门示例
Dec 27 PHP
php 删除指定文件夹的实例讲解
Jul 25 PHP
PHP策略模式定义与用法示例
Jul 27 PHP
PHP中递归的实现实例详解
Nov 14 PHP
PHP实现的AES双向加密解密功能示例【128位】
Sep 03 PHP
php实例化一个类的具体方法
Sep 19 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
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
基于php冒泡排序算法的深入理解
2013/06/09 PHP
PHP中include与require使用方法区别详解
2013/10/19 PHP
浅谈php中curl、fsockopen的应用
2016/12/10 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
基于javascript如何传递特殊字符
2015/11/30 Javascript
javascript实现禁止复制网页内容汇总
2015/12/30 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
vue实现点击展开点击收起效果
2018/04/27 Javascript
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
讲解Python中的递归函数
2015/04/27 Python
python3.5仿微软计算器程序
2020/03/30 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
python 梯度法求解函数极值的实例
2019/07/10 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
python字符串判断密码强弱
2020/03/18 Python
Python Charles抓包配置实现流程图解
2020/09/29 Python
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
预备党员转正考核材料
2014/06/03 职场文书
我的中国心演讲稿
2014/09/04 职场文书
学校政风行风整改方案
2014/10/25 职场文书
文言文辞职信
2015/02/28 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python