2

我正在尝试在 Asana 中设置一个 webhook,以向我发送特定项目的事件更新。我是新手,所以在阅读和回答时请记住这一点。我在这里的第一篇文章,所以请放轻松。这是我正在运行的代码。

asanawebhook.php 页面:

$headers = getallheaders();
$secret_token = $headers['X-Hook-Secret'];
header('X-Hook-Secret: ' . $secret_token);
header("HTTP/1.1 200 OK");

我创建 webhook 的 curl 请求:

$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 请求以获取完整的有效负载。提前致谢。

4

2 回答 2

1

感谢您伸出援手!我是 Asana 的开发者倡导者,我想我知道什么会给你带来麻烦。(不用担心,我们在 Asana 非常友好!)

当你创建一个 webhook 时,你要求 Asana 做的就是在你感兴趣的东西改变状态时调用你。也就是说,当您注册了 webhook 的项目发生更改时,我们的服务器会调用您的服务器,让您知道更改已经发生。

这意味着我们的服务器需要与您维护的公开可用的服务器取得联系。要检查是否是这种情况,当您创建 webhook 时,有一个“握手”过程:

  1. 您调用 Asana 的 API 来创建一个 webhook。这会暂时阻塞,而:
  2. Asana 的服务器向您回电,POST向您指定的位置发出请求,并将target标头设置为一个值,该值:
  3. 您以具有200 OK相同标头值的响应进行响应,最后
  4. 创建 webhook 的原始调用返回200 OK.

如果您没有设置此握手,则来自 webhook 创建的返回调用将失败并显示您看到的错误。您可以在我们的 webhook API 参考页面上查看有关此过程的更多技术细节。设置起来可能看起来需要做很多工作或反复来回,但这个过程的设计是为了让你知道当你创建一个 webhook 时你是否会得到未来的回调,而不是悲伤的、无声的失败 -我们实际上在您创建 webhook 时测试了您是否可以这样做。

作为替代方案,如果您不想创建和维护公开可用的服务器,您可能需要查看我们的事件API;这些很像 webhook,但不是您期望在事情发生变化时被 Asana 的服务器调用,您可以轮询自特定时间点以来的更改(由我们提供给您的同步令牌表示)。例如,您可以GET在特定时间点执行任务,也可以从端点GET为该任务提供同步令牌。/events之后,您可以定期在GET同一资源上创建请求/events端点并传递该同步令牌,我们将返回自您获得该令牌以来发生的变化(如果有的话)(并传回一个新的“这些更改发生后的最新”令牌供您在以后的调用中使用)。

我希望这能帮助你再次动起来!

于 2016-10-09T21:06:12.953 回答
1

在仔细研究和轮询 Asana 寻求帮助后,我确定这对我来说是一个与 SSL 相关的问题。该代码运行良好,允许握手并设置 webhook。我没有意识到的是,虽然我有一个 SSL 证书,但我没有设置它。确保为 webhook 目标要访问的域正确配置了 SSL。

于 2016-10-12T21:14:31.033 回答