【问题标题】:Get the data sent by MailChimp API V3 Webhook获取 MailChimp API V3 Webhook 发送的数据
【发布时间】:2016-09-04 21:52:19
【问题描述】:

我正在尝试使用 API 版本 3 为 Mailchimp 事件编写一个 webhook,但由于缺乏库、文档和基本示例,而且我缺乏经验,我有点挣扎。

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

他们说“虽然我们确实为实际数据发送 HTTP POST,但我们的 webhook 验证器只会发送 HTTP GET 请求。您需要同时允许这两个请求才能使您的 webhook 正常运行。”好的,我想我可以使用 Request.HttpMethod 如果它是 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);
}

【问题讨论】:

  • 这篇文章可能对stackoverflow.com/questions/15020807/…有帮助
  • MailChimp 使用 form encoding 发送 webhook 数据,而不是 JSON。您需要像处理来自 Web 表单的 POST 一样处理这些 POST。
  • 最近我从我的日志文件中发现 Mailchimp 没有使用 webhook 发回任何内容。我猜它是在弃用 V2 之后发生的。

标签: c# asp.net-mvc mailchimp webhooks mailchimp-api-v3.0


【解决方案1】:

假设您已经按照here 的描述设置了 MailChimp Webhook,您可以使用 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
    // ...
    // ...
}

【讨论】:

  • 感谢 ekad。只是好奇,这是个老问题,怎么今天终于有动作了?
  • 不客气。在我回答之前,我在 c# 和 mailchimp 标记中看到了这个问题。看起来有人在我之前回答了这个问题,然后答案被删除了。
猜你喜欢
  • 1970-01-01
  • 2016-10-08
  • 2020-07-19
  • 2016-08-01
  • 2018-08-15
  • 2021-04-07
  • 2017-05-20
  • 2015-11-08
  • 2017-05-08
相关资源
最近更新 更多