getRootPath(); try { $resRoutine = true;//小程序 $resWap = true;//公众号 $siteUrl = sys_config('site_url'); // 配置的海报背景模板 $routineSpreadBanner = sys_data('routine_spread_banner'); if (!count($routineSpreadBanner)) { $err = '暂无海报'; Log::error($err); return [false, $err]; } $user = User::getUserInfo($uid); if (!$user) { $err = '用户不存在'; Log::error($err); return [false, $err]; } $is_promoter = $user['is_promoter'] ?? 0; if (!$is_promoter) { return [false, '没有推广权限']; } if ($type == 1) { // 直接获取用户海报 foreach ($routineSpreadBanner as &$item) { $item['namep'] = self::generate_user_poster_filename($user['uid'], $item['id'], $user['is_promoter']); } $posters = SystemAttachment::whereIn('name', array_column($routineSpreadBanner, 'namep'))->field('name, att_dir')->select()->toArray(); if (count($posters)) { foreach ($routineSpreadBanner as $key => &$item) { foreach ($posters as $poster) { if ($item['namep'] == $poster['name']) { $item['poster'] = $poster['att_dir']; } } unset($item['namep']); if (!isset($item['poster'])) { unset($routineSpreadBanner[$key]); } } $routineSpreadBanner = array_values($routineSpreadBanner); if (count($routineSpreadBanner) > 0) { return [true, $routineSpreadBanner]; } } //小程序个人分享二维码文件名 $name = self::generate_user_share_qrcode_filename($user['uid'], $user['is_promoter']); $imageInfo = SystemAttachment::getInfo($name, 'name'); //检测远程文件是否存在 // 20210722 注释掉,太卡 if (isset($imageInfo['att_dir']) && strstr($imageInfo['att_dir'], 'http') !== false && curl_file_exist($imageInfo['att_dir']) === false) { $imageInfo = null; SystemAttachment::where(['name' => $name])->delete(); } if (!$imageInfo) { // 数据库中无记录 $res = RoutineCode::getShareCode($user['uid'], 'spread', '', ''); if (!$res) { return [false, '二维码生成失败']; } $uploadType = (int)sys_config('upload_type', UPLOAD_FS); $upload = new Upload($uploadType, [ 'accessKey' => sys_config('accessKey'), 'secretKey' => sys_config('secretKey'), 'uploadUrl' => sys_config('uploadUrl'), 'storageName' => sys_config('storage_name'), 'storageRegion' => sys_config('storage_region'), ]); // 上传分享二维码 [ qiniu 添加一个子路径] $remoteName = $uploadType == UPLOAD_QINIU ? self::QINIU_PATH . '/' . $name : $name; $uploadRes = $upload->to('routine/spread/code')->validate()->stream($res['res'], $remoteName); if ($uploadRes === false) { $err = $upload->getError(); Log::error("upload error:" . $err); return [false, $err]; } $upload->delete($name); $imageInfo = $upload->getUploadInfo(); // 20210919 为了能小程序下载,这个函数上传的图片全部使用 https $httpsUrl = set_http_type($imageInfo['dir']); $imageInfo['image_type'] = $uploadType; SystemAttachment::attachmentAdd(basename($imageInfo['name']), $imageInfo['size'], $imageInfo['type'], $httpsUrl, $httpsUrl, 1, $imageInfo['image_type'], $imageInfo['time'], 2); RoutineQrcode::setRoutineQrcodeFind($res['id'], ['status' => 1, 'url_time' => time(), 'qrcode_url' => $imageInfo['dir']]); $urlCode = $imageInfo['dir']; } else { $urlCode = $imageInfo['att_dir']; } if ($imageInfo['image_type'] == UPLOAD_FS) { $urlCode = $siteUrl . $urlCode; } $siteUrlHttps = set_http_type($siteUrl, $siteSsl ? 0 : 1); $filelink = [ 'Bold' => 'public/static' . DS . 'font' . DS . 'Alibaba-PuHuiTi-Regular.otf', 'Normal' => 'public/static' . DS . 'font' . DS . 'Alibaba-PuHuiTi-Regular.otf', ]; if (!file_exists($filelink['Bold'])) { $err = '缺少字体文件Bold'; Log::error($err); return [false, $err]; } if (!file_exists($filelink['Normal'])) { $err = '缺少字体文件Normal'; Log::error($err); return [false, $err]; } foreach ($routineSpreadBanner as $key => &$item) { $posterInfo = '海报生成失败'; $config = array( 'image' => array( array( 'url' => $urlCode, //二维码资源 'stream' => 0, 'left' => 114, 'top' => 790, 'right' => 0, 'bottom' => 0, 'width' => 120, 'height' => 120, 'opacity' => 100 ) ), 'text' => array( array( 'text' => $user['nickname'], 'left' => 250, 'top' => 840, 'fontPath' => $rootPath . $filelink['Bold'], //字体文件 'fontSize' => 16, //字号 'fontColor' => '40,40,40', //字体颜色 'angle' => 0, ), array( 'text' => '邀请您加入' . sys_config('site_name'), 'left' => 250, 'top' => 880, 'fontPath' => $rootPath . $filelink['Normal'], //字体文件 'fontSize' => 16, //字号 'fontColor' => '40,40,40', //字体颜色 'angle' => 0, ) ), 'background' => $item['pic'], 'name' => self::QINIU_PATH . '/' . self::generate_user_poster_filename($user['uid'], $item['id'], $user['is_promoter']), ); $resRoutine = $resRoutine && $posterInfo = UtilService::setSharePoster($config, 'routine/spread/poster'); if (!is_array($posterInfo)) { Log::error($posterInfo); return [false, $posterInfo]; } // 20210919 为了能小程序下载,这个函数上传的图片全部使用 https $httpsUrl = set_http_type($posterInfo['dir']); SystemAttachment::attachmentAdd(basename($posterInfo['name']), $posterInfo['size'], $posterInfo['type'], $httpsUrl, $httpsUrl, 1, $posterInfo['image_type'], $posterInfo['time'], 2); if ($resRoutine) { if ($posterInfo['image_type'] == UPLOAD_FS) $item['poster'] = $siteUrlHttps . $posterInfo['dir']; else $item['poster'] = set_http_type($posterInfo['dir'], $siteSsl ? 0 : 1); $item['poster'] = str_replace('\\', '/', $item['poster']); } } } else if ($type == 2) { Log::error(__FUNCTION__ . ' bad parameter type=2'); } if ($resRoutine && $resWap) { return [true, $routineSpreadBanner]; } else { return [false, '生成图片失败']; } } catch (\Exception $e) { Log::error('生成图片时,系统错误:' . $e->getMessage()); return [false, '生成图片时,系统错误:' . $e->getMessage()]; } } }