当前位置:首页 > PHP教程 > php应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-09-04 22:27:21 浏览: 评论:0 

本文主要和大家分享php生成带二维码图片并强制下载实现代码,希望能帮助到大家实现一个自己的二维码。

  1. /* 下载二维码 */ 
  2.  public function 测试(){ 
  3.   // 接收传递的参数 
  4.   $data['keys'] = [ 'b01id'=>trim(I('get.b01id')), 
  5.        'b02id'=>trim(I('get.b02id')), 
  6.        'b03id'=>trim(I('get.b03id')), 
  7.        'brid'=>trim(I('get.brid')), 
  8.        'unicon'=>trim(I('get.unicon'))]; 
  9.   if(emptyempty($data['keys']['b01id'])) $this->error('商户不存在',U('Seller/index'),3); 
  10.   $res = D('Sellerbrcode')->download($data); //方法在下面 
  11.   if(!is_array($res)) $this->error($res,U('Seller/index'),3); 
  12.   if(!emptyempty($res['error'])) $this->error($res['error'],U('Seller/seebrcode?'.$res['url']),3); 
  13.   // 制作扫码牌 
  14.   $bgimg = imagecreatefromstring(file_get_contents($res['bgimg'])); // 拿到背景图做画布 
  15.   import('Component/phpqrcode',APP_PATH,'.php');  // 引入二维码生成类 
  16.   // 如果有扫码123二维码,则生成扫码123二维码 
  17.   if('' != $res['codea']){ 
  18.    /* 参数说明: 
  19.     * 参数1:二维码需要保持的值 
  20.     * 参数2:false代表直接输出,其他则是生成的文件名 
  21.     * 参数3:纠错级别:L、M、Q、H 
  22.     * 参数4:点的大小,数值越大图片越大 
  23.     * */ 
  24.    \QRcode::png($res['codea'], $res['codeimg'], 'H', 18); 
  25.    /* 使用图片缩放方法 
  26.    bool imagecopyresized($dst_im,$src_im,$dst_x,$dst_y,$src_x,$src_y,$dst_w,$dst_h,$src_w,$src_h) 
  27.      dst_im 目标图像链接的资源。 
  28.      src_im 源图像链接的资源。 
  29.      dst_x X坐标的目的地。 
  30.      dst_y y坐标目的地。 
  31.      src_x X坐标的源点。 
  32.      src_y y坐标源点。 
  33.      dst_w 目的地宽度。 
  34.      dst_h 目标高度。 
  35.      src_w 源宽度。 
  36.      src_h 源高度。 
  37.     * */ 
  38.    $codeimg = imagecreatefromstring(file_get_contents($res['codeimg'])); // 拿到二维码图片 
  39.    $bg_info = getimagesize($res['codeimg']);        // 得到原二维码图片的大小 
  40.    imagecopyresized($bgimg,$codeimg,1520,550,0,70,700,666,$bg_info[0],$bg_info[1]-36); 
  41.   } 
  42.   // 如果存在银联云闪付二维码,则生成银联云闪付二维码图片 
  43.   if('' != $res['codeb']){ 
  44.    \QRcode::png($res['codeb'], $res['paycodeimg'], 'H', 18); 
  45.    $codeimg = imagecreatefromstring(file_get_contents($res['paycodeimg']));// 拿到二维码图片 
  46.    $bg_info = getimagesize($res['paycodeimg']);       // 得到原二维码图片的大小 
  47.    imagecopyresized($bgimg,$codeimg,236,536,0,80,750,670,$bg_info[0],$bg_info[1]-80); 
  48.   } 
  49.   // 如果存在商户推广二维码,则生成商户推广二维码图片 
  50.   if('' != $res['codec']){ 
  51.    \QRcode::png($res['codec'], $res['bridimg'], 'H', 18); 
  52.    $codeimg = imagecreatefromstring(file_get_contents($res['bridimg'])); // 拿到二维码图片 
  53.    $bg_info = getimagesize($res['bridimg']);        // 得到原二维码图片的大小 
  54.    imagecopyresized($bgimg,$codeimg,1375,1288,0,0,230,230,$bg_info[0],$bg_info[1]); 
  55.   } 
  56.   // 如果存在商户名称 
  57.   if('' != $res['bName']){ 
  58.    // 为了让文字居中,需要计算左偏移量 
  59.    preg_match_all("/[0-9]{1}/",$res['bName'],$len1);     // 得到字符串中的字数量 
  60.    preg_match_all("/[a-zA-Z]{1}/",$res['bName'],$len2);    // 得到字符串中的字母数量 
  61.    preg_match_all("/([\x{4e00}-\x{9fa5}]){1}/u",$res['bName'],$len3); // 得到字符串中的中文数量 
  62.    $left = 610 - (count($len1[0]) * 16) - (count($len2[0]) * 15) - (count($len3[0]) * 28); 
  63.    $res['filename'] .= '_' . $res['bName'];       // 追加二维码名称 
  64.    $black = imagecolorallocate($bgimg, 0x20, 0x57, 0xa0);    // 字体颜色 
  65.    imagefttext($bgimg, 42, 0, $left, 480, $black,'./Public/font/msyh.ttf',$res['bName']); 
  66.   } 
  67.   // 如果存在二维码编号,则写入二维码编号 
  68.   if('' != $res['brid']){ 
  69.    $black = imagecolorallocate($bgimg, 0x3e, 0x75, 0xc7);    //字体颜色 
  70.    imagefttext($bgimg, 30, 0, 1720,1190, $black,'./Public/font/msyh.ttf',$res['brid']); 
  71.   } 
  72.   // 添加银联云闪付logo 
  73.   $codeimg = imagecreatefromstring(file_get_contents($res['union']));  // 拿到二维码图片 
  74.   $bg_info = getimagesize($res['union']);         // 得到原logo图片的大小 
  75.   imagecopyresized($bgimg,$codeimg,550,760,0,0,120,120*$bg_info[1]/$bg_info[0],$bg_info[0],$bg_info[1]); 
  76.   // 添加添加扫码123logo 
  77.   $codeimg = imagecreatefromstring(file_get_contents($res['logo']));  // 拿到二维码图片 
  78.   $bg_info = getimagesize($res['logo']);         // 得到原logo图片的大小 
  79.   imagecopyresized($bgimg,$codeimg,1805,770,0,0,120,120*$bg_info[1]/$bg_info[0],$bg_info[0],$bg_info[1]); 
  80.   $res['filename'] .= '_' . date('Y-m-d',time()) . '.png';    // 追加二维码名称 
  81.   header('Pragma: public'); // required 
  82.   header('Expires: 0');  // no cache 
  83.   header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
  84.   header('Cache-Control: private',false); 
  85.   header('Content-Type: application/force-download'); 
  86.   header('Content-Disposition: attachment; filename="'.$res['filename'].'"'); 
  87.   header('Content-Transfer-Encoding: binary'); 
  88.   header('Connection: close'); 
  89.   imagepng($bgimg); 
  90.  } 
  91.  
  92. /* 生成图片前 拼接数据 */ 
  93. public function download($data){ 
  94. $tool = D('Tool'); 
  95. // 得到公共类 
  96. $mysql = M(); 
  97. $admin = I('session.admin'); 
  98. /* 拼接url,方便以下错误时,跳转使用 */ 
  99. $show['url'] = 'b01id='.$data['keys']['b01id']; 
  100. // 如果传递了用户id,那么判断该用户是否属于该商户 
  101. if($data['keys']['b03id']) 
  102. $show['url'].= '&b03id='.$data['keys']['b03id']; 
  103. // 如果传递了二维码id 
  104. if($data['keys']['b02id']) 
  105. $show['url'].= '&b02id='.$data['keys']['b02id']; 
  106. // 如果传递了银联云闪付 
  107. if($data['keys']['unicon']) $show['url'].= '&unicon='.$data['keys']['unicon']; 
  108. // 如果传递了推广二维码 
  109. if($data['keys']['brid']) 
  110. $show['url'].= '&brid='.$data['keys']['brid']; 
  111. // 调用上部方法得到数据 
  112. $data = $this->seebrcode($data,$tool,$mysql,$admin,false); 
  113. if(!is_array($data)){ return ['error'=>$data,'url'=>$show['url']]; } 
  114. /* 得到要展示的数据 
  115. */ 
  116. $show['bgimg'
  117. './Public/img/qrcode/qrcode.png'
  118. // 背景图片地址 
  119. $show['logo'
  120. './Public/img/qrcode/logo.png'
  121. // 扫码123的logo地址 
  122. $show['union']  
  123. './Public/img/qrcode/unionPay.png'
  124. // 银联logo地址 
  125. $show['codeimg'
  126. './Public/img/qrcode/code.png'
  127. // 普通二维码生成的保存地址 
  128. $show['paycodeimg'] = './Public/img/qrcode/paycode.png'
  129. // 银联二维码生成的保存地址 
  130. $show['bridimg'
  131. './Public/img/qrcode/brid.png'
  132. // 商户推广二维码图片的保存地址 
  133. $show['filename'
  134. '扫码123收款二维码'
  135. // 二维码名称 
  136. // 扫码123二维码内容 
  137. $show['codea'
  138. = (!$data['keys']['b02id']) ? '' : isset($data['qrcode'][$data['keys']['b02id']]) ? $data['url1'].$data['qrcode'][$data['keys']['b02id']]['brCode'] : ''
  139. // 扫码123二维码编号 
  140. $show['brid'
  141. = (!$data['keys']['b02id']) ? '' : isset($data['qrcode'][$data['keys']['b02id']]) ? 'NO.'.$data['keys']['b02id'] : ''
  142. // 银联二维码 
  143. $show['codeb'
  144. = (!$data['keys']['unicon']) ? '' : isset($data['qrcode'][$data['keys']['unicon']]) ? $data['qrcode'][$data['keys']['unicon']]['brCode'] : ''
  145. // 商户推广二维码 
  146. $show['codec'
  147. = (!$data['keys']['brid']) 
  148.  ? '' : isset($data['download'][$data['keys']['brid']]) ? $data['url2'].$data['download'][$data['keys']['brid']]['brCode'] : ''
  149. // 商户名称 
  150. $show['bName'
  151. emptyempty($data['seller']['bShortName']) ? (emptyempty($data['seller']['bName']) ? (emptyempty($data['seller']['bCode']) ? $data['seller']['b01id'] : $data['seller']['bCode']) : $data['seller']['bName'] ) : $data['seller']['bShortName']; 
  152. /* 如果存在旧图片,则删除旧图片 */ 
  153. if(is_file($res['codeimg'])) 
  154. unlink($res['codeimg']); 
  155. // 删除旧的扫码123二维码图片 
  156. if(is_file($res['paycodeimg'])) unlink($res['paycodeimg']); // 删除旧的银联云闪付二维码图片 
  157. if(is_file($res['paycodeimg'])) unlink($res['paycodeimg']); // 删除旧的商户推广二维码图片 
  158. return $show
  159. }

Tags: php生成二维码

分享到: