Files
juzi/taobao/README.md
T
xsl 9eec4369da feat(taobao): add native mini program with shared backend
Preserve H5 flows while adding Taobao identity, native capture, reports and isolated local development. Fix canceled province selection and expired-session logout. Record passing local regressions, two pre-existing H5 assertion failures and pending platform validation.
2026-10-19 20:14:31 +08:00

100 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 淘宝小程序开发说明
当前完成本地开发闭环:授权登录 → 基础档案 → 正/右/左三步手动拍摄或相册选图 → 服务端检测 → 七项报告 → 最近5份历史报告。真实淘宝授权、云网关、相机和图片组件仍需在关联 AppKey 的淘宝 IDE 与真机中验收。
## 本地启动
在本目录运行:
```powershell
npm ci
npm run dev:backend
```
只监听回环地址:
- `http://127.0.0.1:18180`:本地 H5 与淘宝网关模拟代理。
- `http://127.0.0.1:18181`:实际共享 Node 后端。
- `http://127.0.0.1:18180/dev/health`:确认样本模式。
- `../temp/taobao-local-data/`:隔离的账号、照片、检测记录和报告。不会读写现有 `h5/data/`。
代理使用固定的本地测试身份并模拟淘宝网关签名;Face++ 返回仓库内的固定样本。模拟逻辑仅在开发启动脚本中,正式服务器不会接受客户端自报 `open_id`,也没有免验签的开发登录后门。本地 H5 的微信入口不启用;微信 `/state/` 授权由独立浏览器回归验证。
`config.js` 当前是本地配置:`transport: 'direct'`、端口18180。直连传输只允许 localhost/127.0.0.1;不要把它当成淘宝正式网络方案。IDE 中导入本目录并关联自己的 AppKey。桌面模拟器是否允许访问回环地址需以实际 IDE 为准;手机上的127.0.0.1指向手机自身。
## 文件职责
首页右上角“开发调试 · 相机验收”可直接进入相机页,不依赖淘宝登录、本地后端或网络。也可在IDE启动参数中指定页面 `pages/camera/camera`、参数 `debug=camera`。入口需要同时满足 `config.js` 中 `environment: 'development'`、`cameraDebug: true`、本机直连配置;改为正式/cloud配置后入口关闭,单独拼参数也不能绕过登录。
验收时先开启相机,按正脸→右脸→左脸拍摄/确认,第三张完成后仅在本页验证JPEG压缩并展示三张原始预览与压缩尺寸,不发检测请求、不生成报告、不播放远程语音,也不会写入正式档案/报告状态。临时预览用于检查前置照片方向;页面不判断拍摄姿态是否合格。退出时清空本页照片引用。
依次检查:首次授权、拒绝后相册仍可使用、授权设置恢复、前后镜头、三张方向、切后台恢复、压缩最长边≤1280。真实系统权限和相机画面仍需淘宝IDE/手机验收,自动测试仅验证代码流程。
- `pages/splash`:协议同意、淘宝授权登录、退出和历史入口。
- `pages/profile`:账号隔离的基础信息缓存、出生年月和省市滚轮、肤质选择。
- `pages/camera`:手动三步拍摄/预览确认;离页取消、重复点击保护;单画布顺序压缩成最长边1280的 JPEG。
- `pages/report`:服务端返回的当前评分/话术、七项分析、护理选三、精华、真实图层和坐标标注;侧脸图层异步加载。
- `pages/history`:本人最近5份完整报告。
- `utils/transport.js`:本机代理或淘宝云 SDK 传输,保留反代子路径配置。
- `utils/api.js`:账号凭据、64KiB照片分片、检测任务提交与轮询、历史报告。
- `vendor/`:从 H5 同步的评分、报告呈现、文案及哈希清单,不手工修改。
- `scripts/`、`test/`、`docs/`:开发与回归文件,IDE 配置排除上传。
H5 规则变更后运行 `npm run sync:shared`;`npm run check:shared` 会检查逐字节一致。在线报告优先使用服务端返回的 `vm/presentation`,原始检测分数和展示肌龄分别保存。
## 账号与共享后端
正式淘宝请求走 `cloud.application.httpRequest`。登录分两步:先获取60秒一次性 challenge,再发送经网关签名、含 challenge 与同意标记的登录请求。服务端验证全部查询参数和原始请求体的签名,从网关注入的 `open_id` 建立 `kind: taobao` 的稳定账号;不依赖前端上报身份。账号键保存为 appKey/openId 的哈希。
淘宝使用独立 Bearer 会话,微信继续使用原有 Cookie。两种会话不能互换。共用 `accounts` 存储和报告格式,按服务端身份隔离历史、图片上传、检测任务和侧脸标注。
新检测记录自动标记 `h5` 或 `taobao`,不信任请求体中的 `channel`。历史没有该字段的记录视为 H5。管理 API 支持 `?channel=taobao` 筛选;统计返回 `by_channel`;CSV在末尾追加渠道列,旧列的位置保持不变。后台页面本轮没有改布局。
## 云网关接入准备
这里仅说明未来配置,不会自动部署。
1. 关联淘宝 AppKey 与外部云应用,配置域名与资源域名权限。
2. 只在后端环境配置 `TAOBAO_APP_KEY`、`TAOBAO_APP_SECRET`;Face++ 密钥沿用现有服务端设置。所有 Secret 均不得进入小程序代码。
3. `config.js` 设置 `environment: 'production'`、`cameraDebug: false`、`transport: 'cloud'`、HTTPS `baseUrl`、`cloudAppId`、资源 `assetBase`。如果使用原来的 `/state/` 反代入口,设置 `basePath: '/state'`,资源根同时包含 `/state/assets/`。
4. 外部/空应用 `cloudEnv` 为 `online`,这表示淘宝网关的环境,和本次是否部署生产服务器无关。
5. 真实淘宝授权确认后才能创建账号。当前尚未填入真实 AppKey/Secret/cloudAppId,也没有宣称已完成真实平台联调。
云网关单次请求内容上限128KB、外部服务超时最多10秒。照片按64KiB base64顺序上传,每个用户的照片只可消费一次;检测与侧脸标注均用短请求提交、轮询结果,不能直接把三张大图发进一个45秒请求。中断轮询不会自动重复付费检测,已完成结果可在历史报告中读取。
官方依据:
- [外部/空应用调用标准、128KB、10秒、响应封装](https://developer.alibaba.com/docs/doc.htm?articleId=121864&docType=1&treeId=836)
- [外部服务请求签名算法](https://developer.alibaba.com/docs/doc.htm?articleId=121746&docType=1&treeId=832)
- [服务端获取平台OpenId](https://developer.alibaba.com/docs/doc.htm?articleId=121213&docType=1&treeId=804)
- [淘宝小程序外发请求接入说明](https://developer.alibaba.com/docs/doc.htm?articleId=121954&docType=1&treeId=842)
## 自动验证
```powershell
npm run check:shared
npm test
npx playwright install chromium
npm run test:h5
```
`npm test` 覆盖验签和重放、账号与历史隔离、照片分片与过期、异步检测、渠道筛选/CSV兼容、评分与七项话术、拍摄竞态、图片尺寸和省市联动。检测上游均为固定样本,不消耗线上检测额度。
`npm run test:h5` 运行现有 H5 的四组浏览器测试,覆盖游客不留存、HTTPS `/state/` 微信授权/退出/跨设备、完整报告/后台/CSV,以及异步侧脸图层。使用本地 Playwright,不改写旧测试;Windows上自动使用已安装 Git 附带的 OpenSSL。截图保存至 `../temp/taobao-h5-compatibility/`。
## 待平台验收
开发账号采用独立淘宝账号,由公司主账号管理员将其加入目标小程序的开发成员。公司完成主体认证、开发者入驻及应用创建;开发人员按后台要求完成个人账号认证,获得开发权限后再登录IDE关联应用。不能把店铺子账号的应用使用权限当作小程序开发权限,也不能只添加为体验者。当前账号尚未就绪,以下平台验收未完成。
相机权限单独处理:进入拍摄页先查询 `my.getSetting`;首次使用由用户点击“开启相机”后调用 `my.authorize({ scopes: 'scope.camera' })`,授权后再挂载原生camera组件。拒绝后保留相册路径,并提供用户主动打开 `my.openSetting` 的入口,不循环申请。相册选择使用独立的 `scope.album`;淘宝账号登录的 `scope.userInfo` 不代表相机已获授权。`app.json` 中的用途描述也不代表授权完成。平台控制台仍需确认对应权限包,并在“开发设置-scope授权项管理”填写用途。手机系统对淘宝App的相机/相册权限同样需要真机验证。
参考:[淘宝用户授权、权限范围与拒绝后的设置入口](https://developer.alibaba.com/docs/doc.htm?articleId=119119&docType=1&treeId=776)、[淘宝camera组件与CameraContext API](https://developer.alibaba.com/docs/doc.htm?articleId=120279&docType=1&treeId=776)。
- 真实 AppKey/cloudAppId、签名参数和授权权限包联调。
- 真实网关传输报告大图时的返回体限制与内存占用;已减少小程序 `setData` 中重复照片和非当前Tab图层。
- Android/iOS相机权限、前置相片方向、cover-view覆盖、系统相机降级、后台恢复、原生canvas及大图读取。
- UI真机对齐。当前相机使用椭圆框和左右转头提示,尚未迁移H5精确取景轮廓与实时姿态自动拍摄。
- 商品跳转尚需真实商品ID与平台能力验收;当前报告展示推荐产品,没有伪造商品链接。
以上是待真实平台验收的范围,不影响已通过的本地接口与H5回归结论。