我正在尝试在 Asana 中设置一个 Webhook,以向我发送特定项目的事件更新。我是新手,所以在阅读和回答时请记住这一点。我在这里发表的第一篇文章,所以请放轻松。这是我正在运行的代码。
asanawebhook.php 页面:
$headers = getallheaders();
$secret_token = $headers['X-Hook-Secret'];
header('X-Hook-Secret: ' . $secret_token);
header("HTTP/1.1 200 OK");
我的curl请求创建webhook:
$apikey = "mykey"; // Your API key
$taskid = "resourceid";
exec( 'curl \
-H "Authorization: Bearer '.$apikey.'" \
-H "Content-Type: application/x-www-form-urlencoded" \
-X POST https://app.asana.com/api/1.0/webhooks \
-d "resource='.$taskid.'" \
-d "target=https://mywebsite.com/folders/asanawebhook.php"', $return);
print_r($return);
这让我在我的页面上打印了这个错误。
Array ( [0] => {"errors":[{"message":"Could not complete activation handshake with target URL. Please ensure that the receiving server is accepting connections and supports SSL","help":"For more information on API status codes and how to handle them, read the docs on errors: https://asana.com/developers/documentation/getting-started/errors"}]} )
如果我可以让它返回某种成功消息,我假设我可以解析数据,然后向 Asana 发出一个curl 请求以获取完整的有效负载。提前致谢。
最佳答案
感谢您的联系!我是 Asana 的开发者倡导者,我想我知道什么可能会给您带来麻烦。 (不用担心,我们 Asana 非常友好!)
当您创建 Webhook 时,您要求 Asana 做的就是在您感兴趣的内容更改状态时调用您。也就是说,当您注册了 webhook 的项目发生更改时,我们的服务器将调用您的服务器,让您知道更改已经发生。
这意味着我们的服务器需要与您维护的公共(public)服务器取得联系。要检查情况是否如此,当您创建 webhook 时,有一个“握手”过程:
- 您调用 Asana 的 API 来创建 Webhook。这会暂时阻塞,同时:
- Asana 的服务器会向您在
target
中指定的位置发送POST
请求,并将 header 设置为一个值,其中: - 您使用相同的 header 值响应
200 OK
响应,最后 - 创建 Webhook 的原始调用返回
200 OK
。
如果您没有设置此握手,则 Webhook 创建的返回调用将会失败,并出现您所看到的错误。您可以在our API reference page for webhooks上查看有关此过程的更多技术细节。 。设置起来可能看起来需要做很多工作或来来回回,但此过程的设计目的是让您在创建 Webhook 时知道是否会收到 future 的回调,而不是悲伤、无声的失败 - 我们实际上在创建 Webhook 时测试了您是否可以。
作为替代方案,如果您不想创建和维护公开可用的服务器,您可能需要查看我们的 events应用程序接口(interface);这些很像 webhook,但您不希望在事情发生变化时被 Asana 的服务器调用,而是可以轮询自特定时间点(由我们提供给您的同步 token 表示)以来的变化。例如,您可以在特定时间点GET
任务,还可以从/events
端点GET
该任务的同步 token 。此后,您可以定期在 /events
端点对同一资源创建 GET
请求并传递该同步 token ,我们将返回已更改的内容(如果有)因为您获得了该 token (并传回一个新的“发生这些更改后的最新” token 以供您在将来的调用中使用)。
我希望这可以帮助您再次前进!
关于php - 为 Asana php 创建 webhook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39935122/