# 因公付款服务系统 - 架构设计计划
## 一、系统概述
### 1.1 项目定位
基于支付宝企业码能力,构建企业级因公付款服务系统。系统核心目标是帮助企业实现员工因公消费的额度管控、费用控制和账单管理,区别于原文档的旅行社场景,本系统面向各类企业客户提供通用的因公付款解决方案。
### 1.2 核心业务流程
```
企业入驻 → 部门管理 → 员工管理 → 费控制度创建 → 额度发放 → 员工消费 → 账单通知 → 对账结算
```
1. **企业入驻**:企业完成支付宝企业码服务签约开通
2. **组织架构**:创建企业部门,添加/管理企业员工
3. **员工激活**:员工通过二维码/链接完成支付宝协议确认,绑定企业
4. **费控制度**:创建通用场景费控制度,设置使用规则和发放规则
5. **额度管理**:为员工创建点券/额度,设定有效期和金额
6. **因公消费**:员工出示企业码付款或扫码进行因公支付
7. **账单同步**:消费记录实时通过账单变动通知同步给企业
8. **对账结算**:企业查询账单详情,进行费用核销和对账
***
## 二、系统架构设计
### 2.1 整体架构图
```
┌─────────────────────────────────────────────────────────────────┐
│ 前端应用层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Web管理后台 │ │ 企业Portal │ │ 支付宝小程序 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 接口服务层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 企业管理API │ │ 员工管理API │ │ 费控管理API │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 额度管理API │ │ 账单查询API │ │ 支付跳转API │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 业务服务层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 企业签约服务 │ │ 员工管理服务 │ │ 费控规则服务 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 额度发放服务 │ │ 账单处理服务 │ │ 消息通知服务 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 支付宝集成层 │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ Alipay SDK ││
│ │ 企业码API │ 费控API │ 账单API │ 消息订阅(websocket/http) ││
│ └─────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 数据存储层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ PostgreSQL │ │ Redis │ │ 文件存储 │ │
│ │ 企业/员工/制度│ │ 额度/会话缓存 │ │ 账单凭证 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
```
### 2.2 技术栈选型
| 层级 | 技术选型 | 说明 |
| ------ | --------------------- | --------------- |
| 后端框架 | Spring Boot / FastAPI | 根据团队技术栈选择 |
| 数据库 | PostgreSQL 14+ | 存储企业、员工、费控等核心数据 |
| 缓存 | Redis | 额度缓存、会话管理、幂等控制 |
| 消息订阅 | WebSocket / HTTP | 接收支付宝账单变动通知 |
| 支付宝SDK | Alipay SDK | 调用支付宝企业码相关接口 |
| API文档 | Swagger/OpenAPI | 接口文档化 |
***
## 三、核心模块设计
### 3.1 企业管理模块
**功能职责**:完成企业码服务的开通和入驻
**核心接口**:
| 接口名 | 功能 | 优先级 |
| --------------------------------------------------- | -------- | --- |
| alipay.commerce.ec.enterprise.registerinvite.create | 邀请企业注册 | P0 |
| alipay.commerce.ec.enterprise.change.notify | 企业状态变更通知 | P0 |
| alipay.commerce.ec.enterprise.info.query | 查询企业详情 | P1 |
| alipay.commerce.ec.enterprise.info.modify | 修改企业信息 | P1 |
| alipay.commerce.ec.enterprise.unsign | 企业解约 | P2 |
| alipay.commerce.ec.enterprise.delete | 企业注销 | P2 |
**数据结构**:
```
Enterprise {
enterprise_id: string # 企业码企业ID
account_id: string # 支付宝账号ID
name: string # 企业名称
status: enum # 注册/签约/解约/注销
created_at: datetime
updated_at: datetime
}
```
### 3.2 员工管理模块
**功能职责**:管理企业内部可使用因公付款的员工账号
**核心接口**:
| 接口名 | 功能 | 优先级 |
| ----------------------------------------- | -------- | --- |
| alipay.commerce.ec.employee.add | 添加企业员工 | P0 |
| alipay.commerce.ec.employee.delete | 删除企业员工 | P0 |
| alipay.commerce.ec.employee.change.notify | 员工变更通知 | P0 |
| alipay.commerce.ec.employee.invite.query | 获取员工邀请链接 | P1 |
| alipay.commerce.ec.employee.info.modify | 修改员工信息 | P1 |
| alipay.commerce.ec.employee.info.query | 查询员工详情 | P1 |
| alipay.commerce.ec.employee.idlist.query | 查询员工ID列表 | P1 |
**数据结构**:
```
Employee {
employee_id: string # 员工ID
enterprise_id: string # 所属企业ID
alipay_user_id: string # 支付宝用户ID
name: string # 员工姓名
phone: string # 手机号
department_id: string # 部门ID
status: enum # 待激活/已激活/已删除
bind_time: datetime # 绑定时间
}
Department {
department_id: string # 部门ID
enterprise_id: string # 所属企业ID
name: string # 部门名称
parent_id: string # 上级部门ID
}
```
### 3.3 费控制度模块
**功能职责**:创建和管理企业的费用控制规则
**核心接口**:
| 接口名 | 功能 | 优先级 |
| --------------------------------------------------- | -------- | --- |
| alipay.ebpp.invoice.institution.create | 创建费控制度 | P0 |
| alipay.ebpp.invoice.institution.modify | 编辑费控制度 | P0 |
| alipay.ebpp.invoice.institution.scopepageinfo.query | 查询制度适用成员 | P0 |
| alipay.ebpp.invoice.institution.pageinfo.query | 查询费控制度列表 | P1 |
| alipay.ebpp.invoice.institution.detailinfo.query | 查询制度详情 | P1 |
| alipay.ebpp.invoice.institution.delete | 删除费控制度 | P2 |
**数据结构**:
```
ExpenseControl {
institution_id: string # 费控制度ID
enterprise_id: string # 所属企业ID
name: string # 制度名称
expense_type: string # 费用类型
expense_sub_type: string # 费用类型子类
status: enum # 生效/失效
created_at: datetime
}
ExpenseRule {
rule_id: string # 规则ID
institution_id: string # 所属制度ID
name: string # 规则名称
max_amount: decimal # 最大限额
valid_from: datetime # 有效期开始
valid_to: datetime # 有效期结束
merchant_pid: string # 限定商户(可选)
}
```
### 3.4 额度管理模块
**功能职责**:管理员工的因公消费额度
**核心接口**:
| 接口名 | 功能 | 优先级 |
| ----------------------------------------------- | -------- | --- |
| alipay.ebpp.invoice.expensecontrol.quota.create | 创建手工发放额度 | P0 |
| alipay.ebpp.invoice.expensecontrol.quota.query | 查询员工可用额度 | P0 |
| alipay.ebpp.invoice.expensecontrol.quota.modify | 修改手工发放额度 | P0 |
| alipay.ebpp.invoice.expensecontrol.quota.delete | 删除额度 | P2 |
**数据结构**:
```
Quota {
quota_id: string # 额度ID
employee_id: string # 员工ID
institution_id: string # 费控制度ID
outer_source_id: string # 外部来源ID(幂等)
total_amount: decimal # 总金额
available_amount: decimal # 可用金额
valid_from: datetime # 有效期开始
valid_to: datetime # 有效期结束
status: enum # 正常/冻结/已用完/已过期
}
```
### 3.5 账单管理模块
**功能职责**:接收和处理消费账单数据
**核心接口**:
| 接口名 | 功能 | 优先级 |
| -------------------------------------------- | -------- | --- |
| alipay.commerce.ec.consume.change.notify | 账单变动通知 | P0 |
| alipay.commerce.ec.consume.detail.query | 账单详情查询 | P0 |
| alipay.commerce.ec.consume.detail.batchquery | 账单批量分页查询 | P1 |
| alipay.commerce.ec.balance.downloadurl.query | 对账单文件下载 | P2 |
| alipay.commerce.ec.voucher.change.notify | 凭证变动通知 | P1 |
**数据结构**:
```
Bill {
bill_id: string # 账单ID
trade_no: string # 支付宝交易号
enterprise_id: string # 企业ID
employee_id: string # 员工ID
institution_id: string # 费控制度ID
quota_id: string # 额度ID
total_amount: decimal # 账单金额
enterprise_pay_amount: decimal # 企业付金额
personal_pay_amount: decimal # 个人付金额
discount_amount: decimal # 优惠金额
trade_time: datetime # 交易时间
merchant_name: string # 商户名称
status: enum # 已支付/退款/关闭
}
Voucher {
voucher_id: string # 凭证ID
bill_id: string # 关联账单ID
content: json # 凭证内容
}
```
### 3.6 支付跳转模块
**功能职责**:生成跳转链接,拉起支付宝扫一扫或付款码
**核心接口**:
| 功能 | 说明 | 优先级 |
| ------ | ---------------------- | --- |
| 跳转扫一扫 | 生成openAlipayApp拉起扫一扫参数 | P0 |
| 跳转付款码 | 生成schema拉起付款码参数 | P0 |
| 跳转发票关联 | 生成发票关联页面跳转链接 | P1 |
***
## 四、消息通知机制
### 4.1 通知类型
| 通知类型 | 接口名 | 处理方式 |
| ------ | ------------------------------------------- | ------- |
| 企业状态变更 | alipay.commerce.ec.enterprise.change.notify | 更新企业状态 |
| 员工变更 | alipay.commerce.ec.employee.change.notify | 更新员工状态 |
| 账单变动 | alipay.commerce.ec.consume.change.notify | 创建/更新账单 |
| 凭证变动 | alipay.commerce.ec.voucher.change.notify | 更新凭证信息 |
### 4.2 接入方式
* **WebSocket长连接**:实时推送,延迟低
* **HTTP回调**:简单实现,需要暴露公网接口
***
## 五、数据库表设计
### 5.1 核心表结构
```sql
-- 企业表
CREATE TABLE t_enterprise (
id BIGSERIAL PRIMARY KEY,
enterprise_id VARCHAR(64) NOT NULL UNIQUE,
account_id VARCHAR(64),
name VARCHAR(128) NOT NULL,
status VARCHAR(32) DEFAULT 'registered',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 部门表
CREATE TABLE t_department (
id BIGSERIAL PRIMARY KEY,
department_id VARCHAR(64) NOT NULL UNIQUE,
enterprise_id VARCHAR(64) NOT NULL,
name VARCHAR(128) NOT NULL,
parent_id VARCHAR(64),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 员工表
CREATE TABLE t_employee (
id BIGSERIAL PRIMARY KEY,
employee_id VARCHAR(64) NOT NULL UNIQUE,
enterprise_id VARCHAR(64) NOT NULL,
alipay_user_id VARCHAR(64),
name VARCHAR(64) NOT NULL,
phone VARCHAR(32),
email VARCHAR(128),
department_id VARCHAR(64),
status VARCHAR(32) DEFAULT 'pending',
bind_time TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 费控制度表
CREATE TABLE t_expense_institution (
id BIGSERIAL PRIMARY KEY,
institution_id VARCHAR(64) NOT NULL UNIQUE,
enterprise_id VARCHAR(64) NOT NULL,
name VARCHAR(128) NOT NULL,
expense_type VARCHAR(32) DEFAULT 'DEFAULT',
expense_sub_type VARCHAR(32) DEFAULT 'DEFAULT',
status VARCHAR(32) DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 使用规则表
CREATE TABLE t_expense_rule (
id BIGSERIAL PRIMARY KEY,
rule_id VARCHAR(64) NOT NULL UNIQUE,
institution_id VARCHAR(64) NOT NULL,
name VARCHAR(128),
max_amount DECIMAL(12,2),
valid_from TIMESTAMP,
valid_to TIMESTAMP,
merchant_pid VARCHAR(64),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 额度表
CREATE TABLE t_quota (
id BIGSERIAL PRIMARY KEY,
quota_id VARCHAR(64) NOT NULL UNIQUE,
employee_id VARCHAR(64) NOT NULL,
institution_id VARCHAR(64) NOT NULL,
outer_source_id VARCHAR(64) NOT NULL,
total_amount DECIMAL(12,2) NOT NULL,
available_amount DECIMAL(12,2) NOT NULL,
valid_from TIMESTAMP NOT NULL,
valid_to TIMESTAMP NOT NULL,
status VARCHAR(32) DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 账单表
CREATE TABLE t_bill (
id BIGSERIAL PRIMARY KEY,
bill_id VARCHAR(64) NOT NULL UNIQUE,
trade_no VARCHAR(64) NOT NULL,
enterprise_id VARCHAR(64) NOT NULL,
employee_id VARCHAR(64) NOT NULL,
institution_id VARCHAR(64),
quota_id VARCHAR(64),
total_amount DECIMAL(12,2) NOT NULL,
enterprise_pay_amount DECIMAL(12,2) DEFAULT 0,
personal_pay_amount DECIMAL(12,2) DEFAULT 0,
discount_amount DECIMAL(12,2) DEFAULT 0,
trade_time TIMESTAMP,
merchant_name VARCHAR(256),
status VARCHAR(32) DEFAULT 'paid',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 凭证表
CREATE TABLE t_voucher (
id BIGSERIAL PRIMARY KEY,
voucher_id VARCHAR(64) NOT NULL UNIQUE,
bill_id VARCHAR(64) NOT NULL,
content JSONB,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 操作日志表
CREATE TABLE t_operation_log (
id BIGSERIAL PRIMARY KEY,
operation_type VARCHAR(64) NOT NULL,
enterprise_id VARCHAR(64),
employee_id VARCHAR(64),
request_data JSONB,
response_data JSONB,
status VARCHAR(32),
error_message TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 添加更新触发器函数
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ language 'plpgsql';
-- 为需要自动更新updated_at的表创建触发器
CREATE TRIGGER update_t_enterprise_updated_at
BEFORE UPDATE ON t_enterprise
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_t_employee_updated_at
BEFORE UPDATE ON t_employee
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_t_expense_institution_updated_at
BEFORE UPDATE ON t_expense_institution
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_t_quota_updated_at
BEFORE UPDATE ON t_quota
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_t_bill_updated_at
BEFORE UPDATE ON t_bill
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
```
***
## 六、接口设计
### 6.1 企业管理接口
| 接口 | 方法 | 说明 |
| ------------------------------------------ | ------ | ------ |
| POST /api/enterprise/invite | 创建企业邀请 | 获取注册链接 |
| GET /api/enterprise/{enterpriseId} | 查询企业详情 |
|
| PUT /api/enterprise/{enterpriseId} | 修改企业信息 |
|
| POST /api/enterprise/{enterpriseId}/unsign | 企业解约 |
|
| POST /api/enterprise/{enterpriseId}/delete | 企业注销 |
|
### 6.2 员工管理接口
| 接口 | 方法 | 说明 |
| ----------------------------------------- | ------ | ------ |
| POST /api/employee | 添加员工 |
|
| DELETE /api/employee/{employeeId} | 删除员工 |
|
| GET /api/employee/{employeeId} | 查询员工详情 |
|
| PUT /api/employee/{employeeId} | 修改员工信息 |
|
| GET /api/employee/list | 查询员工列表 |
|
| GET /api/employee/{employeeId}/invite-url | 获取邀请链接 |
|
### 6.3 费控管理接口
| 接口 | 方法 | 说明 |
| --------------------------------------------- | ------ | ------ |
| POST /api/institution | 创建费控制度 |
|
| PUT /api/institution/{institutionId} | 编辑费控制度 |
|
| GET /api/institution/{institutionId} | 查询制度详情 |
|
| GET /api/institution/list | 查询制度列表 |
|
| DELETE /api/institution/{institutionId} | 删除费控制度 |
|
| POST /api/institution/{institutionId}/members | 编辑制度成员 |
|
### 6.4 额度管理接口
| 接口 | 方法 | 说明 |
| ------------------------------------ | -------- | ------ |
| POST /api/quota | 创建额度 |
|
| GET /api/quota/{quotaId} | 查询额度详情 |
|
| GET /api/quota/employee/{employeeId} | 查询员工可用额度 |
|
| PUT /api/quota/{quotaId} | 修改额度 |
|
| DELETE /api/quota/{quotaId} | 删除额度 |
|
### 6.5 账单管理接口
| 接口 | 方法 | 说明 |
| ---------------------- | ------ | ------ |
| GET /api/bill/{billId} | 查询账单详情 |
|
| GET /api/bill/list | 查询账单列表 |
|
| GET /api/bill/download | 下载对账单 |
|
### 6.6 支付跳转接口
| 接口 | 方法 | 说明 |
| ------------------------- | ---------- | ------ |
| POST /api/pay/scan-url | 生成扫一扫跳转链接 |
|
| POST /api/pay/code-url | 生成付款码跳转链接 |
|
| POST /api/pay/invoice-url | 生成发票关联跳转链接 |
|
***
## 七、实施计划
### 阶段一:基础能力建设(2-3周)
1. **环境准备**
* 完成支付宝开放平台账号注册和认证
* 创建自研应用(小程序或网页应用)
* 配置密钥,完成应用上线
2. **框架搭建**
* 项目工程创建,依赖配置
* 数据库设计和初始化
* 支付宝SDK集成和配置
3. **核心功能开发**
* 企业管理模块(入驻、签约)
* 员工管理模块(增删改查)
* 消息订阅机制实现
**交付物**:
* 基础项目框架
* 数据库表结构脚本
* 企业管理、员工管理API
### 阶段二:费控和额度模块(2-3周)
1. **费控制度管理**
* 费控制度CRUD
* 使用规则管理
* 成员范围管理
2. **额度管理**
* 额度创建和发放
* 额度查询和修改
* 有效期管理
**交付物**:
* 费控管理API
* 额度管理API
* 管理后台界面原型
### 阶段三:账单和支付模块(2-3周)
1. **账单管理**
* 账单通知接收和处理
* 账单查询和对账
* 凭证管理
2. **支付跳转**
* 扫一扫跳转链接生成
* 付款码跳转链接生成
* H5/小程序端集成
**交付物**:
* 账单管理API
* 支付跳转功能
* 完整业务流程联调
### 阶段四:测试和上线(1-2周)
1. **测试**
* 单元测试编写
* 接口联调测试
* 场景测试
2. **上线**
* 生产环境部署
* 支付宝产品包挂载
* 消息订阅配置
* 正式环境联调
**交付物**:
* 测试报告
* 部署文档
* 用户手册
***
## 八、风险点和注意事项
### 8.1 关键风险
| 风险点 | 影响 | 应对措施 |
| ------- | ----- | ----------- |
| 支付宝接口限流 | 业务中断 | 添加限流保护,本地缓存 |
| 消息通知丢失 | 账单不一致 | 定期对账,主动查询补全 |
| 额度超用 | 资金损失 | 额度预冻结机制 |
| 员工删除后消费 | 纠纷 | 删除前检查待生效额度 |
### 8.2 注意事项
1. **幂等性**:所有写操作接口需保证幂等,使用outer\_source\_id控制
2. **安全性**:敏感数据加密存储,接口权限校验
3. **日志**:完整记录所有操作,便于问题排查
4. **监控**:接口调用监控,异常告警
***
## 九、参考文档
* 支付宝开放平台文档:
* 企业码产品文档:
* 消息订阅接入: