Facebook 向 webhook 发送空 POST

Facebook sends empty POST to a webhook

我正在尝试通过 Facebook 应用程序为我的页面安装 leadgen 事件的 webhook。所以我有:

  1. 潜在客户来源的 Facebook 页面
  2. Facebook 应用程序
  3. 我要保存潜在客户的网络服务器

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

我怀疑权限问题,但我可以直接使用 PHP SDK 从页面(通过 leadgen_id)检查线索,并且 POST 请求是从 Facebook 发送的URL,所以他们还不知道代币。

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

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

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

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

这段代码对我有用...

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 获取数据。

希望这会有所帮助...

如果您使用的是 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"}}]}]}