577 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			577 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | // | likeshop开源商城系统
 | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
 | |||
|  | // | gitee下载:https://gitee.com/likeshop_gitee
 | |||
|  | // | github下载:https://github.com/likeshop-github
 | |||
|  | // | 访问官网:https://www.likeshop.cn
 | |||
|  | // | 访问社区:https://home.likeshop.cn
 | |||
|  | // | 访问手册:http://doc.likeshop.cn
 | |||
|  | // | 微信公众号:likeshop技术社区
 | |||
|  | // | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
 | |||
|  | // |  likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
 | |||
|  | // | 禁止对系统程序代码以任何目的,任何形式的再发布
 | |||
|  | // | likeshop团队版权所有并拥有最终解释权
 | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | // | author: likeshop.cn.team
 | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | namespace app\common\logic; | |||
|  | use app\common\model\RechargeTemplate; | |||
|  | use app\common\server\ConfigServer; | |||
|  | use app\common\server\FileServer; | |||
|  | use app\common\server\storage\Driver as StorageDriver; | |||
|  | use app\common\server\UrlServer; | |||
|  | use app\common\server\WeChatServer; | |||
|  | use app\common\server\JsonServer; | |||
|  | use Endroid\QrCode\QrCode; | |||
|  | use think\facade\Cache; | |||
|  | use think\Exception; | |||
|  | use EasyWeChat\Factory; | |||
|  | 
 | |||
|  | class QrCodeLogic | |||
|  | { | |||
|  |     //商品图片配置
 | |||
|  |     public function goodsShareConfig(){ | |||
|  |         return [ | |||
|  |             //会员头像
 | |||
|  |             'head_pic' => [ | |||
|  |                 'w' => 64, 'h' => 64, 'x' => 40, 'y' => 20, | |||
|  |             ], | |||
|  |             //会员昵称
 | |||
|  |             'nickname' => [ | |||
|  |                 'color' => '#555555', 'font_face' => ROOT_PATH .'/font/SourceHanSansCN-Regular.otf', 'font_size' => 19, 'x' => 120, 'y' => 60, | |||
|  |             ], | |||
|  |             //标题
 | |||
|  |             'title' => [ | |||
|  |                 'color' => '#333333', 'font_face' => ROOT_PATH .'/font/SourceHanSansCN-Bold.otf', 'font_size' => 20, 'w' => 360, 'x' => 40, 'y' => 785, | |||
|  |             ], | |||
|  |             //价格符号
 | |||
|  |             'price_symbol' => [ | |||
|  |                 'color' => '#FF2C3C', 'font_face' => ROOT_PATH .'/font/SourceHanSansCN-Regular.otf', 'font_size' => 22, 'w' => 140, 'x' => 40, 'y' => 722, | |||
|  |             ], | |||
|  |             //商品价格
 | |||
|  |             'price' => [ | |||
|  |                 'color' => '#FF2C3C', 'font_face' => ROOT_PATH .'/font/SourceHanSansCN-Bold.otf', 'font_size' => 32, 'w' => 140, 'x' => 64, 'y' => 722, | |||
|  |             ], | |||
|  |             //小数
 | |||
|  |             'decimal'=> [ | |||
|  |                 'color' => '#FF2C3C', 'font_face' => ROOT_PATH .'/font/SourceHanSansCN-Bold.otf', 'font_size' => 22, 'w' => 140, 'x' => 114, 'y' => 722, | |||
|  |             ], | |||
|  |             //市场价
 | |||
|  |             'market_price_symbol' => [ | |||
|  |                 'color' => '#999999', 'font_face' => ROOT_PATH .'/font/SourceHanSansCN-Regular.otf', 'font_size' => 22, 'w' => 140, 'x' => 142, 'y' => 722, | |||
|  |             ], | |||
|  |             //市场价符号
 | |||
|  |             'market_price' => [ | |||
|  |                 'color' => '#999999', 'font_face' => ROOT_PATH .'/font/SourceHanSansCN-Regular.otf', 'font_size' => 20, 'w' => 140, 'x' => 168, 'y' => 722, | |||
|  |             ], | |||
|  |             //推广主图商品主图
 | |||
|  |             'main_pic' => [ | |||
|  |                 'w' => 560, 'h' => 560, 'x' => 40, 'y' => 100, | |||
|  |             ], | |||
|  |             //提醒长按扫码
 | |||
|  |             'notice' => [ | |||
|  |                 'color' => '#888888', 'font_face' =>  ROOT_PATH .'/font/SourceHanSansCN-Regular.otf', 'font_size' => 18, 'x' => 432, 'y' => 895, | |||
|  |             ], | |||
|  |             //二维码
 | |||
|  |             'qr' => [ | |||
|  |                 'w' => 165,'h' => 165, 'x' => 436, 'y' => 700, | |||
|  |             ], | |||
|  |         ]; | |||
|  |     } | |||
|  |     //生成商品分享图
 | |||
|  |     public function makeGoodsPoster($user,$goods,$url,$url_type){ | |||
|  | 
 | |||
|  |         try { | |||
|  |             $save_dir = ROOT_PATH .'/uploads/qr_code/goods_share/'; | |||
|  |             $background_img = ROOT_PATH .'/images/share/share_goods_bg.png'; | |||
|  |             !file_exists($save_dir) && mkdir($save_dir, 0777, true); | |||
|  | 
 | |||
|  |             $cache_key = 'gid' . $goods['id'].'uid'.$user['id'].$url_type; | |||
|  |             $qr_src = md5($cache_key) . '.png'; | |||
|  |             $poster_url = $save_dir . $qr_src; | |||
|  | 
 | |||
|  |             $base64 = Cache::get($cache_key); | |||
|  |             if (!empty($base64)) { | |||
|  |                 $data = [ | |||
|  |                     'code' => 1, | |||
|  |                     'msg' => '海报生成成功', | |||
|  |                     'show' => 0, | |||
|  |                     'data' => $base64 | |||
|  |                 ]; | |||
|  |                 return json($data); | |||
|  |             } | |||
|  | 
 | |||
|  | 
 | |||
|  |             $poster_config = self::goodsShareConfig(); | |||
|  |             //生成二维码
 | |||
|  |             if($url_type == 'path'){ | |||
|  |                 $scene = 'id='.$goods['id'].'&invite_code='.$user['distribution_code']; | |||
|  |                 $result = $this->makeMnpQrcode($scene,$url,$qr_src,$save_dir); | |||
|  |                 if(true !== $result){ | |||
|  |                     return JsonServer::error('微信配置错误:'.$result); | |||
|  |                 } | |||
|  |             }else{ | |||
|  | 
 | |||
|  |                 $qrCode = new QrCode(); | |||
|  |                 $qrCode->setText($url); | |||
|  |                 $qrCode->setSize(1000); | |||
|  |                 $qrCode->setWriterByName('png'); | |||
|  |                 $qrCode->writeFile($poster_url); | |||
|  | 
 | |||
|  |             } | |||
|  |             $user_avatar =  UrlServer::getFileUrl($user['avatar']); | |||
|  | 
 | |||
|  |             //判断头像是否存在
 | |||
|  |             if(!check_file_exists($user_avatar)){ | |||
|  |                 //如果不存在,使用默认头像
 | |||
|  |                 $user_avatar = ROOT_PATH.ConfigServer::get('website', 'user_image'); | |||
|  |             } | |||
|  | 
 | |||
|  |             //默认商品主图
 | |||
|  |             $goods_image = UrlServer::getFileUrl($goods['image']); | |||
|  | 
 | |||
|  |             //判断是否有自定义分享海报图
 | |||
|  |             if($goods['poster']){ | |||
|  |                 $goods_image = UrlServer::getFileUrl($goods['poster']); | |||
|  |             } | |||
|  | 
 | |||
|  |             if(!check_file_exists($goods_image)){ | |||
|  |                 //如果不存在,使用默认商品主图
 | |||
|  |                 $goods_image = ROOT_PATH.ConfigServer::get('website', 'goods_image'); | |||
|  |             } | |||
|  | 
 | |||
|  |             $qr_code_logic = new QrCodeLogic(); | |||
|  |             //获取背景图
 | |||
|  |             $share_background_img = imagecreatefromstring(file_get_contents($background_img)); | |||
|  | 
 | |||
|  |             //合成头像
 | |||
|  |             $qr_code_logic->writeImg($share_background_img, $user_avatar, $poster_config['head_pic'],true); | |||
|  |             //合并商品主图
 | |||
|  |             $qr_code_logic->writeImg($share_background_img, $goods_image, $poster_config['main_pic'],false); | |||
|  | 
 | |||
|  |             //合成昵称
 | |||
|  |             $nickname = filterEmoji($user['nickname']); | |||
|  |             $nickname = '来自'.$nickname.'的分享'; | |||
|  |             $qr_code_logic->writeText($share_background_img, $nickname, $poster_config['nickname']); | |||
|  | 
 | |||
|  |             //长按识别
 | |||
|  |             $notice = '长按识别二维码'; | |||
|  |             $qr_code_logic->writeText($share_background_img, $notice, $poster_config['notice']); | |||
|  | 
 | |||
|  |             //合成价格
 | |||
|  |             $qr_code_logic->writeText($share_background_img, '¥', $poster_config['price_symbol']); | |||
|  |             $qr_code_logic->writeText($share_background_img, floatval($goods['min_price']), $poster_config['price']); | |||
|  | 
 | |||
|  |             //合成商品标题
 | |||
|  |             $goods_name = auto_adapt($poster_config['title']['font_size'], 0, $poster_config['title']['font_face'], $goods['name'], $poster_config['title']['w'],$poster_config['title']['y'],getimagesize($background_img)); | |||
|  |             $qr_code_logic->writeText($share_background_img, $goods_name, $poster_config['title']); | |||
|  | 
 | |||
|  |             //合成二维码
 | |||
|  |             $qr_code_logic->writeImg($share_background_img, $poster_url, $poster_config['qr'],false); | |||
|  |             imagepng($share_background_img, $poster_url); | |||
|  |             if ($fp = fopen($poster_url, "rb", 0)) { | |||
|  |                 $gambar = fread($fp, filesize($poster_url)); | |||
|  |                 fclose($fp); | |||
|  |                 $base64 = chunk_split(base64_encode($gambar)); | |||
|  |                 $base64 = 'data:image/png;base64,' . $base64; | |||
|  |             } | |||
|  | 
 | |||
|  |             //删除文件
 | |||
|  | //            if (strstr($poster_url, $save_dir)) {
 | |||
|  | //                unlink($poster_url);
 | |||
|  | //            }
 | |||
|  |             Cache::set($cache_key, $base64, 3600); | |||
|  | 
 | |||
|  |             $data = [ | |||
|  |                 'code' => 1, | |||
|  |                 'msg' => '海报生成成功', | |||
|  |                 'show' => 0, | |||
|  |                 'data' => $base64 | |||
|  |             ]; | |||
|  |             return json($data); | |||
|  | 
 | |||
|  |         }catch (Exception $e){ | |||
|  |             return JsonServer::error('海报生成错误:' . $e->getMessage()); | |||
|  |         } | |||
|  | 
 | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     //用户图片配置
 | |||
|  |     public function userShareConfig() | |||
|  |     { | |||
|  |         return [ | |||
|  |             //会员头像
 | |||
|  |             'head_pic' => [ | |||
|  |                 'w' => 80, 'h' => 80, 'x' => 30, 'y' => 680, | |||
|  |             ], | |||
|  |             //会员昵称
 | |||
|  |             'nickname' => [ | |||
|  |                 'color' => '#333333', 'font_face' => ROOT_PATH.'/font/SourceHanSansCN-Regular.otf', 'font_size' => 20, 'x' => 120, 'y' => 730, | |||
|  |             ], | |||
|  |             //标题
 | |||
|  |             'title' => [ | |||
|  |                 'color' => '#333333', 'font_face' => ROOT_PATH.'/font/SourceHanSansCN-Regular.otf', 'font_size' => 20, 'w' => 360, 'x' => 30, 'y' => 810, | |||
|  |             ], | |||
|  |             //提醒长按扫码
 | |||
|  |             'notice' => [ | |||
|  |                 'color' => '#333333', 'font_face' => ROOT_PATH.'/font/SourceHanSansCN-Regular.otf', 'font_size' => 20, 'x' => 30, 'y' => 880, | |||
|  |             ], | |||
|  |             //邀请码文本
 | |||
|  |             'code_text' => [ | |||
|  |                 'color' => '#FF2C3C', 'font_face' => ROOT_PATH.'/font/SourceHanSansCN-Regular.otf', 'font_size' => 20, 'x' => 355, 'y' => 930, | |||
|  |             ], | |||
|  |             //二维码
 | |||
|  |             'qr' => [ | |||
|  |                 'w' => 170,'h' => 170, 'x' => 370, 'y' => 730, | |||
|  |             ], | |||
|  |         ]; | |||
|  |     } | |||
|  | 
 | |||
|  |     //生成用户小程序二维码
 | |||
|  |     public function makeUserMnpQrcode($code,$content,$img_src) | |||
|  |     { | |||
|  |         try { | |||
|  |             $config = WeChatServer::getMnpConfig(); | |||
|  |             $app = Factory::miniProgram($config); | |||
|  |             $response = $app->app_code->get($content.'?invite_code='.$code, [ | |||
|  |                 'width' => 170, | |||
|  |             ]); | |||
|  | 
 | |||
|  |             if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) { | |||
|  |                 $response->saveAs('uploads/qr_code/user_share/', $img_src); | |||
|  |                 return true; | |||
|  |             } | |||
|  |             if(isset($response['errcode']) && 41030 === $response['errcode']){ | |||
|  |                 return '商城小程序码,先提交审核并通过'; | |||
|  |             } | |||
|  |             return $response['errmsg']; | |||
|  | 
 | |||
|  |         } catch (\EasyWeChat\Kernel\Exceptions\Exception $e){ | |||
|  |             return $e->getMessage(); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     //生成用户分享图
 | |||
|  |     public function makeUserPoster($user, $content, $url_type, $client) | |||
|  |     { | |||
|  |         try { | |||
|  |             $save_dir = 'uploads/qr_code/user_share/'; | |||
|  |             $shareBg = ConfigServer::get('invite', 'poster', 'images/share/share_user_bg.png'); | |||
|  |             $background_img = ROOT_PATH .'/'.$shareBg; | |||
|  |             !file_exists($save_dir) && mkdir($save_dir, 0777, true); | |||
|  | 
 | |||
|  |             $save_key = 'uid'.$user['id'].$url_type.$client; | |||
|  |             $qr_src = md5($save_key) . '.png'; | |||
|  |             $poster_url = ROOT_PATH.'/'.$save_dir . $qr_src; | |||
|  | 
 | |||
|  |             $poster_config = $this->userShareConfig(); | |||
|  |             //生成二维码
 | |||
|  |             if($url_type == 'path'){ | |||
|  |                 $result = $this->makeUserMnpQrcode($user['distribution_code'], $content, $qr_src); | |||
|  |                 if(true !== $result){ | |||
|  |                     return ['status' => 0, 'msg' => '微信配置错误:'.$result, 'data' => '']; | |||
|  |                 } | |||
|  | 
 | |||
|  |             }else{ | |||
|  |                 $qrCode = new QrCode(); | |||
|  |                 $qrCode->setText($content); | |||
|  |                 $qrCode->setSize(1000); | |||
|  |                 $qrCode->setWriterByName('png'); | |||
|  | 
 | |||
|  |                 $qrCode->writeFile($poster_url); | |||
|  |             } | |||
|  |             $user_avatar =  UrlServer::getFileUrl($user['avatar'],'share'); | |||
|  |             //判断头像是否存在
 | |||
|  |             if(!check_file_exists($user_avatar)){ | |||
|  |                 //如果不存在,使用默认头像
 | |||
|  |                 $user_avatar = ROOT_PATH.ConfigServer::get('website', 'user_image'); | |||
|  |             } | |||
|  | 
 | |||
|  |             $qr_code_logic = new QrCodeLogic(); | |||
|  | 
 | |||
|  |             //获取背景图
 | |||
|  |             $share_background_img = imagecreatefromstring(file_get_contents($background_img)); | |||
|  |             //合成头像
 | |||
|  |             $qr_code_logic->writeImg($share_background_img, $user_avatar, $poster_config['head_pic'],true); | |||
|  | 
 | |||
|  |             //合成昵称
 | |||
|  |             $nickname = filterEmoji($user['nickname']); | |||
|  |             $qr_code_logic->writeText($share_background_img, $nickname, $poster_config['nickname']); | |||
|  |             //长按识别
 | |||
|  |             $notice = '长按识别二维码 >>'; | |||
|  |             $qr_code_logic->writeText($share_background_img, $notice, $poster_config['notice']); | |||
|  |             //合成商品标题
 | |||
|  |             $title = auto_adapt($poster_config['title']['font_size'], 0, $poster_config['title']['font_face'], '邀请你一起来赚大钱', $poster_config['title']['w'],$poster_config['title']['y'],getimagesize($background_img)); | |||
|  |             $qr_code_logic->writeText($share_background_img, $title, $poster_config['title']); | |||
|  |             //邀请码
 | |||
|  |             $qr_code_logic->writeText($share_background_img, '邀请码 '.$user['distribution_code'], $poster_config['code_text']); | |||
|  |             //合成二维码
 | |||
|  |             $qr_code_logic->writeImg($share_background_img, $poster_url, $poster_config['qr'],false); | |||
|  | 
 | |||
|  |             imagepng($share_background_img, $poster_url); | |||
|  | 
 | |||
|  |             $file_name = $save_dir . $qr_src; | |||
|  |             $local_uir = ROOT_PATH.'/'.$file_name; | |||
|  |             self::upload($local_uir, $file_name); | |||
|  | 
 | |||
|  |             return ['status' => 1, 'msg' => '', 'data' => $file_name]; | |||
|  |         }catch (Exception $e){ | |||
|  |             return ['status' => 0, 'msg' => $e->getMessage(), 'data' => '']; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * Notes: 生成的图片根据不同的存储方式储存 | |||
|  |      * @param $local_uri 本地图片路径 | |||
|  |      * @param $img_uri 图片地址名称 | |||
|  |      * @author 段誉(2021/3/2 18:47) | |||
|  |      * @throws Exception | |||
|  |      */ | |||
|  |     public function upload($local_uri, $file_name) | |||
|  |     { | |||
|  |         $config = [ | |||
|  |             'default' => ConfigServer::get('storage', 'default', 'local'), | |||
|  |             'engine' => ConfigServer::get('storage_engine') | |||
|  |         ]; | |||
|  | 
 | |||
|  |         if (empty($config['engine']['local'])) { | |||
|  |             $config['engine']['local'] = []; | |||
|  |         } | |||
|  | 
 | |||
|  |         if ($config['default'] != 'local') { | |||
|  |             $StorageDriver = new StorageDriver($config); | |||
|  |             if (!$StorageDriver->fetch($local_uri, $file_name)) { | |||
|  |                 throw new Exception('图片保存出错:' . $StorageDriver->getError()); | |||
|  |             } | |||
|  |             //删除本地图片
 | |||
|  |             @unlink($file_name); | |||
|  |         } | |||
|  |     } | |||
|  |     //砍价图片配置
 | |||
|  |     public function bargainShareConfig(){ | |||
|  |         return [ | |||
|  |             //会员头像
 | |||
|  |             'head_pic' => [ | |||
|  |                 'w' => 64, 'h' => 64, 'x' => 40, 'y' => 20, | |||
|  |             ], | |||
|  |             //会员昵称
 | |||
|  |             'nickname' => [ | |||
|  |                 'color' => '#555555', 'font_face' => ROOT_PATH .'/font/SourceHanSansCN-Regular.otf', 'font_size' => 19, 'x' => 120, 'y' => 60, | |||
|  |             ], | |||
|  | 
 | |||
|  |             'bargain_title' => [ | |||
|  |                 'color' => '#FF2C3C', 'font_face' => ROOT_PATH .'/font/SourceHanSansCN-Bold.otf', 'font_size' => 24, 'w' => 360, 'x' => 40, 'y' => 735, | |||
|  |             ], | |||
|  |             'brief_title'   => [ | |||
|  |                 'color' => '#F95F2F', 'font_face' => ROOT_PATH .'/font/SourceHanSansCN-Regular.otf', 'font_size' => 16, 'w' => 360, 'x' => 40, 'y' => 765, | |||
|  |             ], | |||
|  |             //标题
 | |||
|  |             'title' => [ | |||
|  |                 'color' => '#333333', 'font_face' => ROOT_PATH .'/font/SourceHanSansCN-Regular.otf', 'font_size' => 20, 'w' => 360, 'x' => 40, 'y' => 795, | |||
|  |             ], | |||
|  |             //推广主图商品主图
 | |||
|  |             'main_pic' => [ | |||
|  |                 'w' => 560, 'h' => 560, 'x' => 40, 'y' => 100, | |||
|  |             ], | |||
|  |             //提醒长按扫码
 | |||
|  |             'notice' => [ | |||
|  |                 'color' => '#888888', 'font_face' =>  ROOT_PATH .'/font/SourceHanSansCN-Regular.otf', 'font_size' => 18, 'x' => 432, 'y' => 895, | |||
|  |             ], | |||
|  |             //二维码
 | |||
|  |             'qr' => [ | |||
|  |                 'w' => 165,'h' => 165, 'x' => 436, 'y' => 700, | |||
|  |             ], | |||
|  |         ]; | |||
|  |     } | |||
|  | 
 | |||
|  |     // 生成砍价海报
 | |||
|  |     public function makeBargainPoster($user,$bargain_launch,$url,$url_type){ | |||
|  | 
 | |||
|  |         try { | |||
|  |             $save_dir = ROOT_PATH .'/uploads/qr_code/bargain_share/'; | |||
|  |             $background_img = ROOT_PATH .'/images/share/share_goods_bg.png'; | |||
|  |             !file_exists($save_dir) && mkdir($save_dir,0777,true); | |||
|  | 
 | |||
|  |             $cache_key = 'bid' . $bargain_launch['id'].'uid'.$user['id'].$url_type; | |||
|  |             $qr_src = md5($cache_key) . '.png'; | |||
|  |             $poster_url = $save_dir . $qr_src; | |||
|  | 
 | |||
|  |             $base64 = Cache::get($cache_key); | |||
|  |             if (!empty($base64)) { | |||
|  |                 $data = [ | |||
|  |                     'code' => 1, | |||
|  |                     'msg' => '海报生成成功', | |||
|  |                     'show' => 0, | |||
|  |                     'data' => $base64 | |||
|  |                 ]; | |||
|  |                 return json($data); | |||
|  |             } | |||
|  | 
 | |||
|  | 
 | |||
|  |             $poster_config = self::bargainShareConfig(); | |||
|  |             //生成二维码
 | |||
|  |             if($url_type == 'path'){ | |||
|  |                 $scene = 'id='.$bargain_launch['id']; | |||
|  |                 $result = $this->makeMnpQrcode($scene,$url,$qr_src,$save_dir); | |||
|  |                 if(true !== $result){ | |||
|  |                     return JsonServer::error('微信配置错误:'.$result); | |||
|  |                 } | |||
|  |             }else{ | |||
|  |                 $qrCode = new QrCode(); | |||
|  |                 $qrCode->setText($url); | |||
|  |                 $qrCode->setSize(1000); | |||
|  |                 $qrCode->setWriterByName('png'); | |||
|  |                 $qrCode->writeFile($poster_url); | |||
|  | 
 | |||
|  |             } | |||
|  |             $user_avatar =  UrlServer::getFileUrl($user['avatar']); | |||
|  |             //判断头像是否存在
 | |||
|  |             if(!check_file_exists($user_avatar)){ | |||
|  |                 //如果不存在,使用默认头像
 | |||
|  |                 $user_avatar = ROOT_PATH.ConfigServer::get('website', 'user_image'); | |||
|  |             } | |||
|  |             //判断商品主图是否存在
 | |||
|  |             $goods_image = UrlServer::getFileUrl($bargain_launch['goods_snap']['goods_iamge'],'share'); | |||
|  |             if(!check_file_exists($goods_image)){ | |||
|  |                 //如果不存在,使用默认商品主图
 | |||
|  |                 $goods_image = ROOT_PATH.ConfigServer::get('website', 'goods_image'); | |||
|  |             } | |||
|  | 
 | |||
|  |             $qr_code_logic = new QrCodeLogic(); | |||
|  |             //获取背景图
 | |||
|  |             $share_background_img = imagecreatefromstring(file_get_contents($background_img)); | |||
|  | 
 | |||
|  |             //合成头像
 | |||
|  |             $qr_code_logic->writeImg($share_background_img, $user_avatar, $poster_config['head_pic'],true); | |||
|  | 
 | |||
|  |             //合并商品主图
 | |||
|  |             $qr_code_logic->writeImg($share_background_img, $goods_image, $poster_config['main_pic'],false); | |||
|  | 
 | |||
|  |             //合成昵称
 | |||
|  |             $nickname = filterEmoji($user['nickname']); | |||
|  |             $nickname = '来自'.$nickname.'的分享'; | |||
|  |             $qr_code_logic->writeText($share_background_img, $nickname, $poster_config['nickname']); | |||
|  | 
 | |||
|  |             //长按识别
 | |||
|  |             $notice = '长按识别二维码'; | |||
|  |             $qr_code_logic->writeText($share_background_img, $notice, $poster_config['notice']); | |||
|  | 
 | |||
|  |             //合成砍价标题
 | |||
|  |             $bargain_title = '我正在参与砍价 还差一步'; | |||
|  |             $qr_code_logic->writeText($share_background_img, $bargain_title, $poster_config['bargain_title']); | |||
|  | 
 | |||
|  |             //合成简介
 | |||
|  |             $brief_title = '帮忙砍一刀'; | |||
|  |             $qr_code_logic->writeText($share_background_img, $brief_title, $poster_config['brief_title']); | |||
|  | 
 | |||
|  |             //合成商品标题
 | |||
|  |             $goods_name = auto_adapt($poster_config['title']['font_size'], 0, $poster_config['title']['font_face'], $bargain_launch['goods_snap']['name'], $poster_config['title']['w'],$poster_config['title']['y'],getimagesize($background_img)); | |||
|  |             $qr_code_logic->writeText($share_background_img, $goods_name, $poster_config['title']); | |||
|  | 
 | |||
|  |             //合成二维码
 | |||
|  |             $qr_code_logic->writeImg($share_background_img, $poster_url, $poster_config['qr'],false); | |||
|  | 
 | |||
|  |             imagepng($share_background_img, $poster_url); | |||
|  |             if ($fp = fopen($poster_url, "rb", 0)) { | |||
|  |                 $gambar = fread($fp, filesize($poster_url)); | |||
|  |                 fclose($fp); | |||
|  |                 $base64 = chunk_split(base64_encode($gambar)); | |||
|  |                 $base64 = 'data:image/png;base64,' . $base64; | |||
|  |             } | |||
|  |             //删除文件
 | |||
|  |             if (strstr($poster_url, $save_dir)) { | |||
|  |                 unlink($poster_url); | |||
|  |             } | |||
|  | 
 | |||
|  |             $expire = $bargain_launch['launch_end_time'] - time(); | |||
|  | 
 | |||
|  |             Cache::set($cache_key, $base64, $expire); | |||
|  | 
 | |||
|  |             $data = [ | |||
|  |                 'code' => 1, | |||
|  |                 'msg' => '海报生成成功', | |||
|  |                 'show' => 0, | |||
|  |                 'data' => $base64 | |||
|  |             ]; | |||
|  |             return json($data); | |||
|  | 
 | |||
|  |         }catch (Exception $e){ | |||
|  |             return JsonServer::error('海报生成错误:' . $e->getMessage()); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     //小程序生成二维码(非永久码)
 | |||
|  |     public function makeMnpQrcode($scene,$url,$img_src,$save_dir){ | |||
|  |         try { | |||
|  |             $config = WeChatServer::getMnpConfig(); | |||
|  |             $app = Factory::miniProgram($config); | |||
|  | 
 | |||
|  |             $response = $app->app_code->getUnlimit($scene, [ | |||
|  |                 'page'  => $url, | |||
|  |             ]); | |||
|  |             if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) { | |||
|  |                 $response->saveAs($save_dir, $img_src); | |||
|  |                 return true; | |||
|  |             } | |||
|  |             if(isset($response['errcode']) && 41030 === $response['errcode']){ | |||
|  |                 return '商城小程序未上线或商城小程序页面发布'; | |||
|  |             } | |||
|  |             return $response['errmsg']; | |||
|  | 
 | |||
|  | 
 | |||
|  |         } catch (\EasyWeChat\Kernel\Exceptions\Exception $e){ | |||
|  | 
 | |||
|  |             return $e->getMessage(); | |||
|  | 
 | |||
|  |         } | |||
|  | 
 | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     //写入图片
 | |||
|  |     public function writeImg($poster, $img_uri, $config, $is_rounded = false){ | |||
|  |         $pic_img = imagecreatefromstring(file_get_contents($img_uri)); | |||
|  |         $is_rounded?$pic_img = rounded_corner($pic_img):'';//切成圆角返回头像资源
 | |||
|  |         $pic_w = imagesx($pic_img); | |||
|  |         $pic_h = imagesy($pic_img); | |||
|  | 
 | |||
|  |         //圆形头像大图合并到海报
 | |||
|  |         imagecopyresampled($poster, $pic_img, | |||
|  |             $config['x'], | |||
|  |             $config['y'], | |||
|  |             0, 0, | |||
|  |             $config['w'], | |||
|  |             $config['h'], | |||
|  |             $pic_w, | |||
|  |             $pic_h | |||
|  |         ); | |||
|  | 
 | |||
|  |         return $poster; | |||
|  |     } | |||
|  |     //写入文字
 | |||
|  |     public function writeText($poster, $text, $config){ | |||
|  | 
 | |||
|  |         $font_uri = $config['font_face']; | |||
|  |         $font_size = $config['font_size']; | |||
|  |         $color = substr($config['color'],1); | |||
|  |         //颜色转换
 | |||
|  |         $color= str_split($color, 2); | |||
|  |         $color = array_map('hexdec', $color); | |||
|  |         if (empty($color[3]) || $color[3] > 127) { | |||
|  |             $color[3] = 0; | |||
|  |         } | |||
|  |         //写入文字
 | |||
|  |         $font_col = imagecolorallocatealpha($poster, $color[0], $color[1], $color[2], $color[3]); | |||
|  |         imagettftext($poster, $font_size,0, $config['x'], $config['y'], $font_col, $font_uri, $text); | |||
|  |         return $poster; | |||
|  | 
 | |||
|  |     } | |||
|  | } |