import httpx from app.config import settings async def code_to_session(code: str) -> dict: """用小程序 code 换取 openid 和 session_key""" url = "https://api.weixin.qq.com/sns/jscode2session" params = { "appid": settings.wechat_app_id, "secret": settings.wechat_app_secret, "js_code": code, "grant_type": "authorization_code", } async with httpx.AsyncClient() as client: resp = await client.get(url, params=params) data = resp.json() if "errcode" in data and data["errcode"] != 0: raise Exception(f"微信登录失败: {data.get('errmsg', '未知错误')}") return { "openid": data["openid"], "session_key": data["session_key"], "unionid": data.get("unionid"), }