From 64a81393b55c4f9fd862eafcd1aeb58662d56ea8 Mon Sep 17 00:00:00 2001 From: HenryDu8133 <813367384@qq.com> Date: Sun, 27 Sep 2026 15:30:17 +0800 Subject: [PATCH] =?UTF-8?q?fix(notify):=20=E7=8E=AF=E5=A2=83=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E5=8F=AA=E7=BB=99=E6=A8=A1=E6=9D=BF=20id=20=E6=97=B6?= =?UTF-8?q?=E4=BF=9D=E7=95=99=E5=86=85=E7=BD=AE=E7=9A=84=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 站长在 Gitea 里设了 WECHAT_MINI_SUBSCRIBE_TEMPLATES。若值里只写 id 不写 fields, 原来会把该模板的字段映射整个替换掉 → buildTemplateData 退回默认映射 (thing1/time2/thing3)→ 发给微信直接 47003。 现在按键合并:给了 fields 就用,没给就沿用内置的(SONG_REJECTED: thing6←songTitle, thing4←reason)。坏 JSON / 裸字符串 / 空对象一律忽略,仍用内置模板。 已验证(8 项断言):内置默认、只给 id(保住映射)、id+fields(完全覆盖)、三种坏值。 --- server/services/wechatSubscribeService.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/server/services/wechatSubscribeService.ts b/server/services/wechatSubscribeService.ts index c5fa14f..cde6121 100644 --- a/server/services/wechatSubscribeService.ts +++ b/server/services/wechatSubscribeService.ts @@ -61,7 +61,19 @@ export function getSubscribeTemplates(): Record { if (parsed && typeof parsed === 'object') { Object.keys(parsed).forEach((k) => { const conf = parsed[k] - if (conf && conf.id) merged[k] = conf + if (!conf || !conf.id) return + const base = merged[k] + /* + * 环境变量**按键覆盖内置模板**,但只覆盖它给到的部分: + * · 给了 id 但没给 fields → 沿用内置的字段映射(否则会退化成 + * thing1/time2/thing3 的默认映射,发给微信直接 47003); + * · 给了 fields → 用它。 + * 这样"只想换个模板 ID"时不用把 fields 一起抄一遍。 + */ + merged[k] = { + id: conf.id, + fields: conf.fields && typeof conf.fields === 'object' ? conf.fields : base && base.fields + } }) } } catch (err) {