Skip to content

常见问题

本文汇总了事件订阅相关的常见问题。

Q:配置事件订阅请求地址时报错,无法保存如何处理?

你可以按照以下步骤,依次排查配置是否有问题。

  1. 设置的请求地址必须是 IPv4 协议的、公网可访问的请求地址(必须以 http://https://开头)。

    例如,使用内网穿透工具生成的请求地址,因工具不稳定或本地企业设置了防火墙,会导致开发平台无法与你配置的请求地址进行连接。

  2. 请求地址所在服务器可以成功接收由开放平台发送的、用于校验请求地址合法性的 HTTP POST 请求,且必须在 1 秒内,将接收到的 challenge 值以 JSON 格式原样返回给开放平台。

    如果应用配置了 Encrypt Key(如下图),则需要先解密,然后从解密后的内容中提取出 challenge 值,并必须在 1 秒内原样返回该值作为响应。你可以参考本文 将事件发送至开发者服务器 章节的操作步骤,依次检查配置是否有问题。

    image.png

你可以使用以下 curl 命令行工具,测试所配置的请求地址是否可以成功返回 challenge 值。

bash
# 注意使用以下命令测试时,请确认应用没有配置 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”。

image.png

排查建议

Note 当你在本地配置用于接收事件订阅的服务器时,建议直接把来自开放平台的 HTTP POST 请求打印出来,以此来确认服务器是否接收到了请求,以及请求的具体内容包含哪些。

首先使用以下 curl 命令行工具,测试所配置的请求地址是否可以成功返回 challenge 值。

bash
# 注意使用以下命令测试时,请确认应用没有配置 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。

    image.png

    json
    # 当应用配置了 Encrypt Key,此时开放平台发起的 challenge code 是被加密过的。
    # 需要开发者按照事件解密文档进行解密。
    
    {
        "encrypt": "ds3da3sj32421lkkld4xxxx"  // 加密字符串
    }

Q:如何确认事件推送成功了?

可以使用应用的日志检索功能查看事件推送的日志记录,返回状态 SUCCESS 表示推送成功。

点击某一日志记录左侧箭头,可查看详细的日志字段信息。

image.png

Q:订阅事件后,服务器收到两条开放平台推送的消息

可能原因:服务器收到两条开放平台推送的消息,可能是事件重复推送机制导致的。飞书开放平台在推送事件时,如果未在 3 秒内收到 HTTP 200 状态码的响应,会认为推送失败并重新推送事件,从而导致服务器收到重复的事件推送。

Note 你可以查看事件日志中的 retry cnt 信息,如果 retry cnt 的值大于1,可以确定是事件重推引起。

解决方法:在接收到事件后,确保服务器及时返回 HTTP 200 状态码,并使用事件体中的 event_id 字段去重。

内容来源:飞书开放平台 · 自动爬取整理