From fa06678e921f6f40bcbba0d460556d6331e08c8c Mon Sep 17 00:00:00 2001 From: Pine Date: Wed, 26 Aug 2026 12:21:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(auth):=20=E8=BF=90=E8=A1=8C=E7=8E=AF?= =?UTF-8?q?=E5=A2=83(=E7=94=9F=E4=BA=A7/=E5=BC=80=E5=8F=91)+=20=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=A0=81=E7=89=88=E6=9C=AC(=E4=BD=93?= =?UTF-8?q?=E9=AA=8C=E7=89=88trial/=E6=AD=A3=E5=BC=8F=E7=89=88release)?= =?UTF-8?q?=E5=8F=AF=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PINEAGENTS_ENV=prod|dev 判定运行环境; /auth/status 回显 env + wxacode_env 以便确认 - PINEAGENTS_WXACODE_ENV=release|trial|develop 决定小程序码指向(默认 prod→release, dev→trial=体验版) - get_wxacode 用该 env_version(支持体验版测试) --- app/api/routers/auth.py | 2 ++ app/api/schemas/auth.py | 2 ++ app/config.py | 13 +++++++++++++ app/services/wechat.py | 7 +++++-- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/app/api/routers/auth.py b/app/api/routers/auth.py index 674bc40..b753f26 100644 --- a/app/api/routers/auth.py +++ b/app/api/routers/auth.py @@ -311,6 +311,8 @@ async def auth_status(db: Database = Depends(get_db)): login_modes=modes, wechat_login=config.AUTH_WECHAT_LOGIN, wx_qr=config.AUTH_WECHAT_QR, + env=config.APP_ENV, + wxacode_env=config.WECHAT_WXACODE_ENV, ) diff --git a/app/api/schemas/auth.py b/app/api/schemas/auth.py index fcb09a1..aac23bc 100644 --- a/app/api/schemas/auth.py +++ b/app/api/schemas/auth.py @@ -61,6 +61,8 @@ class AuthStatusResponse(BaseModel): login_modes: list[str] = ["password", "phone"] # password/phone/wechat/miniprogram(四种) wechat_login: bool = False # 小程序扫码(code2session) wx_qr: bool = False # 微信开放平台扫码(OAuth) + env: str = "prod" # prod | dev —— 运行环境(前端/联调可据此确认) + wxacode_env: str = "release" # release | trial | develop —— 小程序码指向的版本(体验版=trial) class VerifyResponse(BaseModel): valid: bool diff --git a/app/config.py b/app/config.py index 957d10b..49e6f44 100644 --- a/app/config.py +++ b/app/config.py @@ -146,6 +146,19 @@ AUTH_WECHAT_QR = os.environ.get("PINEAGENTS_WECHAT_QR", "true").strip().lower() # 本期统一登录仅两模式(账号密码/手机号验证码);微信扫码预留后期,未开放(默认 False)。 AUTH_WECHAT_LOGIN = os.environ.get("PINEAGENTS_WECHAT_LOGIN", "false").strip().lower() in ("true", "1", "yes") +# --------------------------------------------------------------------------- +# 运行环境(生产/开发)—— 供业务判断与小程序码版本选择,亦在 /auth/status 回显以便确认 +# --------------------------------------------------------------------------- +# APP_ENV: prod | dev(默认 prod)。dev 时小程序码默认指向「体验版」(trial);prod 指向正式版(release)。 +APP_ENV = os.environ.get("PINEAGENTS_ENV", "prod").strip().lower() +APP_ENV = "prod" if APP_ENV not in ("prod", "dev", "development", "test") else ("prod" if APP_ENV == "prod" else "dev") +# 小程序码(wxacode) 的版本类型:release(正式版) | trial(体验版) | develop(开发版) +# 默认按 APP_ENV:prod→release,dev→trial;可显式 PINEAGENTS_WXACODE_ENV 覆盖。 +_WXACODE_DEFAULT = "release" if APP_ENV == "prod" else "trial" +WECHAT_WXACODE_ENV = os.environ.get("PINEAGENTS_WXACODE_ENV", "").strip().lower() or _WXACODE_DEFAULT +if WECHAT_WXACODE_ENV not in ("release", "trial", "develop"): + WECHAT_WXACODE_ENV = _WXACODE_DEFAULT + def resolve_token_expiry(expires_in: int | None) -> int: """把前端传来的 ``expires_in`` 归一化为秒数。 diff --git a/app/services/wechat.py b/app/services/wechat.py index 4302cad..a91fd17 100644 --- a/app/services/wechat.py +++ b/app/services/wechat.py @@ -147,17 +147,20 @@ async def _wx_access_token() -> str: return token -async def get_wxacode(scene: str, page: str = "pages/scan-login/index") -> bytes: +async def get_wxacode(scene: str, page: str = "pages/scan-login/index", env_version: str | None = None) -> bytes: """生成小程序码(wxacode)图片,扫码自动打开小程序指定页面并携带 scene。 + env_version:release(正式版) | trial(体验版) | develop(开发版),默认取 config.WECHAT_WXACODE_ENV + (随 APP_ENV:prod→release,dev→trial,可显式 PINEAGENTS_WXACODE_ENV 覆盖)。 scene 限 32 字符(本服务用短 token)。返回 PNG 字节。 """ token = await _wx_access_token() + env = env_version or config.WECHAT_WXACODE_ENV try: async with httpx.AsyncClient(timeout=15) as client: resp = await client.post( _WX_ACODE_URL.format(token=token), - json={"scene": scene, "page": page, "check_path": False, "env_version": "release"}, + json={"scene": scene, "page": page, "check_path": False, "env_version": env}, ) except Exception as exc: # noqa: BLE001 raise WechatError(f"wechat getwxacodeunlimit failed: {exc}") from exc