获取 MailChimp API V3 Webhook 发送的数据

Get the data sent by MailChimp API V3 Webhook

我正在尝试使用 API 版本 3 为 Mailchimp 事件编写一个 webhook,由于它们缺少库、文档和基本示例,而且我也缺少经验.

我知道我们应该通过在 URL 中设置一个秘密来保护 webhook,这很好。顺便说一句,MailChimp 不允许在其门户中配置基本访问身份验证。

他们说 "While we do send HTTP POST for actual data, our webhook validator will only send HTTP GET requests. You'll need to allow both in order for your webhook to function properly." 好吧,我想我可以使用 Request.HttpMethod 到 return 成功状态代码(如果是 GET),如果是 POST 则可以处理一些数据.

但不确定如何从请求中挑选内容,理想情况下不想编写大量 类 和属性来涵盖所有事件类型,C# 是静态类型的,尽管我猜动态关键字也是一个选项。

我需要反序列化 JSON 吗?我之前只在库的帮助下为另一个 API 编写了一个 webhook,您可以使用来自请求的字符串、流或文本阅读器构造一个 API 事件。图书馆让一切变得非常简单。

作为参考,还有这个问题显示了如何使用 PHP 获取一些数据:How to pass email address to webhook from mailchimp

贴出的数据是这样的(据说V3似乎没有任何文档):

"type": "unsubscribe", 
"fired_at": "2009-03-26 21:40:57",  
"data[action]": "unsub",
"data[reason]": "manual", 
"data[id]": "8a25ff1d98", 
"data[list_id]": "a6b5da1054",
"data[email]": "api+unsub@mailchimp.com", 
"data[email_type]": "html", 
"data[merges][EMAIL]": "api+unsub@mailchimp.com", 
"data[merges][FNAME]": "MailChimp", 
"data[merges][LNAME]": "API", 
"data[merges][INTERESTS]": "Group1,Group2", 
"data[ip_opt]": "10.20.10.30",
"data[campaign_id]": "cb398d21d2",
"data[reason]": "hard"

我基本上只需要将这些数据放入变量中,这样我就可以将它与我的数据库同步。

到目前为止,这是我的(骨架)控制器:

[Route("mailchimp/newsletter-webhook/super-secret-key-goes-here")]
public HttpStatusCodeResult ChargeBeeWebhook()
{

    return new HttpStatusCodeResult(200);
}

假设您已经按照 here 所述设置了 MailChimp Webhooks,您可以使用 Request.Form 语法获取发布的数据。使用问题中发布的示例数据,您的控制器代码应如下所示:

[AllowAnonymous]
public void ChargeBeeWebhook()
{
    // type variable will be "unsubscribe"
    string type = Request.Form["type"];

    // action variable will be "unsub"
    string action = Request.Form["data[action]"];

    // reason variable will be "manual"
    string reason = Request.Form["data[reason]"];

    // ...
    // ...
    // ... do the same with the rest of the posted variables
    // ...

    // sync the posted data above with your database
    // ...
    // ...
}