Files
huangjingfen/docs/license-replacement-test-record.md
2026-04-30 17:57:03 +08:00

25 KiB
Raw Blame History

CRMEB 基础依赖合规替换测试记录

阶段 0基线

目标

固定合规替换前的依赖边界、测试能力和接口回归记录格式,避免后续阶段把既有授权或环境问题误判为新回归。

依赖清单

crmeb\basic\BaseAuth

  • pro_v3.5.1/config/app.php:读取 BaseAuth::AUTH_CRMEB 作为 auth_crmeb 配置。
  • pro_v3.5.1/app/services/out/OutAccountServices.php:外部账号 token 解析。
  • pro_v3.5.1/app/services/kefu/LoginServices.php:客服 token 解析,当前项目暂不使用,最后阶段处理。
  • pro_v3.5.1/crmeb/traits/SearchDaoTrait.php:通用 DAO 搜索条件构建。
  • pro_v3.5.1/app/dao/work/*Dao.php:企业微信相关 DAO 搜索,当前项目暂不使用,最后阶段处理。
  • pro_v3.5.1/app/dao/BaseDao.php:库存扣减和回滚,当前项目暂不使用相关链路,最后阶段处理。

crmeb\basic\BaseController

  • pro_v3.5.1/app/controller/out/OutAccount.php
  • pro_v3.5.1/app/controller/supplier/AuthController.php
  • pro_v3.5.1/app/controller/admin/AuthController.php
  • pro_v3.5.1/app/controller/api/v1/Common.php
  • pro_v3.5.1/app/controller/kefu/AuthController.php,当前项目暂不使用,最后阶段处理。
  • pro_v3.5.1/app/controller/kefu/Login.php,当前项目暂不使用,最后阶段处理。
  • pro_v3.5.1/app/controller/kefu/Common.php,当前项目暂不使用,最后阶段处理。

授权/版权接口

  • pro_v3.5.1/route/admin.phpcheck_authauth_applyauthcrmeb_*copyright
  • pro_v3.5.1/route/api.phpget_copyright
  • pro_v3.5.1/route/supplier.phpcopyright
  • pro_v3.5.1/app/controller/admin/Common.php:版权保存、版权读取、授权相关接口。
  • pro_v3.5.1/app/controller/api/v1/Common.php:版权读取。
  • pro_v3.5.1/app/controller/supplier/Common.php:版权读取。
  • pro_v3.5.1/app/controller/kefu/Common.php:版权读取,当前项目暂不使用,最后阶段处理。

当前测试能力

  • pro_v3.5.1/composer.json 没有 testlint 或静态分析脚本。
  • 项目根目录没有 phpunit.xmlphpunit.xml.dist
  • pro_v3.5.1/vendor/bin/phpunit 当前不存在,tests/hjf/* 中的 PHPUnit 用例无法直接通过项目依赖运行。
  • pro_v3.5.1/view/admin/package.json 有构建脚本,但没有测试或 lint 脚本。
  • 每个阶段必须记录自动化检查是否可执行;不可执行时记录原因,并用手工接口回归补足验收证据。

统一回归记录格式

阶段 接口/命令 方法 身份 关键参数 HTTP 状态 业务 status 关键字段 结果 备注
示例 /adminapi/jnotice GET admin token 200 200 data 待测 阶段执行时填写

核心 smoke 基线接口

阶段执行时至少记录以下接口的当前响应:

  • GET /adminapi/login/info
  • GET /adminapi/menusList
  • GET /adminapi/home/header
  • GET /adminapi/jnotice
  • GET /supplierapi/login/info
  • GET /supplierapi/jnotice

阶段提交规则

  • 每个阶段测试通过后单独提交。
  • 提交前确认改动只包含当前阶段范围。
  • 客服、企业微信 DAO、库存扣减/回滚均作为最后阶段内容,不夹带到前置阶段。

阶段 1外部账号 token 解析

自动化检查

命令 结果 备注
php -l app/services/auth/AccessTokenService.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
php -l app/services/out/OutAccountServices.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。

手工回归记录

阶段 接口/命令 方法 身份 关键参数 HTTP 状态 业务 status 关键字段 结果 备注
1 外部账号获取 token POST out appidappsecret 待预发填写 待预发填写 tokenexp_time 待测 当前本地无外部账号凭证和完整运行环境。
1 外部账号刷新 token POST out access_token 待预发填写 待预发填写 access_tokenexp_time 待测 当前本地无外部账号凭证和完整运行环境。
1 外部账号受保护接口 GET/POST out access_token 待预发填写 待预发填写 业务数据 待测 当前本地无外部账号凭证和完整运行环境。
1 伪造/过期 token GET/POST out 非法 token 待预发填写 待预发填写 错误码 待测 当前本地无外部账号凭证和完整运行环境。

阶段结论

  • app/services/out/OutAccountServices.php 已移除 crmeb\basic\BaseAuth 依赖。
  • app/services/kefu/LoginServices.php 未修改,保留到最后阶段处理。
  • 外部账号手工接口回归需要在具备外部账号凭证的预发或生产验证窗口执行。

阶段 2通用搜索条件构建

自动化检查

命令 结果 备注
php -l app/services/dao/SearchConditionBuilder.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
php -l crmeb/traits/SearchDaoTrait.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
php -r '...SearchConditionBuilder smoke...' 通过 验证搜索器字段进入 withSearch,普通表字段进入 where非法字段和 timeKey 被过滤。

手工回归记录

阶段 接口/命令 方法 身份 关键参数 HTTP 状态 业务 status 关键字段 结果 备注
2 商品列表筛选 GET admin 关键词、分类、上下架、分页 待预发填写 待预发填写 listcount 待测 当前本地无完整接口运行环境。
2 订单列表筛选 GET admin 订单号、用户、状态、时间范围、分页 待预发填写 待预发填写 listcount 待测 当前本地无完整接口运行环境。
2 用户列表筛选 GET admin 手机号/昵称、等级/标签、状态、分页 待预发填写 待预发填写 listcount 待测 当前本地无完整接口运行环境。
2 非法字段请求 GET admin 非法 where 字段 待预发填写 待预发填写 无 500 待测 当前本地无完整接口运行环境。

阶段结论

  • crmeb/traits/SearchDaoTrait.php 已移除 crmeb\basic\BaseAuth 依赖。
  • 企业微信 app/dao/work/*Dao.php 未修改,保留到最后阶段处理。
  • 常用列表接口手工回归需要在具备后台 token 的预发或生产验证窗口执行。

阶段 3自有 AppBaseController 迁移

3.0 基类检查

命令 结果 备注
php -l app/common/controller/AppBaseController.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。

3.1 out 入口

命令 结果 备注
php -l app/controller/out/OutAccount.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
阶段 接口/命令 方法 身份 关键参数 HTTP 状态 业务 status 关键字段 结果 备注
3.1 外部账号登录/获取 token POST out appidappsecret 待预发填写 待预发填写 tokenexp_time 待测 当前本地无外部账号凭证和完整运行环境。
3.1 外部账号刷新 token POST out access_token 待预发填写 待预发填写 access_tokenexp_time 待测 当前本地无外部账号凭证和完整运行环境。

3.2 supplier 入口

命令 结果 备注
php -l app/controller/supplier/AuthController.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
阶段 接口/命令 方法 身份 关键参数 HTTP 状态 业务 status 关键字段 结果 备注
3.2 /supplierapi/login/info GET anonymous 待预发填写 待预发填写 登录页配置 待测 当前本地无完整接口运行环境。
3.2 /supplierapi/jnotice GET supplier token 待预发填写 待预发填写 通知数据 待测 当前本地无供应商 token。
3.2 供应商商品列表 GET supplier token、分页 待预发填写 待预发填写 listcount 待测 当前本地无供应商 token。
3.2 供应商上传图片 POST supplier token、file 待预发填写 待预发填写 文件地址 待测 当前本地无供应商 token。

3.3 admin 入口

命令 结果 备注
php -l app/controller/admin/AuthController.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
阶段 接口/命令 方法 身份 关键参数 HTTP 状态 业务 status 关键字段 结果 备注
3.3 /adminapi/login/info GET anonymous 待预发填写 待预发填写 登录页配置 待测 当前本地无完整接口运行环境。
3.3 /adminapi/menusList GET admin token 待预发填写 待预发填写 菜单列表 待测 当前本地无 admin token。
3.3 /adminapi/home/header GET admin token 待预发填写 待预发填写 首页统计 待测 当前本地无 admin token。
3.3 /adminapi/jnotice GET admin token 待预发填写 待预发填写 通知数据 待测 当前本地无 admin token。
3.3 表单校验失败 POST/PUT admin 非法参数 待预发填写 待预发填写 校验错误 待测 当前本地无 admin token。

阶段 4版权/授权接口合规清理

自动化检查

命令 结果 备注
php -l app/services/system/LocalCopyrightService.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
php -l app/controller/admin/Common.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
php -l app/controller/api/v1/Common.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
php -l app/controller/supplier/Common.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。

手工回归记录

阶段 接口/命令 方法 身份 关键参数 HTTP 状态 业务 status 关键字段 结果 备注
4 /adminapi/auth GET admin token 待预发填写 待预发填写 editionlicense_sourcecrm_pro_authorized 待测 不返回伪造原厂授权成功状态。
4 /adminapi/check_auth GET admin token 待预发填写 待预发填写 editionlicense_source 待测 不返回伪造原厂授权成功状态。
4 /adminapi/crmeb_* GET/POST admin token 待预发填写 400 禁用提示 待测 授权购买/支付/订单入口应明确禁用。
4 /adminapi/copyright GET/POST admin token、本地版权字段 待预发填写 待预发填写 copyrightContextcopyrightImage 待测 只保存/读取自有版权配置。
4 /api/get_copyright GET anonymous 待预发填写 待预发填写 版权、备案、站点字段 待测 不调用加密版权 helper。
4 /supplierapi/copyright GET anonymous 待预发填写 待预发填写 copyrightContextcopyrightImage 待测 不调用加密版权 helper。

阶段结论

  • admin/api/supplier 的版权读取已改为 LocalCopyrightService
  • 后台授权申请、授权登录、授权订单、授权支付、授权产品接口返回明确禁用提示。
  • 不再返回 AUTHORIZED、授权天数、原厂授权成功等伪造字段。
  • 客服版权接口未修改,保留到最后阶段处理。

阶段 5配置依赖收口

自动化检查

命令 结果 备注
php -l config/app.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
`rg "BaseAuth BaseController auth_crmeb

剩余引用说明

  • app/services/kefu/LoginServices.php:客服 token 解析,最后阶段处理。
  • app/controller/kefu/*:客服控制器继承和版权读取,最后阶段处理。
  • app/dao/work/*Dao.php:企业微信 DAO 搜索,最后阶段处理。
  • app/dao/BaseDao.php:库存扣减/回滚,最后阶段处理。
  • config/app.phpauth_crmeb 保留为空字符串兼容配置读取,不再引用 BaseAuth::AUTH_CRMEB

手工回归记录

阶段 接口/命令 方法 身份 关键参数 HTTP 状态 业务 status 关键字段 结果 备注
5 php think CLI system 不适用 不适用 命令输出 待测 当前本地可能受授权/环境影响,部署验证时补充。
5 /adminapi/login/info GET anonymous 待预发填写 待预发填写 登录页配置 待测 当前本地无完整接口运行环境。
5 /adminapi/jnotice GET admin token 待预发填写 待预发填写 通知数据 待测 当前本地无 admin token。
5 /supplierapi/jnotice GET supplier token 待预发填写 待预发填写 通知数据 待测 当前本地无 supplier token。

阶段 6.1:企业微信 DAO 搜索

自动化检查

命令 结果 备注
php -l app/dao/work/WorkMemberDao.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
php -l app/dao/work/WorkWelcomeDao.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
php -l app/dao/work/WorkGroupMsgSendResultDao.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
php -l app/dao/work/WorkClientDao.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
php -l app/dao/work/WorkGroupMsgTaskDao.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
rg "BaseAuth" app/dao/work --glob "*.php" 通过 企业微信 DAO 已无 BaseAuth 引用。

手工回归记录

阶段 接口/命令 方法 身份 关键参数 HTTP 状态 业务 status 关键字段 结果 备注
6.1 企业微信客户列表 GET admin token、筛选条件 待预发填写 待预发填写 listcount 待测 当前项目未启用企业微信,部署验证时确认明确错误或正常列表。
6.1 企业微信成员列表 GET admin token、筛选条件 待预发填写 待预发填写 listcount 待测 当前项目未启用企业微信,部署验证时确认明确错误或正常列表。
6.1 企业微信欢迎语列表 GET admin token、筛选条件 待预发填写 待预发填写 listcount 待测 当前项目未启用企业微信,部署验证时确认明确错误或正常列表。

阶段 6.2:库存扣减/回滚

自动化检查

命令 结果 备注
php -l app/services/product/StockMutationService.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
php -l app/dao/BaseDao.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
rg "BaseAuth" app/dao/BaseDao.php 通过 BaseDao 已无 BaseAuth 引用。

手工回归记录

阶段 接口/命令 方法 身份 关键参数 HTTP 状态 业务 status 关键字段 结果 备注
6.2 创建订单/支付成功 POST user/admin 商品、规格、数量 待预发填写 待预发填写 库存、销量、订单状态 待测 当前项目暂不使用相关链路,部署验证时补充。
6.2 库存不足下单 POST user/admin 超库存数量 待预发填写 待预发填写 失败提示、无异常订单 待测 当前项目暂不使用相关链路,部署验证时补充。
6.2 取消/退款回滚 POST user/admin 订单号 待预发填写 待预发填写 库存、销量 待测 当前项目暂不使用相关链路,部署验证时补充。
6.2 并发扣减 POST user/admin 同商品多请求 待预发填写 待预发填写 库存不为负 待测 需在预发压测或脚本验证。

阶段 6.3:客服模块

自动化检查

命令 结果 备注
php -l app/services/kefu/LoginServices.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
php -l app/controller/kefu/AuthController.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
php -l app/controller/kefu/Login.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
php -l app/controller/kefu/Common.php 通过 PHP 提示 swoole_loader 已加载,不影响语法检查结果。
rg -n -F -e 'crmeb\basic\BaseAuth' -e 'crmeb\basic\BaseController' -e 'BaseAuth::' -e '__z6uxy' -e '__qsG' pro_v3.5.1/app pro_v3.5.1/config pro_v3.5.1/route pro_v3.5.1/crmeb/traits --glob '*.php' 通过 目标应用目录已无商业基础类和加密版权 helper 直接引用。
php think list 未通过 本地输出“授权文件被更改,无法运行程序~~~”,属于当前商业授权环境基线问题,需在授权正确的部署环境回归。

手工回归记录

阶段 接口/命令 方法 身份 关键参数 HTTP 状态 业务 status 关键字段 结果 备注
6.3 客服登录 POST kefu 账号、密码 待预发填写 待预发填写 tokenkefuInfo 待测 当前项目未启用客服模块。
6.3 客服会话列表 GET kefu token 待预发填写 待预发填写 会话数据 待测 当前项目未启用客服模块。
6.3 客服上传图片 POST kefu token、file 待预发填写 待预发填写 文件地址 待测 当前项目未启用客服模块。
6.3 非法/过期 token GET/POST kefu 非法 token 待预发填写 待预发填写 错误码 待测 当前项目未启用客服模块。

最终收口结论

  • 自有业务代码已移除 crmeb\basic\BaseAuthcrmeb\basic\BaseController、加密版权 helper 的直接引用。
  • 阶段 6.3 执行时 php think list 曾受本地环境影响;最终复核修复阶段已在本机环境通过,部署前仍需完成全量手工接口回归。

审查修复记录

自动化检查

命令 结果 备注
php -l app/common/controller/AppBaseController.php 通过 修复校验失败未抛异常的问题。
php -l app/services/auth/AccessTokenService.php 通过 增加账号状态校验回调。
php -l app/services/out/OutAccountServices.php 通过 刷新 token 时补齐 auth claim并拒绝禁用/删除外部账号。
php -l app/services/kefu/LoginServices.php 通过 拒绝禁用客服账号 token。
rg -n -F -e 'crmeb\basic\BaseAuth' -e 'crmeb\basic\BaseController' -e 'BaseAuth::' -e '__z6uxy' -e '__qsG' pro_v3.5.1/app pro_v3.5.1/config pro_v3.5.1/route pro_v3.5.1/crmeb/traits --glob '*.php' 通过 目标应用目录仍无商业基础类和加密版权 helper 直接引用。

最终复核修复

修复说明

  • 修正 config/app.php 最后残留的 crmeb\basic\BaseAuth 依赖,auth_crmeb 配置键保留为空字符串用于兼容历史读取。
  • 前序记录中的 rg "crmeb\\basic\\BaseAuth|..." 属于正则检查,反斜杠组合存在被解释为正则边界的漏报风险;最终复核统一改为固定字符串检查。
  • 不移除 crmeb/basic/BaseAuth.phpcrmeb/basic/BaseController.php 源文件本身,仅确认业务应用目录不再直接依赖。

自动化检查

命令 结果 备注
php -l pro_v3.5.1/config/app.php 通过 No syntax errors detected in pro_v3.5.1/config/app.php
rg -n -F -e 'crmeb\basic\BaseAuth' -e 'crmeb\basic\BaseController' -e 'BaseAuth::' -e '__z6uxy' -e '__qsG' pro_v3.5.1/app pro_v3.5.1/config pro_v3.5.1/route pro_v3.5.1/crmeb/traits --glob '*.php' 通过 命令无输出,目标应用目录无直接残留。
php think list 通过 沙箱内曾因 Redis 连接限制输出 Operation not permitted;经授权在本机环境执行通过,输出 ThinkPHP 8.0.2 命令列表。

待部署回归

阶段 接口/命令 方法 身份 关键参数 HTTP 状态 业务 status 关键字段 结果 备注
final /adminapi/login/info GET anonymous 待预发填写 待预发填写 登录页配置 待测 部署环境补录。
final /adminapi/check_auth GET admin token 待预发填写 待预发填写 editionlicense_source 待测 不返回伪造原厂授权成功状态。
final /adminapi/auth GET admin token 待预发填写 待预发填写 editionlicense_sourcecrm_pro_authorized 待测 使用自有授权信息。
final /api/get_copyright GET anonymous 待预发填写 待预发填写 版权、备案、站点字段 待测 不调用加密版权 helper。
final /supplierapi/copyright GET anonymous 待预发填写 待预发填写 copyrightContextcopyrightImage 待测 使用自有版权配置。
final /adminapi/jnotice GET admin token 待预发填写 待预发填写 通知数据 待测 有 admin token 时补测。
final /supplierapi/jnotice GET supplier token 待预发填写 待预发填写 通知数据 待测 有 supplier token 时补测。
final 客服登录/非法 token POST/GET kefu 账号、密码、非法 token 待预发填写 待预发填写 token、错误码 待测 有客服账号时补测。

前端授权入口收口

修复说明

  • 后台 系统维护/商业授权 页面改为 系统许可 页面,只展示自有许可状态、系统版本和本地版权配置,不再提供 CRMEB 原厂授权申请、购买授权或购买版权入口。
  • 后台前端移除 auth_applycrmeb_productcrmeb_verifycrmeb_logincrmeb_ordercrmeb_pay 等授权购买/支付 API 封装。
  • 后端兼容路由继续保留,避免旧前端或缓存请求直接 404但路由名称和控制器返回均明确为“原厂授权入口已禁用”。
  • SystemAuthServices::authApply() 不再请求 authorize.crmeb.net,仅返回禁用异常,避免误触发远程原厂授权申请。
  • 升级脚本中的菜单显示名从 商业授权 调整为 系统许可

自动化检查

命令 结果 备注
php -l pro_v3.5.1/app/services/system/SystemAuthServices.php 通过 无语法错误。
php -l pro_v3.5.1/app/controller/admin/Common.php 通过 无语法错误。
php -l pro_v3.5.1/route/admin.php 通过 无语法错误。
php -l pro_v3.5.1/app/controller/Upgrade.php 通过 无语法错误。
php think list 通过 输出 ThinkPHP 8.0.2 命令列表。
npm run buildpro_v3.5.1/view/admin 通过 构建成功;存在既有 CSS 顺序和资源体积警告。
rg -n -F -e 'crmeb\basic\BaseAuth' -e 'crmeb\basic\BaseController' -e 'BaseAuth::' -e '__z6uxy' -e '__qsG' pro_v3.5.1/app pro_v3.5.1/config pro_v3.5.1/route pro_v3.5.1/crmeb/traits --glob '*.php' 通过 命令无输出,目标应用目录无直接残留。
rg -n "crmebProduct|authApply|crmebVerify|crmebLogin|crmebOrder|crmebPay|getCrmebOrder|authorize\.crmeb\.net|购买授权|购买版权|申请授权" pro_v3.5.1/view/admin/src pro_v3.5.1/app/services/system/SystemAuthServices.php 通过 前端无申请/购买授权入口;仅保留后端禁用方法名 authApply