gjm
|
cfb2a36c87
|
feat: 阶段 2 - /usage/consume、pending 授权惰性激活
- usage.py: POST /usage/consume,事务内校验会话(严格 device_id)、
激活 pending、按 time/points 分支扣减;失败返回 ok:false + reason
- 积分扣减用条件 UPDATE 原子完成,status 赋值写在自减之前
(MySQL SET 从左到右求值,否则 IF 读到已减 1 的值,判空差 1)
- 时间授权 usage_logs 按 (user_id, device_id) 60 秒节流;积分每次必写
- auth.py: 新增 activate_pending_authorization(),失效 active 后
FIFO 激活 pending,时间授权按原时长从当前时刻重新锚定
- get_status/handle_scan 接入惰性激活;get_status 改事务包裹
- _get_active_authorization/_serialize_authorization 改公开供 usage 复用
- config/.env.example: 新增 USAGE_LOG_THROTTLE_SECONDS
|
2026-09-27 15:00:02 +08:00 |
|
gjm
|
a798fbad60
|
fix: need_purchase 时微信回复文案不再误报"授权成功"
handle_scan() 原先只返回场景是否绑定成功,导致无可用授权的用户扫码后
微信里收到"授权成功"、而 MFC 轮询拿到 need_purchase,提示不一致。
改为返回 authorized / need_purchase / invalid 三种结果,与 /auth/status
的 status 取值保持一致,wechat.py 据此选择回复文案。
|
2026-09-26 23:58:20 +08:00 |
|
gjm
|
3790821ce0
|
feat: 阶段 1 最小闭环 - 建表 SQL、/wechat 事件、/auth 接口、首次关注免费授权
- sql/schema.sql: users/authorizations/auth_scenes/usage_logs + sessions 建表
- db.py: aiomysql 连接池,lifespan 内初始化与释放
- wechat_api.py: access_token 缓存 + 临时二维码创建
- auth.py: /auth/create_scene、/auth/status,handle_scan 事务内幂等处理扫码
- wechat.py: 接入 DB 生命周期,处理 subscribe/SCAN 事件;移除多余的 openid query 参数
- 首次关注赠送 7 天免费授权,has_claimed_free 条件更新保证幂等
- config.py/.env.example: 新增 FREE_AUTH_DAYS/SCENE_TTL_SECONDS/SESSION_TTL_HOURS
|
2026-09-26 22:25:02 +08:00 |
|
gjm
|
a2185104ad
|
Add FastAPI wechat app: config, wechat handler, run scripts, requirements, env template
|
2026-09-25 20:58:11 +08:00 |
|