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 请求
向 Firebase https onRequest 云函数发送 webhook 请求得到 403 响应