Facebook的Webhook应用创建失败,错误原因是“无法验证提供的URL”。

4
无法在Facebook上创建Webhook应用程序,因为出现错误“无法验证提供的URL”。

enter image description here

  1. The url given for callback is working fine from browser with https port 443
  2. The Servlet code to recieve the post call from webhook as below

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
             System.out.println("**************Entering Callback Servlet**************************");
                Map<String, String[]> parametersMap = request.getParameterMap();
                if (parametersMap.size() > 0) {
                    if (request.getParameter("hub.mode").equals("streamInit")) {
                        System.out.println("Verify Token: " + request.getParameter("hub.verify_token"));
                        System.out.println("Challenge number:" + request.getParameter("hub.challenge"));
                        String responseToClient = request.getParameter("hub.challenge");
                        response.setStatus(HttpServletResponse.SC_OK);
                        response.getWriter().write(responseToClient);
                        response.getWriter().flush();
                        response.getWriter().close();           
                        response.getWriter().append("Fetch-Mode").append(request.getParameter("hub.mode"));
                        response.getWriter().append("App Verify Token:").append(request.getParameter("hub.verify_token"));
                        response.getWriter().append("App Challenge No").append(request.getParameter("hub.challenge"));
                        System.out.println("**************Callback Successful**************************");
                       }
    
                    //response.getWriter().append("Served at: ").append(request.getContextPath());
                    }else{
                        System.out.println("**************Not an Facebook POST**************************");
                    }
                   System.out.println("**************Exiting Callback Servlet**************************");
    
    
            }
    
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                doGet(request, response);
            }
    
需要帮助,我在这里缺少什么。

你并没有真正使用IP 0.0.0.0,对吧?你不能使用本地IP地址,它必须是公共可达的URL。(而且我不确定IP地址是否有效 - 在大多数情况下,Facebook希望具有主机名的URL。) - CBroe
不,我没有使用0.0.0.0。我有一个公共URL并且它是可达的,但正如Markus所说,我没有签名的SSL证书。现在我陷入了死局 :) - Karthick Radhakrishnan
1
是的,现在你需要提供一个HTTPS URL。一个便宜且简单的获取有效SSL证书的方法是https://letsencrypt.org/,但它要求你的服务器配合(允许你使用其客户端来处理域名验证)。如果这不是一个选项,https://www.startssl.com/也为个人提供免费证书。 - CBroe
2个回答

2
Facebook希望指向确切的文件(例如:callback.php),您可以通过mod rewrite进行解决。需要注意的是,https://证书必须有效并由公共机构(例如:comodo)签名。

好的。我没有签名的SSL证书。除了Webhook之外,有没有其他实时提供数据源的方法? - Karthick Radhakrishnan
1
@KarthickRadhakrishnan 不行,但你可以花大约8美元一年获得签名的SSL证书。我找到的最便宜的是在namecheap网站。 - Hupfauer

1
你可以使用 https://ngrok.com/ 将 https Webhooks 发送到本地主机开发服务器。
if (request.getParameter("hub.mode").equals("streamInit")) 翻译为 if (request.getParameter("hub.mode").equals("subscribe")) 我不需要将它指向一个确切的文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接