【问题标题】:Stripe webhooks fail with null entry for parameter 'id'Stripe webhook 失败,参数“id”为空条目
【发布时间】:2012-08-25 06:30:33
【问题描述】:

我正在尝试与 stripe.com 集成,但 webhook 给了我一个问题。

我创建了一个控制器和一个动作来接受和解析来自条纹的 webhook:

public class WebhooksController : AbstractController
{
    public JsonResult Stripe(int id)
    {
        // some parsing code
    }
}

这是通过

routes.MapRoute("webhooks", "Financial/Webhooks/{action}/{id}", new { "Webhooks", "Index", id = "" }, new string[] { "MyApp.Controllers.Financial" });

我可以从浏览器或使用此路线很好地访问

curl -i -H "Host: mydomain.com" -H "Content-Type: application/json" -X POST http://{resolvedIP}/Financial/Webhooks/Stripe/4

但是,当我尝试使用“测试 webhook”功能从条纹仪表板触发 webhook 时,我得到 500:

参数字典包含“Drg.M3.Client.Controllers”中方法“System.Web.Mvc.JsonResult Stripe(Int32)”的不可为空类型“System.Int32”的参数“id”的空条目。 Financial.WebhooksController'。可选参数必须是引用类型、可空类型或声明为可选参数。

据 Stripe 聊天室的一名工作人员称,发送 webhook 时会带有如下内容:

curl -i -H "Host: mydomain.com" -H "Content-Type: application/json" -X POST http://{resolvedIP}/Financial/Webhooks/Stripe/4 -d '{big ol' json object}'

为什么当一个没有数据的请求通过时,一个有数据的请求会在路由时失败?

【问题讨论】:

  • 接收端那个id的类型是什么?是否有可能它是某种 Guid,而您正试图传入一个空字符串?
  • 类型是int。在这个例子中是4 (http://{ip}/Financial/Webhooks/Stripe/4)。
  • 你有没有试过在你的 Stripe 方法中设置一个断点,看看它是否被命中?此外,默认路由中的 id = "" 与您的 ID 不符,因为您的 ID 是 INT
  • 动作没有被命中。 "" 的默认 id 应该与 id = (int?)null 没有什么不同。事实上,MVC 并不关心路由时 url 段是什么类型,只是在调用动作时。

标签: c# asp.net-mvc stripe-payments webhooks


【解决方案1】:

解决了。

事实证明,当 MVC 看到 application/json 的内容类型时,它会尝试将数据自动绑定到您的操作参数。

由于 Stripe 发送的 json 对象包含

{
  "id" : "evt_0000000000",
  ...
}

id 参数被设置为 evt_0000000000 而不是 4

【讨论】:

  • ASP.NET MVC 将 post 数据自动映射到控制器操作方法参数名称与 application/json 内容类型没有直接关系或限制; ASP.NET MVC url 映射引擎在大量场景中执行此映射/参数绑定。
猜你喜欢
  • 2021-11-28
  • 2017-10-08
  • 1970-01-01
  • 2023-03-08
  • 2014-09-14
  • 2017-05-12
  • 2018-11-02
  • 1970-01-01
  • 2012-07-26
相关资源
最近更新 更多