我正在尝试通过Facebook应用为我的页面安装一个webhook for leadgen事件。所以我有:
我认为应用和网络服务器连接良好。 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请求按预期工作。
答案 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获取数据。
希望这会有所帮助......