From c1946091934e8e3cc9f19691de560dbaf2028bf8 Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 5 Nov 2026 22:06:37 +0800 Subject: [PATCH] =?UTF-8?q?fix(integrations):=20=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E6=BC=8F=E4=BA=86=20/api/v1=EF=BC=8C?= =?UTF-8?q?=E7=94=9F=E4=BA=A7=E4=B8=8A=E6=89=93=E8=BF=87=E5=8E=BB=E6=98=AF?= =?UTF-8?q?=20405?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 生产把应用挂在域名根、路由带 /api/v1 前缀,request.base_url 里没有前缀, 拼出来的地址少了这一段;本地被 Vite 的代理掩盖了。改成从 base_url 截站点根、 前缀一律取 settings.api_prefix,并补一条断言把这个差异钉住。 --- 2.Design/screens/prod-integrations.png | Bin 0 -> 45446 bytes backend/app/api/integrations.py | 11 +++++++++-- backend/tests/test_clawbot.py | 8 ++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 2.Design/screens/prod-integrations.png diff --git a/2.Design/screens/prod-integrations.png b/2.Design/screens/prod-integrations.png new file mode 100644 index 0000000000000000000000000000000000000000..a4b322b61d88355effd0ccd5e8a120a5e967b298 GIT binary patch literal 45446 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

#@`93=QR_^T`5@oI5`UD<~GDf0K1Zehct4 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 dict[str, Any]: def _webhook_url(request: Request, token: str) -> str: - base = str(request.base_url).rstrip("/") - return f"{base}/integrations/clawbot/{token}" + """拼出机器人要打的那个地址。 + + 不能直接用 `request.base_url`:生产上应用挂在域名根、路由带 `/api/v1` 前缀, + base_url 里没有前缀,拼出来的地址会 405(本地被 Vite 代理掩盖过这个差异)。 + 所以站点根从 base_url 里截,前缀一律取 `settings.api_prefix`。 + """ + base = str(request.base_url).split("/api/")[0].rstrip("/") + return f"{base}{get_settings().api_prefix}/integrations/clawbot/{token}" @admin_router.get("/{ws_id}/integrations") diff --git a/backend/tests/test_clawbot.py b/backend/tests/test_clawbot.py index c410369..ad0c94a 100644 --- a/backend/tests/test_clawbot.py +++ b/backend/tests/test_clawbot.py @@ -197,3 +197,11 @@ async def test_member_cannot_manage_channels(client: AsyncClient) -> None: ) assert resp.status_code == 403 assert resp.json()["code"] in (3004, 3003) + + +async def test_webhook_url_carries_api_prefix(client: AsyncClient) -> None: + """回调地址必须带 /api/v1:生产上应用挂在域名根,漏了前缀就是 405。""" + user = await login(client) + ws = await create_workspace(client, user, "微信地址") + channel = await _channel(client, user, ws) + assert channel["webhook_url"].endswith(f"/api/v1/integrations/clawbot/{channel['token']}")