因公付款服务系统架构设计.md 25 KB

因公付款服务系统 - 架构设计计划

一、系统概述

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 核心表结构

-- 企业表
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. 监控:接口调用监控,异常告警

九、参考文档