NodeJS后端如何在WhatsApp Flow中获取用户wa_id、手机号等信息?
解决WhatsApp Flow启动时无法获取用户身份信息的问题
核心思路
Flow启动请求本身不会主动携带用户身份元数据,必须通过初始消息上下文+按钮Payload传参的方式关联用户信息,具体步骤如下:
1. 存储初始"Hi"消息的用户身份信息
当用户发送"Hi"时,你的Webhook会收到WhatsApp推送的消息请求,里面包含wa_id(用户唯一ID)、from(用户手机号)、wamid(消息唯一ID)这些关键字段。此时把这些信息和一个会话标识绑定存储,生产环境推荐用Redis这类持久化键值缓存,测试阶段可用内存缓存。
NodeJS示例代码(Express + Redis):
const express = require('express'); const redis = require('redis'); const client = redis.createClient(); // 按需配置Redis连接参数 const app = express(); app.use(express.json()); // 处理WhatsApp Webhook消息接收 app.post('/webhook', async (req, res) => { const message = req.body.entry[0].changes[0].value.messages[0]; if (message.body.toLowerCase() === 'hi') { const waId = message.from; // 用户wa_id/手机号 const wamid = message.id; // 消息唯一ID,用作会话标识 // 存储用户信息,设置24小时过期时间 await client.setEx(`session:${wamid}`, 86400, JSON.stringify({ waId, phone: message.from })); // 发送带Flow启动按钮的消息模板,重点在按钮Payload const flowButtonPayload = { sessionId: wamid }; // 嵌入会话标识 // 调用WhatsApp API发送消息,将按钮的action.payload设为JSON.stringify(flowButtonPayload) } res.sendStatus(200); });
2. 在Flow启动按钮中嵌入会话标识
发送消息模板时,给启动Flow的按钮配置payload字段,把刚才存储的会话标识(比如wamid)传进去。用户点击按钮启动Flow时,WhatsApp会把这个payload原封不动地传给你的Flow后端。
3. 从Flow启动请求中恢复用户信息
用户点击按钮后,Flow后端会收到启动请求,从请求体的payload字段取出会话标识,再去缓存中获取对应的用户信息。
NodeJS示例代码:
// 处理Flow启动请求 app.post('/flow/start', async (req, res) => { const flowPayload = JSON.parse(req.body.payload); // 解析按钮传来的Payload const sessionKey = `session:${flowPayload.sessionId}`; const userInfo = await client.get(sessionKey); if (!userInfo) { return res.json({ error: '会话已过期,请重新发送Hi' }); } const { waId, phone } = JSON.parse(userInfo); // 现在可使用waId和phone进行后续数据交互 res.json({ type: 'form', fields: [{ type: 'phone', label: '手机号', value: phone, readOnly: true }] }); });
4. 可选:身份验证增强
若担心会话标识被篡改,存储用户信息时可同时存入签名(比如用waId + 自定义密钥生成HMAC),Flow启动时验证签名,确保用户身份未被伪造。
内容的提问来源于stack exchange,提问作者Narendra Chatterjee
相关产品推荐
相关产品推荐

