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

Twilio C# 为响应附加Cookie/Header实现WhatsApp回复溯源问题

问题根因

你当前的方案逻辑存在本质错误:Cookie和自定义响应头的作用域是当前HTTP请求的发起方,FileDeliveryNotice接口的请求方是Twilio的服务器,你设置的Cookie/响应头只会被Twilio服务器接收,不会传递到WhatsApp用户的客户端,也不会和用户的后续回复绑定。Twilio调用你的InboundMessage接口时是新的独立HTTP请求,自然不会携带你之前返回的任何头或Cookie。

可行解决方案

通过本地存储用户手机号和发送消息SID的映射关系实现关联,搭配Twilio原生的回复引用参数即可覆盖所有场景,具体实现步骤如下:

步骤1:发送消息时存储映射关系

你调用MessageResource.Create发送消息后,会拿到返回的消息SID,将用户手机号、发送消息SID、关联业务参数存入你的数据库或缓存即可:

TwilioClient.Init(accountSid, authToken);
var message = MessageResource.Create(
    body: messageText,
    statusCallback: new Uri($"{configuration[SDR_Core.ClassLibrary.Globals.ConfigurationGlobals.Whatsapp_Callback_Url]}Communication/Whatsapp/FileDeliveryNotice"),
    to: new Twilio.Types.PhoneNumber($"whatsapp:+6{Input.NewSendFileDetailsViewModel.MobileNumber}"),
    messagingServiceSid: tcd.TwilioMessagingServiceSID
);
// 新增映射存储逻辑,可根据业务需求选择存数据库或Redis
var sendRecord = new UserWhatsappSendRecord
{
    UserPhone = Input.NewSendFileDetailsViewModel.MobileNumber,
    SendMessageSid = message.Sid,
    SendTime = DateTime.Now,
    // 补充你需要关联的其他业务字段
};
_dbContext.UserWhatsappSendRecords.Add(sendRecord);
await _dbContext.SaveChangesAsync();

步骤2:入站消息时关联原发送消息

Twilio的入站消息参数中自带OriginalRepliedMessageSid字段,当用户点击特定消息回复时,该字段会返回被回复的原消息SID;如果用户直接发新消息没有引用原消息,就用用户手机号查最近的发送记录即可:

[HttpPost("InboundMessage")]
[Consumes("application/x-www-form-urlencoded")]
public ActionResult InboundMessage([FromForm] WhatsappInboundMessage Input)
{
    string originalSendMessageSid = null;
    // 优先取用户引用回复的原消息SID
    if (!string.IsNullOrEmpty(Input.OriginalRepliedMessageSid))
    {
        originalSendMessageSid = Input.OriginalRepliedMessageSid;
    }
    else
    {
        // 提取用户手机号,去掉whatsapp前缀和国家码前缀,和你存储的格式对齐即可
        var userPhone = Input.From.Replace("whatsapp:+6", "");
        // 查该用户最近30天内的最新发送记录,有效期可根据业务调整
        originalSendMessageSid = _dbContext.UserWhatsappSendRecords
            .Where(r => r.UserPhone == userPhone && r.SendTime >= DateTime.Now.AddDays(-30))
            .OrderByDescending(r => r.SendTime)
            .Select(r => r.SendMessageSid)
            .FirstOrDefault();
    }
    // 将关联到的原消息SID和入站消息绑定保存
    Input.RelatedSendMessageSid = originalSendMessageSid;
    var res = whatsappIMData.Save(Input);
    return Ok(res);
}

补充优化建议

  • 如果你的业务支持同一个用户同时有多条待回复的消息,可以在发送的消息内容中加入唯一业务编号,引导用户回复时携带该编号,关联准确率更高。
  • 映射关系如果追求查询性能可以存在Redis中,设置30天过期时间足够覆盖WhatsApp官方的会话响应有效期。

内容的提问来源于stack exchange,提问作者JianYA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:15:03