Node.js使用Twilio发送短信时如何携带自定义参数并在webhook获取
Twilio 短信携带自定义参数到回调的实现方案
Twilio 官方没有提供专门的自定义参数字段用于传输不展示在短信内容里的业务参数,你可以通过以下两种成熟方案实现需求:
方案1:给回调地址拼接查询参数(最简单)
你可以直接把自定义参数作为查询参数拼接在回调地址statusCallback后面,Twilio触发回调时会原封不动带回这些参数,你直接从回调请求的查询参数中取值即可。
修改后的发送代码示例:
// 你的自定义参数 const userId = 'xxxxxx'; // 拼接自定义参数到回调地址,注意用encodeURIComponent转义特殊字符 const statusCallbackUrl = `https://你的公网服务地址/sms-callback?userId=${encodeURIComponent(userId)}`; twilioClient.messages.create({ to: USER_PHONE, body: smsBody, messagingServiceSid: MSG_SERVICE_ID, statusCallback: statusCallbackUrl // 新增回调地址配置 }).then(resp => { console.log('SMS sent', resp) })
webhook回调触发时,直接从请求的query参数中就能拿到userId的值。
方案2:存储短信SID与自定义参数的映射(更稳妥,适合多参数场景)
每条通过Twilio发送的短信都会返回唯一的sid标识,你可以在短信发送成功后,直接把sid和对应的自定义参数关联存储在你自己的数据库中。
Twilio触发回调时会自动携带当前短信的MessageSid参数,你用这个参数查询你的数据库即可拿到对应的自定义参数。
代码示例:
twilioClient.messages.create({ to: USER_PHONE, body: smsBody, messagingServiceSid: MSG_SERVICE_ID, statusCallback: 'https://你的公网服务地址/sms-callback' }).then(async resp => { const smsSid = resp.sid; const userId = 'xxxxxx'; // 把smsSid和userId的映射关系存入你的数据库 await yourDb.query('INSERT INTO sms_map (sms_sid, user_id) VALUES (?, ?)', [smsSid, userId]); console.log('SMS sent', resp) })
回调处理逻辑里,从Twilio的请求参数中取出MessageSid,查询sms_map表就能拿到对应的userId。
注意事项
- 回调地址必须是公网可访问的HTTPS地址,本地测试可以用内网穿透工具暴露本地服务
- 如果需要传递多个自定义参数,直接在回调地址后拼接即可,例如
?userId=1&orderId=2&type=notify - 如果你已经在Twilio后台配置了全局的短信服务回调地址,无需额外在代码中传
statusCallback,直接用方案2即可
内容的提问来源于stack exchange,提问作者Kiran Uppunda
相关产品推荐
相关产品推荐

