微信登录授权集成
使用场景
集成微信登录功能,支持公众号、小程序、开放平台三种方式。
小程序登录流程
前端 wx.login() → 获取 code
↓
后端用 code 换取 openid/session_key
↓
生成自定义 token 返回给前端
↓
前端保存 token,后续请求携带
后端代码 (Python/Flask)
import requests
def wx_login(code: str) -> dict:
"""微信小程序登录"""
url = "https://api.weixin.qq.com/sns/jscode2session"
params = {
"appid": APPID,
"secret": SECRET,
"js_code": code,
"grant_type": "authorization_code"
}
resp = requests.get(url, params=params).json()
if "errcode" in resp:
raise ValueError(f"微信登录失败: {resp['errmsg']}")
openid = resp["openid"]
session_key = resp["session_key"]
# 生成自定义token
token = generate_token(openid)
return {"token": token, "openid": openid}
公众号OAuth登录
def get_wechat_auth_url(redirect_uri: str, state: str = "STATE") -> str:
"""获取微信授权URL"""
return (
f"https://open.weixin.qq.com/connect/oauth2/authorize"
f"?appid={APPID}"
f"&redirect_uri={redirect_uri}"
f"&response_type=code"
f"&scope=snsapi_userinfo"
f"&state={state}"
f"#wechat_redirect"
)
def get_wechat_userinfo(code: str) -> dict:
"""通过code获取用户信息"""
# 1. 获取access_token
token_url = "https://api.weixin.qq.com/sns/oauth2/access_token"
token_resp = requests.get(token_url, params={
"appid": APPID, "secret": SECRET,
"code": code, "grant_type": "authorization_code"
}).json()
# 2. 获取用户信息
user_url = "https://api.weixin.qq.com/sns/userinfo"
user_resp = requests.get(user_url, params={
"access_token": token_resp["access_token"],
"openid": token_resp["openid"],
"lang": "zh_CN"
}).json()
return user_resp
安全注意事项
session_key不要返回给前端- 不要用
wx.getUserInfo(已废弃),用wx.getUserProfile - 建议使用云函数处理敏感逻辑
- 定期刷新 access_token
