Commit Graph

81 Commits

Author SHA1 Message Date
2ce97243ab fix: 全量代码审计修复 — 30项
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
P0 - Panic 风险修复:
  - payment.rs: unwrap() → let-else safe handling
  - payment.rs: get_jwt_secret() expect → Result/AppError
  - auth.rs: openid 切片添加 len >= 8 守卫
  - main.rs: 启动时 expect → unwrap_or_else 描述性 panic
  - main.rs: Directive::from_str 添加 fallback

P1 - 逻辑/安全修复:
  - payment.rs: urlencoding() + 解码 bug 修复 (移除 had_escape)
  - payment.rs: Mock 支付添加 check_mock_payment_allowed 检查
  - db.rs: 永久会员 NULL → 2099-12-31 一致化
  - user.rs: 维护模式添加安全说明注释
  - 自动清理 unused_variables 警告 (_is_mobile)

P2 - 错误吞没修复:
  - main.rs: 3 处定时任务 let _ = → if let Err = tracing::error!
  - db.rs + admin.rs: 7 处通知/审计日志 let _ = → tracing::warn!
  - auth.rs: refresh token 保存 add warn 日志

P3 - 死代码清理:
  - models.rs: 移除 TokenResponse (dead)
  - models.rs: 移除 AppState 中 5 个未使用字段 (env var 直接读取)
  - error.rs: 移除 3 个 dead ErrorResponse 方法
  - rate_limiter.rs: extract_client_ip_from_header → #[cfg(test)]
  - models.rs: 注释 typo fix (user_ytpe → user_type)
  - db.rs: RefreshToken 添加 deserialization 注释

Shell 脚本修复:
  - deploy.sh: run_migrations 移到 restart_service 之前
  - test.sh: 移除 EXIT trap 覆盖; heredoc 引号修复; 维护模式添加 restart
  - common.sh: mock_key 添加 sed 转义 (防 / & 注入)

验证: cargo check 0 warnings, 8 tests passed
2026-07-23 12:40:47 +08:00
0b0757939b fix: 使用请求 Host 头动态构建 notify_url + 迁移文档/测试
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
根因:base_url 默认硬编码为 dev.xmclassmate.top,导致支付宝通知回调
(notify_url)指向开发服务器,RSA2 签名验证失败,订单延迟 12 分钟。

修复:
- 新增 get_base_url():优先用 APP_BASE_URL 环境变量,否则从请求
  Host 头获取当前域名,确保 notify_url 始终指向正确的服务器
- 生产 .env 已设置 APP_BASE_URL=https://xmclassmate.top
- .env.example 新增 APP_BASE_URL 文档

迁移文档:
- SERVER-MIGRATION-PLAN.md 新增阶段 3 关键配置章节
- 12 项迁移检查清单 + 历史问题复盘

部署测试:
- test.sh 新增 test_notify_url_domain:校验支付表单 notify_url
  域名与 BASE_URL 一致,迁移后自动捕获配置错误
2026-07-23 12:09:52 +08:00
65157475cb fix: 统一使用 alipay.trade.page.pay + 支付全链路测试
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
- 因支付宝产品仅开通电脑网站支付,移除 mobile/desktop 切换
- 统一使用 alipay.trade.page.pay + FAST_INSTANT_TRADE_PAY
- 该接口在手机浏览器中也能跳转支付宝或显示移动端页面
- 新增 tests/payment_e2e_test.sh — 全链路支付测试脚本
2026-07-22 20:39:57 +08:00
6b0871f77d feat: 根据 User-Agent 自动切换手机/电脑网站支付
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
- 新增 is_mobile_ua() 检测手机浏览器(mobile/android/iphone/ipad/harmonyos)
- build_alipay_form_html 新增 is_mobile 参数
- 手机端: alipay.trade.wap.pay + QUICK_WAP_PAY
- 桌面端: alipay.trade.page.pay + FAST_INSTANT_TRADE_PAY
- 同时应用于 payment_page 和 alipay_pay_page 两个入口
2026-07-20 15:22:42 +08:00
a7ffd387d9 feat: 添加访客登录 API (POST /api/guest-login) 支持网站独立支付
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
- 新增 web_guest_login handler: 创建访客用户(免微信 code),返回 JWT
- 路由注册在公共区(无需 JWT 认证)
- /payment 页面新增「访客登录」按钮,直接选择套餐支付
- 保留微信小程序登录作为备选
- 已部署到 dev.xmclassmate.top 验证通过
2026-07-20 15:08:30 +08:00
2c86219c82 feat: Alipay 安全加固 + 切换手机网站支付 (wap.pay)
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
- Phase 1: 移除 Git 中 ALIPAY 密钥,改用 EnvironmentFile
  所有 4 个 deploy 模板删除 ALIPAY_* 内联 Environment,改为指向 .env
  check_service_file() 不再要求 ALIPAY_APP_ID 在 Environment 中
  init_env() 生成模板添加 EnvironmentFile 行

- Phase 2: 切换到手机网站支付 (alipay.trade.wap.pay)
  payment.rs: product_code QUICK_WAP_PAY, method alipay.trade.wap.pay
  用户从手机浏览器访问时自动唤起支付宝 APP

- Phase 3: 服务器 .env 文件创建
  所有环境 .env 文件已通过 SSH 创建(600 权限)
  dev 使用沙箱网关 (openapi-sandbox.dl.alipaydev.com)
  prod 使用正式网关 (openapi.alipay.com)

- 生产部署完成(blue→green 双环境同步)
  密钥安全: 不再存在于任何 Git 跟踪文件中
2026-07-20 14:52:39 +08:00
4c5c879583 fix: static_files 添加 txt 的 Content-Type 映射 2026-07-20 09:36:00 +08:00
5a5953f21f chore: 网页端名称统一改为小明计算助手
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
2026-07-17 13:33:20 +08:00
38ee5ccbc6 feat: 所有页面添加ICP备案号 浙ICP备2026052792号
Some checks failed
Deploy Backend / deploy (push) Has been cancelled
2026-07-13 17:30:06 +08:00
178008496e 优化: Keep-Alive/rate-limiter/dead-code清理 + deploy.sh蓝绿自动检测 + 压测文档 2026-07-03 19:45:57 +08:00
fb224c829f fix: 成功页sync-order轮询传JWT-实时确认支付状态 2026-06-17 10:39:33 +08:00
b220368544 fix: 退款回调同步使用手动表单解析避免GBK编码问题 2026-06-15 13:24:38 +08:00
ac49ccb552 fix: Alipay回调手动解析表单支持GBK/GB2312编码回退 2026-06-15 11:17:43 +08:00
43c349919d fix: 防止用户误取消已付款订单-回调重新激活+2分钟内禁止取消+成功页30s超时提示 2026-06-15 10:37:28 +08:00
b806d0c7e0 feat: 支付成功页轮询确认+升级页onShow自动同步pending订单 2026-06-07 10:24:52 +08:00
f8bee8f8b4 fix: 后台定时清理refresh_token+清理payment.rs死代码 2026-06-05 22:35:02 +08:00
ef05d4fed6 fix: 续费页按钮文案按用户状态区分(续费/开通) 2026-06-02 13:21:05 +08:00
12437975f3 feat: 网页续费页UI大改-横向卡片布局+续费文案+响应式优化 2026-06-02 13:19:22 +08:00
f7f8a1e03f fix: 全站文案统一为环境计算助手 2026-06-02 13:16:42 +08:00
173bd25d74 fix: 网页端支付页响应式设计-紧凑布局+手机端适配 2026-06-02 13:13:55 +08:00
ebf2fcc383 fix: 网页端已付费用户显示续费套餐(原只显示会员信息无套餐) 2026-06-02 13:11:43 +08:00
62386052c8 fix: 首页文案大气稳定度判定→环境计算助手 2026-06-02 13:08:44 +08:00
0db36dd0f0 fix: 二维码改用静态文件(static/QR.jpg)代替损坏的内联base64 2026-06-02 13:06:32 +08:00
c27c86d764 feat: 首页添加微信小程序二维码+fix: switch-env.sh容器内路径 2026-06-02 13:04:12 +08:00
2c0bdf18ce fix: Mock支付增加MOCK_PAY_KEY密钥验证(规则:支付宝优先>启用开关>请求头签名) 2026-06-02 12:08:05 +08:00
5d6be08f32 fix: 修复2个支付安全漏洞-未经认证的payment_success确认+未禁用mock_confirm 2026-06-02 11:46:26 +08:00
bcd9bc81e4 fix: 创建订单前查重-防止同一用户同一套餐重复pending订单 2026-06-02 11:38:23 +08:00
6893fcb5d9 feat: 根页面改为小程序介绍页(响应式设计) 2026-05-31 23:22:59 +08:00
49b32a8b2d fix: 添加季卡/半年卡HTML卡片+原价删除线显示 2026-05-27 09:30:54 +08:00
55259a96a6 fix: 套餐定价更新+新增季卡/半年卡+SQL interval适配 2026-05-27 09:18:20 +08:00
8d7e9d8ca1 fix: notifications查询type列别名与sqlx rename冲突导致500 2026-05-26 15:08:57 +08:00
640f57b6da feat: 通知系统(notifications表+CRUD接口+管理员接口) 2026-05-26 15:02:49 +08:00
80434047df fix: 支付页面文案-检测额度→存储空间,无限次→无限制 2026-05-26 10:35:54 +08:00
da4af50b45 fix: mock_login支持X-Mock-Key请求头鉴权 + deploy自动配置随机密钥 2026-05-25 16:27:01 +08:00
722ab837d0 refactor: is_paid→is_member, paid_expires_at→membership_expires_at 全局重命名 2026-05-25 15:33:31 +08:00
94ad9ba190 fix: payment_page支持resume参数复用已有待支付订单 2026-05-25 14:59:33 +08:00
ae46e0b0fc fix: sync-order仅查询状态不确认订单(防止误激活) 2026-05-25 14:50:43 +08:00
d5f87d3d85 fix: rsa2_sign后备逻辑改为from_pkcs8_der(支持裸Base64私钥) 2026-05-25 14:13:32 +08:00
e6e04979dc fix: get_user_quota 返回 was_paid 字段 2026-05-25 13:45:55 +08:00
fed95531fe fix: 维护模式使用500条临时限额而非完全跳过(防滥用) 2026-05-25 13:34:40 +08:00
f82dd8d5de feat: 添加PAYMENT_MAINTENANCE_MODE维护模式 + ServiceUnavailable错误 2026-05-25 13:32:16 +08:00
72cbb8ff28 fix: 添加用户取消订单 + 管理员手动退款端点 2026-05-25 13:09:54 +08:00
5f3b919e92 fix: 添加后台定时重试 + 管理员强制确认 + 审计日志 + mock守卫 2026-05-25 13:04:19 +08:00
af2837e15e fix: 修复付费机制失效处理的5个后端缺口
- 新增POST /payment/refund-notify支付宝退款Webhook
- 新增待支付订单自动清理(超过24h→cancelled, 含启动清理)
- 新增web登录码过期启动清理
- 永久会员用NULL替代硬编码2099-12-31
- 修复缺失的is_paid_active数据库函数(改用内联SQL)
2026-05-25 12:07:15 +08:00
moira
f8a95c7417 feat: 集成 Sentry 错误监控 + 前端错误上报中继
后端:
  - Cargo.toml 添加 sentry/sentry-actix/sentry-tracing (v0.48)
  - main.rs 条件初始化 Sentry(SENTRY_DSN 环境变量控制)
  - 新增 handlers/sentry.rs — POST /api/sentry/events 前端中继端点
  - sentry-actix 全局中间件 + sentry-tracing 自动捕获 tracing::error!
  - .env.example 添加 SENTRY_DSN / SENTRY_TRACES_SAMPLE_RATE 配置

前端:
  - 新增 utils/sentryReporter.ts (批量上报/防抖/开发环境跳过)
  - app.ts 全局错误处理接入 Sentry (wx.onError/onUnhandledRejection/onPageNotFound)

Sentry 未配置 DSN 时完全无操作,无性能开销
2026-05-14 10:12:09 +08:00
moira
27c8979690 fix: 全量代码审计修复—安全/死代码/错误处理/配置净化
P0 安全修复:
  - 支付宝回调验签 (alipay_notify BTreeMap + rsa2_verify)
  - JWT fallback 'default_secret' 改为 .expect() (panic保底)
  - 安全响应头中间件 (CSP/X-Frame-Options/HSTS)

P1 死代码清理:
  - 移除孤儿文件 src/alipay.rs (284行, 无mod注册)
  - 移除Cargo未使用依赖 (actix-files/error/log/hex/digest)
  - log::info! → tracing::info! (auth.rs)
  - 移除 config.rs server_host + 3个TOML定义

P1 质量修复:
  - 修复 weather.rs unwrap() → unwrap_or
  - 修复 auth.rs+payment.rs 错误吞咽 (add tracing::warn)
  - 修复 main.rs 3x parse().unwrap → unwrap_or

P3 运维:
  - 新增 scripts/backup-db.sh (定时备份用)
  - 新增 README.md (快速入门文档)
  - deploy.sh 集成 backup-db.sh 上传
2026-05-13 17:20:31 +08:00
061c2bbb5a fix: 修复多处代码质量问题-移除unwrap/println/dead-code/重复代码/错误吞咽 2026-05-11 13:38:41 +08:00
2c66528205 fix: goPay 加载状态、轮询 5min 超时;成功页已有小程序引导 2026-05-07 17:33:30 +08:00
df64877a5d fix: 推荐标签移到包年;清理永久套餐的残留 CSS 2026-05-07 17:30:11 +08:00
e074171d44 fix: 网页端套餐只保留包月和包年,移除永久 2026-05-07 17:26:16 +08:00