fix(whatsapp): normalize device-qualified contact ids

This commit is contained in:
wmq
2026-08-03 01:11:46 +08:00
parent 7e739ad7b8
commit bffd2f4fe6
3 changed files with 11 additions and 3 deletions
+7 -3
View File
@@ -1,11 +1,15 @@
import crypto from 'node:crypto'
export function canonicalWhatsAppJid(jid, identity = {}) {
const raw = String(jid || '').trim().toLowerCase()
const normalizeDevice = (value) => String(value || '')
.trim()
.toLowerCase()
.replace(/:\d+(?=@s\.whatsapp\.net$)/, '')
const raw = normalizeDevice(jid)
if (!raw || raw.endsWith('@g.us') || raw.endsWith('@newsletter')) return raw
const canonical = String(identity?.canonicalJid || '').trim().toLowerCase()
const canonical = normalizeDevice(identity?.canonicalJid)
if (canonical.endsWith('@s.whatsapp.net')) return canonical
const phone = String(identity?.phone || '').replace(/\D/g, '')
const phone = String(identity?.phone || '').split(':')[0].replace(/\D/g, '')
return phone ? `${phone}@s.whatsapp.net` : raw
}
+2
View File
@@ -12,6 +12,8 @@ test('WhatsApp LID resolves to the same canonical phone identity', () => {
assert.equal(canonicalWhatsAppJid('987654321@lid', { phone: '+1 555 123 4567' }), phoneJid)
assert.equal(canonicalWhatsAppJid('987654321@lid', { canonicalJid: phoneJid }), phoneJid)
assert.equal(whatsappCustomerStableId(canonicalWhatsAppJid('987654321@lid', { phone: '+1 555 123 4567' })), whatsappCustomerStableId(phoneJid))
assert.equal(canonicalWhatsAppJid('15551234567:4@s.whatsapp.net'), phoneJid)
assert.equal(canonicalWhatsAppJid('987654321@lid', { canonicalJid: '15551234567:0@s.whatsapp.net' }), phoneJid)
})
test('WhatsApp customer id remains stable after gateway reauthorization', () => {