This workspace contains a minimal Django project and an app weixin_app that
implements a helper to fetch Weixin access tokens and a unit test that mocks
the external HTTP call.
To run tests locally:
# weixin Django app (minimal)
该仓库包含一个最小的 Django 项目和 `weixin_app` 应用,主要实现:
- 服务端获取并管理 Weixin 全局 access_token(存库并短期本地缓存);
- 支持微信网页授权(SNS OAuth)——引导授权、用 `code` 换取用户授权 token、拉取用户信息。
**快速开始(测试环境)**
1. 创建虚拟环境并安装依赖:
```bash
python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
python manage.py test
微信网页授权演示(本仓库已提供脚本)
scripts/run_oauth_demo.sh:会创建/复用 .venv,安装依赖并以指定端口启动 Django 开发服务器(后台),并把日志写入 server.log。export WEIXIN_APP_SECRETS_JSON='{"YOUR_APPID":"YOUR_APPSECRET"}'
export CNB_VSCODE_PROXY_URI='https://fjisdofi21-{{port}}.cnb.run'
./scripts/run_oauth_demo.sh 8000
环境变量说明:
WEIXIN_APP_SECRETS_JSON: 必需(在演示中)——JSON 字符串,格式为 {"APPID":"APPSECRET"},用于服务端在回调时查找对应的 app secret(仅保存在服务器端)。CNB_VSCODE_PROXY_URI: 可选——如果你使用端口转发(如 cnb.run),设置其模板值(包含 {{port}} 占位符),脚本会替换并打印公网访问 URL。脚本行为:
.venv(若不存在);requirements.txt 中的依赖;manage.py runserver 0.0.0.0:<port>,后台运行,日志写入 server.log;authorize 与 callback 链接示例。重要 HTTP 路由(演示用)
引导用户进入授权页(服务端重定向到微信授权链接):
GET /api/weixin/oauth/authorize/?appid=<APPID>&scope=<SCOPE>&state=<STATE>http://127.0.0.1:8000/api/weixin/oauth/authorize/?appid=YOUR_APPID&scope=snsapi_userinfo&state=test回调(微信会带 code 回调到此处):
GET /api/weixin/oauth/callback/?code=<CODE>&appid=<APPID>&state=<STATE>WEIXIN_APP_SECRETS_JSON 中对应的 secret 调用 https://api.weixin.qq.com/sns/oauth2/access_token 换取用户授权 access_token,当 scope 为 snsapi_userinfo 时会继续调用 sns/userinfo 拉取用户信息并以 JSON 返回。直接触发回调(如果你已有 code)
curl 'http://127.0.0.1:8000/api/weixin/oauth/callback/?code=THE_CODE&appid=YOUR_APPID'
日志与控制
server.log(脚本会写入)。kill <PID>。安全与建议
WEIXIN_APP_SECRETS_JSON 中的 appsecret 级别很高,只能保存在服务器端,不要暴露给客户端或提交到代码仓库;生产环境请使用安全的 secret 管理(如环境变量注入、Vault)。state 到用户会话,以防 CSRF;当前演示会透传 state,但不会自动验证会话。refresh_token 持久化到数据库;演示仅返回 JSON,不持久化用户信息。后续工作建议
weixin_app/models.py 添加 WeixinUser 模型以保存 openid/unionid 与用户 profile;refresh_token 周期刷新与失效处理。