扫码支付超时设置变更记录
- 日期:2026-09-10
- 项目:AIDishRecognition
- 最终状态:
DONE_WITH_CONCERNS - 状态说明:单元测试、Debug 构建和静态检查通过;已检测到可用 Android 设备,但本任务未获授权安装或改变设备状态,因此手工 UI/运行时验收未执行,不能记为通过。另有一处既存敏感日志风险需单独处理。
变更目标
为扫码支付增加可配置的完整请求超时时间:默认值为 30 秒,只接受 5~120 秒(含边界)的整数。该超时只作用于二维码扫码支付的 HTTP 请求,不改变刷卡、人脸、MQTT 路由或普通 Retrofit 请求的超时行为。
实现摘要
- 在
Constants中集中定义扫码支付超时配置键、默认值 30 秒、最小值 5 秒、最大值 120 秒,并集中定义支付方式常量,消除业务分支中的裸值paymentType == 2和METHOD_QR = 2。 - 新增
ScanPaymentTimeoutPolicy,集中负责输入解析、范围校验和异常持久化值归一化;无效值统一回退到 30 秒。 - 支付设置页新增扫码支付超时入口和数字输入弹窗。弹窗通过子
FragmentManager的稳定 tag 恢复,并在视图重建时重新绑定校验与确认回调,避免仅依赖瞬时 listener 的生命周期问题;确认前校验 5~120 秒,合法后才持久化并刷新显示。 - 新增独立且缓存的扫码支付 Retrofit 实例。缓存按服务地址和归一化后的超时秒数区分;服务地址更新时同步失效扫码支付缓存。其 OkHttpClient 从共享客户端
newBuilder()派生,只调整 connect/read/write timeout,保留共享连接池、调度器及其他基础配置;生产代码未调用callTimeout。 - 新增 RxJava
timeout,在连接、上传、服务端处理和响应传递的整体链路上施加同一超时上限;TimeoutException与SocketTimeoutException均映射为现有统一超时错误。 PaymentManager仅在二维码扫码支付时调用新的 HTTP 超时链路;普通 HTTP 支付继续调用原orderPayment,MQTT 模式下的非扫码支付继续走原 MQTT 路由。新增扫码支付日志只记录 requestId 与 timeoutSeconds,不记录 payCode。
自动化验证
单元测试
- 命令:
./gradlew :app:testDebugUnitTest - 退出码:
0 - Gradle 最终结果:
BUILD SUCCESSFUL in 840ms - 任务摘要:
60 actionable tasks: 2 executed, 58 up-to-date - 测试报告汇总:20 个测试套件、74 个测试,0 failures、0 errors、0 skipped。
Debug 构建
- 命令:
./gradlew :app:assembleDebug - 退出码:
0 - Gradle 最终结果:
BUILD SUCCESSFUL in 3s - 任务摘要:
86 actionable tasks: 8 executed, 78 up-to-date - 构建输出包含 Gradle 8.0 兼容性相关的既有 deprecated features 警告,但本次 Debug 构建成功。
Git 与静态检查
git diff --check:退出码0,无输出。- 生产源码
callTimeout(搜索结果:0 个文件;扫码客户端只配置 connect/read/write timeout。 - 生产源码裸值
paymentType == 2或METHOD_QR = 2搜索结果:0 个文件;二维码支付方式统一使用Constants.PAYMENT_METHOD_SCAN_QR。 - 超时配置键、默认值、最小值、最大值仅在
Constants中定义,校验与回退由ScanPaymentTimeoutPolicy集中实现。 - 普通 Retrofit 的
getRetrofit/createApi构建路径未加入扫码支付超时;新增的是隔离的createScanPaymentApi缓存路径。 - 新增扫码支付日志不包含 payCode。
- 业务仓根目录未新增
docs/、doc/或prompt/目录;当前未跟踪文件均为本功能的 Java 源码或单元测试。 - 提示词工程 AIDishRecognition 范围内的 Markdown/HTML 正式文档按同目录同 basename 配对,本记录也按该规则生成。
手工 UI / 运行时验收
adb devices 检测到以下 3 个状态为 device 的目标:
192.168.9.97:33835adb-30aedcd4e69e7185-5i8hrr._adb-tls-connect._tcpadb-36cf08b82c21955d-OisAHp._adb-tls-connect._tcp
本任务没有安装 APK、启动 Activity、写入设置或进行支付请求,因为用户未授权改变设备状态。因此以下项目仍待人工执行,不能宣称通过:设置页显示默认 30 秒、5/120 秒边界保存、4/121/空值拒绝、页面或弹窗重建后的回调与显示、扫码 HTTP 超时提示、刷卡/人脸/MQTT/普通 Retrofit 回归。
已知既存风险与关注项
DishRecognitionActivity.triggerPayment在本次变更前已存在一条日志,会输出 payCode、cardCode 和 faceUser。通过读取HEAD版本确认该行并非本功能新增,因此不作为本次扫码超时功能回归;但它属于敏感信息泄露风险,建议另立任务脱敏或移除。- 手工 UI/真机运行时验收尚未执行,当前结论只覆盖 JVM 单元测试、Debug 构建和静态检查。
- Gradle 输出提示存在面向 Gradle 8.0 的 deprecated features 兼容性风险,本次未扩大处理范围。
业务仓当前变更文件
以下为 git status --short 中的完整 AIDishRecognition 业务仓文件清单,共 19 个,均属于扫码支付超时设置功能;未发现额外的已修改或未跟踪业务文件。
已修改
app/src/main/java/com/cpt/aidishrecognition/activity/DishRecognitionActivity.javaapp/src/main/java/com/cpt/aidishrecognition/activity/PaymentTestActivity.javaapp/src/main/java/com/cpt/aidishrecognition/fragment/SettingsPaymentFragment.javaapp/src/main/java/com/cpt/aidishrecognition/network/RetrofitClient.javaapp/src/main/java/com/cpt/aidishrecognition/network/RetrofitRequest.javaapp/src/main/java/com/cpt/aidishrecognition/network/exception/ExceptionHandle.javaapp/src/main/java/com/cpt/aidishrecognition/utils/Constants.javaapp/src/main/java/com/cpt/aidishrecognition/utils/PaymentManager.javaapp/src/main/java/com/cpt/aidishrecognition/view/InputValueDialogFragment.javaapp/src/main/res/layout/fragment_setting_payment.xmlapp/src/main/res/values/dimens.xmlapp/src/main/res/values/strings.xml
未跟踪
app/src/main/java/com/cpt/aidishrecognition/network/ScanPaymentHttpClientFactory.javaapp/src/main/java/com/cpt/aidishrecognition/network/ScanPaymentRequestTimeout.javaapp/src/main/java/com/cpt/aidishrecognition/payment/ScanPaymentTimeoutPolicy.javaapp/src/test/java/com/cpt/aidishrecognition/network/ScanPaymentHttpClientFactoryTest.javaapp/src/test/java/com/cpt/aidishrecognition/network/ScanPaymentRequestTimeoutTest.javaapp/src/test/java/com/cpt/aidishrecognition/network/exception/ExceptionHandleTest.javaapp/src/test/java/com/cpt/aidishrecognition/payment/ScanPaymentTimeoutPolicyTest.java
本记录文件
work_android/AIDishRecognition/change_records/2026-09-10-scan-payment-timeout-settings.mdwork_android/AIDishRecognition/change_records/2026-09-10-scan-payment-timeout-settings.html
Git 操作
未执行 stage、commit、push、branch、merge、rebase、reset 或 clean。