在.NET Core中基于Twilio SMS构建预约提醒:如何将用户回复短信关联至特定ID?
针对你遇到的「一个手机号对应多用户、单用户多预约,需要把用户回复关联到特定预约」的问题,我整理了几个不用发链接的实用方案,都是在Twilio生态内就能搞定的:
利用Twilio短信的关联SID(官方推荐)
当你通过Twilio发送预约提醒短信时,每条短信都会生成一个唯一的MessageSid。你可以把这个MessageSid和对应的预约ID、用户信息一起存入你的数据库。
当用户回复这条短信时,Twilio给你的Webhook回调请求里会包含ParentMessageSid字段——这个字段就是你之前发送的那条提醒短信的MessageSid。你只需要用这个ParentMessageSid去数据库里匹配,就能直接关联到对应的预约ID了。用.NET Core发送短信的示例代码大概是这样:
using Twilio; using Twilio.Rest.Api.V2010.Account; using Twilio.Types; var twilioClient = new TwilioClient("你的AccountSid", "你的AuthToken"); var appointmentId = "你的预约ID"; // 比如从数据库取的预约唯一标识 var message = await MessageResource.CreateAsync( to: new PhoneNumber("用户的手机号"), from: new PhoneNumber("你的Twilio号码"), body: "提醒:你明天10:00有个皮肤科预约,回复Y确认,N取消", statusCallback: new Uri("https://你的后端回调地址/api/appointment/reply") // 可选,用来跟踪发送状态 ); // 把message.Sid和appointmentId存入数据库,比如用EF Core await _dbContext.SmsLogs.AddAsync(new SmsLog { MessageSid = message.Sid, AppointmentId = appointmentId, PhoneNumber = "用户的手机号", SentTime = DateTime.UtcNow }); await _dbContext.SaveChangesAsync();当用户回复时,你的Webhook接口可以这样处理:
[HttpPost("api/appointment/reply")] public async Task<IActionResult> HandleSmsReply([FromForm] TwilioReplyModel reply) { // 从Twilio的回调里拿到ParentMessageSid var parentMessageSid = reply.ParentMessageSid; // 去数据库查对应的预约ID var smsLog = await _dbContext.SmsLogs.FirstOrDefaultAsync(l => l.MessageSid == parentMessageSid); if (smsLog != null) { var appointmentId = smsLog.AppointmentId; // 根据用户的回复内容(reply.Body)处理确认/取消逻辑 if (reply.Body.Equals("Y", StringComparison.OrdinalIgnoreCase)) { // 标记预约为已确认 } else if (reply.Body.Equals("N", StringComparison.OrdinalIgnoreCase)) { // 取消预约 } } return Ok(); } // 对应的TwilioReplyModel可以包含你需要的字段,比如ParentMessageSid、Body、From等 public class TwilioReplyModel { public string ParentMessageSid { get; set; } public string Body { get; set; } public string From { get; set; } // 其他需要的字段 }在短信内容中加入预约识别码
这个方法更直观,适合用户单日有多个预约的场景。你可以在提醒短信里加入短的、唯一的预约编号,比如:提醒1:明天10:00皮肤科预约,回复Y123确认,N123取消
提醒2:明天14:00牙科预约,回复Y456确认,N456取消用户回复时会带上这个编号,你在Webhook里解析回复内容(比如提取出123、456),直接匹配到对应的预约ID。这种方式的好处是用户能明确知道自己操作的是哪个预约,避免混淆。
用Twilio Studio保留上下文变量
如果你用Twilio Studio来构建预约提醒的流程,可以在发送短信的步骤中设置自定义变量(比如把预约ID存在Flow的变量里)。当用户回复时,Studio的流程会自动保留这个上下文变量,你可以在流程的「Make HTTP Request」步骤里把预约ID和用户回复一起发送到你的.NET Core后端,不用自己处理SID的匹配逻辑,非常省心。
这些方案都不需要给用户发送链接,完全通过Twilio的原生功能或者短信内容来实现关联,适配你提到的复杂场景。
内容的提问来源于stack exchange,提问作者dotnetbuddy

