From 9bb9868d312bf51f38bcb130689fbb9dd54bef8e Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Fri, 8 May 2026 10:18:20 +0800 Subject: [PATCH] docs: align api guide with appKey identity --- docs/API_ACCESS.md | 170 ++++++++++++++++++++++----------------------- 1 file changed, 85 insertions(+), 85 deletions(-) diff --git a/docs/API_ACCESS.md b/docs/API_ACCESS.md index 2f673ef..466e7f2 100644 --- a/docs/API_ACCESS.md +++ b/docs/API_ACCESS.md @@ -1,6 +1,6 @@ # XuqmGroup Server 联调接口文档 -> 最后更新:2026-04-28 +> 最后更新:2026-05-08 ## 线上入口 @@ -13,18 +13,18 @@ | App 更新 | `https://dev.xuqinmin.com/api/v1/updates/` | 原生版本管理 | | RN 热更新 | `https://dev.xuqinmin.com/api/v1/rn/` | Bundle 热更新 | -## ID 约定 +## 应用标识约定 这套工程里同时存在两种“应用标识”,不要混用: | 名称 | 含义 | 常见位置 | |------|------|----------| -| `tenant appId` | 租户平台应用主键,`tenant-service` 的 `/api/apps/{id}`、`/api/apps/{appId}/services` 使用它 | 租户平台、服务配置页 | -| `IM appKey` | IM 业务域作用域标识,`im-service` 的管理接口和消息接口虽然参数名仍叫 `appId`,但实际传的是这个值 | IM 管理页、IM HTTP 接口 | +| `tenant appKey` | 租户平台应用唯一标识,`tenant-service` 的 `/api/apps/{appKey}`、`/api/apps/{appKey}/services` 使用它 | 租户平台、服务配置页 | +| `IM appKey` | IM 业务域作用域标识,`im-service` 的管理接口和消息接口虽然历史参数名仍叫 `appId`,但实际传的是这个值 | IM 管理页、IM HTTP 接口 | 结论: -- `tenant-platform` 的“服务配置”只认租户 `app.id` +- `tenant-platform` 的“服务配置”只认租户 `appKey` - `tenant-platform` 的“IM 管理”必须带 `appKey` - `tenant-platform` 的“离线推送 / 版本管理”只需要一次开通,平台差异配置在各自的管理页里维护,不再按 Android / iOS / 鸿蒙分别申请开通 - `im-service` 代码里沿用旧参数名 `appId`,但这是历史命名,调用方传的是 `appKey` @@ -83,14 +83,14 @@ | POST | `/api/auth/forgot-password` | 否 | 发送找回密码邮件 | | POST | `/api/auth/reset-password` | 否 | 重置密码 | | GET | `/api/apps` | 是 | 应用列表 | -| GET | `/api/apps/{id}` | 是 | 应用详情 | +| GET | `/api/apps/{appKey}` | 是 | 应用详情 | | POST | `/api/apps` | 是 | 创建应用 | -| PUT | `/api/apps/{id}` | 是 | 更新应用 | -| DELETE | `/api/apps/{id}` | 是 | 删除应用 | -| GET | `/api/apps/{appId}/services` | 是 | 服务列表 | -| PUT | `/api/apps/{appId}/services/config` | 是 | 更新服务配置,IM 和 UPDATE 走各自的配置模型 | -| POST | `/api/apps/{appId}/services/toggle` | 是 | 开关服务 | -| POST | `/api/apps/{appId}/services/{id}/regenerate-key` | 是 | 重新生成服务密钥 | +| PUT | `/api/apps/{appKey}` | 是 | 更新应用 | +| DELETE | `/api/apps/{appKey}` | 是 | 删除应用 | +| GET | `/api/apps/{appKey}/services` | 是 | 服务列表 | +| PUT | `/api/apps/{appKey}/services/config` | 是 | 更新服务配置,IM 和 UPDATE 走各自的配置模型 | +| POST | `/api/apps/{appKey}/services/toggle` | 是 | 开关服务 | +| POST | `/api/apps/{appKey}/services/{id}/regenerate-key` | 是 | 重新生成服务密钥 | | GET | `/api/sub-accounts` | 是 | 子账号列表 | | POST | `/api/sub-accounts/send-verify-code` | 是 | 子账号邮箱验证码 | | POST | `/api/sub-accounts/verify-email` | 是 | 校验子账号邮箱 | @@ -162,18 +162,18 @@ | GET | `/api/v1/rn/update/check` | 否 | 检查 RN 热更新 | | POST | `/api/v1/rn/upload` | 是 | 上传 Bundle | | POST | `/api/v1/rn/{id}/publish` | 是 | 发布 Bundle | -| GET | `/api/v1/rn/files/{appId}/{platform}/{moduleId}` | 否 | 下载 Bundle | +| GET | `/api/v1/rn/files/{appKey}/{platform}/{moduleId}` | 否 | 下载 Bundle | ### tenant-service 提供给 update-sdk 的公共配置接口 | 方法 | 路径 | 鉴权 | 说明 | |------|------|------|------| -| GET | `/api/sdk/config` | 否 | 发版脚本读取租户级默认配置;`appId` 可以传 `appKey`,`platform` 用于读取当前平台的 UPDATE 配置 | +| GET | `/api/sdk/config` | 否 | 发版脚本读取租户级默认配置;`appKey` 用于读取当前平台的 UPDATE 配置 | 说明: -- 这里的 `appId` 按 `appKey` 解析;当前 demo 默认使用 `ak_demo_chat`,`tenant-service` 会优先复用数据库里已有的应用,如果没有,会自动补一条默认 demo 应用和基础服务配置。 -- `GET /api/sdk/config` 主要给 `update-sdk` 脚本使用,脚本侧建议传 `appKey`。接口会根据 `platform` 返回当前平台的 UPDATE 默认配置和开关状态。 +- 这里的 `appKey` 按唯一应用标识解析;当前 demo 默认使用 `ak_demo_chat`,`tenant-service` 会优先复用数据库里已有的应用,如果没有,会自动补一条默认 demo 应用和基础服务配置。 +- `GET /api/sdk/config` 主要给 `update-sdk` 脚本使用,脚本侧直接传 `appKey`。接口会根据 `platform` 返回当前平台的 UPDATE 默认配置和开关状态。 - 应用商店配置页分成两个 tab:`凭据配置` 和 `应用配置指引`。App Store / 鸿蒙只保留 `marketUrl` 跳转页,且该字段是可选项;Android 市场继续保留审核凭据。审核通知使用单独的 `REVIEW_WEBHOOK` 配置,只保存一次,所有市场共用,并会在保存时先做连通性校验。 - 发布配置页保存灰度默认模式、成员目录同步回调和成员选择回调,两个回调都支持单独配置 `secret`,调用时会带 `X-Xuqm-Callback-Secret`。 - `POST /api/im/auth/login` 还要求 demo-service 通过 AppSecret 生成签名头再转发给 IM 服务。 @@ -182,10 +182,10 @@ - `GET /api/v1/updates/app/check` 现在按“当前版本之后的最高已发布版本”返回更新信息,但 `forceUpdate` 会按照“当前版本之后是否存在任意一条强更版本”来计算,所以后续发布的非强更版本不会覆盖更低版本当时应看到的强更提示。 - RN bundle 建议打成 zip 后再上传,zip 内至少包含 `rn-manifest.json`、bundle 文件和资源文件;update-service 会优先从 manifest 自动读取 `moduleId`、`version` / `bundleVersion`、`minCommonVersion` 和 `packageName`。 - 租户平台里的“发布配置”标签页保存灰度默认模式、成员目录同步回调和成员选择回调;当默认模式切到成员灰度时,至少要配置一个回调才允许保存,保存前也会做连通性校验。 -- 上下架、上传、发布、灰度、市场提交、商店配置变更都会写入 `update_operation_log`,可通过 `GET /api/v1/updates/ops/logs?appId=...` 查询。 +- 上下架、上传、发布、灰度、市场提交、商店配置变更都会写入 `update_operation_log`,可通过 `GET /api/v1/updates/ops/logs?appKey=...` 查询。 - 提交应用市场会真实调用已实现的厂商接口。小米、OPPO、vivo 和华为/荣耀当前支持服务端提交;App Store、Google Play、鸿蒙仍以跳转页和人工流程为主。 - 租户平台控制台新增 `GET /api/dashboard/stats`,返回当前租户的应用数、已开通服务数和子账号数,同时会写一条 `CONSOLE / DASHBOARD / VIEW_DASHBOARD` 操作日志。 -- 租户平台“操作日志”菜单现在集中查看租户平台与版本管理两类日志;版本管理日志继续按 `appId` 查询,控制台访问日志则落在 `t_operation_log`。 +- 租户平台“操作日志”菜单现在集中查看租户平台与版本管理两类日志;版本管理日志继续按 `appKey` 查询,控制台访问日志则落在 `t_operation_log`。 ## update-sdk 自动发版 @@ -211,7 +211,7 @@ Android SDK 的整包发版脚本支持通过“检查版本 -> 打包 -> 上传 推荐流程: -1. 脚本先调用 `GET /api/sdk/config?appId=&platform=`。 +1. 脚本先调用 `GET /api/sdk/config?appKey=&platform=`。 2. 如果服务未开通或配置缺失,则进入 dry-run 或提示补齐配置。 3. 脚本读取服务器最新版本,和本地版本对比。 4. 本地版本不高于服务端时,提示用户重新输入版本名 / 版本码。 @@ -234,8 +234,8 @@ curl -X POST 'https://dev.xuqinmin.com/api/auth/ops/login' \ ### App 更新检查 ```bash -curl 'https://dev.xuqinmin.com/api/v1/updates/app/check?appId=ak_demo_chat&platform=ANDROID¤tVersionCode=1' -curl 'https://dev.xuqinmin.com/api/v1/updates/app/check?appId=ak_demo_chat&platform=HARMONY¤tVersionCode=1' +curl 'https://dev.xuqinmin.com/api/v1/updates/app/check?appKey=ak_demo_chat&platform=ANDROID¤tVersionCode=1' +curl 'https://dev.xuqinmin.com/api/v1/updates/app/check?appKey=ak_demo_chat&platform=HARMONY¤tVersionCode=1' ``` Harmony 平台只跳转应用市场,不提供本地安装包下载。 @@ -243,13 +243,13 @@ Harmony 平台只跳转应用市场,不提供本地安装包下载。 ### RN 热更新检查 ```bash -curl 'https://dev.xuqinmin.com/api/v1/rn/update/check?appId=ak_demo_chat&platform=ANDROID&moduleId=chat-home¤tVersion=1.0.0' +curl 'https://dev.xuqinmin.com/api/v1/rn/update/check?appKey=ak_demo_chat&platform=ANDROID&moduleId=chat-home¤tVersion=1.0.0' ``` ### IM 登录 ```bash -curl -X POST 'https://dev.xuqinmin.com/api/im/auth/login?appId=ak_demo_chat&userId=demo_alice' +curl -X POST 'https://dev.xuqinmin.com/api/im/auth/login?appKey=ak_demo_chat&userId=demo_alice' ``` 返回示例中的 `data` 只包含 `token`。如果需要更新登录态,请由业务服务端重新调用登录接口并覆盖当前会话。 @@ -257,80 +257,80 @@ curl -X POST 'https://dev.xuqinmin.com/api/im/auth/login?appId=ak_demo_chat&user ### IM 会话与关系链 ```bash -curl 'https://dev.xuqinmin.com/api/im/accounts/user_001?appId=ak_demo_chat' -curl -X POST 'https://dev.xuqinmin.com/api/im/accounts/import?appId=ak_demo_chat' \ +curl 'https://dev.xuqinmin.com/api/im/accounts/user_001?appKey=ak_demo_chat' +curl -X POST 'https://dev.xuqinmin.com/api/im/accounts/import?appKey=ak_demo_chat' \ -H 'Content-Type: application/json' \ -d '{"userId":"user_001","nickname":"Alice"}' -curl -X POST 'https://dev.xuqinmin.com/api/im/accounts/import/batch?appId=ak_demo_chat' \ +curl -X POST 'https://dev.xuqinmin.com/api/im/accounts/import/batch?appKey=ak_demo_chat' \ -H 'Content-Type: application/json' \ -d '[{"userId":"user_001"},{"userId":"user_002"}]' -curl -X DELETE 'https://dev.xuqinmin.com/api/im/accounts/user_001?appId=ak_demo_chat' -curl 'https://dev.xuqinmin.com/api/im/accounts/user_001/exists?appId=ak_demo_chat' -curl 'https://dev.xuqinmin.com/api/im/conversations?appId=ak_demo_chat' -curl -X PUT 'https://dev.xuqinmin.com/api/im/conversations/user_002/pinned?appId=ak_demo_chat&chatType=SINGLE&pinned=true' -curl -X PUT 'https://dev.xuqinmin.com/api/im/conversations/user_002/draft?appId=ak_demo_chat&chatType=SINGLE&draft=hello' -curl -X PUT 'https://dev.xuqinmin.com/api/im/conversations/user_002/hidden?appId=ak_demo_chat&chatType=SINGLE&hidden=true' -curl -X PUT 'https://dev.xuqinmin.com/api/im/conversations/user_002/group?appId=ak_demo_chat&chatType=SINGLE&groupName=重要客户' -curl 'https://dev.xuqinmin.com/api/im/conversation-groups?appId=ak_demo_chat' -curl 'https://dev.xuqinmin.com/api/im/conversation-groups/重要客户?appId=ak_demo_chat' -curl -X DELETE 'https://dev.xuqinmin.com/api/im/conversations/user_002?appId=ak_demo_chat&chatType=SINGLE' -curl -X PUT 'https://dev.xuqinmin.com/api/im/friends/user_002/group?appId=ak_demo_chat&groupName=同事' -curl 'https://dev.xuqinmin.com/api/im/friends/groups?appId=ak_demo_chat' -curl 'https://dev.xuqinmin.com/api/im/friends/groups/同事?appId=ak_demo_chat' -curl -X DELETE 'https://dev.xuqinmin.com/api/im/friends?appId=ak_demo_chat' -curl 'https://dev.xuqinmin.com/api/im/groups?appId=ak_demo_chat' -curl 'https://dev.xuqinmin.com/api/im/groups/public?appId=ak_demo_chat&keyword=demo' -curl 'https://dev.xuqinmin.com/api/im/groups/search?appId=ak_demo_chat&keyword=demo&size=20' -curl 'https://dev.xuqinmin.com/api/im/groups/group_001/members?appId=ak_demo_chat' -curl 'https://dev.xuqinmin.com/api/im/groups/group_001/members/search?appId=ak_demo_chat&keyword=demo&size=20' -curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/owner?appId=ak_demo_chat' \ +curl -X DELETE 'https://dev.xuqinmin.com/api/im/accounts/user_001?appKey=ak_demo_chat' +curl 'https://dev.xuqinmin.com/api/im/accounts/user_001/exists?appKey=ak_demo_chat' +curl 'https://dev.xuqinmin.com/api/im/conversations?appKey=ak_demo_chat' +curl -X PUT 'https://dev.xuqinmin.com/api/im/conversations/user_002/pinned?appKey=ak_demo_chat&chatType=SINGLE&pinned=true' +curl -X PUT 'https://dev.xuqinmin.com/api/im/conversations/user_002/draft?appKey=ak_demo_chat&chatType=SINGLE&draft=hello' +curl -X PUT 'https://dev.xuqinmin.com/api/im/conversations/user_002/hidden?appKey=ak_demo_chat&chatType=SINGLE&hidden=true' +curl -X PUT 'https://dev.xuqinmin.com/api/im/conversations/user_002/group?appKey=ak_demo_chat&chatType=SINGLE&groupName=重要客户' +curl 'https://dev.xuqinmin.com/api/im/conversation-groups?appKey=ak_demo_chat' +curl 'https://dev.xuqinmin.com/api/im/conversation-groups/重要客户?appKey=ak_demo_chat' +curl -X DELETE 'https://dev.xuqinmin.com/api/im/conversations/user_002?appKey=ak_demo_chat&chatType=SINGLE' +curl -X PUT 'https://dev.xuqinmin.com/api/im/friends/user_002/group?appKey=ak_demo_chat&groupName=同事' +curl 'https://dev.xuqinmin.com/api/im/friends/groups?appKey=ak_demo_chat' +curl 'https://dev.xuqinmin.com/api/im/friends/groups/同事?appKey=ak_demo_chat' +curl -X DELETE 'https://dev.xuqinmin.com/api/im/friends?appKey=ak_demo_chat' +curl 'https://dev.xuqinmin.com/api/im/groups?appKey=ak_demo_chat' +curl 'https://dev.xuqinmin.com/api/im/groups/public?appKey=ak_demo_chat&keyword=demo' +curl 'https://dev.xuqinmin.com/api/im/groups/search?appKey=ak_demo_chat&keyword=demo&size=20' +curl 'https://dev.xuqinmin.com/api/im/groups/group_001/members?appKey=ak_demo_chat' +curl 'https://dev.xuqinmin.com/api/im/groups/group_001/members/search?appKey=ak_demo_chat&keyword=demo&size=20' +curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/owner?appKey=ak_demo_chat' \ -H 'Content-Type: application/json' \ -d '{"newOwnerId":"user_002"}' -curl -X PUT 'https://dev.xuqinmin.com/api/im/groups/group_001/attributes?appId=ak_demo_chat' \ +curl -X PUT 'https://dev.xuqinmin.com/api/im/groups/group_001/attributes?appKey=ak_demo_chat' \ -H 'Content-Type: application/json' \ -d '{"department":"sales","priority":"high"}' -curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/attributes/delete?appId=ak_demo_chat' \ +curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/attributes/delete?appKey=ak_demo_chat' \ -H 'Content-Type: application/json' \ -d '{"keys":["priority"]}' -curl 'https://dev.xuqinmin.com/api/im/messages/search?appId=ak_demo_chat&keyword=hello&page=0&size=20' -curl 'https://dev.xuqinmin.com/api/im/admin/webhooks?appId=ak_demo_chat' -curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests?appId=ak_demo_chat&remark=申请加入' -curl 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests?appId=ak_demo_chat' -curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests/req_001/accept?appId=ak_demo_chat' -curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests/req_001/reject?appId=ak_demo_chat' -curl 'https://dev.xuqinmin.com/api/im/blacklist?appId=ak_demo_chat' -curl 'https://dev.xuqinmin.com/api/im/blacklist/check?appId=ak_demo_chat&targetUserId=user_002' -curl 'https://dev.xuqinmin.com/api/im/friend-requests?appId=ak_demo_chat&direction=incoming' +curl 'https://dev.xuqinmin.com/api/im/messages/search?appKey=ak_demo_chat&keyword=hello&page=0&size=20' +curl 'https://dev.xuqinmin.com/api/im/admin/webhooks?appKey=ak_demo_chat' +curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests?appKey=ak_demo_chat&remark=申请加入' +curl 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests?appKey=ak_demo_chat' +curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests/req_001/accept?appKey=ak_demo_chat' +curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests/req_001/reject?appKey=ak_demo_chat' +curl 'https://dev.xuqinmin.com/api/im/blacklist?appKey=ak_demo_chat' +curl 'https://dev.xuqinmin.com/api/im/blacklist/check?appKey=ak_demo_chat&targetUserId=user_002' +curl 'https://dev.xuqinmin.com/api/im/friend-requests?appKey=ak_demo_chat&direction=incoming' ``` ### IM 管理后台接口 ```bash -curl 'https://dev.xuqinmin.com/api/im/admin/users?appId=ak_demo_chat&page=0&size=20' -curl 'https://dev.xuqinmin.com/api/im/admin/groups?appId=ak_demo_chat' -curl 'https://dev.xuqinmin.com/api/im/admin/messages?appId=ak_demo_chat&userA=user_001&userB=user_002&page=0&size=20' -curl 'https://dev.xuqinmin.com/api/im/admin/operation-logs?appId=ak_demo_chat&page=0&size=20' -curl -X POST 'https://dev.xuqinmin.com/api/im/admin/messages/msg_001/revoke?appId=ak_demo_chat' +curl 'https://dev.xuqinmin.com/api/im/admin/users?appKey=ak_demo_chat&page=0&size=20' +curl 'https://dev.xuqinmin.com/api/im/admin/groups?appKey=ak_demo_chat' +curl 'https://dev.xuqinmin.com/api/im/admin/messages?appKey=ak_demo_chat&userA=user_001&userB=user_002&page=0&size=20' +curl 'https://dev.xuqinmin.com/api/im/admin/operation-logs?appKey=ak_demo_chat&page=0&size=20' +curl -X POST 'https://dev.xuqinmin.com/api/im/admin/messages/msg_001/revoke?appKey=ak_demo_chat' curl -X DELETE 'https://dev.xuqinmin.com/api/im/admin/groups/group_001' -curl 'https://dev.xuqinmin.com/api/im/admin/friend-requests?appId=ak_demo_chat' -curl -X POST 'https://dev.xuqinmin.com/api/im/admin/friend-requests/req_001/accept?appId=ak_demo_chat' -curl -X POST 'https://dev.xuqinmin.com/api/im/admin/blacklist?appId=ak_demo_chat' \ +curl 'https://dev.xuqinmin.com/api/im/admin/friend-requests?appKey=ak_demo_chat' +curl -X POST 'https://dev.xuqinmin.com/api/im/admin/friend-requests/req_001/accept?appKey=ak_demo_chat' +curl -X POST 'https://dev.xuqinmin.com/api/im/admin/blacklist?appKey=ak_demo_chat' \ -H 'Content-Type: application/json' \ -d '{"userId":"user_001","blockedUserId":"user_002"}' -curl 'https://dev.xuqinmin.com/api/im/admin/groups/group_001/members?appId=ak_demo_chat' -curl -X POST 'https://dev.xuqinmin.com/api/im/admin/groups/group_001/owner?appId=ak_demo_chat' \ +curl 'https://dev.xuqinmin.com/api/im/admin/groups/group_001/members?appKey=ak_demo_chat' +curl -X POST 'https://dev.xuqinmin.com/api/im/admin/groups/group_001/owner?appKey=ak_demo_chat' \ -H 'Content-Type: application/json' \ -d '{"newOwnerId":"user_002"}' -curl -X PUT 'https://dev.xuqinmin.com/api/im/admin/groups/group_001/attributes?appId=ak_demo_chat' \ +curl -X PUT 'https://dev.xuqinmin.com/api/im/admin/groups/group_001/attributes?appKey=ak_demo_chat' \ -H 'Content-Type: application/json' \ -d '{"department":"sales"}' -curl -X POST 'https://dev.xuqinmin.com/api/im/admin/groups/group_001/read-receipts?appId=ak_demo_chat' \ +curl -X POST 'https://dev.xuqinmin.com/api/im/admin/groups/group_001/read-receipts?appKey=ak_demo_chat' \ -H 'Content-Type: application/json' \ -d '{"messageIds":["msg_001","msg_002"]}' -curl 'https://dev.xuqinmin.com/api/im/admin/groups/group_001/join-requests?appId=ak_demo_chat' -curl -X POST 'https://dev.xuqinmin.com/api/im/admin/groups/group_001/join-requests/req_001/accept?appId=ak_demo_chat' -curl 'https://dev.xuqinmin.com/api/im/admin/keyword-filters?appId=ak_demo_chat' -curl 'https://dev.xuqinmin.com/api/im/admin/global-mute?appId=ak_demo_chat' +curl 'https://dev.xuqinmin.com/api/im/admin/groups/group_001/join-requests?appKey=ak_demo_chat' +curl -X POST 'https://dev.xuqinmin.com/api/im/admin/groups/group_001/join-requests/req_001/accept?appKey=ak_demo_chat' +curl 'https://dev.xuqinmin.com/api/im/admin/keyword-filters?appKey=ak_demo_chat' +curl 'https://dev.xuqinmin.com/api/im/admin/global-mute?appKey=ak_demo_chat' ``` ### IM Webhook 回调 @@ -490,22 +490,22 @@ export function verifyWebhook({ ### 好友申请 / 黑名单 ```bash -curl -X POST 'https://dev.xuqinmin.com/api/im/friend-requests?appId=ak_demo_chat&toUserId=user_002&remark=hi' -curl -X POST 'https://dev.xuqinmin.com/api/im/friend-requests/req_001/accept?appId=ak_demo_chat' -curl -X POST 'https://dev.xuqinmin.com/api/im/friend-requests/req_001/reject?appId=ak_demo_chat' -curl 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests?appId=ak_demo_chat' -curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests?appId=ak_demo_chat&remark=申请加入' -curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests/req_001/accept?appId=ak_demo_chat' -curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests/req_001/reject?appId=ak_demo_chat' -curl -X POST 'https://dev.xuqinmin.com/api/im/blacklist?appId=ak_demo_chat&blockedUserId=user_002' -curl -X DELETE 'https://dev.xuqinmin.com/api/im/blacklist?appId=ak_demo_chat&blockedUserId=user_002' +curl -X POST 'https://dev.xuqinmin.com/api/im/friend-requests?appKey=ak_demo_chat&toUserId=user_002&remark=hi' +curl -X POST 'https://dev.xuqinmin.com/api/im/friend-requests/req_001/accept?appKey=ak_demo_chat' +curl -X POST 'https://dev.xuqinmin.com/api/im/friend-requests/req_001/reject?appKey=ak_demo_chat' +curl 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests?appKey=ak_demo_chat' +curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests?appKey=ak_demo_chat&remark=申请加入' +curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests/req_001/accept?appKey=ak_demo_chat' +curl -X POST 'https://dev.xuqinmin.com/api/im/groups/group_001/join-requests/req_001/reject?appKey=ak_demo_chat' +curl -X POST 'https://dev.xuqinmin.com/api/im/blacklist?appKey=ak_demo_chat&blockedUserId=user_002' +curl -X DELETE 'https://dev.xuqinmin.com/api/im/blacklist?appKey=ak_demo_chat&blockedUserId=user_002' ``` ### IM 历史过滤查询 ```bash -curl 'https://dev.xuqinmin.com/api/im/messages/history/user_002?appId=ak_demo_chat&page=0&size=20&keyword=hello&msgType=TEXT' -curl 'https://dev.xuqinmin.com/api/im/messages/group-history/group_001?appId=ak_demo_chat&page=0&size=20&keyword=user_002&startTime=2026-04-27T00:00:00&endTime=2026-04-27T23:59:59' +curl 'https://dev.xuqinmin.com/api/im/messages/history/user_002?appKey=ak_demo_chat&page=0&size=20&keyword=hello&msgType=TEXT' +curl 'https://dev.xuqinmin.com/api/im/messages/group-history/group_001?appKey=ak_demo_chat&page=0&size=20&keyword=user_002&startTime=2026-04-27T00:00:00&endTime=2026-04-27T23:59:59' ``` 支持的筛选参数:`keyword`、`msgType`、`startTime`、`endTime`。 @@ -517,7 +517,7 @@ curl -X POST 'https://file.dev.xuqinmin.com/api/file/upload' \ -H 'Authorization: Bearer ' \ -F 'file=@image.jpg' -curl -X POST 'https://im.dev.xuqinmin.com/api/im/messages/send?appId=ak_demo_chat' \ +curl -X POST 'https://im.dev.xuqinmin.com/api/im/messages/send?appKey=ak_demo_chat' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{"toId":"user_002","chatType":"SINGLE","msgType":"IMAGE","content":"{\"url\":\"https://file.dev.xuqinmin.com/api/file/abc\"}"}'