Facebook将空POST发送给webhook

时间:2016-03-10 12:55:25

标签: facebook webhooks

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

  1. 来自
  2. 的潜在客户的Facebook页面
  3. Facebook App
  4. 我想保存潜在客户的网络服务器
  5. 我认为应用和网络服务器连接良好。 Webhook显示在应用程序页面等。但是当我尝试使用此工具https://developers.facebook.com/tools/lead-ads-testing创建测试主管时,我收到的POST请求中没有数据。

    我怀疑权限问题,但我可以直接使用PHP SDK从页面(通过leadgen_id)查看引导,并且只是通过URL从Facebook发送POST请求,因此他们还不知道令牌

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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果您使用的是django框架,则应使用request.body,因为发布数据将保持空白。

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"}}]}]}

答案 3 :(得分:0)

此代码适用于我......

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

希望这会有所帮助......