C:\Users\qmj\.jdks\graalvm-jdk-21.0.7updatesql/sql.md applied manually by the developerE:\QtwCode\foodie\foodie-admin-vueDo not execute schema migration from Codex. Do not use the deprecated TestTask, ZaloPayController, PayController, or OrderAppealController flows.
ruoyi-admin/src/main/resources/application.yml contains non-secret defaults:
line-pay:
environment: sandbox
base-url: https://sandbox-api-pay.line.me
confirm-url: https://api.example.com/pay/line/confirm
cancel-url: https://api.example.com/pay/line/cancel
reconcile:
fixed-delay-ms: 60000
initial-delay-ms: 60000
batch-size: 20
row-lease-seconds: 120
round-budget-seconds: 45
auth-deadline-minutes: 30
unknown-deadline-hours: 24
Channel credentials are saved per store through the platform API; they are not placed in application.yml.
Use JDK 21 only in the current PowerShell process:
$env:JAVA_HOME='C:\Users\qmj\.jdks\graalvm-jdk-21.0.7'
$env:PATH="$env:JAVA_HOME\bin;$env:PATH"
mvn -pl ruoyi-system -am -Dtest='*Line*Test' -Dsurefire.failIfNoSpecifiedTests=false test
mvn -pl ruoyi-admin -am -Dtest='*LinePay*Test,OrderLifecycleServiceTest,OmgPayControllerTest' -Dsurefire.failIfNoSpecifiedTests=false test
mvn -pl ruoyi-admin -am -DskipTests package
现有 Online 平台前端回归(仅当实际修改 foodie-admin-vue 时执行):
Set-Location E:\QtwCode\foodie\foodie-admin-vue
npm run lint
npm run build:prod
Repository checks:
Set-Location E:\QtwCode\foodie\foodie_server
git diff --check
git status --short
Offline 增量的定向验证命令在全部后端功能、测试源码和 SQL 调整完成后统一执行:
$env:JAVA_HOME='C:\Users\qmj\.jdks\graalvm-jdk-21.0.7'
$env:PATH="$env:JAVA_HOME\bin;$env:PATH"
mvn -pl ruoyi-system -am -Dtest='*Line*Test' -Dsurefire.failIfNoSpecifiedTests=false test
mvn -pl ruoyi-admin -am -Dtest='*LinePayOffline*Test,PosOrderShOprateControllerTest,*LinePay*Test,OrderLifecycleServiceTest,OmgPaymentControllerTest' -Dsurefire.failIfNoSpecifiedTests=false test
mvn -pl ruoyi-admin -am -DskipTests package
payType=3./pay/line/create; assert payment row is WAITING_AUTH and response uses paymentUrl.web.paymentId/lineOrderId is returned with reusedAttempt=true.PAID.PAID, order pay_status=1, and gateway logs contain REQUEST/CHECK/CONFIRM/RETRIEVE events.REFUNDED, while payment remains PAID and order becomes pay_status=2.active_dd_id./system/orderShOprate/createOrder 创建 paymentMethod="3" 的单门店订单。order_source=MERCHANT;用户端订单和历史订单保持 USER。oneTimeKey,调用 /system/orderShOprate/linePay/offline/pay。payment_mode=OFFLINE,且数据库、应用日志、异常和 payment_gateway_log.payload 均不存在原始 oneTimeKey。1145/1169 或 Check 返回 AUTH_READY 时,状态接口返回 AUTH_REQUIRED;重复提交新的 My Code 只返回旧尝试,不再次调用 Pay。PROCESSING,任务只按 lineOrderId 调 Offline Check;Check 未识别结果码同样不得释放活跃键。COMPLETE 且订单号、交易号、金额合计、非空 paymentProvider 匹配时,状态最终为 PAID,订单结算和通知只执行一次。shId 搭配他店 mdId、用户端/历史订单、多门店订单、非 payType=3 订单或无效 My Code 请求,确认在调用 LINE 前拒绝。captured_amount 保存 LINE 实际扣款额、不触发正常履约、只创建一条以实际扣款额为金额的全额退款意图,并且原订单保持禁止再次支付。lineOrderId;对 Online 订单回归确认仍使用 transactionId。credential_id; old transaction remains queryable/refundable.active_dd_id or directly repeat side effects.oneTimeKey 不记录、不发送。AUTH_REQUIRED、PROCESSING、AMOUNT_MISMATCH 和缺失 paymentProvider 的 MANUAL_REVIEW 均阻止重新扫码。shId=userId 鉴权,其他摊位商家按 mdId=InfoUser.storeId 鉴权。oneTimeKey 不可见。Sandbox cannot prove every App handoff behavior. Before production enablement, verify on real iOS and Android devices:
com.twanmsdyh.app://payment/result is registered and handled./query and never trusts the deep-link as success.AUTH_READY/COMPLETE/CANCEL/FAIL 收敛。paymentProvider 的 TSP/EPI 原值;若生产返回其他非空值仍保存并允许完成,缺失或空值进入人工核对。