Facebook线索Webhook投递失败(webhook.delivery.rejected)排查求助
问题描述
处理线索(lead)时出现异常:已在应用中启用Webhook并订阅leadgen事件、配置回调URL,但创建线索后,Webhook状态显示“failed”,提示“webhook.delivery.rejected”,且服务器未收到任何请求。
此前手动为每个Webhook单独使用不同应用订阅时一切正常;现在希望通过Facebook API用单个应用完成程序化订阅,所用请求如下:
curl -X POST "https://graph.facebook.com/{page_id}/subscribed_apps?subscribed_fields=leadgen&access_token={page_token}" -H "Content-Type: application/json" -d '{ "override_callback_uri": "https://api-development.recrubo.app/facebook/webhooks/{organization_id}", "verify_token": "{verify_token}" }'
调试操作
- 使用Facebook分享调试工具测试回调URL,返回200状态
- 使用Lead Ads RTU调试工具发送测试线索,服务器仍未收到请求
代码实现
perform方法负责调用后续操作:先获取user_id确认用户授权的页面,再获取这些页面的page_access_tokens,最后遍历页面订阅Webhook。代码如下:
def perform @user_id = get_user_id @pages = get_page_access_tokens @pages.each do |page| @facebook.subscribe_to_webhook(page[:id], page[:token]) token = @facebook.get_long_lived_access_token(page[:token]) options = { ad_account_id: @ad_account_id } @access_token ||= @organization.access_tokens.create!(token: token, options: options, name: 'Meta', user_id: @user_id) end @access_token end def get_page_access_tokens(user_id, access_token) response = Faraday.get("#{ENV.fetch('FACEBOOK_GRAPH_API')}/#{user_id}/accounts") do |req| req.headers['Content-Type'] = 'application/json' req.params['access_token'] = access_token end raise "Unable to get page access token server responded with #{response.body} and status #{response.status}" unless response.success? data = JSON.parse(response.body) page_data = data['data'] page_data.map { |page| { id: page['id'], name: page['name'], token: page['access_token'] } } end def subscribe_to_webhook(page_id, page_token) response = Faraday.post("#{ENV.fetch('FACEBOOK_GRAPH_API')}/#{page_id}/subscribed_apps?subscribed_fields=leadgen") do |req| req.headers['Content-Type'] = 'application/json' req.params['access_token'] = page_token req.body = { override_callback_uri: "#{ENV.fetch('API_URL')}/facebook/webhooks/#{@organization['id']}", verify_token: {local_token} }.to_json end raise "Unable to subscribe to leadgen webhook server responded with #{response.body} and status #{response.status}" unless response.success? response end def get_user_id(access_token) response = Faraday.get("#{ENV.fetch('FACEBOOK_GRAPH_API')}/me") do |req| req.headers['Content-Type'] = 'application/json' req.params['fields'] = 'id' req.params['access_token'] = access_token end raise "Unable to get user id server responded with #{response.body} and status #{response.status}" unless response.success? JSON.parse(response.body)['id'] end
补充信息(Edit 1)
检查订阅配置后获取到以下数据:
- 请求
graph.facebook.com/v20.0{page_id}/subscribed_apps返回的结果:
- 请求
graph.facebook.com/v20.0{app_id}/subscriptions返回的结果:
疑问
开发者应用后台是否有更多错误日志可查看?
内容的提问来源于stack exchange,提问作者mark DE Jong
相关产品推荐
相关产品推荐

