# 常见问题

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

## Q：配置事件订阅请求地址时报错，无法保存如何处理？

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

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

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

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

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

![image.png](//sf3-cn.feishucdn.com/obj/open-platform-opendoc/d9f071e1e59747482afafe2c2db3d5f5_FPozCJtDUD.png?height=708&lazyload=true&maxWidth=600&width=2280)

你可以使用以下 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>`：替换成 [开发者后台](https://open.feishu.cn/app) > **应用详情页** > **事件与回调** > **加密策略** 页面中的 **Verification Token** 值。

成功返回结果如下图所示。

![](//sf3-cn.feishucdn.com/obj/open-platform-opendoc/b2ba36fd3588c069867a8ac5b62144f9_jaLkd92ft2.png?height=732&lazyload=true&maxWidth=600&width=2780)

## Q：配置事件订阅请求地址时，提示“请填写有效的 HTTP/HTTPS URL”如何处理？

**问题现象**

如下图所示，配置了事件订阅请求地址后，在保存时提示“请填写有效的 HTTP/HTTPS URL”。

![image.png](//sf3-cn.feishucdn.com/obj/open-platform-opendoc/f624df97e52c455dbf904bb04a0c1743_8hbVzUILKS.png?height=854&lazyload=true&maxWidth=600&width=1632)

**排查建议**
当你在本地配置用于接收事件订阅的服务器时，建议直接把来自开放平台的 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>`：替换成 [开发者后台](https://open.feishu.cn/app) > **应用详情页** > **事件与回调** > **加密策略** 页面中的 **Verification Token** 值。

成功返回结果如下图所示。

![](//sf3-cn.feishucdn.com/obj/open-platform-opendoc/b2ba36fd3588c069867a8ac5b62144f9_jaLkd92ft2.png?height=732&lazyload=true&maxWidth=600&width=2780)

然后根据不同场景进行排查：

- 如果本地测试命令能返回和请求体中相同的 challenge code，但是在开放平台事件配置时提示「请填写有效的 HTTP/HTTPS URL」，那么：
 	- 检查开放平台的请求是否访问到了请求地址对应的回调服务器，如果没有访问到回调服务器的记录，那么请检查回调服务器是否因配置了防火墙策略，导致请求无法访问。
 	- 检查配置的请求地址是否是公网可访问的。例如，你可以使用其他外部网络设备重新执行步骤 1 中的 curl 命令，测试是否可以正常返回 challenge 值。

- 如果本地测试命令不能返回和请求体中相同 challenge code，请先参考[配置订阅方式](https://open.feishu.cn/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-subscription-configure-/request-url-configuration-case)文档，编写正确的代码，然后重试。

- 如果应用配置了 Encrypt Key（如下图），那么开放平台会推送加密后的 POST 请求。在请求地址对应的回调服务器内，需要按照[事件解密](https://open.feishu.cn/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-subscription-configure-/encrypt-key-encryption-configuration-case#679e4309)文档，进行解密后再返回消息体中的 challenge code。

![image.png](//sf3-cn.feishucdn.com/obj/open-platform-opendoc/d9f071e1e59747482afafe2c2db3d5f5_FPozCJtDUD.png?height=708&lazyload=true&maxWidth=600&width=2280)

```json
    # 当应用配置了 Encrypt Key，此时开放平台发起的 challenge code 是被加密过的。
    # 需要开发者按照事件解密文档进行解密。

{
        "encrypt": "ds3da3sj32421lkkld4xxxx"  // 加密字符串
    }
    ```

## Q：如何确认事件推送成功了？

可以使用应用的[日志检索](https://open.feishu.cn/document/tools-and-resources/open-api-log-query#30d1c67a)功能查看事件推送的日志记录，返回状态 `SUCCESS` 表示推送成功。

![](//sf3-cn.feishucdn.com/obj/open-platform-opendoc/c394e9fbc44a3991446e9dee4175ce1c_eElUSqBOlJ.png?height=1260&lazyload=true&maxWidth=600&width=2274)

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

![image.png](//sf3-cn.feishucdn.com/obj/open-platform-opendoc/7e990f4caf6cbb91588a449cdb61f8f2_aLxcYONsS3.png?height=1236&lazyload=true&maxWidth=600&width=2276)

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

**可能原因**：服务器收到两条开放平台推送的消息，可能是事件重复推送机制导致的。飞书开放平台在推送事件时，如果未在 **3 秒内**收到 HTTP 200 状态码的响应，会认为推送失败并重新推送事件，从而导致服务器收到重复的事件推送。
你可以查看事件日志中的 **retry cnt** 信息，如果 **retry cnt** 的值大于1，可以确定是事件重推引起。 

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