fix(微信订阅): 用微信真实关键词修正歌曲排期模板(thing1/phrase2/time3/character_string4),并修掉字段认领顺序导致的校准失效

This commit is contained in:
2026-10-24 11:56:50 +08:00
parent dc2565da34
commit f5a43b37cc
7 changed files with 192 additions and 56 deletions
+21 -13
View File
@@ -84,17 +84,23 @@ test('空白与换行会被压成一行(微信不接受换行)', () => {
})
test('SONG_SELECTED 的内置字段映射:每个字段名后缀都要跟发出去的值类型匹配', () => {
// 字段映射的唯一来源是 server/utils/wechatSubscribeTemplates.ts(那里有更完整的测试)
/*
* 字段映射的唯一来源是 server/utils/wechatSubscribeTemplates.ts(那里有更完整的测试)。
* 这里的重点不是"是不是这几个编号",而是**每个键的后缀(类型)和值匹配**:
* thing1 / phrase2 / time3 / character_string4
* 真实模板内容(微信 /wxaapi/newtmpl/gettemplate 读出来):
* 歌曲名称:{{thing1.DATA}} 排期状态:{{phrase2.DATA}}
* 播放时间:{{time3.DATA}} 排期序号:{{character_string4.DATA}}
* ⚠️ 这张模板**没有日期字段**,日期含在 time3 的 'YYYY-MM-DD HH:mm' 里。
*/
const fields = {
thing2: 'songTitle',
date4: 'playDate',
time1: 'playTime',
character_string3: 'sequence',
phrase5: 'status'
thing1: 'songTitle',
phrase2: 'status',
time3: 'playTime',
character_string4: 'sequence'
}
const vars = {
songTitle: '晴天',
playDate: '2026-02-14',
playTime: '2026-02-14 12:30',
sequence: '1',
status: '已排期'
@@ -102,11 +108,10 @@ test('SONG_SELECTED 的内置字段映射:每个字段名后缀都要跟发出
const out = {}
for (const key of Object.keys(fields)) out[key] = clampField(key, vars[fields[key]])
assert.equal(out.thing2, '晴天')
assert.equal(out.date4, '2026-02-14')
assert.match(out.time1, /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/)
assert.equal(out.character_string3, '1')
assert.equal(out.phrase5, '已排期') // 3 个汉字本来就合规,不补全角空格
assert.equal(out.thing1, '晴天')
assert.match(out.time3, /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/)
assert.equal(out.character_string4, '1')
assert.equal(out.phrase2, '已排期') // 3 个汉字本来就合规,不补全角空格
// 不能有任何字段是空值:空值同样会被微信拒
for (const key of Object.keys(out)) assert.ok(out[key].length > 0, key + ' 不能为空')
})
@@ -160,9 +165,12 @@ test('内置模板与线上代码一致(直接读源码,防止映射被改
const selected = block('SONG_SELECTED')
assert.match(selected, /oLTAefO92xYYlGRYmcsm5AfUUlUI5IKFfXhIVNrItSk/)
for (const f of ['thing2', 'date4', 'time1', 'character_string3', 'phrase5']) {
// 这四个编号是微信侧真实分配的(见上方模板原文),改了就必须同步改这里
for (const f of ['thing1', 'phrase2', 'time3', 'character_string4']) {
assert.match(selected, new RegExp(f + ":\\s*'"), f + ' 的映射丢了')
}
// 这张模板没有日期字段,配置里不该出现 date 型键
assert.doesNotMatch(selected, /date\d+:/, 'SONG_SELECTED 的模板里没有日期关键词')
})
test('beijingNow 是合法的 time 型值,且与北京时间一致', () => {