new-admin-api/crmeb/services/QrcodeService.php

234 lines
8.0 KiB
PHP
Raw Permalink 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
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 Endroid\QrCode\Writer\PngWriter;
use think\exception\ValidateException;
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');
// 二维码生成 新版本2024-2-6
$qrCode = QrCode::create($url);
$writer = new PngWriter();
$result = $writer->write($qrCode);
// $result->getString();
$upload = UploadService::create($uploadType);
$res = $upload->to('/public/' . $outfile)->validate()->stream($result->getString(), $name);
if ($res === false) {
return $upload->getError();
}
$info = $upload->getUploadInfo();
$info['image_type'] = $uploadType;
return $info;
$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 = 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;
}
}
/**
* Common: 二维码生成
* Author: wu-hui
* Time: 2024/01/23 14:20
* @param $valueData
* @param $path
* @return mixed
*/
public function createQrCode($valueData,$path){
// 参数获取
try{
// 生成参数
$name = md5($path . $valueData) . '.jpg';
$qrcode = $this->getRoutineQrcodePath($name, $path, $valueData);
if (!$qrcode) throw new \Exception('二维码生成失败');
return $qrcode;
}catch(\Exception $e){
throw new ValidateException($e->getMessage());
}catch(\Throwable $e){
throw new ValidateException($e->getMessage());
}
}
}