Facebook 向 webhook 发送空 POST

Posted

技术标签:

【中文标题】Facebook 向 webhook 发送空 POST【英文标题】:Facebook sends empty POST to a webhook 【发布时间】:2016-03-10 12:55:25 【问题描述】:

我正在尝试通过 facebook 应用为我的页面安装一个用于 Leadgen 事件的 webhook。所以我有:

    潜在客户来源的 Facebook 页面 脸书应用 我要保存潜在客户的网络服务器

我相信应用程序和网络服务器连接良好。 Webhook 显示在应用页面等处。但是当我尝试使用此工具 https://developers.facebook.com/tools/lead-ads-testing 创建测试主管时,我收到了一个没有数据的 POST 请求。

我怀疑权限问题,但我可以直接使用 php SDK 从页面(通过leadgen_id)检查潜在客户,并且 POST 请求仅通过 URL 从 Facebook 发送,因此他们还不知道令牌。

UPD 对同一网址 (curl -d "param=value" https://..url..) 的普通 POST 请求按预期工作。

【问题讨论】:

【参考方案1】:

Facebook 以 Content-Type: application/json 发送 webhook 数据,而不是 …: application/x-www-form-urlencoded(作为带有 method=post 的普通形式。)

因此,PHP 不会填充 $_POST - 您需要读取原始输入流。这可以使用file_get_contents('php://input') 来完成——然后只需在该数据上应用json_decode,您就可以使用适当的数据结构。

【讨论】:

【参考方案2】:

Facebook 在请求正文中发送潜在客户数据。如果您使用的是框架,请检查您是否有权访问请求正文。 尝试使用 Runscope 之类的第三方中间服务查看完整的请求,非常有用

【讨论】:

好的,我明白你在说什么了。它作为序列化字符串发送,而不是作为一组参数发送。谢谢!【参考方案3】:

如果你使用 django 框架,你应该 request.body,因为 post 数据将保持为空。

def webhook_response(request):
   # it will print the contents from facebook webhook response
   print(request.body)

   # something like the following object will print up if you are using leadgen
   "object": "page", "entry": ["id": "0", "time": 111111111, "changes": ["field": "leadgen", "value": "ad_id": "444444444", "form_id": "444444444444", "leadgen_id": "444444444444", "created_time": 11111111, "page_id": "444444444444", "adgroup_id": "44444444444"]]

【讨论】:

【参考方案4】:

此代码对我有用...

if (!empty($_REQUEST['hub_mode']) && $_REQUEST['hub_mode'] == 'subscribe' && $_REQUEST['hub_verify_token'] == "<mytoken>") 
    echo $_REQUEST['hub_challenge'];
 else 
    $data = json_decode(file_get_contents("php://input"), true);
    file_put_contents('logFB.txt', print_r($data, true));
  

第一部分用于验证 webhook,第二部分用于从 facebook webhook 获取数据。

希望这会有所帮助...

【讨论】:

以上是关于Facebook 向 webhook 发送空 POST的主要内容,如果未能解决你的问题,请参考以下文章

Rocket.Chat 传入 Webhook:以特定响应回答(用于 facebook 集成)

Telegram 向 webhook 发送重复的 POST JSON 请求

Facebook webhook多次调用同一条消息?

向 Firebase https onRequest 云函数发送 webhook 请求得到 403 响应

SonarQube 不会向 Discord webhook 发送通知

如何向 Discord Webhooks C# 发送 POST 请求