zx/crmeb/services/QrcodeService.php

194 lines
7.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace crmeb\services;
use app\common\repositories\system\attachment\AttachmentRepository;
use app\common\repositories\system\merchant\MerchantRepository;
use app\common\repositories\wechat\RoutineQrcodeRepository;
use Endroid\QrCode\QrCode;
use think\facade\Config;
class QrcodeService
{
/**
* 获取二维码
* @param $url
* @param $name
* @return array|bool|string
*/
public function getQRCodePath($url, $name)
{
if (!strlen(trim($url)) || !strlen(trim($name))) return false;
try {
$uploadType = systemConfig('upload_type');
//TODO 没有选择默认使用本地上传
if (!$uploadType) $uploadType = 1;
$uploadType = (int)$uploadType;
$siteUrl = systemConfig('site_url');
if (!$siteUrl) return '请前往后台设置->系统设置->网站域名 填写您的域名格式为http://域名';
$info = [];
$outfile = Config::get('qrcode.cache_dir');
$code = new QrCode($url);
if ($uploadType === 1) {
if (!is_dir('./public/' . $outfile))
mkdir('./public/' . $outfile, 0777, true);
$code->writeFile('./public/' . $outfile . '/' . $name);
$info["code"] = 200;
$info["name"] = $name;
$info["dir"] = rtrim($siteUrl, '/') . '/' . $outfile . '/' . $name;
$info["time"] = time();
$info['size'] = 0;
$info['type'] = 'image/png';
$info["image_type"] = 1;
$info['thumb_path'] = $info["dir"];
return $info;
} else {
$upload = UploadService::create($uploadType);
$res = $upload->to('/public/' . $outfile)->validate()->stream($code->writeString(), $name);
if ($res === false) {
return $upload->getError();
}
$info = $upload->getUploadInfo();
$info['image_type'] = $uploadType;
return $info;
}
} catch (\Exception $e) {
return $e->getMessage();
}
}
/**
* 获取二维码完整路径,不存在则自动生成
* @param string $name 路径名
* @param string $link 需要生成二维码的跳转路径
* @param bool $force 是否返回false
* @return bool|mixed|string
*/
public function getWechatQrcodePath(string $name, string $link, bool $force = false, $key = '')
{
try {
$imageInfo = app()->make(AttachmentRepository::class)->getWhere(['attachment_name' => $name]);
if (!$imageInfo) {
$siteUrl = rtrim(systemConfig('site_url'), '/');
$codeUrl = tidy_url($link, null, $siteUrl);
if ($key && systemConfig('open_wechat_share')) {
$qrcode = WechatService::create(false)->qrcodeService();
$codeUrl = $qrcode->forever('_scan_url_' . $key)->url;
}
$imageInfo = $this->getQRCodePath($codeUrl, $name);
if (is_string($imageInfo) && $force)
return false;
if (is_array($imageInfo)) {
$imageInfo['dir'] = tidy_url($imageInfo['dir'], null, $siteUrl);
app()->make(AttachmentRepository::class)->create($imageInfo['image_type'], -1, 0, [
'attachment_category_id' => 0,
'attachment_name' => $imageInfo['name'],
'attachment_src' => $imageInfo['dir']
]);
$url = $imageInfo['dir'];
} else {
$url = '';
}
} else $url = $imageInfo['attachment_src'];
return $url;
} catch (\Throwable $e) {
if ($force)
return false;
else
return '';
}
}
/**
* 获取小程序分享二维码
* @param int $id
* @param int $uid
* @param int $type 1 = 拼团,2 = 秒杀
* @param array $parame
* @return bool|string
*/
public function hotQrcodePath(int $id, int $uid, int $type, array $parame = [])
{
$page = '';
$namePath = '';
$data = 'id=' . $id . '&spid=' . $uid;
switch ($type) {
case 1:
$page = 'pages/activity/goods_combination_details/index';
$namePath = 'combination_' . $id . '_' . $uid . '.jpg';
break;
case 2:
$page = 'pages/activity/goods_seckill_details/index';
$namePath = 'seckill_' . $id . '_' . $uid . '.jpg';
if (isset($parame['stop_time']) && $parame['stop_time']) {
$data .= '&time=' . $parame['stop_time'];
$namePath = $parame['stop_time'] . $namePath;
}
break;
}
if (!$page || !$namePath) {
return false;
}
return $this->getRoutineQrcodePath($namePath, $page, $data);
}
/**
* @param $namePath
* @param $page
* @param $data
* @return bool|int|mixed|string
* @author xaboy
* @day 2020/6/18
*/
public function getRoutineQrcodePath($namePath, $page, $data, $to = 'routine/product')
{
try {
$imageInfo = app()->make(AttachmentRepository::class)->getWhere(['attachment_name' => $namePath]);
if (!$imageInfo) {
$res = app()->make(RoutineQrcodeRepository::class)->getPageCode($page, $data, 280);
if (!$res) return false;
$uploadType = (int)systemConfig('upload_type') ?: 1;
$upload = UploadService::create($uploadType);
$res = $upload->to($to)->validate()->stream($res, $namePath);
if ($res === false) {
return false;
}
$imageInfo = $upload->getUploadInfo();
$imageInfo['image_type'] = $uploadType;
$imageInfo['dir'] = tidy_url($imageInfo['dir'], 0);
$remoteImage = remoteImage($imageInfo['dir']);
if (!$remoteImage['status']) return false;
app()->make(AttachmentRepository::class)->create($uploadType, -1, 0, [
'attachment_category_id' => 0,
'attachment_name' => $imageInfo['name'],
'attachment_src' => $imageInfo['dir']
]);
$url = $imageInfo['dir'];
} else $url = $imageInfo['attachment_src'];
return $url;
} catch (\Throwable $e) {
return false;
}
}
}