logo
0
0
Login

weixin Django app (minimal)

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:

  1. Create a virtualenv and install dependencies:
# 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
  1. 运行项目测试:
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
    • 打印本地或替换后的公网 authorizecallback 链接示例。

重要 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,当 scopesnsapi_userinfo 时会继续调用 sns/userinfo 拉取用户信息并以 JSON 返回。

直接触发回调(如果你已有 code)

curl 'http://127.0.0.1:8000/api/weixin/oauth/callback/?code=THE_CODE&appid=YOUR_APPID'

日志与控制

  • 日志文件: server.log(脚本会写入)。
  • 停止服务器: 在脚本输出的 PID 上运行 kill <PID>

安全与建议

  • WEIXIN_APP_SECRETS_JSON 中的 appsecret 级别很高,只能保存在服务器端,不要暴露给客户端或提交到代码仓库;生产环境请使用安全的 secret 管理(如环境变量注入、Vault)。
  • 建议在发起授权时生成并绑定 state 到用户会话,以防 CSRF;当前演示会透传 state,但不会自动验证会话。
  • 视业务需求决定是否将用户信息或授权 refresh_token 持久化到数据库;演示仅返回 JSON,不持久化用户信息。

后续工作建议

  • 为授权流程添加单元测试(mock/集成),并持久化用户数据;
  • weixin_app/models.py 添加 WeixinUser 模型以保存 openid/unionid 与用户 profile;
  • 实现 refresh_token 周期刷新与失效处理。

About

微信公众号开发

Language
Python85.1%
Shell11.2%
Dockerfile3.7%