post-bank-point-mall/docs/需求文档-PRD.md

1059 lines
33 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.

# 虚拟商品充值服务商系统 - 产品需求文档
## 1. 功能模块划分
### 1.1 模块结构
```
服务商系统
├── 接口服务模块(对接邮储银行服务开放平台)
│ ├── 服务预约接口
│ ├── 服务取消接口
│ ├── 服务完成通知接口
│ ├── 订单过期积分查询接口
│ └── 服务状态查询接口
├── 券码管理模块对接蓝色兄弟营销开放API
│ ├── 券码获取功能
│ ├── 券码查询功能
│ ├── 券码作废功能
│ └── 券码状态回调接收
├── 订单管理模块
│ ├── 订单创建
│ ├── 订单状态管理
│ ├── 订单查询
│ └── 订单对账
├── 对账管理模块
│ ├── 对账文件查询
│ ├── 对账文件下载
│ └── 对账数据核对
└── 安全与加密模块
├── SM2/SM4加解密邮储银行
├── RSA/AES加解密蓝色兄弟
└── 签名验签
```
### 1.2 模块关系
| 模块 | 调用方/被调用方 | 内部依赖 | 说明 |
|------|----------------|---------|------|
| 接口服务模块 | 被下游邮储银行调用 | 订单管理模块、券码管理模块 | 接收邮储银行请求,转发至内部处理 |
| 券码管理模块 | 调用上游蓝色兄弟API | 订单管理模块 | 负责券码全生命周期管理 |
| 订单管理模块 | - | 券码管理模块、对账管理模块 | 核心业务数据管理 |
| 对账管理模块 | 调用下游邮储银行API | 订单管理模块 | 月度对账处理 |
| 安全与加密模块 | - | 所有模块 | 提供安全基础能力 |
---
## 2. 功能详细说明
### 2.1 接口服务模块
#### 2.1.1 服务预约接口
**功能描述**:接收邮储银行服务开放平台的预约请求,为客户预约虚拟商品充值服务
**业务规则**
1. 解密请求报文,验证签名
2. 校验权益码有效性20分钟有效期
3. 调用蓝色兄弟API获取券码
4. 创建订单记录,状态设为"已预约"(200)
5. 返回预约成功响应
**输入**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| rightsCode | String | M | 兑换预约码格式16800G-VN4724-NX874-30VHR |
| serviceType | String | M | 服务类型编码 |
| providerCode | String | M | 服务厂商编号 |
| custName | String | C | 客户名称(电话银行渠道可选) |
| personalCertTypeCode | String | C | 证件类型 |
| personalCertNo | String | C | 证件号码 |
**输出**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| respCode | String | M | 返回码000000表示成功 |
| respMsg | String | M | 返回信息 |
| rightsCode | String | C | 兑换预约码 |
| tradeRespCode | String | M | 业务响应码 |
| tradeRespMsg | String | M | 业务响应码描述 |
**验收标准**
- [ ] 能正确解密SM4加密的请求报文
- [ ] 能正确验证SM2签名
- [ ] 权益码超过20分钟返回失效错误(161026)
- [ ] 预约成功后订单状态为200
- [ ] 预约成功后能获取到蓝色兄弟券码
---
#### 2.1.2 服务取消接口
**功能描述**:接收邮储银行服务开放平台的取消请求,取消已预约的服务
**业务规则**
1. 校验订单状态必须为"已预约"(200)
2. 调用蓝色兄弟API作废券码
3. 更新订单状态为"已取消"(400)
4. 返回取消成功响应
**输入**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| rightsCode | String | M | 兑换预约码 |
| serviceType | String | M | 服务类型编码 |
| providerCode | String | M | 服务厂商编号 |
**输出**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| respCode | String | M | 返回码 |
| respMsg | String | M | 返回信息 |
| tradeRespCode | String | M | 业务响应码 |
| tradeRespMsg | String | M | 业务响应码描述 |
**验收标准**
- [ ] 非"已预约"状态订单返回错误(161024)
- [ ] 已完成订单不允许取消(161014)
- [ ] 取消成功后蓝色兄弟券码状态为已作废(3)
- [ ] 取消成功后订单状态为400
---
#### 2.1.3 服务完成通知接口
**功能描述**:接收蓝色兄弟券码核销回调,主动通知邮储银行服务完成
**业务规则**
1. 接收蓝色兄弟券码状态变更回调
2. 当券码状态变为"已核销"(2)时
3. 调用邮储银行服务完成接口
4. 更新订单状态为"已完成"(300)
5. 服务完成状态更新需在T+2日内完成
**输入**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| rightsCode | String | M | 兑换预约码 |
| serviceType | String | M | 服务类型编码 |
| providerCode | String | M | 服务厂商编号 |
| completionTime | String | M | 实际完成时间格式yyyyMMddHHmmss |
**输出**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| respCode | String | M | 返回码 |
| respMsg | String | M | 返回信息 |
**验收标准**
- [ ] 能正确接收蓝色兄弟回调通知
- [ ] 回调验签通过后正确响应"ok"
- [ ] 服务完成通知在T+2日内发送
- [ ] 已取消订单不允许完成(161014)
- [ ] 完成成功后订单状态为300
---
#### 2.1.4 订单过期积分查询接口
**功能描述**:查询订单退还时已过期的幸福点信息,用于取消前提醒客户
**业务规则**
1. 根据权益码或原交易流水号查询订单
2. 计算订单涉及的总幸福点
3. 计算已过期的幸福点数量
4. 返回过期幸福点提醒信息
**输入**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| rightsCode | String | C | 兑换预约码(已预约取消场景必填) |
| orgTranSq | String | C | 原交易流水号(已兑换未预约取消场景必填) |
| cstmName | String | C | 客户名称 |
| paperType | String | C | 证件类型 |
| paperId | String | C | 证件号码 |
**输出**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| respCode | String | M | 返回码 |
| respMsg | String | M | 返回信息 |
| tranIntglNum | int | C | 交易总幸福点 |
| ovdueIntglNum | int | C | 已过期的幸福点 |
| noticeMsg | String | C | 提醒信息文本 |
**验收标准**
- [ ] 能正确查询订单积分信息
- [ ] 过期幸福点计算准确
- [ ] 返回友好的提醒信息
---
#### 2.1.5 服务状态查询接口
**功能描述**:根据权益码查询服务预约状态
**业务规则**
1. 根据权益码查询订单
2. 返回当前服务状态
**输入**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| rightsCode | String | M | 兑换权益码 |
| tranChnl | String | M | 渠道标识 |
**输出**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| respCode | String | M | 返回码 |
| respMsg | String | M | 返回信息 |
| serviceState | String | M | 预约服务状态码100-未预约200-已预约300-已完成400-已取消500-已过期 |
| serviceStateMsg | String | M | 预约服务状态描述 |
**验收标准**
- [ ] 能正确查询订单状态
- [ ] 状态码与状态描述一致
---
### 2.2 券码管理模块
#### 2.2.1 券码获取功能
**功能描述**调用蓝色兄弟API获取虚拟商品券码
**业务规则**
1. 生成唯一外部业务号(out_biz_no)
2. 构造请求参数并AES加密
3. 使用RSA私钥签名
4. 调用获取券码接口
5. 保存券码信息与订单关联
**输入**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| out_biz_no | String | M | 外部业务号长度2~32位幂等 |
| activity_no | String | M | 活动编号长度32位内 |
| number | int | M | 数量只支持1 |
| account | String | N | 账号 |
| notify_url | String | N | 回调通知地址 |
**输出**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| out_biz_no | String | M | 外部业务号 |
| trade_no | String | M | 交易号 |
| key | String | N | key码 |
| url | String | N | 短链接 |
| status | uint8 | M | 状态1-正常2-已核销3-已作废 |
| valid_begin_time | String | M | key码有效期开始 |
| valid_end_time | String | M | key码有效期结束 |
| usable_num | uint32 | M | 可兑换次数 |
**验收标准**
- [ ] 能正确加密业务参数(AES)
- [ ] 能正确签名请求(RSA)
- [ ] 幂等请求返回相同结果
- [ ] 获取成功后保存券码信息
---
#### 2.2.2 券码查询功能
**功能描述**:查询已获取券码的当前状态
**业务规则**
1. 支持通过外部业务号或交易号查询
2. 返回券码完整状态信息
**输入**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| out_biz_no | String | C | 外部业务号与trade_no二选一 |
| trade_no | String | C | 交易号,优先使用 |
**输出**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| status | uint8 | M | 状态1-正常2-已核销3-已作废4-已过期 |
| usage_num | uint32 | M | 已兑换次数 |
| usage_time | String | N | 最后一次核销时间 |
**验收标准**
- [ ] 能正确查询券码状态
- [ ] 状态信息完整准确
---
#### 2.2.3 券码作废功能
**功能描述**:作废待使用或已过期的券码
**业务规则**
1. 只能作废待使用(1)、已过期(4)状态的券码
2. 已核销券码不允许作废
**输入**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| out_biz_no | String | C | 外部业务号与trade_no二选一 |
| trade_no | String | C | 交易号,优先使用 |
**验收标准**
- [ ] 正常状态券码能成功作废
- [ ] 已核销券码作废返回错误
- [ ] 作废成功后券码状态为3
---
#### 2.2.4 券码状态回调接收
**功能描述**:接收蓝色兄弟的券码状态变更通知
**业务规则**
1. 验证回调签名
2. 解析回调数据
3. 更新本地券码状态
4. 当status=2(已核销)时触发服务完成通知
5. 响应httpCode=200和字符串"ok"
**回调重试策略**
- 首次间隔120s
- 第二次间隔240s
- 第三次间隔360s
- 大于5分钟后间隔5分钟
- 大于10分钟后间隔10分钟
- 超过120分钟后不再重试
**验收标准**
- [ ] 能正确验证回调签名
- [ ] 状态更新及时准确
- [ ] 核销状态触发服务完成通知
- [ ] 响应格式正确(httpCode=200, body="ok")
---
### 2.3 订单管理模块
#### 2.3.1 订单创建
**功能描述**:创建权益服务订单
**业务规则**
1. 生成唯一订单号
2. 关联权益码、券码、客户信息
3. 初始状态为"已预约"(200)
**验收标准**
- [ ] 订单号全局唯一
- [ ] 订单信息完整
---
#### 2.3.2 订单状态管理
**功能描述**:管理订单全生命周期状态流转
**状态定义**
| 状态码 | 状态名称 | 说明 |
|-------|---------|------|
| 100 | 服务未预约 | 已兑换但未预约 |
| 200 | 服务已预约 | 已预约待使用 |
| 300 | 服务已完成 | 券码已核销 |
| 400 | 服务已取消 | 用户主动取消 |
| 500 | 服务已过期 | 超过90天未预约 |
**状态流转规则**
- 200(已预约) → 300(已完成):券码核销
- 200(已预约) → 400(已取消):用户取消
- 300(已完成) 和 400(已取消) 为终态,不可变更
**验收标准**
- [ ] 状态流转符合规则
- [ ] 终态不可变更
- [ ] 状态变更有日志记录
---
#### 2.3.3 订单查询
**功能描述**:支持多维度订单查询
**查询维度**
- 按权益码查询
- 按订单号查询
- 按客户信息查询
- 按状态查询
- 按时间范围查询
**验收标准**
- [ ] 支持所有查询维度
- [ ] 查询结果准确
---
### 2.4 对账管理模块
#### 2.4.1 对账文件查询
**功能描述**:查询邮储银行生成的对账文件列表
**业务规则**
1. 每月3号查询上月对账文件
2. 只包含服务完成(300)状态的订单
**输入**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| accountingDate | String | M | 会计日期YYYYMMDD |
| fileIntfcName | String | M | 文件接口名 |
**验收标准**
- [ ] 能正确查询对账文件列表
- [ ] 返回文件ID、名称等完整信息
---
#### 2.4.2 对账文件下载
**功能描述**:下载对账文件内容
**输入**
| 字段 | 类型 | 必填 | 说明 |
|-----|------|-----|------|
| fileId | String | M | 文件唯一标识 |
| fileIntfcName | String | M | 文件接口名 |
| sm4Key | String | M | 对账文件SM4加密密钥 |
**对账文件内容**
| 字段 | 说明 |
|-----|------|
| 统计月份 | YYYYMMDD |
| 一分机构序号 | - |
| 一分机构名称 | - |
| 网点机构属性 | 01-自营02-代理 |
| 积分客户服务编码 | - |
| 服务内容 | - |
| 预约时间 | - |
| 实际完成时间 | - |
| 权益兑换码 | - |
**验收标准**
- [ ] 能正确解密对账文件
- [ ] 能解析对账文件内容
- [ ] 与本地订单数据核对
---
### 2.5 安全与加密模块
#### 2.5.1 邮储银行加解密SM2/SM4
**功能描述**:实现与邮储银行通信的加解密
**加密规则**
1. 随机生成SM4 key
2. 使用SM4 key对请求报文加密CBC模式
3. 使用邮储银行公钥SM2加密SM4 key
**签名规则**
1. 拼接request + encryptKey + accessToken
2. 使用SM3计算摘要
3. 使用私钥SM2加密摘要
**验收标准**
- [ ] SM4加解密正确
- [ ] SM2加解密正确
- [ ] SM3签名验签正确
---
#### 2.5.2 蓝色兄弟加解密RSA/AES
**功能描述**:实现与蓝色兄弟通信的加解密
**业务参数加密规则**
1. 业务参数去掉"零"值
2. 按字母排序转成JSON字符串
3. 使用应用key进行AES加密
**签名规则**
1. 拼接appId + timestamp + ciphertext
2. 使用私钥RSA签名
**验收标准**
- [ ] AES加解密正确
- [ ] RSA签名验签正确
- [ ] 回调验签正确
---
## 3. 数据需求
### 3.1 数据实体
#### 3.1.1 订单表(t_order)
| 字段名 | 类型 | 长度 | 必填 | 说明 |
|-------|------|-----|-----|------|
| id | bigint | 20 | M | 主键 |
| order_no | varchar | 32 | M | 订单号 |
| rights_code | varchar | 32 | M | 权益码 |
| service_type | varchar | 6 | M | 服务类型 |
| provider_code | varchar | 4 | M | 服务商编号 |
| status | int | 3 | M | 订单状态100/200/300/400/500 |
| cust_name | varchar | 40 | N | 客户名称 |
| cert_type | varchar | 2 | N | 证件类型 |
| cert_no | varchar | 30 | N | 证件号码 |
| cust_id | varchar | 32 | N | 客户编号 |
| partner_tx_sri_no | varchar | 24 | M | 合作方交易流水号 |
| req_time | datetime | - | M | 请求时间 |
| appointment_time | datetime | - | N | 预约时间 |
| completion_time | datetime | - | N | 完成时间 |
| cancel_time | datetime | - | N | 取消时间 |
| create_time | datetime | - | M | 创建时间 |
| update_time | datetime | - | M | 更新时间 |
#### 3.1.2 券码表(t_coupon)
| 字段名 | 类型 | 长度 | 必填 | 说明 |
|-------|------|-----|-----|------|
| id | bigint | 20 | M | 主键 |
| order_id | bigint | 20 | M | 关联订单ID |
| out_biz_no | varchar | 32 | M | 外部业务号 |
| trade_no | varchar | 32 | M | 交易号 |
| key_code | varchar | 64 | N | 券码 |
| url | varchar | 256 | N | 短链接 |
| status | int | 1 | M | 状态1-正常2-已核销3-已作废4-已过期 |
| activity_no | varchar | 32 | M | 活动编号 |
| usable_num | int | 10 | M | 总兑换次数 |
| usage_num | int | 10 | M | 已兑换次数 |
| valid_begin_time | datetime | - | M | 有效期开始 |
| valid_end_time | datetime | - | M | 有效期结束 |
| usage_time | datetime | - | N | 核销时间 |
| discard_time | datetime | - | N | 作废时间 |
| create_time | datetime | - | M | 创建时间 |
| update_time | datetime | - | M | 更新时间 |
#### 3.1.3 对账记录表(t_reconciliation)
| 字段名 | 类型 | 长度 | 必填 | 说明 |
|-------|------|-----|-----|------|
| id | bigint | 20 | M | 主键 |
| recon_month | varchar | 6 | M | 对账月份YYYYMM |
| file_id | varchar | 32 | M | 文件ID |
| file_name | varchar | 128 | M | 文件名 |
| recon_status | int | 1 | M | 对账状态0-待对账1-已对账2-有差异 |
| total_count | int | 10 | M | 总记录数 |
| match_count | int | 10 | M | 匹配记录数 |
| diff_count | int | 10 | M | 差异记录数 |
| create_time | datetime | - | M | 创建时间 |
| update_time | datetime | - | M | 更新时间 |
### 3.2 数据规则
1. **订单号生成规则**:渠道号(2位) + 日期(8位) + 序列号(8位)
2. **外部业务号生成规则**:订单号 + 随机数(4位),保证唯一性和幂等性
3. **状态流转**:只允许 200→300、200→400 的状态变更
4. **数据保留**订单数据保留至少2年
---
## 4. 流程图
### 4.1 服务预约流程
```plantuml
@startuml 服务预约流程
actor 客户 as Customer
participant "邮储银行\n服务开放平台" as Bank
participant "服务商系统" as Provider
participant "蓝色兄弟\n营销开放API" as LSB
database "服务商数据库" as DB
Customer -> Bank: 1.发起服务预约
activate Bank
Bank -> Provider: 2.调用预约接口\n(SM2/SM4加密)
activate Provider
Provider -> Provider: 3.解密验签\n校验权益码有效性
Provider -> LSB: 4.获取券码\n(RSA/AES加密)
activate LSB
LSB -> LSB: 5.生成券码
LSB --> Provider: 6.返回券码信息\n(key/url)
deactivate LSB
Provider -> DB: 7.创建订单\n保存券码信息
activate DB
DB --> Provider: 8.保存成功
deactivate DB
Provider --> Bank: 9.返回预约成功\n(SM2/SM4加密)
deactivate Provider
Bank --> Customer: 10.显示预约成功\n展示券码/链接
deactivate Bank
@enduml
```
### 4.2 服务完成流程
```plantuml
@startuml 服务完成流程
actor 客户 as Customer
participant "蓝色兄弟\n营销开放API" as LSB
participant "服务商系统" as Provider
participant "邮储银行\n服务开放平台" as Bank
database "服务商数据库" as DB
Customer -> LSB: 1.使用券码核销
activate LSB
LSB -> LSB: 2.核销券码\n状态变更为已核销(2)
LSB -> Provider: 3.回调通知\n券码状态变更
activate Provider
Provider -> Provider: 4.验证回调签名
Provider -> DB: 5.更新券码状态
activate DB
DB --> Provider: 6.更新成功
deactivate DB
Provider --> LSB: 7.响应"ok"
deactivate LSB
Provider -> Bank: 8.通知服务完成\n(SM2/SM4加密)\n[T+2日内]
activate Bank
Bank -> Bank: 9.更新订单状态\n已预约(200)→已完成(300)
Bank --> Provider: 10.返回完成成功
deactivate Bank
Provider -> DB: 11.更新订单状态为300
deactivate Provider
@enduml
```
### 4.3 服务取消流程
```plantuml
@startuml 服务取消流程
actor 客户 as Customer
participant "邮储银行\n服务开放平台" as Bank
participant "服务商系统" as Provider
participant "蓝色兄弟\n营销开放API" as LSB
database "服务商数据库" as DB
Customer -> Bank: 1.发起服务取消
activate Bank
Bank -> Provider: 2.查询过期积分
activate Provider
Provider -> DB: 3.查询订单积分信息
activate DB
DB --> Provider: 4.返回积分信息
deactivate DB
Provider --> Bank: 5.返回过期积分信息
deactivate Provider
alt 存在过期幸福点
Bank --> Customer: 6a.提示"存在已过期幸福点\n取消后只退还未过期部分"
Customer -> Bank: 6b.确认取消
end
Bank -> Provider: 7.调用取消接口
activate Provider
Provider -> DB: 8.查询订单和券码
activate DB
DB --> Provider: 9.返回订单信息
deactivate DB
Provider -> LSB: 10.作废券码
activate LSB
LSB --> Provider: 11.作废成功
deactivate LSB
Provider -> DB: 12.更新订单状态为400
activate DB
DB --> Provider: 13.更新成功
deactivate DB
Provider --> Bank: 14.返回取消成功
deactivate Provider
Bank --> Customer: 15.显示取消成功\n已退还XX幸福点
deactivate Bank
@enduml
```
### 4.4 月度对账流程
```plantuml
@startuml 月度对账流程
participant "定时任务" as Scheduler
participant "服务商系统" as Provider
participant "邮储银行\n服务开放平台" as Bank
database "服务商数据库" as DB
Scheduler -> Provider: 1.每月3号触发对账任务
activate Provider
Provider -> Bank: 2.查询对账文件列表\n(上月已完成订单)
activate Bank
Bank --> Provider: 3.返回文件列表
deactivate Bank
Provider -> Bank: 4.下载对账文件
activate Bank
Bank --> Provider: 5.返回对账文件内容\n(SM4加密)
deactivate Bank
Provider -> Provider: 6.解密对账文件
Provider -> DB: 7.查询本地已完成订单
activate DB
DB --> Provider: 8.返回订单列表
deactivate DB
Provider -> Provider: 9.数据核对比对
alt 存在差异
Provider -> Provider: 10a.生成差异报告\n人工介入处理
else 无差异
Provider -> DB: 10b.更新对账状态为已对账
end
deactivate Provider
@enduml
```
### 4.5 错误处理流程
```plantuml
@startuml 错误处理流程
participant "调用方" as Caller
participant "服务商系统" as Provider
participant "下游服务" as Downstream
database "服务商数据库" as DB
Caller -> Provider: 1.发起请求
activate Provider
alt 参数校验失败
Provider --> Caller: 2a.返回参数错误\n(900001/900002)
else 签名验证失败
Provider --> Caller: 2b.返回签名错误\n(900005/900011)
else 权益码无效
Provider --> Caller: 2c.返回权益码错误\n(161026/161027)
else 业务规则不满足
Provider --> Caller: 2d.返回业务错误\n(161014/161024)
else 下游服务异常
Provider -> Downstream: 3.调用下游服务
activate Downstream
Downstream --> Provider: 4.返回异常
deactivate Downstream
Provider -> DB: 5.记录异常日志
Provider --> Caller: 6.返回系统繁忙\n(900000/990172)
else 处理成功
Provider -> Downstream: 3.调用下游服务
activate Downstream
Downstream --> Provider: 4.返回成功
deactivate Downstream
Provider -> DB: 5.更新业务数据
Provider --> Caller: 6.返回成功(000000)
end
deactivate Provider
@enduml
```
---
## 5. 用户故事
### 5.1 服务预约
#### US-001: 预约虚拟商品服务
**As a** 邮储银行高端客户
**I want** 使用幸福点兑换的权益码预约虚拟商品服务
**So that** 我可以获得虚拟商品券码并使用
**Acceptance Criteria**:
- [ ] Given 有效的权益码20分钟内When 调用预约接口Then 返回预约成功并获得券码
- [ ] Given 权益码已超过20分钟有效期When 调用预约接口Then 返回161026错误码
- [ ] Given 相同的业务主ID重复请求When 调用预约接口Then 返回幂等结果
---
### 5.2 服务取消
#### US-002: 取消已预约服务
**As a** 邮储银行高端客户
**I want** 取消已预约但未使用的服务
**So that** 我可以退回幸福点
**Acceptance Criteria**:
- [ ] Given 订单状态为已预约(200)When 调用取消接口Then 券码被作废订单状态变为400幸福点退还
- [ ] Given 订单状态为已完成(300)When 调用取消接口Then 返回161014错误码
- [ ] Given 存在已过期幸福点When 取消前查询Then 返回过期积分提醒信息
---
### 5.3 服务完成
#### US-003: 券码核销后服务完成
**As a** 服务商系统
**I want** 在收到券码核销回调后通知邮储银行服务完成
**So that** 完成服务状态同步,确保对账数据一致
**Acceptance Criteria**:
- [ ] Given 收到蓝色兄弟核销回调(status=2)When 处理回调Then 在T+2日内通知邮储银行服务完成
- [ ] Given 订单状态为已取消(400)When 通知服务完成Then 邮储银行返回161014错误
- [ ] Given 回调验签失败When 处理回调Then 不触发服务完成通知
---
### 5.4 服务状态查询
#### US-004: 查询服务状态
**As a** 邮储银行服务开放平台
**I want** 查询权益服务当前状态
**So that** 展示给客户了解服务进展
**Acceptance Criteria**:
- [ ] Given 有效的权益码When 调用状态查询接口Then 返回正确的状态码和描述
- [ ] Given 不存在的权益码When 调用状态查询接口Then 返回161027错误码
---
### 5.5 月度对账
#### US-005: 下载并核对对账文件
**As a** 服务商运营人员
**I want** 每月下载邮储银行的对账文件并与本地数据核对
**So that** 确保交易数据一致性,完成结算
**Acceptance Criteria**:
- [ ] Given 每月3号When 触发对账任务Then 自动下载上月对账文件
- [ ] Given 对账文件下载成功When 数据核对Then 生成对账结果(匹配/差异)
- [ ] Given 存在对账差异When 核对完成Then 生成差异报告供人工处理
---
## 附录
### 附录A专业术语说明
#### A.1 下游系统(邮储银行服务开放平台)
| 术语 | 英文 | 说明 |
|-----|------|------|
| 幸福点 | Happiness Points | 邮储银行高端客户积分,可兑换权益服务 |
| 权益码 | Rights Code | 客户兑换权益服务后获得的唯一标识码格式如16800G-VN4724-NX874-30VHR |
| 服务开放平台 | Open Platform | 邮储银行对外开放的API服务平台 |
| SM2 | SM2 | 国密非对称加密算法,用于密钥交换和数字签名 |
| SM3 | SM3 | 国密哈希算法,用于消息摘要 |
| SM4 | SM4 | 国密对称加密算法,用于报文加密 |
| 业务主ID | busiMainId | 请求的业务唯一标识,规则:渠道号(2位)+日期(8位)+序列号(8位) |
| 对账 | Reconciliation | 每月核对服务商与银行之间的交易数据一致性 |
| T+2 | T+2 | 服务完成后2个工作日内需完成状态同步 |
| 高端客户 | VIP Customer | 邮储银行AUM资产管理规模≥50万的客户 |
| AUM | Assets Under Management | 资产管理规模 |
#### A.2 服务商系统(当前系统)
| 术语 | 英文 | 说明 |
|-----|------|------|
| 合作方交易流水号 | partnerTxSriNo | 服务商生成的交易唯一标识,规则:渠道号(2位)+日期(8位)+序列号(8位) |
| 订单号 | Order No | 服务商系统内部订单唯一标识 |
| 服务状态 | Service Status | 订单服务状态100-未预约200-已预约300-已完成400-已取消500-已过期 |
#### A.3 上游系统蓝色兄弟营销开放API
| 术语 | 英文 | 说明 |
|-----|------|------|
| 蓝色兄弟 | LSB (Lan Se Xiong Di) | 第三方虚拟商品供应商,提供券码服务 |
| 券码 | Coupon Key | 蓝色兄弟平台生成的虚拟商品兑换码 |
| RSA | RSA | 非对称加密算法,用于蓝色兄弟接口签名 |
| AES | AES | 对称加密算法,用于蓝色兄弟业务参数加密 |
| 外部业务号 | out_biz_no | 调用蓝色兄弟API的幂等标识长度2~32位 |
| 交易号 | trade_no | 蓝色兄弟返回的平台交易唯一标识 |
| 活动编号 | activity_no | 蓝色兄弟平台的营销活动唯一标识 |
| 券码状态 | Key Status | 券码状态1-正常2-已核销3-已作废4-已过期 |
---
### 附录B接口业务响应码
#### B.1 下游系统(邮储银行服务开放平台)响应码
**公共响应码**
| 响应码 | 描述 | 处理建议 |
|-------|------|----------|
| 000000 | 交易成功 | - |
| 900000 | 未知系统异常 | 稍后重试或联系技术支持 |
| 900001 | 非法参数 | 检查请求参数格式 |
| 900002 | 必填参数缺失 | 补充必填参数 |
| 900005 | 签名错误 | 检查签名算法和密钥 |
| 900006 | 请求非法 | 检查请求格式 |
| 900008 | 幂等错误 | 检查流水号是否重复 |
| 900011 | 签名验证失败 | 检查签名和公钥 |
| 990172 | 系统繁忙 | 稍后重试 |
| 990272 | 系统繁忙 | 稍后重试 |
| 990772 | 系统繁忙 | 稍后重试 |
**权益积分业务响应码**
| 响应码 | 描述 | 处理建议 |
|-------|------|----------|
| 161006 | 交易数据不存在 | 检查权益码或流水号 |
| 161008 | 未知渠道错误 | 检查渠道标识 |
| 161014 | 服务已完成或取消,不允许再操作 | 业务状态已终结 |
| 161016 | 无权益服务可操作 | 检查订单状态 |
| 161024 | 服务未预约,不允许完成或取消操作 | 需先完成预约 |
| 161026 | 兑换权益码已失效 | 权益码超过20分钟有效期 |
| 161027 | 兑换权益码错误 | 检查权益码格式 |
| 161033 | 实际完成时间不满足对账规范 | 检查completionTime格式 |
| 727101 | 系统异常,请稍后重试 | 稍后重试 |
| 727102 | 未查询到当前分类的积分信息 | 检查查询条件 |
| 729006 | 未找到原交易 | 检查原交易流水号 |
| 729011 | 客户名称不能为空 | 补充客户名称 |
| 729012 | 客户证件类型不能为空 | 补充证件类型 |
| 729013 | 证件号码不能为空 | 补充证件号码 |
| 729024 | 证件号码格式不正确 | 检查证件号码格式 |
| 729033 | 客户编号格式不正确 | 检查客户编号格式 |
| 720502 | 原交易流水号不能为空 | 补充原交易流水号 |
| 720503 | 原交易流水号格式不正确 | 检查流水号格式 |
| 729809 | 系统繁忙,请稍后再试 | 稍后重试 |
| 729909 | 不能为空 | 补充必填字段 |
| 729910 | 格式不正确 | 检查字段格式 |
| 729917 | 长度不符合要求 | 检查字段长度 |
| 729918 | 不能包含特殊字符 | 移除特殊字符 |
| 729922 | 查询结束时间不得小于查询开始时间 | 调整时间范围 |
| 729928 | 查询起始日期必须在12个月内 | 调整查询日期 |
**文件接口响应码**
| 响应码 | 描述 | 处理建议 |
|-------|------|----------|
| 062005 | 查询失败,请稍后再试 | 稍后重试 |
| 063001 | 系统繁忙,请稍后再试 | 稍后重试 |
---
#### B.2 上游系统蓝色兄弟营销开放API响应码
**公共响应码**
| code | reason | 描述 | 处理建议 |
|------|--------|------|----------|
| 200 | - | 成功 | - |
| 400 | SIGNATURE_FAIL | 签名错误 | 检查签名密钥和算法 |
| 400 | SDK_INI_FAIL | SDK错误 | 检查应用配置信息 |
| 400 | PARAM_FAIL | 参数错误 | 检查业务参数 |
| 400 | PARAM_DECRYPT_FAIL | 参数解密错误 | 检查加密方式 |
| 500 | PANIC | 系统错误 | 联系平台处理 |
**业务响应码**
| code | reason | 描述 | 处理建议 |
|------|--------|------|----------|
| 401 | ACTIVITY_NOT_AUTH | 活动未授权 | 检查活动授权状态 |
| 401 | MERCHANT_NOT_EXIST | 客户不存在 | 检查客户是否存在 |
| 401 | MERCHANT_NOT_AUTH | 客户冻结 | 检查客户授权状态 |
| 401 | MERCHANT_APP_INCOMPLETE | 客户应用配置未完善 | 完善应用配置 |
| 401 | MERCHANT_APP_NOT_AUTH | 应用不存在 | 检查应用授权状态 |
| 403 | ACTIVITY_EXPIRE | 活动已结束 | 检查活动有效期 |
| 403 | ACTIVITY_NOT_AUTH | 活动状态异常 | 检查活动状态(作废/待审核/驳回/暂停/失效/编辑中) |
| 403 | ACTIVITY_OUT_OF_STOCK | 活动库存不足 | 联系平台补充库存 |
| 404 | KEY_NOT_EXIST | 券码不存在 | 检查券码或交易号 |
| 404 | ACTIVITY_NOT_EXIST | 活动不存在 | 检查活动编号 |
| 404 | MERCHANT_NOT_EXIST | 客户不存在 | 检查app_id |
| 404 | MERCHANT_APP_NOT_EXIST | 客户应用不存在 | 检查app_id |
| 404 | MERCHANT_ORDER_NOT_EXIST | 订单记录不存在 | 检查交易号/外部业务号 |
| 404 | MERCHANT_APP_INCOMPLETE | 客户应用信息未完善 | 完善应用信息 |
| 503 | KEY_CREATE_FAIL | 券码创建失败 | 稍后重试或联系平台 |
| 503 | MERCHANT_ORDER_CREATE_FAIL | 订单创建失败 | 稍后重试或联系平台 |
| 503 | MERCHANT_ORDER_DISCARD_FAIL | 订单作废失败 | 稍后重试或联系平台 |
| 503 | MERCHANT_ORDER_DISCARD_MQ_FAIL | 订单作废消息失败 | 稍后重试或联系平台 |
---
#### B.3 服务商系统(当前系统)内部错误码
| 错误码 | 描述 | 处理建议 |
|-------|------|----------|
| SYS_001 | 系统内部错误 | 检查系统日志,联系技术支持 |
| SYS_002 | 数据库操作异常 | 检查数据库连接和SQL |
| SYS_003 | 外部服务调用超时 | 检查网络连接,稍后重试 |
| BIZ_001 | 订单不存在 | 检查订单号是否正确 |
| BIZ_002 | 订单状态不允许此操作 | 检查当前订单状态 |
| BIZ_003 | 券码获取失败 | 检查上游服务状态 |
| BIZ_004 | 券码作废失败 | 检查券码当前状态 |
| BIZ_005 | 服务完成通知失败 | 检查下游服务状态,稍后重试 |
---
### 附录C服务类型与厂商编码
#### C.1 服务类型编码
| 服务类型 | 名称 | 类别 |
|---------|------|------|
| 210001 | 口腔护理 | 健康服务 |
| 210002 | 三个月血糖管理 | 健康服务 |
| 210003 | 三个月血压管理 | 健康服务 |
| 210004 | 三个月体重管理 | 健康服务 |
| 220001 | 高铁贵宾厅 | 出行服务 |
| 220002 | 机场贵宾厅 | 出行服务 |
| 220003 | 洗车 | 出行服务 |
| 310001 | 喜马拉雅VIP巅峰会员季卡 | 虚拟会员 |
| 310002 | 知乎会员季卡 | 虚拟会员 |
| 1200 | 机场快速通道 | 出行服务 |
| 1400 | 专车服务舒适型30公里 | 出行服务 |
| 1410 | 专车服务商务型30公里 | 出行服务 |
| 1420 | 专车服务舒适型50公里 | 出行服务 |
| 1430 | 专车服务商务型50公里 | 出行服务 |
| 1500 | 代驾服务20公里及以内 | 出行服务 |
#### C.2 服务厂商编号
| 编号 | 名称 |
|-----|------|
| A101 | 盛大 |
| B101 | 元化 |
#### C.3 渠道标识
| 渠道标识 | 名称 |
|---------|------|
| 12 | 手机银行 |
| 17 | 电话银行 |
| 18 | 微信银行 |
| 36 | you生活 |
| 46 | 北京分行 |