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

本文主要和大家分享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. public function download($data){
  93. $tool = D('Tool');
  94. // 得到公共类
  95. $mysql = M();
  96. $admin = I('session.admin');
  97. /* 拼接url,方便以下错误时,跳转使用 */
  98. $show['url'] = 'b01keys']['b01id'];
  99. // 如果传递了用户id,那么判断该用户是否属于该商户
  100. if($data['keys']['b03id'])
  101. $show['url'].= '&b03keys']['b03id'];
  102. // 如果传递了二维码id
  103. if($data['keys']['b02id'])
  104. $show['url'].= '&b02keys']['b02id'];
  105. // 如果传递了银联云闪付
  106. if($data['keys']['unicon']) $show['url'].= '&unicon='.$data['keys']['unicon'];
  107. // 如果传递了推广二维码
  108. if($data['keys']['brid'])
  109. $show['url'].= '&brkeys']['brid'];
  110. // 调用上部方法得到数据
  111. $data = $this->seebrcode($data,$tool,$mysql,$admin,false);
  112. if(!is_array($data)){ return ['error'=>$data,'url'=>$show['url']]; }
  113. /* 得到要展示的数据
  114. */
  115. $show['bgimg']
  116. = './Public/img/qrcode/qrcode.png';
  117. // 背景图片地址
  118. $show['logo']
  119. = './Public/img/qrcode/logo.png';
  120. // 扫码123的logo地址
  121. $show['union']
  122. = './Public/img/qrcode/unionPay.png';
  123. // 银联logo地址
  124. $show['codeimg']
  125. = './Public/img/qrcode/code.png';
  126. // 普通二维码生成的保存地址
  127. $show['paycodeimg'] = './Public/img/qrcode/paycode.png';
  128. // 银联二维码生成的保存地址
  129. $show['bridimg']
  130. = './Public/img/qrcode/brid.png';
  131. // 商户推广二维码图片的保存地址
  132. $show['filename']
  133. = '扫码123收款二维码';
  134. // 二维码名称
  135. // 扫码123二维码内容
  136. $show['codea']
  137. = (!$data['keys']['b02id']) ? '' : isset($data['qrcode'][$data['keys']['b02id']]) ? $data['url1'].$data['qrcode'][$data['keys']['b02id']]['brCode'] : '';
  138. // 扫码123二维码编号
  139. $show['brid']
  140. = (!$data['keys']['b02id']) ? '' : isset($data['qrcode'][$data['keys']['b02id']]) ? 'NO.'.$data['keys']['b02id'] : '';
  141. // 银联二维码
  142. $show['codeb']
  143. = (!$data['keys']['unicon']) ? '' : isset($data['qrcode'][$data['keys']['unicon']]) ? $data['qrcode'][$data['keys']['unicon']]['brCode'] : '';
  144. // 商户推广二维码
  145. $show['codec']
  146. = (!$data['keys']['brid'])
  147. ? '' : isset($data['download'][$data['keys']['brid']]) ? $data['url2'].$data['download'][$data['keys']['brid']]['brCode'] : '';
  148. // 商户名称
  149. $show['bName']
  150. = emptyempty($data['seller']['bShortName']) ? (emptyempty($data['seller']['bName']) ? (emptyempty($data['seller']['bCode']) ? $data['seller']['b01id'] : $data['seller']['bCode']) : $data['seller']['bName'] ) : $data['seller']['bShortName'];
  151. /* 如果存在旧图片,则删除旧图片 */
  152. if(is_file($res['codeimg']))
  153. unlink($res['codeimg']);
  154. // 删除旧的扫码123二维码图片
  155. if(is_file($res['paycodeimg'])) unlink($res['paycodeimg']); // 删除旧的银联云闪付二维码图片
  156. if(is_file($res['paycodeimg'])) unlink($res['paycodeimg']); // 删除旧的商户推广二维码图片
  157. return $show;
  158. }