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

.NET Core 3.1实现Twitter事件Webhook未收到POST CRC挑战求助

.NET Core 3.1 Twitter Webhook 实现问题修复指南

现有代码的核心错误

  • 方法签名非法:同步方法内使用await关键字,代码无法正常编译,接口无法生效
  • 变量作用域错误:_json是using块内的局部变量,方法返回时无法访问该变量
  • 冗余无效逻辑:无参数的Task.WaitAll()调用没有实际作用,属于无效代码
  • 请求方法配置错误:Twitter Webhook注册阶段的CRC挑战是GET请求,并非POST请求,你只配置了[HttpPost]方法,天然接收不到CRC请求
  • 路由匹配风险:路由配置带尾斜杠/Twitter/,如果Twitter请求的是无尾斜杠路径/Twitter会直接返回404
  • 逻辑缺失:没有实现Twitter要求的CRC签名响应逻辑,就算请求到达也无法通过Webhook有效性校验

请求未到达接口的排查方向

  • 确认服务具备公网可访问的HTTPS端点:Twitter不支持HTTP协议、内网地址、localhost地址、自签名证书的端点,必须配置合法CA签发的HTTPS证书
  • 检查防火墙、安全组配置,确认没有拦截Twitter出口IP的请求
  • 检查ASP.NET Core中间件管道,确认没有全局鉴权、请求拦截规则覆盖了[AllowAnonymous]配置
  • 本地先用Postman等工具向/Twitter、/Twitter/两个路径分别发GET、POST请求,确认接口本身可正常响应,再去Twitter开发者后台配置Webhook地址

可直接使用的正确实现代码

using System.Security.Cryptography;
using System.Text;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("/Twitter")] // 去掉尾斜杠,避免路径匹配问题
[AllowAnonymous]
public class TwitterWebhookController : ControllerBase
{
    // 替换为你在Twitter开发者后台获取的应用Consumer Secret
    private const string TwitterConsumerSecret = "替换为你的Consumer Secret";

    /// <summary>
    /// 处理Twitter CRC校验请求(Webhook注册时自动触发)
    /// </summary>
    [HttpGet]
    public IActionResult HandleCrcChallenge([FromQuery(Name = "crc_token")] string crcToken)
    {
        if (string.IsNullOrWhiteSpace(crcToken))
        {
            return BadRequest("缺少crc_token参数");
        }

        // 按Twitter要求生成HMAC-SHA256签名
        using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(TwitterConsumerSecret));
        var hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(crcToken));
        var sign = Convert.ToBase64String(hashBytes);

        // 返回符合Twitter规范的响应
        return Ok(new { response_token = $"sha256={sign}" });
    }

    /// <summary>
    /// 处理Twitter推送的实际事件
    /// </summary>
    [HttpPost]
    public async Task<IActionResult> HandleEventPush()
    {
        using var reader = new StreamReader(Request.Body);
        var eventContent = await reader.ReadToEndAsync().ConfigureAwait(false);
        
        if (!string.IsNullOrWhiteSpace(eventContent))
        {
            Helper.SaveLog($"收到Twitter事件: {eventContent}", Helper.Log_Mode.Info);
            // 此处添加自定义事件处理逻辑:解析推文、关注、点赞等事件
        }

        // 必须在3秒内返回200状态码,否则Twitter会重复重试推送
        return Ok();
    }
}

额外注意事项

  • Webhook校验通过后,POST接口建议增加签名校验逻辑:从请求头取X-Twitter-Webhooks-Signature值,和本地用Consumer Secret计算的请求体签名做比对,拦截伪造请求
  • 事件处理逻辑不要包含长耗时操作,避免触发Twitter的重试机制,长耗时逻辑建议丢到后台队列异步处理
  • 如果部署在反向代理(Nginx、IIS)后,需要确认反向代理正确转发了GET、POST请求,没有丢弃请求体或修改请求头

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.09 16:15:44