Facebook 向 webhook 发送空 POST
Facebook sends empty POST to a webhook
我正在尝试通过 Facebook 应用程序为我的页面安装 leadgen 事件的 webhook。所以我有:
- 潜在客户来源的 Facebook 页面
- Facebook 应用程序
- 我要保存潜在客户的网络服务器
我相信应用程序和网络服务器连接良好。 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"}}]}]}
我正在尝试通过 Facebook 应用程序为我的页面安装 leadgen 事件的 webhook。所以我有:
- 潜在客户来源的 Facebook 页面
- Facebook 应用程序
- 我要保存潜在客户的网络服务器
我相信应用程序和网络服务器连接良好。 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"}}]}]}