Q:配置事件订阅请求地址时报错,无法保存如何处理?#
1.
设置的请求地址必须是 IPv4 协议的、公网可访问的请求地址(必须以 http://
或 https://
开头)。例如,使用内网穿透工具生成的请求地址,因工具不稳定或本地企业设置了 防火墙,会导致开发平台无法与你配置的请求地址进行连接。
2.
请求地址所在服务器可以成功接收由开放平台发送的、用于校验请求地址合法性的 HTTP POST 请求,且必须在 1 秒内,将接收到的 challenge 值以 JSON 格式原样返回给开放平台。如果应用配置了 Encrypt Key(如下图),则需要先解密,然后从解密后的内容中提取出 challenge 值,并必须在 1 秒内原样返回该值作为响应。你可以参考本文 将事件发送至开发者服务器 章节的操作步骤,依次检查配置是否有问题。 你可以使用以下 curl 命令行工具,测试所配置的请求地址是否可以成功返回 challenge 值。# 注意使用以下命令测试时,请确认应用没有配置 Encrypt Key。如果应用配置了 Encrypt Key,那么 HTTP 的请求包体会有加密。
curl -v --location '{YOUR_CALLBACK_URL}' \
--header 'Content-Type: application/json' \
--data '{
"challenge": "<test code>",
"type": "url_verification",
"token": "<your verification token>"
}'
{YOUR_CALLBACK_URL}
:替换成你所配置的请求地址,以 http://
或 https://
开头。
<test code>
:替换成测试用的 challenge code,例如 ajls384kdj1234
。
<your verification token>
:替换成 开发者后台 > 应用详情页 > 事件与回调 > 加密策略 页面中的 Verification Token 值。Q:配置事件订阅请求地址时,提示“请填写有效的 HTTP/HTTPS URL”如何处理?#
如下图所示,配置了事件订阅请求地址后,在保存时提示“请填写有效的 HTTP/HTTPS URL”。当你在本地配置用于接收事件订阅的服务器时,建议直接把来自开放平台的 HTTP POST 请求打印出来,以此来确认服务器是否接收到了请求,以及请求的具体内容包含哪些。
首先使用以下 curl 命令行工具,测试所配置的请求地址是否可以成功返回 challenge 值。# 注意使用以下命令测试时,请确认应用没有配置 Encrypt Key。如果应用配置了 Encrypt Key,那么 HTTP 的请求包体会有加密。
curl -v --location '{YOUR_CALLBACK_URL}' \
--header 'Content-Type: application/json' \
--data '{
"challenge": "<test code>",
"type": "url_verification",
"token": "<your verification token>"
}'
{YOUR_CALLBACK_URL}
:替换成你所配置的请求地址,以 http://
或 https://
开头。
<test code>
:替换成测试用的 challenge code,例如 ajls384kdj1234
。
<your verification token>
:替换成 开发者后台 > 应用详情页 > 事件与回调 > 加密策略 页面中的 Verification Token 值。如果本地测试命令能返回和请求体中相同的 challenge code,但是在开放平台事件配置时提示「请填写有效的 HTTP/HTTPS URL」,那么:检查开放平台的请求是否访问到了请求地址对应的回调服务器,如果没有访问到回调服务器的记录,那么请检查回调服务器是否因配置了防火墙策略,导致请求无法访问。
检查配置的请求地址是否是公网可访问的。例如,你可以使用其他外部网络设备重新执行步骤 1 中的 curl 命令,测试是否可以正常返回 challenge 值。
如果本地测试命令不能返回和请求体中相同 challenge code,请先参考配置订阅方式文档,编写正确的代码,然后重试。 如果应用配置了 Encrypt Key(如下图),那么开放平台会推送加密后的 POST 请求。在请求地址对应的回调服务器内,需要按照事件解密文档,进行解密后再返回消息体中的 challenge code。# 当应用配置了 Encrypt Key,此时开放平台发起的 challenge code 是被加密过的。
# 需要开发者按照事件解密文档进行解密。
{
"encrypt": "ds3da3sj32421lkkld4xxxx" // 加密字符串
}
Q:如何确认事件推送成功了?#
可以使用应用的日志检索功能查看事件推送的日志记录,返回状态 SUCCESS
表示推送成功。点击某一日志记录左侧箭头,可查看详细的日志字段信息。Q:订阅事件后,服务器收到两条开放平台推送的消息#
可能原因:服务器收到两条开放平台推送的消息,可能是事件重复推送机制导致的。飞书开放平台在推送事件时,如果未在 3 秒内收到 HTTP 200 状态码的响应,会认为推送失败并重新推送事件,从而导致服务器收到重复的事件推送。你可以查看事件日志中的 retry cnt 信息,如果 retry cnt 的值大于1,可以确定是事件重推引起。
解决方法:在接收到事件后,确保服务器及时返回 HTTP 200 状态码,并使用事件体中的 event_id 字段去重。