文件
xionggeshop/addons/shopro_huifu/command/UploadSplitMedia.php
可乐加冰 ae5aac26ac ```
feat(shopro_huifu): 添加分账媒体文件上传命令并优化分账配置流程

- 新增 UploadSplitMedia 命令用于上传小程序运营媒介截图到汇付
- 在 SyncSplitReceivers 中添加异常处理和更清晰的日志输出
- 优化 HuifuMerchantSplitService 中的分账配置逻辑
- 当分账比例>20%时自动验证并上传运营媒介材料
- 添加相关配置项到数据库升级脚本
- 注册新命令到应用命令列表
```
2026-10-13 10:50:30 +08:00

121 行
4.9 KiB
PHP

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace addons\shopro_huifu\command;
use addons\shopro_huifu\library\Bridge;
use addons\shopro_huifu\library\HuifuConfig;
use addons\shopro_huifu\library\onboard\HuifuOnboardPicture;
use think\console\Command;
use think\console\Input;
use think\console\input\Option;
use think\console\Output;
use think\Db;
/**
* 上传小程序运营媒介截图到汇付,生成 split/config 所需的 online_media_info_list JSON
*/
class UploadSplitMedia extends Command
{
protected function configure()
{
$this->setName('shopro_huifu:upload-split-media')
->addOption('home-url', null, Option::VALUE_REQUIRED, '首页截图 HTTPS 地址')
->addOption('goods-url', null, Option::VALUE_REQUIRED, '商品/服务明细页截图')
->addOption('order-url', null, Option::VALUE_REQUIRED, '下单场景页截图')
->addOption('pay-url', null, Option::VALUE_REQUIRED, '支付页截图')
->addOption('media-name', null, Option::VALUE_OPTIONAL, '小程序名称,默认 雄戈小酒')
->addOption('media-type', null, Option::VALUE_OPTIONAL, '运营媒介类型,小程序默认 S3')
->addOption('file-type', null, Option::VALUE_OPTIONAL, '汇付图片上传 file_type,默认 F24')
->addOption('save-config', null, Option::VALUE_NONE, '写入 shopro_huifu_config.split_config_online_media_json')
->setDescription('Upload miniprogram media screenshots for split/config (apply_ratio>20%)');
}
protected function execute(Input $input, Output $output)
{
if (!Bridge::isEnabled()) {
$output->writeln('[FAIL] 汇付插件未启用');
return 1;
}
$urls = [
'media_front_page' => trim((string) $input->getOption('home-url')),
'media_service_page' => trim((string) $input->getOption('goods-url')),
'media_order_page' => trim((string) $input->getOption('order-url')),
'media_pay_page' => trim((string) $input->getOption('pay-url')),
];
$labels = [
'media_front_page' => 'home-url',
'media_service_page' => 'goods-url',
'media_order_page' => 'order-url',
'media_pay_page' => 'pay-url',
];
foreach ($urls as $key => $url) {
if ($url === '') {
$output->writeln('[FAIL] 缺少 --' . $labels[$key]);
return 1;
}
}
$fileType = trim((string) $input->getOption('file-type'));
if ($fileType === '') {
$fileType = 'F24';
}
$mediaName = trim((string) $input->getOption('media-name'));
if ($mediaName === '') {
$mediaName = '雄戈小酒';
}
$mediaType = trim((string) $input->getOption('media-type'));
if ($mediaType === '') {
$mediaType = 'S3';
}
$picture = new HuifuOnboardPicture();
$fileIds = [];
foreach ($urls as $field => $url) {
$output->writeln('上传 ' . $field . ' ...');
$fileIds[$field] = $picture->uploadByUrl($fileType, $url);
$output->writeln(' file_id: ' . $fileIds[$field]);
}
$item = [
'media_type' => $mediaType,
'media_name' => $mediaName,
'media_mer_common_flag' => 'Y',
'media_front_page' => $fileIds['media_front_page'],
'media_service_page' => $fileIds['media_service_page'],
'media_order_page' => $fileIds['media_order_page'],
'media_pay_page' => $fileIds['media_pay_page'],
];
$appId = trim((string) Bridge::getMiniProgramAppId());
if ($appId !== '') {
$item['app_id'] = $appId;
}
$json = json_encode([$item], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$output->writeln('');
$output->writeln('split_config_online_media_json(可复制到 fa_shopro_huifu_config):');
$output->writeln($json);
if ($input->getOption('save-config')) {
$row = Db::name('shopro_huifu_config')->where('name', 'split_config_online_media_json')->find();
if ($row) {
Db::name('shopro_huifu_config')->where('name', 'split_config_online_media_json')->update(['value' => $json]);
} else {
Db::name('shopro_huifu_config')->insert([
'name' => 'split_config_online_media_json',
'value' => $json,
'group' => 'split',
'description' => 'split/config online_media_info_list JSON',
]);
}
HuifuConfig::reload();
$output->writeln('[OK] 已写入 split_config_online_media_json');
}
$output->writeln('');
$output->writeln('下一步: php think shopro_huifu:sync-split-receivers');
return 0;
}
}