MiniContractPro
    • 简介
    • 开放平台接入文档
    • 移动端 - 签署任务
      • 验证短链接(返回签署模式)
        GET
      • 获取预览短链接
        GET
      • 执行签署(对外)
        POST
      • 下载签署文档
        GET
      • 获取签署任务列表(分页)
        GET
      • 获取签署任务详情
        GET
      • 获取签署任务统计
        GET
      • 获取签署任务参与人列表
        GET
      • 撤销签署任务
        DELETE
      • 删除签署任务
        DELETE
      • 基于模板创建签署任务
        POST
      • 基于文件创建签署任务
        POST
      • 基于图片创建签署任务
        POST
      • 获取参与人已填写的表单数据
        GET
      • 获取签署任务的表单字段定义
        GET
      • 提交表单数据(H5端)
        POST
      • 更新表单数据(H5端)
        POST
    • 移动端 - 签署方联系人
      • 获取签署方联系人列表(分页)
        GET
      • 删除签署方联系人
        DELETE
    • 移动端 - 印章授权管理
      • 创建印章授权
        POST
      • 删除印章授权
        DELETE
      • 获取印章的授权列表
        GET
      • 获取当前用户的授权列表
        GET
    • 移动端 - AI起草推荐话术
      • 获取推荐话术列表
        GET
      • 根据合同类型获取推荐话术
        GET
      • 增加话术使用次数
        POST
    • 移动端 - AI起草消息
      • 发送消息
      • 获取对话消息列表
    • 移动端 - AI起草合同
      • 生成合同
      • 更新合同内容
      • 获取合同详情
    • 移动端 - AI起草合同 - PDF和签署
      • 导出合同为PDF
      • 创建签署任务
    • 移动端 - AI起草对话
      • 创建对话
      • 获取对话分页列表
      • 获取对话详情
      • 获取对话详情(包含所有消息)
      • 删除对话
    • 移动端 - 合同AI审查
      • 发起AI审查
      • 查询审查任务状态
      • 获取审查报告
      • 获取审查任务的风险点列表
      • 获取单个风险点详情
      • 获取合同的审查历史
      • 获取当前用户的所有审查历史
      • 重试失败的审查任务
    • 移动端 - 合同模板管理
      • 获取合同模板列表(分页)
      • 获取合同模板详情
      • 获取模板分类列表
      • 获取常用模板
      • 获取热门模板
      • 搜索模板
      • 记录模板使用
    • 移动端 - 印章管理
      • 生成 Seal-Token(支持续期)
      • 获取个人印章列表
      • 创建印章(个人/企业)
      • 获取印章详情
      • 更新印章
      • 删除印章
      • 设置默认印章(开放接口)
      • 获取个人印章列表(分页,开放接口)
      • 检查企业印章唯一性
      • 上传文件(印章图片)
    • 移动端 - 签署配置
      • 获取签署安全配置
    • 移动端 - 短链接
      • 获取小程序信息
    • 移动端 - 配额查询
      • 获取当前用户配额余额
    • 移动端 - 合同验证
      • 验证合同签署
      • 获取验证结果详情
      • 获取剩余验证次数
    • 移动端 - Seal 认证
      • 兑换 Seal-Token(移动端)
      • 刷新 Seal-Token(移动端)
      • 验证 Seal-Token(移动端)
    • 移动端 - 意愿验证
      • 发送验证码
      • 验证身份
      • 获取验证状态
    • PC端门户 - 文件存储
      • 上传文件
      • 获取文件预签名地址(上传)
      • 创建文件
    • PC端门户 - 合同验证
      • 验证合同签署
      • 获取验证结果详情
      • 获取剩余验证次数
    • PC端门户 - 签署任务
      • 创建签署任务(基于模板)
      • 基于文件创建签署任务
      • 基于图片创建签署任务
      • 用户签署任务
      • 拒绝签署任务
      • 撤销签署任务
      • 删除签署任务
      • 批量签署任务
      • 批量获取签署任务状态
      • 获得签署任务详情
      • 获取签署任务参与人列表
      • 获取签署任务的印章放置信息
      • 获得签署任务分页(带权限过滤)
      • 获取签署任务统计信息
      • 获取待我处理的签署任务分页
      • 获取我发起的签署任务分页
      • 获取我已处理的签署任务分页
      • 提交表单数据
      • 修改表单数据
      • 获取字段默认值
      • 验证签署权限
      • 上传签署后的PDF文件
      • 同步纯前端签署状态
      • 保存签署草稿
      • 获取签署草稿
      • 删除签署草稿
      • 获取任务版本历史
      • 比较PDF版本差异
      • 验证PDF文件完整性
      • 生成签署链接
      • 获取印章图片
      • 获取任务参与人的表单字段定义
      • 获取参与人已填写的表单数据
      • 下载合同文件
    • PC端门户 - 意愿验证
      • 发送验证码
      • 验证身份
      • 获取验证状态
    • PC端门户 - 扫码签名
      • 创建签名Token
      • 检查签名状态
      • 上传签名图片
      • 保存签名
    • PC端门户 - 印章管理
      • 创建印章(个人/企业)
      • 更新印章
      • 更新印章状态
      • 删除印章
      • 获得印章详情
      • 获得印章分页
      • 获取当前用户可用的印章列表
      • 设置默认印章
      • 取消默认印章
      • 作废印章
      • 模板生成印章
      • 获取指定类型的默认印章
      • 检查企业印章唯一性
    • PC端门户 - 批量任务
      • 创建批量发起任务
      • 创建批量签署任务
      • 获得批量任务详情
      • 获得批量任务分页(带权限过滤)
      • 批量获取任务状态
      • 获取批量任务子项列表
    • PC端门户 - 签署方联系人
      • 获取签署方联系人列表(分页)
      • 删除签署方联系人
    • PC端门户 - 印章授权
      • 创建印章授权
      • 更新印章授权
      • 删除印章授权
      • 获得印章授权分页
      • 获取可授权的企业成员列表
    • PC端门户 - Seal 认证
      • 兑换 Seal-Token(PC端)
      • 刷新 Seal-Token
      • 验证 Seal-Token
    • PC端门户 - 模板分类
      • 创建模板分类
      • 更新模板分类
      • 删除模板分类
      • 获得模板分类
      • 获得模板分类分页
      • 获得所有启用的模板分类列表
    • PC端门户 - 合同模板
      • 创建合同模板
      • 更新合同模板
      • 删除合同模板
      • 获得合同模板
      • 获得合同模板分页(带权限过滤)
      • 获得合同模板列表(启用状态)
      • 批量保存合同模板表单字段(并创建新版本)
      • 批量保存模板签署方
      • 更新模板二维码启用状态
      • 更新模板状态
      • 获取模板的所有历史版本
      • 获取模板的最新版本
      • 恢复到指定版本
      • 保存签署方验证配置
      • 获取签署方验证配置
    • PC端门户 - 分享
      • 获取分享摘要信息(公开接口)
    • PC端门户 - 配额查询
      • 获取当前用户配额余额
    • 数据模型
      • ParticipantInfo
      • OpenSignTaskRespVO
      • CommonResultOpenSignTaskRespVO
      • key
      • MapObject
      • Participant
      • OpenSignTaskCreateReqVO
      • CommonResultBoolean
      • CommonResultListParticipantInfo
      • CommonResultString
      • SealAuthTokenRespVO
      • CommonResultSealAuthTokenRespVO
      • OpenWebhookConfigRespVO
      • CommonResultOpenWebhookConfigRespVO
      • OpenWebhookConfigVO
      • CommonResultLong
      • PerforationSegment
      • PerforationData
      • SignPosition
      • Participant
      • SealSignTaskCreateReqVO
      • ParticipantInfo
      • AppSignTaskCreateFromFileReqVO
      • ParticipantInfo
      • AppSignTaskCreateFromImagesReqVO
      • FormFieldData
      • PageInfo
      • SealSignTaskSignReqVO
      • MapBoolean
      • CommonResultMapBoolean
      • SealSignTaskBatchSignReqVO
      • ParticipantInfo
      • SealSignTaskStatusRespVO
      • CommonResultListSealSignTaskStatusRespVO
      • SealSignTaskStatusReqVO
      • SealSignTaskRespVO
      • CommonResultSealSignTaskRespVO
      • CommonResultListParticipantInfo
      • SealPlacementRespVO
      • CommonResultListSealPlacementRespVO
      • PageResultSealSignTaskRespVO
      • CommonResultPageResultSealSignTaskRespVO
      • SealSignTaskStatisticsRespVO
      • CommonResultSealSignTaskStatisticsRespVO
      • SealSignTaskFormSubmitReqVO
      • MapString
      • SealSignTaskFieldDefaultsRespVO
      • CommonResultSealSignTaskFieldDefaultsRespVO
      • ValidateSignPermissionRespVO
      • CommonResultValidateSignPermissionRespVO
      • SealInstance
      • key
      • SyncPureFrontendSignStatusReqVO
      • key
      • SavePureFrontendDraftReqVO
      • key
      • PureFrontendDraftRespVO
      • CommonResultPureFrontendDraftRespVO
      • TaskVersionHistoryRespVO
      • CommonResultListTaskVersionHistoryRespVO
      • key
      • ComparePdfVersionsRespVO
      • CommonResultComparePdfVersionsRespVO
      • ComparePdfVersionsReqVO
      • key
      • VerifyPdfIntegrityRespVO
      • CommonResultVerifyPdfIntegrityRespVO
      • key
      • VerifyPdfIntegrityReqVO
      • GenerateSignLinkRespVO
      • CommonResultGenerateSignLinkRespVO
      • GenerateSignLinkReqVO
      • key
      • CommonResultListMapObject
      • key
      • CommonResultMapObject
      • SignatureTokenRespVO
      • CommonResultSignatureTokenRespVO
      • SignatureTokenReqVO
      • SignatureStatusRespVO
      • CommonResultSignatureStatusRespVO
      • SealAuthorizationCreateReqVO
      • SealAuthorizationUpdateReqVO
      • SealAuthorizationRespVO
      • PageResultSealAuthorizationRespVO
      • CommonResultPageResultSealAuthorizationRespVO
      • SealTemplateFormFieldRespVO
      • SealTemplateSignatoryRespVO
      • SealTemplateRespVO
      • CommonResultSealTemplateRespVO
      • PageResultSealTemplateRespVO
      • CommonResultPageResultSealTemplateRespVO
      • CommonResultListSealTemplateRespVO
      • SealTemplateFormFieldSaveReqVO
      • MapLong
      • SealTemplateFormFieldBatchSaveReqVO
      • CommonResultMapLong
      • SealTemplateSignatorySaveReqVO
      • SignatoryVerificationConfigVO
      • SaveSignatoryConfigReqVO
      • SignatoryConfigRespVO
      • CommonResultSignatoryConfigRespVO
      • SignatoryContactRespVO
      • PageResultSignatoryContactRespVO
      • CommonResultPageResultSignatoryContactRespVO
      • ShareSummaryRespVO
      • CommonResultShareSummaryRespVO
      • QuotaBalanceRespVO
      • CommonResultQuotaBalanceRespVO
      • SendCodeRespVO
      • CommonResultSendCodeRespVO
      • SendCodeReqVO
      • VerifyResultVO
      • CommonResultVerifyResultVO
      • VerifyReqVO
      • VerificationStatusVO
      • CommonResultVerificationStatusVO
      • BatchItemData
      • SealBatchTaskCreateReqVO
      • SealBatchTaskItemRespVO
      • SealBatchTaskRespVO
      • CommonResultSealBatchTaskRespVO
      • PageResultSealBatchTaskRespVO
      • CommonResultPageResultSealBatchTaskRespVO
      • CommonResultListSealBatchTaskRespVO
      • SealBatchTaskStatusReqVO
      • CommonResultListSealBatchTaskItemRespVO
      • SealCreateReqVO
      • SealUpdateReqVO
      • SealRespVO
      • CommonResultSealRespVO
      • PageResultSealRespVO
      • CommonResultPageResultSealRespVO
      • CommonResultListSealRespVO
      • SealRevokeReqVO
      • SealTemplateGenerateReqVO
      • TemplateCategorySaveReqVO
      • TemplateCategoryRespVO
      • CommonResultTemplateCategoryRespVO
      • PageResultTemplateCategoryRespVO
      • CommonResultPageResultTemplateCategoryRespVO
      • CommonResultListTemplateCategoryRespVO
      • SendCodeRespVO
      • CommonResultSendCodeRespVO
      • SendCodeReqVO
      • VerifyResultVO
      • CommonResultVerifyResultVO
      • VerifyReqVO
      • VerificationStatusVO
      • CommonResultVerificationStatusVO
      • CommonResultInteger
      • SealIpWhitelistCreateReqVO
      • SealIpWhitelistRespVO
      • CommonResultListSealIpWhitelistRespVO
      • SealTemplateCreateReqVO
      • CommonResultSealAuthorizationRespVO
      • VerificationItemResult
      • ContractInfoVO
      • SignerVO
      • TimelineEventVO
      • VerificationResultVO
      • CommonResultVerificationResultVO
      • FilePresignedUrlRespVO
      • CommonResultFilePresignedUrlRespVO
      • FileCreateReqVO
      • MiniprogramConfig
      • PlatformRouting
      • AuthByRefRespVO
      • CommonResultAuthByRefRespVO
      • SignTaskCreateResultVO
      • CommonResultSignTaskCreateResultVO
      • AppSealGrantCreateReqVO
      • AppSealGrantRespVO
      • CommonResultListAppSealGrantRespVO
      • TemplateRespVO
      • CommonResultListTemplateRespVO
      • MessageRespVO
      • CommonResultMessageRespVO
      • MessageSendReqVO
      • CommonResultListMessageRespVO
      • ContractGenerateReqVO
      • ContractUpdateReqVO
      • ContractRespVO
      • CommonResultContractRespVO
      • PdfExportRespVO
      • CommonResultPdfExportRespVO
      • PdfExportReqVO
      • ParticipantInfo
      • SigningCreateReqVO
      • ConversationCreateReqVO
      • ConversationRespVO
      • PageResultConversationRespVO
      • CommonResultPageResultConversationRespVO
      • CommonResultConversationRespVO
      • ConversationDetailRespVO
      • CommonResultConversationDetailRespVO
      • AuditStartReqVO
      • AuditTaskRespVO
      • CommonResultAuditTaskRespVO
      • AuditRiskRespVO
      • CommonResultListAuditRiskRespVO
      • CommonResultAuditRiskRespVO
      • CommonResultListAuditTaskRespVO
      • AuditRetryReqVO
      • VariableOptionVO
      • TemplateVariableVO
      • TemplateSignatoryFieldVO
      • TemplateSignatoryVO
      • FormFieldVO
      • AppTemplateDetailRespVO
      • CommonResultAppTemplateDetailRespVO
      • TemplateCategoryRespVO
      • CommonResultListTemplateCategoryRespVO
      • AppTemplateRespVO
      • CommonResultListAppTemplateRespVO
      • PageResultAppTemplateRespVO
      • CommonResultPageResultAppTemplateRespVO
      • GenerateTokenReqDTO
      • SignSecurityLevelOption
      • SignSecurityConfigRespVO
      • CommonResultSignSecurityConfigRespVO
      • MiniprogramInfoVO
      • CommonResultMiniprogramInfoVO
      • QuotaBalanceRespVO
      • CommonResultQuotaBalanceRespVO
      • SealSignTaskParticipantReqVO
      • SealSignTaskCreateFromTemplateReqVO
      • VerificationResultVO
      • CommonResultVerificationResultVO
      • CommonResultMapString
      • SealUsageLogRespVO
      • PageResultSealUsageLogRespVO
      • CommonResultPageResultSealUsageLogRespVO
      • SealApiKeyCreateReqVO
      • SealApiKeyUpdateReqVO
      • SealApiKeyRespVO
      • CommonResultSealApiKeyRespVO
      • PageResultSealApiKeyRespVO
      • CommonResultPageResultSealApiKeyRespVO

    简介

      ____             _   ____            _ 
     / ___|  ___  __ _| | / ___| _   _ ___| |_ ___ _ __ ___  
     \___ \ / _ \/ _` | | \___ \| | | / __| __/ _ \ '_ ` _ \ 
      ___) |  __/ (_| | |  ___) | |_| \__ \ ||  __/ | | | | |
     |____/ \___|\__,_|_| |____/ \__, |___/\__\___|_| |_| |_|
                                 |___/                        
    企业级电子印章管理与合同签署系统
    Version License Spring Boot Java
    基于 Spring Boot 2.7.x 开发,采用模块化设计,支持小程序 + H5 双平台签署。

    作者: 小华同学 ai
    官网: https://s.leepm.com
    版本: v1.6.0

    shawn_huangxing_qrcode.png#

    目录#

    系统简介
    技术架构
    项目结构
    SPI 扩展机制
    平台路由配置
    签署链接生成与跳转流程
    签署安全级别
    Open API 开放接口
    快速开始
    配置参考
    更新日志

    系统简介#

    Seal 电子签章系统提供完整的电子印章管理与合同签署能力:
    印章管理 - 创建、分类、权限控制、使用审计
    签署任务 - 创建签署任务,多方协同签署
    双平台签署 - 支持微信小程序和 H5 网页两种签署方式
    安全级别 - 快捷签署(无需登录)和登录签署(需身份认证)
    多租户隔离 - 支持 SaaS 多租户模式
    PDF 数字签名 - 支持元数据签名和真实数字证书签名

    技术架构#

    技术栈#

    技术版本说明
    Spring Boot2.7.x基础框架
    MyBatis-Plus3.5.xORM 框架
    MySQL5.7+ / 8.0+数据库
    Redis6.0+缓存 & 短链接存储
    iText5.5.13PDF 处理与数字签名

    架构图#

    ┌─────────────────────────────────────────────────────────┐
    │                     应用层 (Application)                │
    │  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌────────┐ │
    │  │ Admin UI │  │seal-core │  │mini-cont.│  │Portal  │ │
    │  │ (管理后台) │  │ (签署引擎) │  │(小程序/H5)│  │(PC门户) │ │
    │  └──────────┘  └──────────┘  └──────────┘  └────────┘ │
    └─────────────────────────────────────────────────────────┘
                                ↓
    ┌─────────────────────────────────────────────────────────┐
    │                  接口层 (Controller)                    │
    │  ┌────────────┐  ┌────────────┐  ┌──────────────────┐  │
    │  │  Admin API  │  │   App API   │  │   Portal API    │  │
    │  │ (管理端)     │  │ (签署/认证)  │  │  (PC门户端)      │  │
    │  └────────────┘  └────────────┘  └──────────────────┘  │
    │  ┌──────────────────────────────────────────────────┐   │
    │  │  Open API(第三方开放接口)                         │   │
    │  │  认证 → 签署任务 → Webhook 回调                    │   │
    │  └──────────────────────────────────────────────────┘   │
    └─────────────────────────────────────────────────────────┘
                                ↓
    ┌─────────────────────────────────────────────────────────┐
    │                  业务层 (Service)                       │
    │  ┌──────────┐  ┌──────────┐  ┌────────────┐           │
    │  │SealSign  │  │Seal      │  │Notification│           │
    │  │TaskSvc   │  │ConfigSvc │  │Service     │           │
    │  │(签署任务)  │  │(配置读取)  │  │(通知&短链接) │           │
    │  └──────────┘  └──────────┘  └────────────┘           │
    │  ┌──────────┐  ┌──────────┐  ┌────────────┐           │
    │  │Signature │  │IntentVer.│  │Template    │           │
    │  │Service   │  │Service   │  │Service     │           │
    │  │(PDF签名)  │  │(意愿验证)  │  │(模板管理)   │           │
    │  └──────────┘  └──────────┘  └────────────┘           │
    └─────────────────────────────────────────────────────────┘
                                ↓
    ┌─────────────────────────────────────────────────────────┐
    │                  扩展层 (SPI / Starter)                 │
    │  ┌────────────────────┐  ┌──────────────────────────┐  │
    │  │  UserInfoProvider   │  │  QuotaValidator          │  │
    │  │  (用户信息获取)       │  │  (配额校验)               │  │
    │  └────────────────────┘  └──────────────────────────┘  │
    └─────────────────────────────────────────────────────────┘
                                ↓
    ┌─────────────────────────────────────────────────────────┐
    │                  数据层 (DAO / Mapper)                  │
    │  ┌──────────┐  ┌──────────┐  ┌──────────┐             │
    │  │  MySQL   │  │  Redis   │  │  OSS     │             │
    │  │ (业务数据) │  │ (短链接/缓存)│  │ (文件存储) │             │
    │  └──────────┘  └──────────┘  └──────────┘             │
    └─────────────────────────────────────────────────────────┘

    核心模块#

    yudao-module-seal/
    ├── yudao-module-seal-api/                  # 公共 API(DTO、枚举、SPI 接口)
    │   └── api/
    │       ├── auth/                           #   认证 SPI(SealAuthProvider)
    │       ├── storage/                        #   存储 SPI(SealStorageProvider)
    │       └── validator/                      #   校验 SPI(SealQuotaValidator、SealUserValidator)
    ├── yudao-module-seal-biz/                  # 业务实现(Controller、Service、DAL)
    │   └── service/user/                       #   用户信息 SPI(UserInfoProvider、UserInfoAdapter)
    └── yudao-module-seal-spring-boot-starter/  # 产品化 Starter(SPI 适配、License)
        ├── adapter/                            #   SPI 适配器实现(auth、storage、user、enterprise)
        └── validator/                          #   SPI 校验器实现(Ruoyi 适配 + NoOp 降级)

    前端项目#

    项目说明路径
    seal-core签署引擎 H5(签署页面、短链接路由)yudao-ui/seal-core
    mini-contractuni-app 用户端(小程序 / H5 / APP)mini-contract/
    contract-portal-pcPC 端合同管理门户yudao-ui/contract-portal-pc
    yudao-ui-admin-vue3管理后台yudao-ui/yudao-ui-admin-vue3

    项目结构#

    yudao-module-seal-biz/src/main/java/cn/iocoder/yudao/module/seal/
    ├── controller/
    │   ├── admin/                    # 管理端 API
    │   │   ├── sealsigntask/         # 签署任务管理
    │   │   └── vo/                   # 管理端 VO
    │   ├── app/                      # App 端 API(小程序/H5 直接调用)
    │   │   ├── signtask/             # 签署任务(含 auth-by-ref 认证)
    │   │   ├── seal/                 # 印章操作
    │   │   ├── shortlink/            # 短链接信息
    │   │   └── template/             # 模板操作
    │   ├── portal/                   # Portal 端 API(PC 门户调用)
    │   └── open/                     # Open API(第三方开放接口)
    │       ├── OpenSealAuthController    # 认证(AppKey/Secret → Token)
    │       ├── OpenSignTaskController    # 签署任务 CRUD
    │       ├── OpenWebhookController     # Webhook 回调配置
    │       └── vo/                       # Open API 请求/响应 VO
    ├── service/
    │   ├── sealsigntask/             # 签署任务核心业务
    │   ├── config/                   # 配置服务(SealConfigService)
    │   ├── notification/             # 通知 & 短链接生成
    │   ├── signature/                # PDF 数字签名
    │   ├── intentverification/       # 签署意愿验证
    │   └── webhook/                  # Webhook 回调服务
    │       ├── SealWebhookService        # 接口
    │       └── SealWebhookServiceImpl    # 实现(WebClient + 异步 + 重试)
    ├── dal/
    │   ├── dataobject/               # 数据对象(DO)
    │   │   └── webhook/              # Webhook 相关 DO
    │   │       ├── SealWebhookConfigDO   # 回调配置
    │   │       └── SealWebhookLogDO      # 回调日志
    │   ├── mysql/                    # Mapper
    │   │   └── webhook/              # Webhook Mapper
    │   └── redis/                    # Redis Key 常量
    ├── framework/
    │   └── security/                 # Seal Token 认证体系
    └── util/
        └── jwt/                      # JWT 工具

    SPI 扩展机制#

    设计目标#

    Seal 模块通过 SPI(Service Provider Interface)机制实现与外部系统的解耦。核心思想是:
    seal-api 定义 SPI 接口(契约)
    seal-biz 通过接口调用,不关心具体实现
    seal-spring-boot-starter 提供面向 ruoyi-vue-pro 的默认实现
    第三方客户 可以替换任意 SPI 实现,适配自己的系统
    这种设计使得 Seal 模块可以独立运行,也可以无缝集成到不同的宿主系统中。

    架构总览#

    ┌─────────────────────────────────────────────────────────────────┐
    │                    seal-biz(业务层)                             │
    │                                                                 │
    │  SealSignTaskServiceImpl                                        │
    │    ├── @Resource UserInfoProvider          ← 获取用户手机号等    │
    │    ├── @Resource SealUserValidator         ← 校验用户/实名认证   │
    │    ├── @Autowired(required=false)                               │
    │    │   SealQuotaValidator                  ← 配额校验(可选)    │
    │    └── @Autowired(required=false)                               │
    │        EnterpriseAccessValidator           ← 企业权限校验(可选) │
    │                                                                 │
    │  PdfDigitalSignatureService                                     │
    │    └── @Resource SealStorageProvider       ← 文件上传/下载       │
    │                                                                 │
    │  SealTokenAdapter                                               │
    │    └── @Resource SealAuthProvider          ← 用户认证            │
    └────────────────────────┬────────────────────────────────────────┘
                             │ 接口调用(无编译依赖)
                             ▼
    ┌─────────────────────────────────────────────────────────────────┐
    │                 seal-spring-boot-starter(适配层)                │
    │                                                                 │
    │  ┌─────────────────┐  ┌──────────────────┐  ┌───────────────┐  │
    │  │ RuoyiAuthAdapter │  │RuoyiQuotaValid.  │  │UserInfoAdapter│  │
    │  │ JwtAuthAdapter   │  │RuoyiUserValid.   │  │  Impl         │  │
    │  │ OAuth2AuthAdapter│  │NoOpQuotaValid.   │  │NoOpUserInfo   │  │
    │  └─────────────────┘  │NoOpUserValid.    │  │  Adapter      │  │
    │                        └──────────────────┘  └───────────────┘  │
    │  ┌──────────────────────┐  ┌──────────────────────────────┐     │
    │  │ RuoyiFileClientAdapter│  │EnterpriseAccessValidatorImpl │     │
    │  │ OssStorageAdapter     │  │NoOpEnterpriseAccessValidator │     │
    │  │ MinioStorageAdapter   │  └──────────────────────────────┘     │
    │  │ LocalStorageAdapter   │                                       │
    │  └──────────────────────┘                                       │
    │                                                                 │
    │  通过 @Conditional 注解自动选择实现                                │
    └─────────────────────────────────────────────────────────────────┘

    SPI 接口一览#

    SPI 接口所在模块职责是否必需默认实现
    SealAuthProviderseal-api用户认证(从请求中提取用户信息)是拒绝所有请求(需配置)
    SealStorageProviderseal-api文件存储(上传/下载/删除)是抛异常(需配置)
    SealQuotaValidatorseal-api配额校验与扣减否(可选)跳过配额检查
    SealUserValidatorseal-api用户存在性与实名认证校验是RuoyiUserValidator
    UserInfoProviderseal-biz获取用户手机号、昵称等详细信息是通过 Bridge 桥接
    UserInfoAdapterseal-bizUserInfoProvider 的适配器接口是NoOpUserInfoAdapter(降级)
    EnterpriseAccessValidatorseal-biz验证用户是否有企业访问权限否(可选)NoOpEnterpriseAccessValidator(放行)

    详细说明#

    1. SealAuthProvider(认证提供者)#

    接口定义(seal-api):
    内置实现:
    实现类激活条件说明
    RuoyiAuthAdapterclasspath 存在 SecurityFrameworkUtils从 Ruoyi 的 ThreadLocal 中获取登录用户
    JwtAuthAdapteryudao.seal.auth.type=jwt解析 JWT Token
    OAuth2AuthAdapteryudao.seal.auth.type=oauth2OAuth2 Token 验证
    自定义示例:

    2. SealStorageProvider(文件存储提供者)#

    接口定义(seal-api):
    内置实现:
    实现类说明
    RuoyiFileClientAdapter适配 Ruoyi 的 FileClient(推荐,复用 Ruoyi 文件配置)
    OssStorageAdapter阿里云 OSS
    MinioStorageAdapterMinIO 对象存储
    LocalStorageAdapter本地文件系统

    3. SealQuotaValidator(配额校验器)#

    接口定义(seal-api):
    内置实现:
    实现类激活条件说明
    RuoyiQuotaValidatoryudao.seal.quota-validator=ruoyi(默认)读取 member_quota_account 表,使用乐观锁扣减
    NoOpQuotaValidatoryudao.seal.quota-validator=noop不做任何校验,始终返回 true(测试用)
    Biz 层调用方式(注意 null 安全):

    4. SealUserValidator(用户校验器)#

    接口定义(seal-api):
    内置实现:
    实现类激活条件说明
    RuoyiUserValidatoryudao.seal.user-validator=ruoyi(默认)查询 system_user 和 member_user 表
    NoOpUserValidatoryudao.seal.user-validator=noop始终返回成功(开发/测试用,生产会告警)

    5. UserInfoProvider / UserInfoAdapter(用户信息提供者)#

    这是一个使用了**桥接模式(Bridge Pattern)**的双层 SPI 设计:
                            seal-biz 定义
    ┌──────────────┐    ┌──────────────────┐    ┌──────────────┐
    │ Service 层    │───▶│ UserInfoProvider  │◀──│UserInfoPro-  │
    │ (业务代码调用) │    │ (接口)            │    │viderBridge   │
    └──────────────┘    └──────────────────┘    └──────┬───────┘
                                                       │ 委托
                                                       ▼
                        ┌──────────────────┐    ┌──────────────┐
                        │ UserInfoAdapter   │◀──│UserInfoAdap- │  seal-starter 实现
                        │ (接口)            │    │terImpl       │
                        └──────────────────┘    └──────────────┘
    为什么需要两层?
    1.
    UserInfoProvider:seal-biz 内部使用的标准接口,业务代码只依赖它
    2.
    UserInfoAdapter:供 Starter 模块实现的适配器接口,包含 getAdapterType() 等管理方法
    3.
    UserInfoProviderBridge:桥接器,将 Starter 的 Adapter 实现桥接为 Biz 的 Provider
    4.
    这样 Biz 模块完全不依赖 Starter 模块,实现编译隔离
    UserInfoProvider 接口(seal-biz):
    内置实现:
    实现类激活条件说明
    UserInfoAdapterImplclasspath 存在 MemberUserApi通过反射调用 member 模块,避免编译依赖
    NoOpUserInfoAdapter无其他 Adapter 实现时返回 null,功能降级,日志告警
    Biz 层调用方式:

    6. EnterpriseAccessValidator(企业权限校验器)#

    接口定义(seal-biz):
    内置实现:
    实现类激活条件说明
    EnterpriseAccessValidatorImplclasspath 存在 MemberEnterpriseUserService通过反射调用 member 模块
    NoOpEnterpriseAccessValidator无其他实现时始终放行,日志告警

    SPI 注入模式总结#

    Seal 模块中 SPI 的注入方式分为两类,开发时必须遵循:
    必需依赖(@Resource):
    可选依赖(@Autowired(required = false)):

    自动配置机制#

    Starter 模块通过 Spring Boot 的自动配置机制注册所有 SPI 实现:
    1.
    注册入口:META-INF/spring.factories 声明 SealAutoConfiguration
    2.
    总开关:yudao.seal.mode=starter 时激活自动配置
    3.
    条件装配:每个实现类使用 @Conditional* 注解控制装配条件
    spring.factories
      └── SealAutoConfiguration (@ConditionalOnProperty: yudao.seal.mode=starter)
            ├── @ComponentScan 扫描 seal.biz + seal.starter 包
            ├── RuoyiAuthAdapter      (@ConditionalOnClass: SecurityFrameworkUtils)
            ├── RuoyiQuotaValidator   (@ConditionalOnProperty: quota-validator=ruoyi, 默认)
            ├── RuoyiUserValidator    (@ConditionalOnProperty: user-validator=ruoyi, 默认)
            ├── UserInfoAdapterImpl   (@ConditionalOnClass: MemberUserApi)
            ├── UserInfoProviderBridge(@ConditionalOnBean: UserInfoAdapter)
            ├── NoOpQuotaValidator    (@ConditionalOnProperty: quota-validator=noop)
            ├── NoOpUserValidator     (@ConditionalOnProperty: user-validator=noop)
            ├── NoOpUserInfoAdapter   (@ConditionalOnMissingBean: UserInfoAdapter)
            └── NoOpEnterpriseAccess  (@ConditionalOnMissingBean: EnterpriseAccessValidator)

    配置属性#

    配置键可选值默认值说明
    yudao.seal.modestarter / 不设置不启用总开关,必须设为 starter 才激活自动配置
    yudao.seal.auth.typeruoyi / jwt / oauth2ruoyi认证方式
    yudao.seal.storage.typelocal / oss / minio-存储方式
    yudao.seal.quota-validatorruoyi / noopruoyi配额校验器
    yudao.seal.user-validatorruoyi / noopruoyi用户校验器

    自定义 SPI 实现指南#

    如果需要将 Seal 模块集成到非 Ruoyi 系统,只需实现对应的 SPI 接口:
    步骤 1:创建实现类
    步骤 2:确保你的实现类能被 Spring 扫描到(@Component 或 @Bean)
    步骤 3:如果使用了条件属性,在 application.yml 中设置对应值
    注意:自定义实现会自动覆盖内置的默认实现(通过 @ConditionalOnMissingBean / @ConditionalOnProperty 机制)。

    平台路由配置#

    概述#

    平台路由配置决定了签署链接的生成方式和用户的签署入口(小程序 / H5)。所有配置统一在数据库 infra_config 表中管理,管理员通过管理后台「基础设施 - 参数配置」操作,无需修改代码或重启服务。

    配置项#

    配置键说明示例值
    seal.platform.h5-domainseal-core H5 域名(签署引擎)https://seal.example.com
    seal.platform.mini-contract-h5-domainmini-contract H5 域名(登录签署用)https://app.example.com
    seal.platform.miniprogram-appid微信小程序 AppIDwx22db0d6ebe81e2ee
    seal.platform.miniprogram-name小程序在引导页显示的名称MiniContract.Pro
    seal.platform.miniprogram-logo小程序在引导页显示的图标 URLhttps://oss.example.com/logo.png

    启停控制#

    通过 infra_config 表的 visible 字段(管理后台显示为「是否可见」)控制功能开关:
    visible 值效果
    是 (true)该配置启用,正常读取值
    否 (false)该配置禁用,等同于未配置

    平台组合策略#

    小程序 AppIDMini-Contract H5 域名行为
    启用禁用只走小程序签署
    禁用启用只走 H5 登录签署
    启用启用小程序优先,H5 作为回退
    禁用禁用无法签署(异常)

    初始化#

    首次部署需执行 SQL 脚本初始化配置:

    技术实现#

    配置读取链路:
    管理后台「参数配置」
        ↓ 写入
    infra_config 表(config_key + value + visible)
        ↓ 读取
    ConfigApi.getVisibleConfigValueByKey()
        ↓ visible=false 返回 null
    SealConfigService.getVisibleConfig()
        ↓ null 或空 → 返回 ""(功能禁用)
    业务代码调用(如 getSealCoreH5Domain()、isMiniprogramEnabled())
    相关代码:
    ConfigApi.java / ConfigApiImpl.java - 基础配置 API(含 visible 感知方法)
    SealConfigService.java - 平台路由配置读取服务
    SealConfigChecker.java - 启动时配置检查,打印当前启用状态

    签署链接生成与跳转流程#

    短链接格式#

    前缀用途场景
    /s/{ref}H5 签署链接H5 模式优先时生成
    /m/{ref}小程序签署链接小程序模式优先时生成
    /p/{ref}预览链接签署完成后查看合同

    链接生成逻辑#

    SealSignTaskNotificationServiceImpl.generateSignUrl():
    调用方未指定 platform 参数
        ↓
    SealConfigService.isMiniprogramEnabled() ?
        ├── true  → platform = "miniprogram" → 生成 /m/{ref}
        └── false → platform = "h5"          → 生成 /s/{ref}
    短链接数据存储在 Redis 中,key 格式为 seal:sign:token:{ref},默认 7 天过期。

    前端跳转流程(SignRedirect.vue)#

    用户点击签署链接后,seal-core 的 SignRedirect.vue 负责路由分发:
    用户点击签署链接
        ↓
    前端调用 /app-api/api/v1/seal/auth/by-ref?ref=xxx
        ↓
    后端返回认证结果 + platformRouting
        ↓
    ┌─ linkType = QUICK_SIGN(快捷签署)
    │   → 直接跳转到签署页面 /h5/sign/document
    │
    ├─ linkType = PREVIEW_LINK(预览)
    │   → 跳转到预览页面 /h5/preview/contract
    │
    └─ linkType = SECURE_SIGN(登录签署)
        ↓
        ┌─ /m/ 路径(小程序链接)
        │   ├─ 微信内 → 显示小程序桥接页(打开小程序按钮)
        │   └─ 非微信 → 显示「请使用微信打开」页面(复制链接按钮)
        │              └─ 如果 H5 也启用 → 底部显示「使用网页签署」回退链接
        │
        └─ /s/ 路径(H5 链接)
            ├─ 微信内 + 小程序可用 → 显示小程序桥接页
            ├─ H5 可用 → 跳转 H5 登录页(mini-contract 登录页)
            ├─ 仅小程序(非微信)→ 显示「请使用微信打开」页面
            └─ 都不可用 → 显示错误提示

    后端 platformRouting 响应结构#

    AuthByRefRespVO.PlatformRouting(SECURE_SIGN 模式下返回):
    {
      "preferMiniprogram": true,
      "miniprogram": {
        "enabled": true,
        "appId": "wx22db0d6ebe81e2ee",
        "name": "MiniContract.Pro",
        "logo": "https://...",
        "urlScheme": "weixin://dl/business/?appid=wx...&path=..."
      },
      "h5LoginUrl": "https://app.example.com/#/pages/login/index?redirect=..."
    }
    preferMiniprogram: 由 isMiniprogramEnabled() 决定
    miniprogram.enabled: 小程序 AppID 配置且 visible=是
    h5LoginUrl: mini-contract H5 域名配置且 visible=是 时拼接完整登录 URL,否则为空

    签署安全级别#

    级别定义#

    级别值说明用户体验
    快捷签署0无需登录,点击链接直接签署用户点击链接 → 直接进入签署页面
    登录签署1需要登录后才能签署用户点击链接 → 引导登录 → 登录后跳转签署页面

    配置方式#

    1.
    全局默认级别 - 数据库 seal.sign.default-security-level(0 或 1)
    2.
    任务级别覆盖 - 创建签署任务时可指定 signSecurityLevel,覆盖全局默认值
    3.
    链接过期时间 - 数据库 seal.sign.link-expire-hours,默认 168 小时(7 天)

    实现原理#

    创建签署链接时:
        ├─ 快捷签署 → Redis 存储完整 Seal-Token → 前端拿到 token 直接签署
        └─ 登录签署 → Redis 存储元数据(taskId, participantId, tenantId)
                    → 前端需要用户登录后,带着登录态再请求签署
    
    前端认证时(/auth/by-ref):
        ├─ 快捷签署 → 直接返回 Seal-Token,linkType=QUICK_SIGN
        └─ 登录签署 → 返回 requireLogin=true,linkType=SECURE_SIGN
                    → 同时返回 platformRouting 告诉前端如何跳转

    Open API 开放接口#

    概述#

    Open API 为第三方系统提供签署能力集成接口。第三方通过 AppKey/Secret 认证后,可以创建签署任务、获取签署链接、配置 Webhook 回调,实现签署流程的自动化。

    架构总览#

    ┌──────────────────────────────────────────────────────────────────┐
    │                      第三方系统                                   │
    │                                                                  │
    │  1. 获取 Token    2. 创建签署任务    3. 嵌入签署页面    4. 接收回调  │
    └──────┬───────────────┬──────────────────┬──────────────┬─────────┘
           │               │                  │              │
           ▼               ▼                  ▼              ▼
    ┌──────────────────────────────────────────────────────────────────┐
    │                    Open API 接口层                                │
    │                    路径前缀: /open-api(框架自动添加)               │
    │                                                                  │
    │  ┌─────────────────┐  ┌──────────────────┐  ┌────────────────┐  │
    │  │OpenSealAuth     │  │OpenSignTask      │  │OpenWebhook     │  │
    │  │Controller       │  │Controller        │  │Controller      │  │
    │  │                 │  │                  │  │                │  │
    │  │POST /auth/token │  │POST /sign-tasks  │  │POST /webhooks  │  │
    │  │(AppKey/Secret   │  │GET  /sign-tasks/ │  │GET  /webhooks  │  │
    │  │ → Seal-Token)   │  │     {taskId}     │  │DELETE /webhooks│  │
    │  │                 │  │POST /sign-tasks/ │  │                │  │
    │  │                 │  │     {taskId}/     │  │                │  │
    │  │                 │  │     cancel       │  │                │  │
    │  │                 │  │GET  /sign-tasks/ │  │                │  │
    │  │                 │  │     {taskId}/     │  │                │  │
    │  │                 │  │     sign-links   │  │                │  │
    │  │                 │  │GET  /sign-tasks/ │  │                │  │
    │  │                 │  │     {taskId}/     │  │                │  │
    │  │                 │  │     download     │  │                │  │
    │  └─────────────────┘  └──────────────────┘  └────────────────┘  │
    └──────────────────────────────────────────────────────────────────┘
                                ↓
    ┌──────────────────────────────────────────────────────────────────┐
    │                    业务层 (Service)                               │
    │                                                                  │
    │  ┌──────────────────────┐  ┌─────────────────────────────────┐  │
    │  │SealSignTaskService   │  │SealWebhookService               │  │
    │  │(复用已有签署任务服务)   │  │                                 │  │
    │  │                      │  │ saveWebhookConfig()  配置回调    │  │
    │  │ createSignTask()     │  │ sendWebhook()        异步发送    │  │
    │  │ generateSignLink()   │  │ retryFailedWebhooks() 失败重试  │  │
    │  │ cancelSignTask()     │  │                                 │  │
    │  └──────────────────────┘  │ HTTP 客户端: WebClient           │  │
    │                            │ 签名算法: HMAC-SHA256             │  │
    │                            │ 重试策略: 指数退避 (1/5/30 min)    │  │
    │                            └─────────────────────────────────┘  │
    └──────────────────────────────────────────────────────────────────┘
                                ↓
    ┌──────────────────────────────────────────────────────────────────┐
    │                    数据层 (Database)                              │
    │                                                                  │
    │  ┌──────────────────────┐  ┌─────────────────────────────────┐  │
    │  │seal_api_key          │  │seal_webhook_config              │  │
    │  │(API 密钥表)           │  │(回调配置表)                      │  │
    │  │                      │  │                                 │  │
    │  │ id (Integer)         │  │ id, api_key_id, callback_url    │  │
    │  │ app_name             │  │ secret, events, status          │  │
    │  │ api_key, secret_key  │  └─────────────────────────────────┘  │
    │  │ status               │  ┌─────────────────────────────────┐  │
    │  └──────────────────────┘  │seal_webhook_log                 │  │
    │                            │(回调日志表)                       │  │
    │                            │                                 │  │
    │                            │ id, webhook_config_id, task_id   │  │
    │                            │ event_type, request_body         │  │
    │                            │ response_status, response_body   │  │
    │                            │ status, retry_count              │  │
    │                            │ next_retry_time                  │  │
    │                            └─────────────────────────────────┘  │
    └──────────────────────────────────────────────────────────────────┘

    路径规范#

    Open API 的 Controller 位于 controller.open 包下,框架 WebProperties 自动添加 /open-api 前缀:
    因此 Controller 的 @RequestMapping 不需要写 /open-api 前缀:

    API 接口一览#

    方法实际路径说明认证方式
    POST/open-api/api/v1/seal/auth/token获取访问令牌AppKey + SecretKey
    POST/open-api/api/v1/seal/sign-tasks创建签署任务Seal-Token
    GET/open-api/api/v1/seal/sign-tasks/{taskId}查询任务详情Seal-Token
    POST/open-api/api/v1/seal/sign-tasks/{taskId}/cancel撤销任务Seal-Token
    GET/open-api/api/v1/seal/sign-tasks/{taskId}/sign-links获取签署链接Seal-Token
    GET/open-api/api/v1/seal/sign-tasks/{taskId}/download下载已签署文件Seal-Token
    POST/open-api/api/v1/seal/webhooks配置 WebhookSeal-Token
    GET/open-api/api/v1/seal/webhooks查询 Webhook 配置Seal-Token
    DELETE/open-api/api/v1/seal/webhooks删除 Webhook 配置Seal-Token

    典型集成流程#

    第三方系统                          Contract.Pro                    签署人
        │                                   │                            │
        │  1. POST /auth/token              │                            │
        │     (apiKey + secretKey + nonce)   │                            │
        │ ◀─── Seal-Token ─────────────────│                            │
        │                                   │                            │
        │  2. POST /sign-tasks              │                            │
        │     (模板ID + 参与人 + callbackUrl)│                            │
        │ ◀─── taskId + signUrl ───────────│                            │
        │                                   │                            │
        │  3. 将 signUrl 嵌入 iframe/WebView │                            │
        │ ─────────────────────────────────────────── signUrl ──────────▶│
        │                                   │                            │
        │                                   │  4. 用户在 seal-core 签署   │
        │                                   │ ◀──── 签署完成 ────────────│
        │                                   │                            │
        │  5. Webhook 回调                   │                            │
        │ ◀─── POST callbackUrl ───────────│                            │
        │     {eventType: "sign_completed", │                            │
        │      taskId, signedFileUrl}       │                            │
        │                                   │                            │
        │  6. GET /sign-tasks/{id}/download │                            │
        │ ◀─── signedFileUrl ──────────────│                            │
        │                                   │                            │

    Webhook 回调机制#

    事件类型#

    事件说明触发时机
    sign_completed签署完成所有参与人完成签署
    sign_rejected签署拒绝任一参与人拒签
    sign_cancelled签署撤销发起人撤销任务
    sign_expired签署过期任务超过截止时间

    回调请求格式#

    POST {callbackUrl}
    Headers:
      Content-Type: application/json
      X-Seal-Signature: {HMAC-SHA256 签名}
      X-Seal-Event: {事件类型}
      X-Seal-Timestamp: {时间戳}
    
    Body:
    {
      "eventType": "sign_completed",
      "taskId": 1024,
      "taskName": "劳动合同",
      "status": 3,
      "timestamp": 1707724800000,
      "signedFileUrl": "https://oss.example.com/signed/xxx.pdf"
    }

    签名验证#

    第三方收到回调后,应使用配置的 secret 验证签名:

    重试策略#

    重试次数延迟说明
    第 1 次1 分钟首次失败后
    第 2 次5 分钟指数退避
    第 3 次30 分钟最后一次尝试
    超过 3 次重试后标记为最终失败,记录在 seal_webhook_log 表中。

    技术实现#

    HTTP 客户端:WebClient(Spring WebFlux,与项目 AI 模块保持一致)
    异步发送:@Async + TransactionSynchronizationManager(事务提交后触发)
    失败重试:@Scheduled(fixedDelay = 60000) 定时扫描待重试记录

    安全配置#

    Open API 的安全配置在 SecurityConfiguration 中:
    拦截器配置在 SealWebMvcConfigurer 中:

    快速开始#

    前置要求#

    JDK 1.8+
    Maven 3.6+
    MySQL 5.7+ 或 8.0+
    Redis 6.0+

    步骤 1:添加依赖#

    <dependency>
        <groupId>cn.iocoder.boot</groupId>
        <artifactId>yudao-module-seal-spring-boot-starter</artifactId>
        <version>${revision}</version>
    </dependency>

    步骤 2:初始化数据库#

    步骤 3:在管理后台配置平台路由#

    进入管理后台「基础设施 - 参数配置」,找到 seal 分类,配置:
    1.
    seal.platform.h5-domain - 填写 seal-core 的访问域名
    2.
    seal.platform.miniprogram-appid - 填写微信小程序 AppID(如需小程序签署)
    3.
    seal.platform.miniprogram-name - 填写小程序显示名称
    4.
    seal.platform.miniprogram-logo - 填写小程序图标 URL
    5.
    seal.platform.mini-contract-h5-domain - 填写 mini-contract H5 域名(如需 H5 登录签署)
    通过「是否可见」开关控制各平台的启停。

    步骤 4:启动服务#

    启动时 SealConfigChecker 会自动打印当前配置状态:
    ========================================
    Seal 模块配置检查(数据来源:管理后台「参数配置」)
    ========================================
      [seal-core H5 域名] = https://seal.example.com (已启用)
      [Mini-Contract H5 域名] 未配置或已禁用(配置键: seal.platform.mini-contract-h5-domain)
      [小程序 AppID] = wx22db0d6ebe81e2ee (已启用)
    ========================================

    配置参考#

    application-seal.yaml#

    Seal 模块的配置文件位于 yudao-module-seal-biz/src/main/resources/application-seal.yaml,通过 SealConfigurationLoader(EnvironmentPostProcessor)自动加载,无需手动 import。
    主要配置分类:
    分类说明配置前缀
    基础配置模块开关、调试模式yudao.seal
    API 路径管理端/App端路径前缀yudao.seal.api
    安全认证JWT 密钥、Token 过期时间yudao.seal.security
    License授权验证yudao.seal.license
    文档转换PDF 转换服务seal.document.convert
    数字签名PDF 签名证书seal.digital-signature
    平台路由已迁移到数据库管理seal.platform.*(infra_config 表)
    注意:平台路由配置(H5 域名、小程序信息)已从 YAML 迁移到数据库,通过管理后台动态管理。详见 平台路由配置 章节。

    SQL 初始化脚本#

    脚本说明
    sql/mysql/014-sign-security-mode.sql签署安全级别配置
    sql/mysql/015-platform-routing-config.sql平台路由配置(H5 域名、小程序信息)

    更新日志#

    2026-02-12 - Open API 开放接口#

    新增 Open API 模块(controller.open 包),支持第三方系统集成签署能力
    OpenSealAuthController:AppKey/Secret 认证,获取 Seal-Token
    OpenSignTaskController:签署任务创建、查询、撤销、签署链接获取、文件下载
    OpenWebhookController:Webhook 回调配置管理(CRUD)
    SealWebhookService:异步回调发送 + HMAC-SHA256 签名 + 指数退避重试
    数据库新增 seal_webhook_config(回调配置)和 seal_webhook_log(回调日志)表
    框架 WebProperties 新增 openApi 配置,自动为 controller.open 包添加 /open-api 前缀

    2026-02-06 - 平台路由配置重构#

    平台路由配置从 YAML 迁移到数据库(infra_config 表)
    通过「是否可见」开关控制小程序/H5 模式的启停
    签署链接自动根据启用的平台选择 /s/(H5)或 /m/(小程序)前缀
    新增 ConfigApi.getVisibleConfigValueByKey() 方法,支持 visible 感知
    SealConfigService 简化为纯数据库读取,去掉 YAML 兜底逻辑
    SealConfigChecker 启动时打印平台配置状态
    前端 SignRedirect.vue 完善非微信环境 + 仅小程序模式的处理
    其他引用平台配置的类统一改用 SealConfigService

    v2.0.0 (2025-10-03) - 产品化版本#

    Spring Boot Starter 机制
    SPI 扩展机制(认证 + 存储)
    License 验证系统
    双模式集成(Starter / Direct)

    技术支持#

    邮件:shawn@leepm.com
    社区讨论:GitHub Issues
    修改于 2026-02-14 04:12:10
    下一页
    开放平台接入文档
    Built with