[ 'size' => 143, //二维码宽度 'x' => 376, //水印x 'y' => 35 //水印y ], 2 => [ 'size' => 147, //二维码宽度 'x' => 374, //水印x 'y' => 33 //水印y ], 3 => [ 'size' => 135, //二维码宽度 'x' => 372, //水印x 'y' => 46 //水印y ], 4 => [ 'size' => 179, //二维码宽度 'x' => 356, //水印x 'y' => 15 //水印y ], 5 => [ 'size' => 179, //二维码宽度 'x' => 356, //水印x 'y' => 15 //水印y ], 6 => [ 'size' => 179, //二维码宽度 'x' => 356, //水印x 'y' => 15 //水印y ] ]; protected function configure() { $this ->setName('changeQRCode') ->addOption('type', 't', Option::VALUE_OPTIONAL, '处理自定义二维码错误问题', 'modify') ->setDescription('处理自定义二维码错误问题'); } protected function execute(Input $input, Output $output) { Request::instance()->module('admin'); //cli模式下无法获取到当前的项目模块,手动指定一下 $type = $input->getOption('type'); switch ($type) { case 'modify': $this->modify($input, $output); break; default: $output->writeln("Type: {$type} 无法识别的类型"); } } /** * @param Input $input * @param Output $output */ private function modify(Input $input, Output $output){ $output->info("开始处理自定义二维码错误问题."); try{ if(!$source = model('CustomQrcode')->where(['type'=>'2'])->select()){ $output->info('没有要处理的自定义二维码错误数据'); } foreach($source as $key => $val){ //处理合成图片 if(strpos($val['url'], 'mp.weixin.qq.com') === false){ $tmp = explode('_',basename($val['url'],".png")); $template_id = $tmp[2]; if(!$adminConfig = model('AdminConfig')->where(['admin_id'=>$val['admin_id']])->find()){ $output->error(sprintf('未处理 Channel_id:%d CustomQRCode_id:%d 渠道配置信息获取失败',$val['admin_id'],$val['id'])); continue; } if(empty($adminConfig['appid']) || empty($adminConfig['json']) ){ $output->error(sprintf('未处理 Channel_id:%d CustomQRCode_id:%d 渠道微信没有授权',$val['admin_id'],$val['id'])); continue; } //获取微信永久二维码 $adminConfig = model('AdminConfig')->getAdminInfoAll($val['admin_id']); $wechat = new WeChatObject($adminConfig); $officialAccount = $wechat->getOfficialAccount(); $result = $officialAccount->qrcode->forever($val['index']); if(empty($result) || isset($result['errcode'])){ $output->error(sprintf('未处理 Channel_id:%d CustomQRCode_id:%d 获取微信二维码失败',$val['admin_id'],$val['id'])); continue; } $wx_url = $officialAccount->qrcode->url($result['ticket']); $image_1 = imagecreatefrompng(ROOT_PATH . "public/assets/img/essay/qrcode_{$template_id}.png"); //底图 $image_2 = $this->createThumbnail($wx_url,$this->imgSize[$template_id]['size'],$this->imgSize[$template_id]['size']); imagecopymerge($image_1, $image_2, $this->imgSize[$template_id]['x'], $this->imgSize[$template_id]['y'], 0, 0, imagesx($image_2), imagesy($image_2), 100); $imgPath = ROOT_PATH . 'public/uploads/qrcode/'; //图片保存路径 if (!file_exists($imgPath)) { //创建文件夹 mkdir($imgPath, 0700, true); clearstatcache(); } $imgPath = $imgPath .$val['book_id'].'_'.$val['chapter_id'] .'_' . $template_id .'_'.$val['admin_id'].'_'.time().'.png'; $data['url'] = cdnurl("/uploads/qrcode/" . $val['book_id'] .'_'.$val['chapter_id'] . '_' . $template_id .'_'.$val['admin_id'].'_'.time().'.png'); if(!imagepng($image_1, $imgPath)){ $output->error(sprintf('未处理 Channel_id:%d CustomQRCode_id:%d 拼接图片失败',$val['admin_id'],$val['id'])); continue; } imagedestroy($image_1); imagedestroy($image_2); if(false !== model('CustomQrcode')->where(['id'=>$val['id']])->update($data)){ $output->info(sprintf('已处理 Channel_id:%d CustomQRCode_id:%d ImagePath:%s',$val['admin_id'],$val['id'],$imgPath)); }else{ $output->info(sprintf('未处理 Channel_id:%d CustomQRCode_id:%d 更新数据失败 ImagePath:%s',$val['admin_id'],$val['id'],$imgPath)); } } } }catch (\Exception $e){ $output->error('处理自定义二维码出错,Error:'.$e->getMessage()); } } /** * 生成保持原图纵横比的缩略图,支持.png .jpg .gif * 缩略图类型统一为.png格式 * $srcFile 原图像文件名称 * $toW 缩略图宽 * $toH 缩略图高 * @return bool */ private function createThumbnail($srcFile, $toW, $toH) { $toW += 20; $toH += 20; $info = ""; //返回含有4个单元的数组,0-宽,1-高,2-图像类型,3-宽高的文本描述。 //失败返回false并产生警告。 $data = getimagesize($srcFile, $info); if (!$data) return false; //将文件载入到资源变量im中 switch ($data[2]) //1-GIF,2-JPG,3-PNG { case 1: if(!function_exists("imagecreatefromgif")) { echo "the GD can't support .gif, please use .jpeg or .png! back"; exit(); } $im = imagecreatefromgif($srcFile); break; case 2: if(!function_exists("imagecreatefromjpeg")) { echo "the GD can't support .jpeg, please use other picture! back"; exit(); } $im = imagecreatefromjpeg($srcFile); break; case 3: $im = imagecreatefrompng($srcFile); break; } //计算缩略图的宽高 $srcW = imagesx($im); $srcH = imagesy($im); $toWH = $toW / $toH; $srcWH = $srcW / $srcH; if ($toWH <= $srcWH) { $ftoW = $toW; $ftoH = (int)($ftoW * ($srcH / $srcW)); } else { $ftoH = $toH; $ftoW = (int)($ftoH * ($srcW / $srcH)); } if (function_exists("imagecreatetruecolor")) { $ni = imagecreatetruecolor($ftoW, $ftoH); //新建一个真彩色图像 if ($ni) { //重采样拷贝部分图像并调整大小 可保持较好的清晰度 imagecopyresampled($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH); } else { //拷贝部分图像并调整大小 $ni = imagecreate($ftoW, $ftoH); imagecopyresized($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH); } } else { $ni = imagecreate($ftoW, $ftoH); imagecopyresized($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH); } ImageDestroy($im); return $ni; } }