兼容多微信系统选择器并安全返回 PDD 核单 #261

Open
opened 2026-08-18 09:29:05 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#96
  • 所属 MVP / 版本:#97 真实采购首单闭环(不支付)
  • 阶段:阶段 3/4,提交后只读核单与真实设备验收

要解决什么

真实采购已经单击提交并写入不可逆标记后,PDD 发起微信支付 Intent。Android 设备安装多个微信时会显示系统应用选择器。当前核单代码只尝试重新启动 PDD,没有关闭覆盖在 PDD 上方的系统选择器,随后一直等待并以 RECONCILE_ORDER_PAGE_TIMEOUT 转人工。

现场只读证据:选择器前台包为 android,Activity 为 com.android.internal.app.ChooserActivity,页面包含“选择要使用的应用”和微信候选。人工只按一次返回键后,设备回到 PDD;短暂加载后稳定显示“待付款”和唯一“去支付”,现有单订单详情识别返回 true。

做什么 / 不做什么

  • 做:在只读核单阶段严格识别 Android 应用选择器,只按一次返回键关闭;等待 PDD 订单详情稳定后继续现有只读核单;增加明确诊断与回归测试。
  • 不做:不选择���何微信,不点击“仅此一次”“始终”“去支付”或其他支付控件;不增加“重新核单”;不修改已经进入 reconcile_manual_review 的存量任务状态;不重新采购、不重新提交订单、不自动付款;不修改 Admin、数据库结构或接口。

怎么做

  • 修改 client/src/pdd_u2_purchase_reconcile_adapter.py,增加严格的系统选择器识别:前台业务包为 android,选择器标题为已确认白名单,且页面存在微信候选;Activity 为 ChooserActivity/ResolverActivity 时作为增强证据。
  • 在通用外部应用恢复逻辑之前处理该选择器:只调用一次 device.press("back"),单独记录选择器返回动作,不与现有 PDD 支付页返回次数共用。
  • 返回后允许 PDD 控件树经历短暂加载;识别到“待付款 + 唯一去支付”的单订单详情后进入现有滚动读取。不得点击“去支付”。
  • 一次返回后选择器仍存在,或出现非白名单系统页面时安全停止,返回可定位错误;不得循环按返回键或循环启动应用。
  • 修改 client/test/test_pdd_u2_purchase_reconcile_adapter.py,使用完全脱敏的合成控件树覆盖:三星选择器→PDD 短暂加载→待付款详情、选择器无法关闭、未知系统页面、原微信外部跳转及原 PDD 支付页返回路径。
  • 如需同步稳定安全规则,仅更新 docs/client/06-quality-security.md;不得记录原始控件树、微信账号或其他个人数据。

验收标准

  • 严格识别 android 系统应用选择器后只按一次返回键,不点击任何应用或选择器按钮。
  • 返回后允许短暂加载,并能继续识别 PDD 待付款单订单详情及执行现有只读核单。
  • “去支付”只作为未付款订单详情证据,任何路径都不会点击它。
  • 选择器一次返回后仍存在时停止并给出明确诊断,不重复返回、不重复启动 PDD。
  • 未知系统页面不会被误判为选择器并自动操作。
  • 原有单微信外部跳转、PDD 支付页最多一次返回、登录/验证/风控停止规则保持通过。
  • 不增加重新核单入口,不改变存量人工审核任务,不重新下单或付款。
  • Python 3.10 定向测试、Client 回归、语法检查和离屏 UI 冒烟通过。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m py_compile src/pdd_u2_purchase_reconcile_adapter.py test/test_pdd_u2_purchase_reconcile_adapter.py
C:/Python310/python.exe -m pytest -q test/test_pdd_u2_purchase_reconcile_adapter.py test/test_purchase_recovery.py test/test_purchase_task_service.py
C:/Python310/python.exe -m pytest -q test
$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -c "from src.ui_main import MainWindow; from PyQt5.QtWidgets import QApplication; app=QApplication([]); w=MainWindow(); print('OK'); app.quit()"
Remove-Item Env:QT_QPA_PLATFORM

真机只验证:在系统选择器已出现且订单已经提交的不可逆场景中,自动按一次返回后回到 PDD 待付款详情并开始只读核单。不得为测试再次提交订单或触发付款。

风险和回退

风险是把未知系统页面误认为选择器、重复按返回键离开订单详情,或者错误点击微信/支付入口。必须使用包名、标题和候选的组合证据,只允许一次系统返回,且代码中不提供选择微信或支付按钮的点击路径。回退时移除选择器专用返回分支,恢复当前安全转人工行为;不可修改或清除不可逆标记和历史核单记录。

## 基本信息 - 类型:缺陷 - 父级大工单:#96 - 所属 MVP / 版本:#97 真实采购首单闭环(不支付) - 阶段:阶段 3/4,提交后只读核单与真实设备验收 ## 要解决什么 真实采购已经单击提交并写入不可逆标记后,PDD 发起微信支付 Intent。Android 设备安装多个微信时会显示系统应用选择器。当前核单代码只尝试重新启动 PDD,没有关闭覆盖在 PDD 上方的系统选择器,随后一直等待并以 `RECONCILE_ORDER_PAGE_TIMEOUT` 转人工。 现场只读证据:选择器前台包为 `android`,Activity 为 `com.android.internal.app.ChooserActivity`,页面包含“选择要使用的应用”和微信候选。人工只按一次返回键后,设备回到 PDD;短暂加载后稳定显示“待付款”和唯一“去支付”,现有单订单详情识别返回 true。 ## 做什么 / 不做什么 - 做:在只读核单阶段严格识别 Android 应用选择器,只按一次返回键关闭;等待 PDD 订单详情稳定后继续现有只读核单;增加明确诊断与回归测试。 - 不做:不选择���何微信,不点击“仅此一次”“始终”“去支付”或其他支付控件;不增加“重新核单”;不修改已经进入 `reconcile_manual_review` 的存量任务状态;不重新采购、不重新提交订单、不自动付款;不修改 Admin、数据库结构或接口。 ## 怎么做 - 修改 `client/src/pdd_u2_purchase_reconcile_adapter.py`,增加严格的系统选择器识别:前台业务包为 `android`,选择器标题为已确认白名单,且页面存在微信候选;Activity 为 `ChooserActivity`/`ResolverActivity` 时作为增强证据。 - 在通用外部应用恢复逻辑之前处理该选择器:只调用一次 `device.press("back")`,单独记录选择器返回动作,不与现有 PDD 支付页返回次数共用。 - 返回后允许 PDD 控件树经历短暂加载;识别到“待付款 + 唯一去支付”的单订单详情后进入现有滚动读取。不得点击“去支付”。 - 一次返回后选择器仍存在,或出现非白名单系统页面时安全停止,返回可定位错误;不得循环按返回键或循环启动应用。 - 修改 `client/test/test_pdd_u2_purchase_reconcile_adapter.py`,使用完全脱敏的合成控件树覆盖:三星选择器→PDD 短暂加载→待付款详情、选择器无法关闭、未知系统页面、原微信外部跳转及原 PDD 支付页返回路径。 - 如需同步稳定安全规则,仅更新 `docs/client/06-quality-security.md`;不得记录原始控件树、微信账号或其他个人数据。 ## 验收标准 - [ ] 严格识别 `android` 系统应用选择器后只按一次返回键,不点击任何应用或选择器按钮。 - [ ] 返回后允许短暂加载,并能继续识别 PDD 待付款单订单详情及执行现有只读核单。 - [ ] “去支付”只作为未付款订单详情证据,任何路径都不会点击它。 - [ ] 选择器一次返回后仍存在时停止并给出明确诊断,不重复返回、不重复启动 PDD。 - [ ] 未知系统页面不会被误判为选择器并自动操作。 - [ ] 原有单微信外部跳转、PDD 支付页最多一次返回、登录/验证/风控停止规则保持通过。 - [ ] 不增加重新核单入口,不改变存量人工审核任务,不重新下单或付款。 - [ ] Python 3.10 定向测试、Client 回归、语法检查和离屏 UI 冒烟通过。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m py_compile src/pdd_u2_purchase_reconcile_adapter.py test/test_pdd_u2_purchase_reconcile_adapter.py C:/Python310/python.exe -m pytest -q test/test_pdd_u2_purchase_reconcile_adapter.py test/test_purchase_recovery.py test/test_purchase_task_service.py C:/Python310/python.exe -m pytest -q test $env:QT_QPA_PLATFORM="offscreen" C:/Python310/python.exe -c "from src.ui_main import MainWindow; from PyQt5.QtWidgets import QApplication; app=QApplication([]); w=MainWindow(); print('OK'); app.quit()" Remove-Item Env:QT_QPA_PLATFORM ``` 真机只验证:在系统选择器已出现且订单已经提交的不可逆场景中,自动按一次返回后回到 PDD 待付款详情并开始只读核单。不得为测试再次提交订单或触发付款。 ## 风险和回退 风险是把未知系统页面误认为选择器、重复按返回键离开订单详情,或者错误点击微信/支付入口。必须使用包名、标题和候选的组合证据,只允许一次系统返回,且代码中不提供选择微信或支付按钮的点击路径。回退时移除选择器专用返回分支,恢复当前安全转人工行为;不可修改或清除不可逆标记和历史核单记录。
Author
Owner

实施进度

状态:进行中

已复核根因:_open_unpaid_orders() 对非 PDD 前台统一尝试启动 PDD,但 Android 多微信应用选择器仍覆盖前台,最终核单超时。

本次严格按工单范围实施:识别确认过的 Android 选择器后只按一次返回;选择器未关闭或出现未知系统页面时安全停止;不增加重新核单,不修改不可逆状态,不重新下单或付款。

## 实施进度 状态:进行中 已复核根因:`_open_unpaid_orders()` 对非 PDD 前台统一尝试启动 PDD,但 Android 多微信应用选择器仍覆盖前台,最终核单超时。 本次严格按工单范围实施:识别确认过的 Android 选择器后只按一次返回;选择器未关闭或出现未知系统页面时安全停止;不增加重新核单,不修改不可逆状态,不重新下单或付款。
Author
Owner

实施完成,待用户验收

最终实现

  • 严格组合 android 包、白名单标题和微信候选识别系统应用选择器。
  • 使用 ChooserActivity / ResolverActivity 白名单校验前台 Activity。
  • 只按一次返回;返回后仍是选择器时以 RECONCILE_ANDROID_CHOOSER_STUCK 安全停止。
  • 未知 Activity 以 RECONCILE_ANDROID_CHOOSER_UNRECOGNIZED 安全停止;未知系统页面不会触发选择器返回。
  • 选择器返回门禁与原 PDD 支付页返回门禁相互独立;没有新增选择微信、点击支付、重新核单、重新下单或付款路径。

验证结果

  • Python 语法检查:通过。
  • 核单 Adapter、采购恢复和采购任务服务定向测试:43 项通过。
  • Client 离屏界面冒烟:输出 OK。
  • 完整 Client 测试:存在 2 项与本工单无关的既有失败。当前工作区版本是 0.1.2,更新模块测试仍固定期待 0.1.0;未在本工单中修改。
  • 真机未验证:没有为了测试重新提交订单、触发支付或改变存量人工审核任务。

提交与归档

  • 实现提交:ff92528
  • 归档提交:a92b874
  • 归档:docs/task/261-兼容多微信系统选择器并安全返回PDD核单.md

状态:待用户验收。

## 实施完成,待用户验收 ### 最终实现 - 严格组合 `android` 包、白名单标题和微信候选识别系统应用选择器。 - 使用 `ChooserActivity` / `ResolverActivity` 白名单校验前台 Activity。 - 只按一次返回;返回后仍是选择器时以 `RECONCILE_ANDROID_CHOOSER_STUCK` 安全停止。 - 未知 Activity 以 `RECONCILE_ANDROID_CHOOSER_UNRECOGNIZED` 安全停止;未知系统页面不会触发选择器返回。 - 选择器返回门禁与原 PDD 支付页返回门禁相互独立;没有新增选择微信、点击支付、重新核单、重新下单或付款路径。 ### 验证结果 - Python 语法检查:通过。 - 核单 Adapter、采购恢复和采购任务服务定向测试:43 项通过。 - Client 离屏界面冒烟:输出 `OK`。 - 完整 Client 测试:存在 2 项与本工单无关的既有失败。当前工作区版本是 `0.1.2`,更新模块测试仍固定期待 `0.1.0`;未在本工单中修改。 - 真机未验证:没有为了测试重新提交订单、触发支付或改变存量人工审核任务。 ### 提交与归档 - 实现提交:`ff92528` - 归档提交:`a92b874` - 归档:`docs/task/261-兼容多微信系统选择器并安全返回PDD核单.md` 状态:待用户验收。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#261