无法验证 Slack 对话框字段。 response_url 调用总是失败
Can't validate Slack dialog fields. response_url call always fails
我正在尝试构建一个由斜线命令触发的松弛对话框。对话框正确弹出,当用户提交数据时,slack 会触发我服务器上的一个端点。
从那一刻起有两种可能的结果:
- 一切都很好,我post向用户确认
- 用户提交的数据没有通过我应用程序的验证,我需要让用户知道。
让我们暂时关注#2:
我得到一个似乎有效的 response_url
(https:\/\/hooks.slack.com\/app\/MY-APP-ID\/433197747012\/kQANkbvc3lIViVyLSJKR695z
)
为了测试,我想用我的一个字段模拟验证错误,所以我在我的端点中这样做:
$errors = [
'errors' => [
[
'name' => 'vendor_email',
'error' => 'sorry, I do not like this dude'
]
]
];
// define the curl request
$ch = curl_init();
// $decoded->response_url does contain the correct slack URL...
curl_setopt($ch, CURLOPT_URL, $decoded->response_url);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Type: application/x-www-form-urlencoded'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// set the POST query parameters
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($errors));
// execute curl request
$response = curl_exec($ch);
error_log(" -- response_url response: " . json_encode($response). "\n", 3, './runtime.log');
// close
curl_close($ch);
我从点击 response_url
得到的响应是这样的:
{\"ok\":false,\"error\":\"invalid_request_data\"}
我做错了什么?
****** 编辑 ************
即使不走 CURL 路线,只是这样做:
return json_encode($errors)
提交后只会关闭对话框,不会触发任何验证错误。
respond_url
不是用于回复提交(例如验证错误),而是用于向频道中的用户发回消息。
用户完成对话后,您将收到来自 Slack 的请求。您需要直接响应该请求。如果一切正常,您可以使用空响应进行响应 - 或者使用错误列表进行验证。响应必须在 JSON 内并在 3 秒内发生。
要响应您需要做的就是在 JSON 中回显您的错误数组。还要确保将 header 正确设置为 JSON,如下所示:
header('Content-Type: application/json');
echo json_encode($errors);
如果您没有错误,只需回显任何内容即可自动发送 HTTP 200 OK。
另请参阅文档中的 here,了解如何正确回复提交。
我正在尝试构建一个由斜线命令触发的松弛对话框。对话框正确弹出,当用户提交数据时,slack 会触发我服务器上的一个端点。
从那一刻起有两种可能的结果:
- 一切都很好,我post向用户确认
- 用户提交的数据没有通过我应用程序的验证,我需要让用户知道。
让我们暂时关注#2:
我得到一个似乎有效的 response_url
(https:\/\/hooks.slack.com\/app\/MY-APP-ID\/433197747012\/kQANkbvc3lIViVyLSJKR695z
)
为了测试,我想用我的一个字段模拟验证错误,所以我在我的端点中这样做:
$errors = [
'errors' => [
[
'name' => 'vendor_email',
'error' => 'sorry, I do not like this dude'
]
]
];
// define the curl request
$ch = curl_init();
// $decoded->response_url does contain the correct slack URL...
curl_setopt($ch, CURLOPT_URL, $decoded->response_url);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Type: application/x-www-form-urlencoded'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// set the POST query parameters
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($errors));
// execute curl request
$response = curl_exec($ch);
error_log(" -- response_url response: " . json_encode($response). "\n", 3, './runtime.log');
// close
curl_close($ch);
我从点击 response_url
得到的响应是这样的:
{\"ok\":false,\"error\":\"invalid_request_data\"}
我做错了什么?
****** 编辑 ************
即使不走 CURL 路线,只是这样做:
return json_encode($errors)
提交后只会关闭对话框,不会触发任何验证错误。
respond_url
不是用于回复提交(例如验证错误),而是用于向频道中的用户发回消息。
用户完成对话后,您将收到来自 Slack 的请求。您需要直接响应该请求。如果一切正常,您可以使用空响应进行响应 - 或者使用错误列表进行验证。响应必须在 JSON 内并在 3 秒内发生。
要响应您需要做的就是在 JSON 中回显您的错误数组。还要确保将 header 正确设置为 JSON,如下所示:
header('Content-Type: application/json');
echo json_encode($errors);
如果您没有错误,只需回显任何内容即可自动发送 HTTP 200 OK。
另请参阅文档中的 here,了解如何正确回复提交。