From 727d8586e960a8acf96599db4663c128c03e6fcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=AF=E4=B9=90=E5=8A=A0=E5=86=B0?= <11869599+addie66@user.noreply.gitee.com> Date: Thu, 8 Oct 2026 13:56:24 +0800 Subject: [PATCH] =?UTF-8?q?```=20feat(shopro=5Fwechat=5Ftrade):=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=92=E4=BB=B6=E6=96=87=E6=A1=A3=E5=B9=B6?= =?UTF-8?q?=E6=94=B9=E8=BF=9B=E5=AE=89=E8=A3=85=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 README.md 中添加详细的权限问题解决方案,包括目录不可写和代码部署覆盖两种常见场景 - 添加后台文件冲突提示的处理说明 - 将 info.ini 中 state 从 0 改为 1,默认启用插件 - 在 Installer.php 中添加异常处理,防止缓存刷新失败导致安装中断 - 增强文件写入错误检测,提供更清晰的权限问题提示 - 添加 Service::refresh 的异常捕获和警告日志 ``` --- addons/shopro_wechat_trade/README.md | 27 ++++++++++++++++++- addons/shopro_wechat_trade/info.ini | 2 +- .../shopro_wechat_trade/library/Installer.php | 20 ++++++++++++-- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/addons/shopro_wechat_trade/README.md b/addons/shopro_wechat_trade/README.md index 56ab78a..81fe0ea 100644 --- a/addons/shopro_wechat_trade/README.md +++ b/addons/shopro_wechat_trade/README.md @@ -13,13 +13,38 @@ ## 安装 ```bash -# 上传 addons/shopro_wechat_trade 后 +# 上传 addons/shopro_wechat_trade 后(推荐 SSH,不要只靠后台点启用) php think shopro_wechat_trade:install php think shopro_wechat_trade:verify ``` 后台:**系统管理 → 商城配置 → 微信交易合规** +### 启用报 Permission denied / 过一阵又变关闭 + +常见两类原因: + +1. **目录不可写**(截图里 `runtime/cache/... Permission denied`) + 后台「启用插件」会写 `info.ini`、`application/extra/addons.php`、`public/assets/js/addons.js` 并清缓存。PHP 运行用户(宝塔多为 `www`)必须可写: + - `runtime/`(含 `cache/`、`log/`) + - `addons/shopro_wechat_trade/info.ini` + - `application/extra/addons.php` + - `public/assets/js/addons.js` + + ```bash + cd /www/wwwroot/xgsc.gynhc.com + chown -R www:www runtime addons application/extra public/assets/js/addons.js + chmod -R u+rwX runtime + php think shopro_wechat_trade:install + ``` + +2. **代码部署覆盖 `info.ini`** + 仓库里若 `state = 0`,每次 git/rsync 全量同步会把线上已启用状态盖回关闭。本仓库默认 `state = 1`;若你方部署脚本会覆盖 `addons/*/info.ini`,请在服务器保留 `state = 1` 或部署后执行 `php think shopro_wechat_trade:install`。 + +### 后台提示「文件冲突」 + +启用时若提示与 `application/admin/.../shopro_wechat_trade/*` 冲突,属正常:插件要把后台菜单/页面复制到主工程。仓库已含这些文件时选 **继续操作** 即可;更稳的是只用 CLI `shopro_wechat_trade:install` 修复,不必反复在插件中心开关。 + ## 汇付配合 若使用汇付小程序支付,需同步部署最新 `shopro_huifu`(支付通知会落库微信 `transaction_id`)。 diff --git a/addons/shopro_wechat_trade/info.ini b/addons/shopro_wechat_trade/info.ini index 1e4ac5c..1607642 100644 --- a/addons/shopro_wechat_trade/info.ini +++ b/addons/shopro_wechat_trade/info.ini @@ -4,7 +4,7 @@ intro = 微信小程序购物订单与发货信息同步 author = Shopro website = https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/order_center/order_center.html version = 1.0.0 -state = 0 +state = 1 url = /addons/shopro_wechat_trade first_menu = shopro_wechat_trade/config license = regular diff --git a/addons/shopro_wechat_trade/library/Installer.php b/addons/shopro_wechat_trade/library/Installer.php index 2d8a106..3e73931 100644 --- a/addons/shopro_wechat_trade/library/Installer.php +++ b/addons/shopro_wechat_trade/library/Installer.php @@ -47,7 +47,11 @@ class Installer } } - Service::refresh(); + try { + Service::refresh(); + } catch (\Exception $e) { + self::log($output, ' [warn] 插件缓存刷新失败: ' . $e->getMessage()); + } self::log($output, '安装完成: /admin/shopro_wechat_trade/config'); } @@ -64,8 +68,20 @@ class Installer } else { $content = rtrim($content) . "\nstate = " . $state . "\n"; } - file_put_contents($file, $content, LOCK_EX); + if (file_put_contents($file, $content, LOCK_EX) === false) { + throw new \RuntimeException('无法写入 ' . $file . ',请检查 addons 目录权限(勿用 root 上传后未 chown www)'); + } \think\Config::set($name, null, 'addoninfo'); + \think\Config::set('addon-info-' . $name, null); + + if ($state === 1) { + try { + Service::refresh(); + } catch (\Exception $e) { + self::log($output, ' [warn] Service::refresh 失败: ' . $e->getMessage()); + self::log($output, ' [warn] 请修复 runtime/cache、application/extra/addons.php、public/assets/js/addons.js 写权限后重跑 install'); + } + } return true; }