.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
相关产品推荐
相关产品推荐

