通过HTTPS测试Stripe Webhook持续失败:请求超时
解决HTTPS本地ASP.NET MVC5服务的Webhook转发超时问题
我之前也碰到过一模一样的问题!HTTPS本地服务搭配ngrok确实容易踩坑,给你几个亲测有效的解决办法:
1. 用正确的ngrok命令转发HTTPS端点
很多人会误用ngrok http 44368,但本地服务是HTTPS的话,必须让ngrok明确转发到HTTPS端口,命令应该是:
ngrok https 44368
生成的ngrok地址是类似https://xxxx-xxxx-xxxx.ngrok.io的HTTPS域名,直接把这个地址加上你的控制器路径(比如https://xxxx-xxxx-xxxx.ngrok.io/StripeWebhook)填到Stripe的Webhook配置里,不要改成HTTP——Stripe要求Webhook回调地址必须是HTTPS的,用HTTP会直接失败。
2. 确保本地HTTPS证书被信任
ngrok转发到本地HTTPS服务时,如果本地的开发SSL证书没被系统信任,会导致SSL握手失败,最终请求超时。你可以这么做:
- 先在浏览器访问
https://localhost:44368/StripeWebhook,如果浏览器提示“不安全”,说明证书没被信任 - 对于.NET Framework的ASP.NET MVC5,你可以通过IIS Express的配置界面信任证书:右键点击任务栏的IIS Express图标 → 选择你的网站 → 点击“SSL证书” → 安装证书到“受信任的根证书颁发机构”
- 或者用管理员权限运行命令行执行:
certutil -addstore -f "Root" "C:\Users\<你的用户名>\Documents\IISExpress\config\certificates\<你的网站证书>.cer"
3. 排查控制器的路由与请求拦截问题
有时候请求已经到了本地,但断点没触发,可能是路由或授权拦截了:
- 给控制器或方法明确添加路由特性,避免路由匹配错误:
public class StripeWebhookController : BaseController { [HttpPost] [AllowAnonymous] [Route("StripeWebhook")] // 明确路由规则 public ActionResult Index() { // 先加一行日志输出,确认是否进入方法 System.Diagnostics.Debug.WriteLine("Webhook请求已到达!"); // ... 原有逻辑 } }
- 检查全局过滤器:如果你的网站有全局授权过滤器(比如
[Authorize]),即使方法加了[AllowAnonymous]也可能被拦截,暂时注释掉全局过滤器测试 - 用Postman给
https://localhost:44368/StripeWebhook发一个POST请求,看是否能得到响应,确认本地服务本身是正常的
4. 尝试替代隧道工具localtunnel
如果ngrok还是有适配问题,可以试试localtunnel,它对HTTPS本地服务的支持更友好:
- 先安装Node.js,然后通过npm安装localtunnel:
npm install -g localtunnel
- 运行命令转发HTTPS端口:
lt --port 44368 --local-https
- 复制生成的HTTPS地址(比如
https://xxxx.loca.lt),加上控制器路径填到Stripe里即可
最后排查小技巧
打开ngrok的管理界面http://localhost:4040/inspect/http,查看请求的详情:
- 如果请求的响应状态码是404:说明路由没匹配上,检查控制器路径
- 如果是500:本地服务抛出异常,检查代码逻辑
- 如果一直显示“pending”:说明SSL握手失败或者防火墙拦截,回到第二步检查证书
内容的提问来源于stack exchange,提问作者AlexB
相关产品推荐
相关产品推荐

