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

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

    目录#

    概述
    接入方式选择
    前置条件
    接入检查清单
    认证机制
    通知策略
    签署任务 API
    Webhook 回调
    签署页面嵌入
    安全机制
    状态码与错误处理
    完整集成示例
    FAQ

    概述#

    Contract.Pro 开放平台为第三方系统提供电子合同签署能力的集成方案。无论你是想通过 API 快速对接、使用 SDK 简化开发,还是将整套系统私有化部署到自己的服务器,Contract.Pro 都能满足。
    开放平台提供的核心能力:
    能力说明
    合同签署基于模板创建签署任务,支持多方签署
    签署页面提供开箱即用的签署页面(seal-core),支持 iframe / WebView 嵌入
    状态通知通过 Webhook 实时推送签署状态变更
    文件管理合同 PDF 生成、签章合成、已签署文件下载
    安全保障多种认证模式、数据隔离、IP 白名单、请求限流
    你不需要自己开发签署页面。 Contract.Pro 提供完整的签署页面(seal-core),包含 PDF 预览、签名绘制、印章盖章等全部签署交互。你只需要将签署链接嵌入到自己的系统中即可。
    整体架构:
    ┌─────────────────────────────────────────────────────────────────────┐
    │                                                                     │
    │  你的系统                          Contract.Pro 开放平台              │
    │                                                                     │
    │  ┌──────────────┐                 ┌──────────────────────────────┐  │
    │  │  业务系统     │  API / SDK      │  Open API 服务               │  │
    │  │  (你开发)     │ ──────────────→ │  - 签署任务管理               │  │
    │  │              │ ←────────────── │  - Webhook 回调               │  │
    │  └──────┬───────┘                 │  - 文件下载                   │  │
    │         │                         └──────────┬───────────────────┘  │
    │         │ 嵌入 signUrl                        │                      │
    │         ▼                                    ▼                      │
    │  ┌──────────────┐                 ┌──────────────────────────────┐  │
    │  │  你的前端页面  │   iframe /      │  签署页面 (seal-core)         │  │
    │  │  (你开发)     │   WebView       │  (Contract.Pro 提供,开箱即用) │  │
    │  └──────────────┘                 └──────────────────────────────┘  │
    │                                                                     │
    └─────────────────────────────────────────────────────────────────────┘
    API 对接基本信息(当前已支持的接入方式):
    项目说明
    Base URLhttps://your-domain.com/open-api
    协议HTTPS
    数据格式JSON
    字符编码UTF-8

    接入方式选择#

    Contract.Pro 提供三种接入方式,适用于不同的业务场景和技术能力。请根据你的需求选择合适的方式。

    方式总览#

    接入方式接入难度开发周期适用场景签署页面当前状态
    API 对接★★☆1-3 天已有业务系统,需要嵌入签署能力使用 Contract.Pro 提供的签署页面(seal-core)✅ 已支持
    SDK 对接(Spring Boot Starter)★☆☆0.5-1 天Spring Boot 项目深度集成,将签署能力嵌入自己的系统使用 Contract.Pro 提供的签署页面(seal-core)✅ 已支持
    私有化部署★★★★1-2 周数据安全要求极高,需完全自主可控全部自有📋 企业版

    方式一:API 对接(本文档重点)#

    通过 HTTP RESTful API 直接调用 Contract.Pro 的签署服务。这是当前推荐的标准接入方式。
    工作原理:
    ┌─────────────────────────────────────────────────────────────────┐
    │  你需要开发的部分                                                  │
    │                                                                 │
    │  ┌──────────────┐    HTTP API    ┌──────────────────────────┐   │
    │  │  你的业务系统  │ ─────────────→ │  Contract.Pro Open API   │   │
    │  │              │ ←───────────── │  (后端服务)               │   │
    │  │  - 调用 API   │               └──────────┬───────────────┘   │
    │  │  - 处理回调   │                           │                   │
    │  │  - 业务页面   │                           │                   │
    │  └──────┬───────┘                           │                   │
    │         │                                   │                   │
    │         │ 嵌入 signUrl                       │                   │
    │         ▼                                   ▼                   │
    │  ┌──────────────┐               ┌──────────────────────────┐   │
    │  │  你的前端页面  │    iframe /   │  签署页面 (seal-core)     │   │
    │  │  (合同列表等) │    WebView    │  ← Contract.Pro 提供     │   │
    │  └──────────────┘               │  ← 你不需要开发这部分     │   │
    │                                 └──────────────────────────┘   │
    └─────────────────────────────────────────────────────────────────┘
    你需要开发:
    调用 Open API 的后端逻辑(创建任务、查询状态、处理 Webhook 回调)
    你自己系统内的业务页面(合同列表、状态展示、操作入口等)
    将签署链接(signUrl)嵌入到你的页面中(iframe / WebView / 直接跳转)
    你不需要开发:
    签署页面(seal-core 提供,包含 PDF 预览、签名绘制、印章盖章等全部签署交互)
    PDF 处理逻辑(合同生成、签章合成、文件存储等由 Contract.Pro 后端处理)
    短信通知(notifyChannel: "platform" 模式下由平台自动发送)
    适用场景:
    HR 系统集成合同签署功能
    CRM 系统嵌入合同签约流程
    ERP 系统对接采购/销售合同签署
    任何已有业务系统需要增加电子签署能力

    方式二:SDK 对接(Spring Boot Starter)#

    通过 Maven 依赖引入 yudao-module-seal-spring-boot-starter,将完整的电子签署能力嵌入你的 Spring Boot 项目。Seal 模块的 Controller、Service、数据访问层全部通过 Spring Boot 自动配置注册到你的应用中,数据存储在你自己的数据库里。
    本质上,SDK 对接 = 把 Seal 模块跑在你自己的 JVM 里,用你自己的数据库和存储。与 API 对接的区别是:API 对接调用的是远程服务,SDK 对接是本地方法调用。
    工作原理:
    ┌─────────────────────────────────────────────────────────────────┐
    │  你的 Spring Boot 项目                                           │
    │                                                                 │
    │  ┌──────────────────────────────────────────────────────────┐   │
    │  │  1. 添加 Maven 依赖                                       │   │
    │  │     yudao-module-seal-spring-boot-starter                │   │
    │  │     (自动传递依赖 seal-api + seal-biz)                    │   │
    │  └──────────────────────────────────────────────────────────┘   │
    │                          ↓                                      │
    │  ┌──────────────────────────────────────────────────────────┐   │
    │  │  2. 配置 application.yml(可选,Starter 已内置默认配置)    │   │
    │  │     yudao.seal.auth.type=jwt / oauth2 / custom            │   │
    │  │     yudao.seal.storage.type=local / oss / minio           │   │
    │  │                                                           │   │
    │  │     ℹ️ mode=starter 由 Starter JAR 内置配置自动设置,      │   │
    │  │        你不需要手动配置这个值                                │   │
    │  └──────────────────────────────────────────────────────────┘   │
    │                          ↓                                      │
    │  ┌──────────────────────────────────────────────────────────┐   │
    │  │  3. (可选) 实现自定义 SPI 接口                              │   │
    │  │     @Component                                            │   │
    │  │     class MyAuthProvider implements SealAuthProvider {...} │   │
    │  └──────────────────────────────────────────────────────────┘   │
    │                          ↓                                      │
    │  ┌──────────────────────────────────────────────────────────┐   │
    │  │  自动装配流程(引入 Starter 后自动完成)                     │   │
    │  │                                                           │   │
    │  │  Starter JAR 内置 mode=starter                            │   │
    │  │       ↓ 触发                                              │   │
    │  │  SealAutoConfiguration 生效                                │   │
    │  │       ↓ 扫描并注册                                         │   │
    │  │  ┌────────────┐  ┌────────────┐  ┌────────────────────┐  │   │
    │  │  │ 认证适配器  │→ │ Controller │→ │ Service + 数据层    │  │   │
    │  │  │ 存储适配器  │  │ 自动暴露   │  │ 自动注册            │  │   │
    │  │  │ 用户验证器  │  │            │  │                    │  │   │
    │  │  └────────────┘  └────────────┘  └────────────────────┘  │   │
    │  │                                                           │   │
    │  │  同时,seal-biz 通过 SealConfigurationLoader 自动加载      │   │
    │  │  application-seal.yaml(模块默认配置)                      │   │
    │  └──────────────────────────────────────────────────────────┘   │
    │                                                                 │
    │  你的数据库 (MySQL)  │  你的缓存 (Redis)  │  你的存储 (本地/OSS) │
    └─────────────────────────────────────────────────────────────────┘
    双模式架构说明:
    Seal 模块采用「双模式」设计,同一套代码支持两种运行方式:
    内部模式(direct)Starter 模式(starter)
    使用者Contract.Pro 自身(yudao-seal-server)第三方客户
    依赖方式直接依赖 seal-biz依赖 seal-spring-boot-starter
    模式值mode=direct(默认值,不设置即生效)mode=starter(Starter JAR 内置,自动生效)
    自动配置SealAutoConfiguration 不生效SealAutoConfiguration 生效
    认证方式Ruoyi Security 框架Starter 提供的适配器(JWT/OAuth2/自定义)
    配置加载application-seal.yaml(通过 SealConfigurationLoader)application-seal.yaml + Starter 内置 application.yml
    mode 的切换是自动的:引入 Starter 依赖 → Starter JAR 里的 application.yml 设置了 mode: starter → SealAutoConfiguration 的 @ConditionalOnProperty 条件满足 → 自动配置生效。你不需要手动设置 mode。
    前置条件:
    Java 1.8+ 的 Spring Boot 2.7.x 项目
    MySQL 5.7+ / 8.0+(需要导入 Seal 模块的数据表,SQL 脚本在 sql/ 目录)
    Redis 6.0+(用于缓存和分布式锁)
    Step 1:添加 Maven 依赖
    只需引入一个 Starter 依赖(它会自动传递依赖 seal-api 和 seal-biz):
    <dependency>
        <groupId>cn.iocoder.boot</groupId>
        <artifactId>yudao-module-seal-spring-boot-starter</artifactId>
        <version>${seal.version}</version>
    </dependency>
    seal-api 模块是开源的,包含所有 SPI 接口定义和标准 DTO。seal-biz 和 seal-spring-boot-starter 是闭源的商业模块。
    Step 2:配置 application.yml
    引入 Starter 依赖后,mode: starter 由 Starter JAR 内置配置自动设置,你不需要手动配置。你只需要根据自己的需求配置认证方式和存储方式:
    配置优先级:你的 application.yml > Starter 内置 application.yml > application-seal.yaml(模块默认配置)。你在自己的配置文件中设置的值会覆盖 Starter 和模块的默认值。
    Step 3(按需):实现自定义认证
    如果内置的 JWT / OAuth2 适配器不满足需求,实现 SealAuthProvider 接口:
    Step 4:导入数据库表结构,启动项目。
    启动成功后会看到 Seal 模块的 Banner 和配置信息日志:
      ____             _   ____            _
     / ___|  ___  __ _| | / ___| _   _ ___| |_ ___ _ __ ___
     \___ \ / _ \/ _` | | \___ \| | | / __| __/ _ \ '_ ` _ \
      ___) |  __/ (_| | |  ___) | |_| \__ \ ||  __/ | | | | |
     |____/ \___|\__,_|_| |____/ \__, |___/\__\___|_| |_| |_|
                                   |___/
     :: Seal电子印章系统 ::        (v2.0.0)
    
    Seal 模块配置信息:
      - 集成模式: starter (Starter自动配置已启用)
      - 认证方式: jwt
      - 存储方式: local
    核心 SPI 接口(全部定义在 seal-api 模块,开源):
    接口说明内置实现
    SealAuthProvider认证提供者,从 SealAuthContext 中提取用户信息JwtAuthAdapter、OAuth2AuthAdapter、RuoyiAuthAdapter
    SealStorageProvider文件存储,管理合同 PDF / 印章图片等文件LocalStorageAdapter、OssStorageAdapter、MinioStorageAdapter、RuoyiFileClientAdapter
    SealUserValidator用户验证器,校验 userId 是否存在且可用RuoyiUserValidator、NoOpUserValidator
    SealQuotaValidator配额验证器,校验签署配额是否充足RuoyiQuotaValidator、NoOpQuotaValidator
    SealSignTaskApi签署任务 API,可在代码中直接调用(创建任务、查询状态、下载文件)框架内置实现
    内置认证适配器及装配条件:
    适配器装配条件适用场景
    JwtAuthAdapteryudao.seal.auth.type=jwt标准 JWT Token 认证,从 Authorization: Bearer {jwt} 提取,JWT Payload 需包含 userId、tenantId
    OAuth2AuthAdapteryudao.seal.auth.type=oauth2Spring Security OAuth2 项目,从 SecurityContextHolder 获取认证信息
    RuoyiAuthAdapterclasspath 中存在 SecurityFrameworkUtils 类时自动启用Ruoyi-Vue-Pro 框架项目,直接从 Ruoyi 的 SecurityContext 获取 LoginUser
    自定义实现 SealAuthProvider 接口并注册为 @Component以上都不满足时,自行实现认证逻辑
    注意:RuoyiAuthAdapter 的装配条件是 @ConditionalOnClass(检测 classpath),不是配置项。如果你的项目引入了 Ruoyi Security 模块,它会自动生效,优先级高于配置的 type。
    内置存储适配器:
    适配器装配条件说明
    LocalStorageAdapteryudao.seal.storage.type=local本地磁盘存储,适合开发测试
    OssStorageAdapteryudao.seal.storage.type=oss阿里云 OSS,需配置 endpoint / accessKeyId / accessKeySecret / bucketName
    MinioStorageAdapteryudao.seal.storage.type=minioMinIO 对象存储,支持私有化部署,自动创建 Bucket
    RuoyiFileClientAdapter手动注入(需要 Ruoyi 的 FileClient Bean)复用 Ruoyi 框架的文件存储体系(支持 S3、FTP、SFTP、DB 等)
    完整配置参考(所有可配置项):
    SDK 对接与 API 对接的区别:
    对比项API 对接SDK 对接(Spring Boot Starter)
    集成方式HTTP RESTful 调用远程服务Maven 依赖,嵌入你的应用进程
    认证处理自行管理 AppKey/SecretKey/TokenSPI 接口自动适配你的认证体系
    数据存储数据在 Contract.Pro 平台数据在你自己的数据库
    文件存储由平台管理你自己选择存储方式(本地/OSS/MinIO)
    签署页面使用 seal-core(不变)使用 seal-core(不变)
    适用语言任何语言(HTTP 调用)仅 Java(Spring Boot 2.7.x)
    扩展性受限于 API 能力可深度定制(5 个 SPI 接口可扩展)
    数据隔离按 AppKey 隔离按你的租户体系隔离(tenantId)
    运维无需运维签署服务需要自行运维(数据库、Redis、存储)
    在代码中直接调用签署能力(SealSignTaskApi):
    SDK 模式下,你可以在代码中直接注入 SealSignTaskApi 调用签署能力,无需走 HTTP:
    附加能力:
    健康检查:集成 Spring Boot Actuator 后,访问 GET /actuator/health/seal 可查看 Seal 模块状态
    Bean 加载日志:启动时自动打印已加载的认证适配器和存储适配器
    License 验证:支持试用版(限时限量)和正式版(License 文件授权)
    示例项目:
    examples/ 目录下提供了 5 个开箱即用的示例项目:
    示例难度认证方式文件存储适用场景
    example-minimal⭐JWT本地快速验证,3 分钟启动
    example-springboot⭐⭐JWT阿里云 OSS标准 Spring Boot 生产项目
    example-ruoyi⭐⭐Ruoyi(自动检测)Ruoyi FileClientRuoyi-Vue-Pro 项目无缝集成
    example-microservice⭐⭐⭐OAuth2OSSSpring Cloud 微服务架构
    example-docker⭐⭐JWT本地/OSSDocker Compose 一键部署
    详细的 SDK 集成指南请参考 COMMERCIAL_INTEGRATION_GUIDE.md,示例项目说明请参考 examples/README.md。

    方式三:私有化部署(企业版)#

    将 Contract.Pro 整套系统部署到你自己的服务器,包括后端服务、签署页面、管理后台。适合对数据安全有极高要求的企业。
    包含内容:
    Contract.Pro 后端服务(ruoyi-vue-pro + yudao-module-seal)
    签署页面(seal-core)
    管理后台前端
    移动端应用(mini-contract,可选)
    部署文档和技术支持
    你需要准备:
    服务器环境(Linux + Docker / K8s)
    MySQL 5.7+ / 8.0+
    Redis 6.0+
    域名和 HTTPS 证书
    对象存储(OSS / MinIO,用于合同文件存储)
    快速体验: 可以先通过 examples/example-docker/ 中的 Docker Compose 示例快速搭建一套完整环境进行评估。
    私有化部署方案请联系商务团队:shawn@leepm.com

    如何选择?#

    你有自己的业务系统,想嵌入签署能力?
      └─ 是 → 你的项目是 Spring Boot 吗?
      │        └─ 是 → 方式二:SDK 对接(Spring Boot Starter,最省事)
      │        └─ 否 → 方式一:API 对接(通用方案,支持任何语言)
      └─ 否 → 你需要完全自主可控?
               └─ 是 → 方式三:私有化部署
               └─ 否 → 直接使用 Contract.Pro 平台即可,无需对接
    本文档后续内容以「方式一:API 对接」为主。SDK 对接的详细指南请参考 COMMERCIAL_INTEGRATION_GUIDE.md 和 examples/README.md。

    前置条件#

    在调用 Open API 之前,你需要在 Contract.Pro 管理后台完成以下准备工作。每一步都是必须的,缺少任何一步都会导致接口调用失败。

    前置条件一:拥有管理后台账号#

    你需要一个 Contract.Pro 管理后台的管理员账号。
    管理后台地址: https://your-domain.com/admin
    登录方式: 管理员账号密码登录
    所需权限: 需要拥有 seal:api-key:create、seal:template:create 等权限
    如果你是第三方开发者,请联系 Contract.Pro 的运营方为你开通管理后台账号并分配相应权限。

    前置条件二:创建 API 密钥(获取 AppKey / SecretKey)#

    API 密钥是调用 Open API 的身份凭证,所有接口都需要通过 AppKey + SecretKey 进行认证。
    操作路径: 管理后台 → API 密钥管理 → 创建密钥
    操作步骤:
    1.
    登录管理后台
    2.
    进入左侧菜单「API 密钥管理」
    3.
    点击「新增」按钮
    4.
    填写应用名称(如:HR系统对接、CRM集成),用于标识这组密钥的用途
    5.
    点击「确定」,系统自动生成 AppKey 和 SecretKey
    创建成功后你会得到:
    字段格式示例说明
    AppKeyak_xxxxxxxxxxxxxxxxAPI 密钥标识,可多次查看
    SecretKeysk_xxxxxxxxxxxxxxxxAPI 密钥密码,仅创建时展示一次
    ⚠️ 重要提醒: SecretKey 仅在创建时展示一次,之后无法再次查看。请在创建后立即复制并妥善保存到安全的地方(如密钥管理系统、加密配置文件)。如果遗失,只能删除后重新创建。
    密钥状态管理:
    状态值说明影响
    0启用(默认)正常调用 API
    1禁用所有使用该密钥的请求将返回 API_KEY_DISABLED 错误
    管理员可以随时在后台启用/禁用密钥,无需删除重建。

    前置条件三:创建合同模板(获取 templateId)#

    Open API 创建签署任务时必须指定一个合同模板。模板定义了合同的 PDF 内容、表单字段和签署位。
    操作路径: 管理后台 → 合同模板管理 → 创建模板
    操作步骤:
    1.
    进入左侧菜单「合同模板管理」
    2.
    点击「新增模板」
    3.
    上传合同 PDF 文件(或使用在线编辑器创建)
    4.
    配置表单字段(如:姓名、金额、日期等可填充字段)
    5.
    配置签署方(如:甲方、乙方)及签署位置
    6.
    发布模板
    创建成功后你会得到:
    字段说明
    templateId模板 ID(数字),创建签署任务时需要传入
    表单字段名列表模板中定义的可填充字段名,用于 formData 参数
    签署方列表模板中定义的签署方角色名(如「甲方」「乙方」),用于 participants.signatoryName 参数
    模板中的表单字段名和签署方角色名,在调用 API 创建签署任务时需要精确匹配。建议在模板创建完成后,记录这些信息供开发时使用。

    前置条件四(可选):配置 IP 白名单#

    为了提高安全性,可以为 API 密钥配置 IP 白名单。配置后,只有白名单内的 IP 地址才能调用 API。
    操作路径: 管理后台 → IP 白名单管理
    操作步骤:
    1.
    进入「IP 白名单管理」
    2.
    选择要配置的 API 密钥
    3.
    添加允许访问的 IP 地址
    支持的 IP 格式:
    格式示例说明
    单个 IP203.0.113.50精确匹配一个 IP
    CIDR 网段203.0.113.0/24匹配一个网段内的所有 IP
    如果不配置 IP 白名单,则不限制来源 IP(所有 IP 均可访问)。生产环境强烈建议配置。

    前置条件五(可选):准备 Webhook 回调地址#

    如果你希望实时接收签署状态变更通知(推荐),需要在你的系统中准备一个 HTTP(S) 回调接口。
    回调接口要求:
    要求说明
    协议建议 HTTPS,支持 HTTP
    方法POST
    响应时间必须在 10 秒内返回 HTTP 2xx
    公网可达回调地址必须能被 Contract.Pro 服务器访问到
    Webhook 配置可以在创建签署任务时通过 callbackUrl 参数指定(任务级别),也可以通过 API 配置全局 Webhook。详见 Webhook 回调 章节。

    接入检查清单#

    在开始编码之前,请确认以下事项全部就绪:
    ✅ 拥有管理后台账号,且有 API 密钥管理权限
    ✅ 已创建 API 密钥,拿到 AppKey(ak_xxx)和 SecretKey(sk_xxx)
    ✅ 已创建合同模板,拿到 templateId
    ✅ 已记录模板中的表单字段名和签署方角色名
    ✅ (可选)已配置 IP 白名单
    ✅ (可选)已准备好 Webhook 回调接口
    ✅ 确认你的服务器能访问 Contract.Pro 的 Open API 地址
    全部就绪后,按以下步骤接入:
    Step 1. 选择认证方式  →  简单模式 / Token 模式 / 签名模式(三选一)
    Step 2. 创建签署任务  →  POST /api/v1/seal/sign-tasks
    Step 3. 嵌入签署页面  →  将响应中的 signUrl 嵌入 iframe / WebView
    Step 4. 接收签署结果  →  Webhook 回调 或 主动轮询
    Step 5. 下载签署文件  →  GET /api/v1/seal/sign-tasks/{taskId}/download

    5 分钟跑通(简单模式)#

    最快的接入方式,每次请求直接带 AppKey + SecretKey:
    注意:templateId 和 signatoryName 必须与管理后台创建的模板一致,否则会报错。

    认证机制#

    Open API 提供三种认证方式,根据安全需求选择:
    模式安全级别适用场景前置条件
    简单模式★★☆测试、内网系统AppKey + SecretKey
    Token 模式★★★生产环境推荐AppKey + SecretKey
    签名模式★★★★高安全要求(金融等)AppKey + SecretKey + 签名算法实现
    三种模式都需要先在管理后台创建 API 密钥(见 前置条件二)。

    模式一:简单模式#

    每次请求在 Header 中同时携带 AppKey 和 SecretKey。
    请求头:
    Header 名必填示例值说明
    Seal-Api-Key是ak_xxxxxxxxxxxxxxxx管理后台创建的 AppKey
    Seal-Secret-Key是sk_xxxxxxxxxxxxxxxx管理后台创建的 SecretKey
    示例:
    优点: 接入最简单,无需额外逻辑
    缺点: SecretKey 每次传输,安全性相对较低
    适用: 测试环境、内网系统、快速验证

    模式二:Token 模式(推荐)#

    先用 AppKey + SecretKey 换取短期 Token(5 分钟有效),后续请求只带 Token。SecretKey 只在获取 Token 时传输一次。
    Step 1:获取 Token
    POST /api/v1/seal/auth/token
    Content-Type: application/x-www-form-urlencoded
    请求参数(form 表单):
    参数类型必填说明
    apiKeystring是管理后台创建的 AppKey(ak_xxx 格式)
    secretKeystring是管理后台创建的 SecretKey(sk_xxx 格式)
    noncestring是随机字符串(如 UUID),防重放攻击,10 分钟内不可重复
    请求示例:
    成功响应:
    {
      "code": 0,
      "data": {
        "accessToken": "eyJhbGciOiJIUzI1NiJ9...",
        "tokenType": "Bearer",
        "expiresIn": 300
      }
    }
    响应字段说明
    accessToken访问令牌,后续请求使用
    tokenType令牌类型,固定为 Bearer
    expiresIn有效期(秒),默认 300 秒(5 分钟)
    Step 2:使用 Token 调用业务接口
    后续所有业务接口在 Header 中携带:
    Header 名必填示例值说明
    Seal-Token是eyJhbGciOiJIUzI1NiJ9...Step 1 获取的 accessToken
    注意事项:
    Token 有效期 5 分钟,过期后需重新获取
    同一 AppKey 同时只有一个活跃 Token,获取新 Token 会使旧 Token 失效
    nonce 在 10 分钟内不可重复使用(防重放)
    建议在 Token 过期前 1 分钟刷新

    模式三:签名模式#

    对请求参数进行 MD5 签名,防止参数被篡改。适合对安全性要求最高的场景。
    请求头:
    Header 名必填示例值说明
    Seal-Api-Key是ak_xxxxxxxxxxxxxxxx管理后台创建的 AppKey
    Seal-Sign是5A8F3D2E1B4C7A9F...请求参数签名(大写 MD5)
    Seal-Timestamp是1708000000当前时间戳(秒),签名有效期 5 分钟
    签名算法(4 步):
    1. 收集所有请求参数(Query 参数 + Seal- 开头的请求头)
    2. 按参数名 ASCII 字典序排序
    3. 拼接为 key1=value1&key2=value2&...&key=sk_xxx(末尾拼接 SecretKey)
    4. 对拼接字符串计算 MD5,转大写 → 即为签名值
    Java 签名示例:
    注意事项:
    签名有效期 5 分钟(基于 Seal-Timestamp),超时返回签名无效
    签名模式下不需要 Token,每次请求独立签名
    需要你的系统实现签名算法

    通知策略#

    创建签署任务时,可以通过 notifyChannel 字段控制平台是否自动发送短信通知给签署人。
    值说明行为
    platform(默认)由平台通知创建任务后,平台自动发送短信给所有签署人,短信中包含签署短链接
    caller由调用方通知平台不发送任何短信,调用方通过 GET /sign-tasks/{taskId}/sign-links 获取签署链接后自行通知
    如何选择:
    场景推荐值原因
    快速集成,不想处理通知逻辑platform开箱即用,签署人自动收到短信
    有自己的通知渠道(企业微信、钉钉、邮件等)caller完全控制通知体验和内容
    需要自定义短信内容caller平台短信模板固定,自行发送可自定义
    内部系统,签署人通过系统内跳转caller无需短信,直接在系统内嵌入签署页面
    使用 caller 模式的完整流程:
    1. 创建签署任务时设置 notifyChannel: "caller"
    2. 从创建响应中获取各参与人的 signUrl
    3. 通过你自己的渠道将 signUrl 发送给签署人
    4. 签署人点击链接完成签署
    示例:
    {
      "name": "劳动合同",
      "templateId": 1,
      "notifyChannel": "caller",
      "participants": [
        {
          "signatoryName": "甲方",
          "userName": "张三",
          "userMobile": "13800138000"
        }
      ]
    }
    注意:即使设置 notifyChannel: "caller",签署过程中的状态变更通知(如签署完成)仍由平台发送。notifyChannel 仅控制创建任务时的初始邀请通知。

    签署任务 API#

    创建签署任务#

    基于合同模板创建签署任务,返回各参与人的签署链接。
    POST /api/v1/seal/sign-tasks
    前置条件:
    已完成认证(三种模式任选其一)
    已在管理后台创建合同模板,拿到 templateId
    已知模板中的签署方角色名(如「甲方」「乙方」)
    已知模板中的表单字段名(如果需要填充表单数据)
    请求体:
    {
      "name": "XX公司劳动合同",
      "templateId": 1024,
      "deadline": "2026-03-01 00:00:00",
      "formData": {
        "employeeName": "李四",
        "salary": "15000",
        "startDate": "2026-03-01"
      },
      "participants": [
        {
          "signatoryName": "甲方(公司)",
          "type": "enterprise",
          "companyName": "XX科技有限公司",
          "userName": "王总",
          "userMobile": "13900139000"
        },
        {
          "signatoryName": "乙方(员工)",
          "type": "personal",
          "userName": "李四",
          "userMobile": "13800138000"
        }
      ],
      "signSecurityLevel": 0,
      "notifyChannel": "platform",
      "callbackUrl": "https://your-system.com/webhook/sign"
    }
    请求体字段说明:
    字段类型必填默认值说明
    namestring是-任务名称,用于展示和检索
    templateIdlong是-合同模板 ID(管理后台创建模板后获得)
    deadlinestring否无截止时间,格式 yyyy-MM-dd HH:mm:ss,超时自动过期
    formDataobject否无模板表单填充数据,key 必须与模板中定义的字段名一致
    participantsarray是-签署参与人列表,至少 1 人
    signSecurityLevelint否00-快捷签署(点链接直接签),1-登录签署(需登录后签)
    notifyChannelstring否platform通知策略,详见 通知策略
    callbackUrlstring否无单任务回调地址(优先级高于全局 Webhook)
    participants 字段说明:
    字段类型必填说明
    signatoryNamestring是签署方角色名称,必须与模板中定义的签署方名称一致(如「甲方」「乙方」)
    typestring否personal(个人,默认)或 enterprise(企业)
    companyNamestring条件必填企业名称,type=enterprise 时必须填写
    userNamestring是签署人真实姓名
    userMobilestring是签署人手机号(用于身份匹配和通知)
    signatoryIdlong否模板签署方 ID,用于精确匹配模板中的签署位(不传则按 signatoryName 匹配)
    成功响应:
    {
      "code": 0,
      "data": {
        "taskId": 1024,
        "name": "XX公司劳动合同",
        "status": 2,
        "statusName": "签署中",
        "needFormFilling": false,
        "deadline": "2026-03-01 00:00:00",
        "createTime": "2026-02-12 10:30:00",
        "participants": [
          {
            "participantId": 1,
            "signatoryName": "甲方(公司)",
            "type": "enterprise",
            "userName": "王总",
            "userMobile": "139****9000",
            "status": 0,
            "signUrl": "https://seal.example.com/s/abc123"
          },
          {
            "participantId": 2,
            "signatoryName": "乙方(员工)",
            "type": "personal",
            "userName": "李四",
            "userMobile": "138****8000",
            "status": 0,
            "signUrl": "https://seal.example.com/s/def456"
          }
        ]
      }
    }
    手机号在响应中自动脱敏(中间 4 位替换为 ****)。signUrl 可直接嵌入 iframe 或在 WebView 中打开。
    常见错误:
    错误原因解决方案
    合同模板ID不能为空未传 templateId检查请求体
    模板不存在templateId 不正确在管理后台确认模板 ID
    签署方角色名称不匹配signatoryName 与模板不一致在管理后台查看模板的签署方配置
    签署参与人列表不能为空participants 为空至少传入 1 个参与人

    查询签署任务#

    GET /api/v1/seal/sign-tasks/{taskId}
    前置条件: 已完成认证;taskId 必须是当前 AppKey 创建的任务(数据隔离)
    路径参数:
    参数类型说明
    taskIdlong签署任务 ID(创建任务时返回的 taskId)
    成功响应:
    {
      "code": 0,
      "data": {
        "taskId": 1024,
        "name": "XX公司劳动合同",
        "status": 3,
        "statusName": "已完成",
        "createTime": "2026-02-12 10:30:00",
        "signedFileUrl": "https://oss.example.com/signed/contract-1024.pdf",
        "participants": [
          {
            "participantId": 1,
            "signatoryName": "甲方(公司)",
            "userName": "王总",
            "status": 1,
            "signTime": "2026-02-12 11:00:00"
          }
        ]
      }
    }
    任务状态码:
    status说明可执行操作
    2签署中可撤销、可获取签署链接
    3已完成(所有人签署完毕)可下载签署文件
    4已撤销无
    5已拒签无
    6已过期无
    7表单填写中等待表单填写完成
    参与人状态码:
    status说明
    0待签署
    1已签署
    2已拒签

    撤销签署任务#

    撤销进行中的签署任务。已完成的任务无法撤销。
    POST /api/v1/seal/sign-tasks/{taskId}/cancel
    前置条件: 已完成认证;任务状态必须为「签署中」(status=2)
    成功响应:
    { "code": 0, "data": true }

    获取签署链接#

    签署链接过期后可重新获取。仅返回待签署参与人的链接。
    GET /api/v1/seal/sign-tasks/{taskId}/sign-links
    前置条件: 已完成认证;任务状态必须为「签署中」(status=2)
    使用场景:
    notifyChannel: "caller" 模式下,获取链接后通过自己的渠道发送
    签署链接过期后重新获取
    签署人反馈链接无法打开时重新生成
    成功响应:
    {
      "code": 0,
      "data": [
        {
          "participantId": 2,
          "signatoryName": "乙方(员工)",
          "userName": "李四",
          "status": 0,
          "signUrl": "https://seal.example.com/s/new-link-789"
        }
      ]
    }
    已签署的参与人不会出现在响应中。

    下载已签署文件#

    获取签署完成后的合同 PDF 文件下载地址。
    GET /api/v1/seal/sign-tasks/{taskId}/download
    前置条件: 已完成认证;任务状态必须为「已完成」(status=3)
    成功响应:
    {
      "code": 0,
      "data": "https://oss.example.com/signed/contract-1024.pdf"
    }
    返回的 URL 为 OSS 预签名地址,有一定有效期。建议获取后尽快下载或转存。

    Webhook 回调#

    前置条件#

    使用 Webhook 前,你需要:
    1.
    在你的系统中实现一个 HTTP(S) POST 接口,用于接收回调通知
    2.
    该接口必须公网可达(Contract.Pro 服务器需要能访问到)
    3.
    该接口必须在 10 秒内返回 HTTP 2xx 状态码

    配置方式#

    有两种方式配置 Webhook,可以同时使用:
    方式配置方法生效范围优先级
    任务级别创建签署任务时传入 callbackUrl 参数仅对该任务生效高
    全局级别调用 Webhook 配置 API对该 AppKey 下所有任务生效低
    如果同时配置了两种,任务级别的 callbackUrl 优先。

    配置全局 Webhook#

    前置条件: 已完成认证(Token 模式或简单模式)
    创建/更新:
    POST /api/v1/seal/webhooks
    Content-Type: application/json
    {
      "callbackUrl": "https://your-system.com/webhook/seal",
      "secret": "your-hmac-secret",
      "subscribedEvents": "sign_completed,sign_rejected,sign_cancelled"
    }
    字段类型必填说明
    callbackUrlstring是回调地址,建议 HTTPS
    secretstring否HMAC-SHA256 签名密钥,为空则系统自动生成(建议自行指定)
    subscribedEventsstring否订阅事件(逗号分隔),为空则订阅全部事件
    查询配置:
    GET /api/v1/seal/webhooks
    删除配置:
    DELETE /api/v1/seal/webhooks

    回调事件类型#

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

    回调请求格式#

    Contract.Pro 会向你的回调地址发送如下 POST 请求:
    请求头:
    Header说明
    Content-Typeapplication/json
    X-Seal-SignatureHMAC-SHA256 签名(用于验证请求来源)
    X-Seal-Event事件类型(如 sign_completed)
    X-Seal-Timestamp时间戳(毫秒)
    请求体:
    {
      "eventType": "sign_completed",
      "taskId": 1024,
      "taskName": "XX公司劳动合同",
      "status": 3,
      "timestamp": 1707724800000,
      "signedFileUrl": "https://oss.example.com/signed/contract-1024.pdf"
    }
    signedFileUrl 仅在 sign_completed 事件中返回。

    验证回调签名#

    为了确保回调请求确实来自 Contract.Pro(而非伪造),你应该验证 X-Seal-Signature。
    验证逻辑: 使用你配置的 secret 对请求体(原始 JSON 字符串)进行 HMAC-SHA256 计算,与 X-Seal-Signature 比对。
    Java:
    Python:
    Node.js:

    回调响应要求#

    你的回调接口必须:
    在 10 秒内 返回 HTTP 2xx 状态码(如 200)
    响应体内容不限(Contract.Pro 不解析响应体)
    非 2xx 或超时视为失败,触发重试

    重试策略#

    次数延迟说明
    第 1 次重试1 分钟后首次失败后
    第 2 次重试5 分钟后指数退避
    第 3 次重试30 分钟后最后一次
    超过 3 次仍失败则放弃。你可以通过 GET /api/v1/seal/sign-tasks/{taskId} 主动轮询最终状态作为兜底方案。

    签署页面嵌入#

    创建签署任务后,响应中每个参与人会返回 signUrl,将此 URL 嵌入你的系统即可。

    前置条件#

    已通过 API 创建签署任务并获得 signUrl
    你的页面支持 iframe(Web)或 WebView(移动端)
    签署页面域名已在浏览器/WebView 的安全策略中放行

    iframe 嵌入(Web)#

    allow="camera; microphone" 用于支持人脸识别等高级验证场景。

    WebView 嵌入(移动端)#

    Android:
    iOS (WKWebView):
    uni-app:

    签署安全级别#

    创建任务时通过 signSecurityLevel 控制签署人的验证方式:
    级别值用户体验适用场景
    快捷签署0点击链接直接进入签署页,无需登录内部合同、低风险场景
    登录签署1需要登录 + 实名认证后才能签署外部合同、高安全要求

    安全机制#

    数据隔离#

    每个 AppKey 创建的签署任务相互隔离:
    只能查询、操作自己创建的任务
    无法访问其他 AppKey 或平台用户创建的任务
    Webhook 配置也按 AppKey 隔离

    IP 白名单#

    管理员可在后台为每个 AppKey 配置 IP 白名单(见 前置条件四)。
    未配置白名单时,不限制来源 IP
    配置后,只有白名单内的 IP 才能调用 API
    不在白名单内的请求返回 AUTH_IP_NOT_ALLOWED 错误

    请求限流#

    维度限制说明
    单接口10 req/s每个 AppKey 对单个接口的请求频率
    全局50 req/s每个 AppKey 的总请求频率
    超过限流阈值返回 AUTH_RATE_LIMIT_EXCEEDED 错误(HTTP 429)。建议客户端实现指数退避重试。

    Nonce 防重放#

    Token 模式下,获取 Token 时的 nonce 参数在 10 分钟内不可重复使用,防止请求被截获后重放。

    状态码与错误处理#

    统一响应格式#

    所有接口返回统一的 JSON 格式:
    {
      "code": 0,
      "msg": "",
      "data": {}
    }
    code = 0:成功
    code != 0:失败,msg 包含错误描述

    常见错误码#

    code说明常见原因处理建议
    0成功--
    400请求参数错误缺少必填字段、格式不正确检查请求体字段
    401认证失败Token 无效/过期、AppKey/SecretKey 错误检查凭证,重新获取 Token
    403无权限任务不属于当前 AppKey、IP 不在白名单检查数据归属和 IP 配置
    404资源不存在taskId 不存在或已被删除检查 taskId
    429请求频率超限超过限流阈值降低请求频率,实现退避重试
    500服务器内部错误系统异常联系技术支持

    认证相关错误码#

    错误标识说明处理建议
    API_KEY_NOT_EXISTSAppKey 不存在检查 Seal-Api-Key header 值是否正确
    API_KEY_DISABLEDAppKey 已被禁用联系管理员在后台启用
    AUTH_TOKEN_INVALIDToken 无效或已过期重新调用 /auth/token 获取新 Token
    AUTH_SIGNATURE_INVALID签名验证失败检查签名算法实现和 SecretKey
    AUTH_IP_NOT_ALLOWEDIP 不在白名单联系管理员添加你的服务器 IP
    AUTH_RATE_LIMIT_EXCEEDED请求频率超限降低请求频率
    AUTH_PARAM_MISSING缺少认证参数检查是否携带了认证 Header

    完整集成示例#

    Java (OkHttp)#

    前置条件: 已获取 AppKey、SecretKey、templateId

    Python (requests)#

    前置条件: pip install requests,已获取 AppKey、SecretKey、templateId

    cURL 完整流程#


    FAQ#

    Q1: AppKey / SecretKey 在哪里获取?
    管理后台 → API 密钥管理 → 点击「新增」→ 填写应用名称 → 确定。系统自动生成 AppKey 和 SecretKey。SecretKey 仅在创建时展示一次,请立即复制保存。详见 前置条件二。
    Q2: templateId 在哪里获取?
    管理后台 → 合同模板管理 → 找到你要使用的模板 → 模板 ID 即为 templateId。如果还没有模板,需要先创建。详见 前置条件三。
    Q3: 三种认证模式该选哪个?
    场景推荐模式
    测试阶段、快速验证简单模式
    生产环境Token 模式(推荐)
    金融、法律等高安全场景签名模式
    Q4: Token 过期了怎么办?
    重新调用 POST /api/v1/seal/auth/token 获取新 Token。建议在过期前 1 分钟刷新。Token 有效期 5 分钟(300 秒)。
    Q5: 创建任务后签署人没收到短信?
    检查 notifyChannel 参数:
    如果设置为 caller,平台不会发短信,需要你自己获取签署链接并通知签署人
    如果设置为 platform(或不传),平台会自动发短信
    如果是 platform 模式仍未收到,请检查手机号是否正确
    Q6: 如何知道签署完成了?
    两种方式:
    1.
    配置 Webhook 接收 sign_completed 事件(推荐,实时性好)
    2.
    定时轮询 GET /sign-tasks/{taskId} 查看 status 是否变为 3
    Q7: 签署链接有效期多久?
    签署链接基于 JWT Token,默认有效期 7 天。过期后可通过 GET /sign-tasks/{taskId}/sign-links 重新获取。
    Q8: 能否在创建任务时不指定模板,直接上传 PDF?
    当前版本需要先在管理后台创建模板,再通过 templateId 引用。后续版本将支持直接上传 PDF。
    Q9: 一个 AppKey 能创建多少任务?
    无数量限制。请求频率限制为单接口 10 req/s,全局 50 req/s。
    Q10: 报错「签署方角色名称不匹配」怎么办?
    participants 中的 signatoryName 必须与模板中定义的签署方名称完全一致。请在管理后台查看模板的签署方配置,确认角色名称(如「甲方」「乙方」)是否匹配。
    Q11: 报错「API_KEY_NOT_EXISTS」怎么办?
    检查 Seal-Api-Key header 的值是否正确。确认:
    1.
    AppKey 格式为 ak_xxx
    2.
    在管理后台确认该密钥存在且状态为「启用」
    3.
    Header 名称是 Seal-Api-Key(注意大小写和连字符)
    Q12: 报错「AUTH_IP_NOT_ALLOWED」怎么办?
    你的服务器 IP 不在白名单中。联系管理员在后台「IP 白名单管理」中添加你的服务器出口 IP。如果不确定出口 IP,可以先让管理员清空白名单(不配置白名单 = 不限制 IP)。

    技术支持#

    邮件:shawn@leepm.com
    API 文档(Swagger):https://your-domain.com/doc.html
    GitHub Issues:https://github.com/YunaiV/ruoyi-vue-pro/issues
    修改于 2026-02-14 04:13:02
    上一页
    简介
    下一页
    验证短链接(返回签署模式)
    Built with