# Implementation Plan: 蓝新金流(NewebPay)线上支付接入

**Branch**: `test`（不新建分支，在当前 test 分支开发） | **Date**: 2026-06-22 | **Spec**: [spec.md](spec.md)

**Input**: Feature specification from `/specs/011-newebpay-payment/spec.md`

## Summary

为系统接入台湾蓝新金流(NewebPay) MPG 幕前线上支付。C 端用户下单后由后端按门店凭证生成 AES-256-CBC + SHA256 加密的 MPG 交易参数，前端 Form Post 跳转蓝新付款页完成**信用卡 / LINE Pay / Apple Pay** 支付；蓝新经 NotifyURL 背景回调通知结果，系统解密验签、幂等、金额校验后更新订单支付状态并复用现有推送/记账链路；另支持单笔查询用于对账与回调丢失补单。

凭证按门店存储（新建 `pos_store_newebpay`，复用 009 开通管理模式），交易流水独立成表 `pos_order_payment`（按蓝新交易序号幂等）。加密工具新建 `NewebPayEncryptUtil`（标准 PKCS7 块16，区别于 ezPay 的块32），HTTP 客户端 `NewebPay`。详见 [research.md](research.md)、[data-model.md](data-model.md)、[contracts/api.md](contracts/api.md)、[quickstart.md](quickstart.md)。

## Technical Context

**Language/Version**: Java 17（Spring Boot 3，证据：`jakarta.*` 包、`@EnableMethodSecurity`）

**Primary Dependencies**: Spring Boot 3、Spring Security（`@PreAuthorize`/`@Anonymous`/PermitAllUrlProperties）、MyBatis-Plus（`@TableName`/`@TableId`/LambdaQueryWrapper）、MySQL、fastjson2、Hutool、Apache HttpClient（ezPay 已用）、RuoYi 脚手架（BaseController/AjaxResult/TableDataInfo/MessageUtils）。

**Storage**: MySQL（新增 `pos_store_newebpay`、`pos_order_payment` 两表；`pos_order` 不改结构，payType 取值扩展）。

**Testing**: `NewebPayEncryptUtil.main` 加解密/签名自测（用 NDNF §4.1 官方示例数据）+ 蓝新测试环境 ccore 端到端验证（见 [quickstart.md](quickstart.md)，测试卡号见 NDNF 附录1）。

**Target Platform**: Linux server（Tomcat 8082，公网可达 80/443 供蓝新回调）。

**Project Type**: web-service（Spring Boot REST，多模块 Maven：ruoyi-admin / ruoyi-system / ruoyi-framework / ruoyi-common）。

**Performance Goals**: 99% 支付回调在蓝新发出后 10s 内处理（SC-004）；发起支付接口 p95 < 1s。

**Constraints**: NotifyURL/ReturnURL 必须公网 80/443 可达；回调必须幂等（按 TradeNo）；必须验签 + 金额校验，异常回调误更新率 0%（SC-003）；HashKey/HashIV 不得下发前端（加密仅在后端）。

**Scale/Scope**: 全平台门店可开通；面向 C 端用户下单（外卖/自取/堂食扫码点餐）；商家端/平台后台用于凭证管理与对账查询。

## Constitution Check

*GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.*

**N/A** — `.specify/memory/constitution.md` 仍为模板占位（`[PRINCIPLE_1_NAME]` 等），未填写项目具体准则，无实质 gate 可校验。无违反项。

## Project Structure

### Documentation (this feature)

```text
specs/011-newebpay-payment/
├── spec.md              # 需求规格 (/speckit-specify)
├── plan.md              # 本文件 (/speckit-plan)
├── research.md          # 技术决策 (/speckit-plan Phase 0)
├── data-model.md        # 数据模型 (/speckit-plan Phase 1)
├── quickstart.md        # 端到端验证指南 (/speckit-plan Phase 1)
├── contracts/
│   └── api.md           # 接口契约 (/speckit-plan Phase 1)
└── tasks.md             # 任务分解 (/speckit-tasks，下一步生成)
```

### Source Code (repository root)

```text
ruoyi-admin/src/main/java/com/ruoyi/app/
├── utils/newebpay/
│   ├── NewebPay.java               # 蓝新 HTTP 客户端（MPG/Query），仿 EzPay
│   ├── NewebPayConfig.java         # merchantId/hashKey/hashIV，仿 EzPayConfig
│   └── NewebPayEncryptUtil.java    # AES-256-CBC/PKCS7 + SHA256(TradeSha/CheckValue/CheckCode)
├── pay/
│   └── NewebpayPayController.java  # /pay/newebpay/{create,notify,return,query}（notify/return @Anonymous）
└── mendian/
    └── PosStoreNewebpayController.java  # /system/storeNewebpay/* 门店凭证管理（@PreAuthorize）

ruoyi-system/src/main/java/com/ruoyi/system/
├── domain/
│   ├── PosStoreNewebpay.java       # 门店蓝新凭证实体（@TableName pos_store_newebpay）
│   ├── PosOrderPayment.java        # 支付流水实体（@TableName pos_order_payment）
│   ├── vo/PosStoreNewebpayVo.java  # 凭证列表/详情 VO
│   └── dto/StoreNewebpayCredentialDto.java  # 录入凭证 DTO
├── mapper/
│   ├── PosStoreNewebpayMapper.java + PosOrderPaymentMapper.java
├── service/
│   ├── IPosStoreNewebpayService + Impl   # 纯 DB（状态机/CRUD），仿 PosStoreEzpayServiceImpl
│   └── IPosOrderPaymentService + Impl    # 流水写入/幂等查询

ruoyi-system/src/main/resources/mapper/chanting/
├── PosStoreNewebpayMapper.xml      # 仿 PosStoreEzpayMapper.xml
└── PosOrderPaymentMapper.xml

ruoyi-admin/src/main/resources/
└── application.yml                 # 新增 newebpay 段（base-url/notify-url/return-url/mpg-version）

updatesql/
└── sql.md                          # 追加两段建表 DDL（pos_store_newebpay、pos_order_payment）

前端（CRLF 文件，用 Python 脚本编辑，按项目规范）：
E:\QtwCode\foodie\foodie-store\         # C 端发起支付入口、支付结果页、四语 i18n
E:\QtwCode\foodie\foodie-admin-vue\     # 平台后台门店蓝新凭证管理页 + 四语 i18n
```

**Structure Decision**: 严格遵循现有分层——加密/HTTP 客户端/Controller 在 `ruoyi-admin`，Domain/Mapper/Service 在 `ruoyi-system`（Service 纯 DB，联网验证在 Controller 层以避免反向依赖）。蓝新支付链路与发票（009/010）并列共存、互不干扰，复用 ezPay 的工具类组织形式与 PosStoreEzpay 的开通管理模式，但不共享表/凭证。

## Complexity Tracking

> 无 Constitution Check 违反项，本表无需填写。

| Violation | Why Needed | Simpler Alternative Rejected Because |
|-----------|------------|-------------------------------------|
| — | — | — |

## Phase 1 设计后 Constitution 复核

设计完成（research/data-model/contracts/quickstart 已产出）。`constitution.md` 仍为占位，无 gate 可复核；设计未引入与项目既有模式冲突的结构（全部对齐 ezPay/PosStoreEzpay/PayController.payipn 既有范式）。**通过**。
