commit
48c7f8cf32
@ -0,0 +1,118 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace app\common\service\qrcode; |
||||||
|
|
||||||
|
use app\common\model\User as UserModel; |
||||||
|
use cores\exception\BaseException; |
||||||
|
use Exception; |
||||||
|
use Grafika\Grafika; |
||||||
|
use think\db\exception\DataNotFoundException; |
||||||
|
use think\db\exception\DbException; |
||||||
|
use think\db\exception\ModelNotFoundException; |
||||||
|
use function base_url; |
||||||
|
|
||||||
|
class InviteUser extends BaseQRcode |
||||||
|
{ |
||||||
|
// 当前客户端 (默认H5) |
||||||
|
private string $channel; |
||||||
|
|
||||||
|
// 用户信息 |
||||||
|
private UserModel $userInfo; |
||||||
|
|
||||||
|
/** |
||||||
|
* 构造方法 |
||||||
|
* Goods constructor. |
||||||
|
* @param UserModel $userInfo |
||||||
|
* @param string $channel 二维码渠道(小程序码、h5码) |
||||||
|
*/ |
||||||
|
public function __construct(UserModel $userInfo, string $channel = 'H5') |
||||||
|
{ |
||||||
|
parent::__construct(); |
||||||
|
// 用户信息 |
||||||
|
$this->userInfo = $userInfo; |
||||||
|
// 当前客户端 |
||||||
|
$this->channel = $channel; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 拼接海报图 |
||||||
|
* @return string |
||||||
|
* @throws BaseException |
||||||
|
* @throws DataNotFoundException |
||||||
|
* @throws DbException |
||||||
|
* @throws ModelNotFoundException |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public function getImage(): string |
||||||
|
{ |
||||||
|
// 判断海报图文件存在则直接返回url |
||||||
|
if (file_exists($this->getPosterPath())) { |
||||||
|
return $this->getPosterUrl(); |
||||||
|
} |
||||||
|
// 商城ID |
||||||
|
$storeId = $this->userInfo['store_id']; |
||||||
|
// 商品海报背景图 |
||||||
|
$backdrop = __DIR__ . '/resource/invite_user.png'; |
||||||
|
// 小程序码参数 |
||||||
|
$scene = "refereeId:" . ($this->userInfo['user_id'] ?: ''); |
||||||
|
// 下载小程序码 |
||||||
|
$page = 'pages/login/index'; |
||||||
|
$qrcode = $this->getQrcode($storeId, $scene, null, $this->channel); |
||||||
|
// 拼接海报图 |
||||||
|
return $this->savePoster($backdrop, $qrcode); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 拼接海报图 |
||||||
|
* @param string $backdrop 背景图路径 |
||||||
|
* @param string $qrcode 二维码图路径 |
||||||
|
* @return string |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
private function savePoster(string $backdrop, string $qrcode): string |
||||||
|
{ |
||||||
|
// 实例化图像编辑器 |
||||||
|
$editor = Grafika::createEditor(['Gd']); |
||||||
|
// 打开海报背景图 |
||||||
|
$editor->open($backdropImage, $backdrop); |
||||||
|
// 打开小程序码 |
||||||
|
$editor->open($qrcodeImage, $qrcode); |
||||||
|
// 重设小程序码宽高 |
||||||
|
$editor->resizeExact($qrcodeImage, 140, 140); |
||||||
|
// 小程序码添加到背景图 |
||||||
|
$editor->blend($backdropImage, $qrcodeImage, 'normal', 1.0, 'top-left', 520, 700); |
||||||
|
// 保存图片 |
||||||
|
$editor->save($backdropImage, $this->getPosterPath()); |
||||||
|
return $this->getPosterUrl(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 海报图文件路径 |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
private function getPosterPath(): string |
||||||
|
{ |
||||||
|
// 保存路径 |
||||||
|
$tempPath = web_path() . "temp/{$this->userInfo['store_id']}/"; |
||||||
|
!is_dir($tempPath) && mkdir($tempPath, 0755, true); |
||||||
|
return $tempPath . $this->getPosterName(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 海报图文件名称 |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
private function getPosterName(): string |
||||||
|
{ |
||||||
|
return 'invite_' . md5("{$this->userInfo['user_id']}_$this->channel") . '.png'; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 海报图url |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
private function getPosterUrl(): string |
||||||
|
{ |
||||||
|
return base_url() . 'temp/' . $this->userInfo['store_id'] . '/' . $this->getPosterName() . '?t=' . time(); |
||||||
|
} |
||||||
|
} |
After Width: | Height: | Size: 362 KiB |
Loading…
Reference in new issue