____ _ ____ _
/ ___| ___ __ _| | / ___| _ _ ___| |_ ___ _ __ ___
\___ \ / _ \/ _` | | \___ \| | | / __| __/ _ \ '_ ` _ \
___) | __/ (_| | | ___) | |_| \__ \ || __/ | | | | |
|____/ \___|\__,_|_| |____/ \__, |___/\__\___|_| |_| |_|
|___/ | 能力 | 说明 |
|---|---|
| 合同签署 | 基于模板创建签署任务,支持多方签署 |
| 签署页面 | 提供开箱即用的签署页面(seal-core),支持 iframe / WebView 嵌入 |
| 状态通知 | 通过 Webhook 实时推送签署状态变更 |
| 文件管理 | 合同 PDF 生成、签章合成、已签署文件下载 |
| 安全保障 | 多种认证模式、数据隔离、IP 白名单、请求限流 |
┌─────────────────────────────────────────────────────────────────────┐
│ │
│ 你的系统 Contract.Pro 开放平台 │
│ │
│ ┌──────────────┐ ┌──────────────────────────────┐ │
│ │ 业务系统 │ API / SDK │ Open API 服务 │ │
│ │ (你开发) │ ──────────────→ │ - 签署任务管理 │ │
│ │ │ ←────────────── │ - Webhook 回调 │ │
│ └──────┬───────┘ │ - 文件下载 │ │
│ │ └──────────┬───────────────────┘ │
│ │ 嵌入 signUrl │ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────────────────────┐ │
│ │ 你的前端页面 │ iframe / │ 签署页面 (seal-core) │ │
│ │ (你开发) │ WebView │ (Contract.Pro 提供,开箱即用) │ │
│ └──────────────┘ └──────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘| 项目 | 说明 |
|---|---|
| Base URL | https://your-domain.com/open-api |
| 协议 | HTTPS |
| 数据格式 | JSON |
| 字符编码 | UTF-8 |
| 接入方式 | 接入难度 | 开发周期 | 适用场景 | 签署页面 | 当前状态 |
|---|---|---|---|---|---|
| API 对接 | ★★☆ | 1-3 天 | 已有业务系统,需要嵌入签署能力 | 使用 Contract.Pro 提供的签署页面(seal-core) | ✅ 已支持 |
| SDK 对接(Spring Boot Starter) | ★☆☆ | 0.5-1 天 | Spring Boot 项目深度集成,将签署能力嵌入自己 的系统 | 使用 Contract.Pro 提供的签署页面(seal-core) | ✅ 已支持 |
| 私有化部署 | ★★★★ | 1-2 周 | 数据安全要求极高,需完全自主可控 | 全部自有 | 📋 企业版 |
┌─────────────────────────────────────────────────────────────────┐
│ 你需要开发的部分 │
│ │
│ ┌──────────────┐ HTTP API ┌──────────────────────────┐ │
│ │ 你的业务系统 │ ─────────────→ │ Contract.Pro Open API │ │
│ │ │ ←───────────── │ (后端服务) │ │
│ │ - 调用 API │ └──────────┬───────────────┘ │
│ │ - 处理回调 │ │ │
│ │ - 业务页面 │ │ │
│ └──────┬───────┘ │ │
│ │ │ │
│ │ 嵌入 signUrl │ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────────────────┐ │
│ │ 你的前端页面 │ iframe / │ 签署页面 (seal-core) │ │
│ │ (合同列表等) │ WebView │ ← Contract.Pro 提供 │ │
│ └──────────────┘ │ ← 你不需要开发这部分 │ │
│ └──────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘notifyChannel: "platform" 模式下由平台自动发送)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) │
└─────────────────────────────────────────────────────────────────┘| 内部模式(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。
sql/ 目录)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是闭源的商业模块。
mode: starter 由 Starter JAR 内置配置自动设置,你不需要手动配置。你只需要根据自己的需求配置认证方式和存储方式:配置优先级:你的 application.yml> Starter 内置application.yml>application-seal.yaml(模块默认配置)。你在自己的配置文件中设置的值会覆盖 Starter 和模块的默认值。
SealAuthProvider 接口: ____ _ ____ _
/ ___| ___ __ _| | / ___| _ _ ___| |_ ___ _ __ ___
\___ \ / _ \/ _` | | \___ \| | | / __| __/ _ \ '_ ` _ \
___) | __/ (_| | | ___) | |_| \__ \ || __/ | | | | |
|____/ \___|\__,_|_| |____/ \__, |___/\__\___|_| |_| |_|
|___/
:: Seal电子印章系统 :: (v2.0.0)
Seal 模块配置信息:
- 集成模式: starter (Starter自动配置已启用)
- 认证方式: jwt
- 存储方式: localseal-api 模块,开源):| 接口 | 说明 | 内置实现 |
|---|---|---|
SealAuthProvider | 认证提供者,从 SealAuthContext 中提取用户信息 | JwtAuthAdapter、OAuth2AuthAdapter、RuoyiAuthAdapter |
SealStorageProvider | 文件存储,管理合同 PDF / 印章图片等文件 | LocalStorageAdapter、OssStorageAdapter、MinioStorageAdapter、RuoyiFileClientAdapter |
SealUserValidator | 用户验证器,校验 userId 是否存在且可用 | RuoyiUserValidator、NoOpUserValidator |
SealQuotaValidator | 配额验证器,校验签署配额是否充足 | RuoyiQuotaValidator、NoOpQuotaValidator |
SealSignTaskApi | 签署任务 API,可在代码中直接调用(创建任务、查询状态、下载文件) | 框架内置实现 |
| 适配器 | 装配条件 | 适用场景 |
|---|---|---|
JwtAuthAdapter | yudao.seal.auth.type=jwt | 标准 JWT Token 认证,从 Authorization: Bearer {jwt} 提取,JWT Payload 需包含 userId、tenantId |
OAuth2AuthAdapter | yudao.seal.auth.type=oauth2 | Spring Security OAuth2 项目,从 SecurityContextHolder 获取认证信息 |
RuoyiAuthAdapter | classpath 中存在 SecurityFrameworkUtils 类时自动启用 | Ruoyi-Vue-Pro 框架项目,直接从 Ruoyi 的 SecurityContext 获取 LoginUser |
| 自定义 | 实现 SealAuthProvider 接口并注册为 @Component | 以上都不满足时,自行实现认证逻辑 |
注意: RuoyiAuthAdapter的装配条件是@ConditionalOnClass(检测 classpath),不是配置项。如果你的项目引入了 Ruoyi Security 模块,它会自动生效,优先级高于配置的 type。
| 适配器 | 装配条件 | 说明 |
|---|---|---|
LocalStorageAdapter | yudao.seal.storage.type=local | 本地磁盘存储,适合开发测试 |
OssStorageAdapter | yudao.seal.storage.type=oss | 阿里云 OSS,需配置 endpoint / accessKeyId / accessKeySecret / bucketName |
MinioStorageAdapter | yudao.seal.storage.type=minio | MinIO 对象存储,支持私有化部署,自动创建 Bucket |
RuoyiFileClientAdapter | 手动注入(需要 Ruoyi 的 FileClient Bean) | 复用 Ruoyi 框架的文件存储体系(支持 S3、FTP、SFTP、DB 等) |
| 对比项 | API 对接 | SDK 对接(Spring Boot Starter) |
|---|---|---|
| 集成方式 | HTTP RESTful 调用远程服务 | Maven 依赖,嵌入你的应用进程 |
| 认证处理 | 自行管理 AppKey/SecretKey/Token | SPI 接口自动适配你的认证体系 |
| 数据存储 | 数据在 Contract.Pro 平台 | 数据在你自己的数据库 |
| 文件存储 | 由平台管理 | 你自己选择存储方式(本地/OSS/MinIO) |
| 签署页面 | 使用 seal-core(不变) | 使用 seal-core(不变) |
| 适用语言 | 任何语言(HTTP 调用) | 仅 Java(Spring Boot 2.7.x) |
| 扩展性 | 受限于 API 能力 | 可深度定制(5 个 SPI 接口可扩展) |
| 数据隔离 | 按 AppKey 隔离 | 按你的租户体系隔离(tenantId) |
| 运维 | 无需运维签署服务 | 需要自行运维(数据库、Redis、存储) |
SealSignTaskApi):SealSignTaskApi 调用签署能力,无需走 HTTP:GET /actuator/health/seal 可查看 Seal 模块状态examples/ 目录下提供了 5 个开箱即用的示例项目:| 示例 | 难度 | 认证方式 | 文件存储 | 适用场景 |
|---|---|---|---|---|
example-minimal | ⭐ | JWT | 本地 | 快速验证,3 分钟启动 |
example-springboot | ⭐⭐ | JWT | 阿里云 OSS | 标准 Spring Boot 生产项目 |
example-ruoyi | ⭐⭐ | Ruoyi(自动检测) | Ruoyi FileClient | Ruoyi-Vue-Pro 项目无缝集成 |
example-microservice | ⭐⭐⭐ | OAuth2 | OSS | Spring Cloud 微服务架构 |
example-docker | ⭐⭐ | JWT | 本地/OSS | Docker Compose 一键部署 |
详细的 SDK 集成指南请参考 COMMERCIAL_INTEGRATION_GUIDE.md,示例项目说明请参考examples/README.md。
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。
https://your-domain.com/adminseal:api-key:create、seal:template:create 等权限如果你是第三方开发者,请联系 Contract.Pro 的运营方为你开通管理后台账号并分配相应权限。
HR系统对接、CRM集成),用于标识这组密钥的用途| 字段 | 格式示例 | 说明 |
|---|---|---|
| AppKey | ak_xxxxxxxxxxxxxxxx | API 密钥标识,可多次查看 |
| SecretKey | sk_xxxxxxxxxxxxxxxx | API 密钥密码,仅创建时展示一次 |
⚠️ 重要提醒: SecretKey 仅在创建时展示一次,之后无法再次查看。请在创建后立即复制并妥善保存到安全的地方(如密钥管理系统、加密配置文件)。如果遗失,只能删除后重新创建。
| 状态值 | 说明 | 影响 |
|---|---|---|
| 0 | 启用(默认) | 正常调用 API |
| 1 | 禁用 | 所有使用该密钥的请求将返回 API_KEY_DISABLED 错误 |
| 字段 | 说明 |
|---|---|
| templateId | 模板 ID(数字),创建签署任务时需要传入 |
| 表单字段名列表 | 模板中定义的可填充字段名,用于 formData 参数 |
| 签署方列表 | 模板中定义的签署方角色名(如「甲方」「乙方」),用于 participants.signatoryName 参数 |
模板中的表单字段名和签署方角色名,在调用 API 创建签署任务时需要精确匹配。建议在模板创建完成后,记录这些信息供开发时使用。
| 格式 | 示例 | 说明 |
|---|---|---|
| 单个 IP | 203.0.113.50 | 精确匹配一个 IP |
| CIDR 网段 | 203.0.113.0/24 | 匹配一个网段内的所有 IP |
如果不配置 IP 白名单,则不限制来源 IP(所有 IP 均可访问)。生产环境强烈建议配置。
| 要求 | 说明 |
|---|---|
| 协议 | 建议 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注意: templateId和signatoryName必须与管理后台创建的模板一致,否则会报错。
| 模式 | 安全级别 | 适用场景 | 前置条件 |
|---|---|---|---|
| 简单模式 | ★★☆ | 测试、内网系统 | AppKey + SecretKey |
| Token 模式 | ★★★ | 生产环境推荐 | AppKey + SecretKey |
| 签名模式 | ★★★★ | 高安全要求(金融等) | AppKey + SecretKey + 签名算法实现 |
三种模式都需要先在管理后台创建 API 密钥(见