You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:53:14