基于Twilio在Node.js Web应用中实现简易确认问询方案咨询
简化实现Twilio Yes/No短信问询的方案
你的场景完全不需要用到Twilio Conversations,用基础短信收发+临时状态管理就能轻量实现,以下是具体方案:
核心思路
通过Twilio发送带专属标识的问询短信,用缓存/数据库临时存储问询关联数据(操作信息、Webhook地址等),再通过Twilio的短信接收Webhook捕获回复,匹配对应状态后执行逻辑。
步骤实现
1. 发送问询短信
用Twilio Node.js SDK发送包含专属数据(如操作ID、详情)的短信,同时将问询信息与接收者号码绑定,存入缓存(推荐Redis,自带过期时间)避免数据冗余。
示例代码:
const twilio = require('twilio'); const redis = require('redis'); const redisClient = redis.createClient(); // 触发问询的核心函数 async function sendApprovalInquiry(recipientNumbers, operationDetails, targetWebhook) { const twilioClient = twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN); const inquiryId = `op_${Date.now()}`; // 生成唯一操作ID for (const number of recipientNumbers) { // 发送问询短信 await twilioClient.messages.create({ body: `请确认执行以下操作:\n${operationDetails}\n操作ID: ${inquiryId}\n回复Yes执行,No取消`, from: process.env.TWILIO_PHONE_NUMBER, to: number }); // 存储问询状态到Redis,1小时后自动过期 await redisClient.setEx( `twilio_inquiry:${number}`, 3600, JSON.stringify({ inquiryId, operationDetails, targetWebhook, createdAt: Date.now() }) ); } }
2. 配置Twilio接收Webhook
在Twilio控制台找到你的短信号码,设置**"A Message Comes In"**的Webhook地址为你的Node.js服务接口(如POST /twilio-sms-webhook),请求格式选application/x-www-form-urlencoded。
3. 处理回复并执行逻辑
在你的Node.js接口中解析Twilio的请求参数,匹配对应问询状态,根据回复内容执行Webhook调用或取消操作。
示例代码:
const express = require('express'); const router = express.Router(); const redis = require('redis'); const axios = require('axios'); const twilio = require('twilio'); const redisClient = redis.createClient(); const twilioClient = twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN); router.post('/twilio-sms-webhook', async (req, res) => { const { From: senderNumber, Body: replyContent } = req.body; const normalizedReply = replyContent.trim().toLowerCase(); // 从Redis取出对应问询状态 const inquiryDataStr = await redisClient.get(`twilio_inquiry:${senderNumber}`); if (!inquiryDataStr) { await twilioClient.messages.create({ body: '无法识别该回复,请确认是否在1小时内回复有效问询。', from: process.env.TWILIO_PHONE_NUMBER, to: senderNumber }); return res.sendStatus(200); } const inquiryData = JSON.parse(inquiryDataStr); switch(normalizedReply) { case 'yes': // 调用目标Webhook try { await axios.post(inquiryData.targetWebhook, { inquiryId: inquiryData.inquiryId, operationDetails: inquiryData.operationDetails, approver: senderNumber }); await twilioClient.messages.create({ body: `操作已执行,操作ID: ${inquiryData.inquiryId}`, from: process.env.TWILIO_PHONE_NUMBER, to: senderNumber }); } catch (err) { await twilioClient.messages.create({ body: `操作执行失败,请排查。操作ID: ${inquiryData.inquiryId}`, from: process.env.TWILIO_PHONE_NUMBER, to: senderNumber }); } break; case 'no': await twilioClient.messages.create({ body: `操作已取消,操作ID: ${inquiryData.inquiryId}`, from: process.env.TWILIO_PHONE_NUMBER, to: senderNumber }); break; default: await twilioClient.messages.create({ body: '请回复Yes或No来确认操作。', from: process.env.TWILIO_PHONE_NUMBER, to: senderNumber }); return res.sendStatus(200); } // 处理完成后删除缓存状态,避免重复触发 await redisClient.del(`twilio_inquiry:${senderNumber}`); res.sendStatus(200); }); module.exports = router;
为什么不用Conversations?
Twilio Conversations面向的是多参与者、持久化对话、消息历史管理等复杂场景,你的需求是临时的一对一审批问询,用基础短信+轻量缓存就能满足,既简化了实现逻辑,也能降低不必要的资源消耗和成本。
内容的提问来源于stack exchange,提问作者dmikester1
相关产品推荐
相关产品推荐

