3. 合同管理
合同发起支持两种业务路径:
PDF 上传发起
同一发起人完成上传与创建;发起人可在平台查看,也可用用户合同列表查询。
flowchart TD
A["上传 PDF"] --> B["获得文件"]
B --> C["创建草稿"]
C --> D["设计签署位置"]
D --> E["发起签署"]
E --> F["获取签署链接"]
C --> G["用户合同列表查询"]
模板发起
模板来自接入应用;传入发起人后合同归发起人,可用用户合同列表查询。
flowchart TD
T0["创建模板 可选"] --> T1["查询模板"]
T1 --> T2["模板发起或批量发起"]
T2 --> T3["获取签署链接"]
T2 --> T4["用户合同列表查询"]
创建或发起合同时,可选填签署完成通知地址与跳转地址,说明见 §3.10.1。
3.1 上传合同 PDF
- 接口路径:
POST /contract/upload-template
- 请求类型:JSON(
Content-Type: application/json)
- 功能说明:上传合同 PDF,返回文件 ID,供创建草稿使用;上传后系统会生成预览图
- 注意事项:须指定发起人;后续创建草稿须使用同一发起人与本接口返回的文件 ID
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
| Content-Type |
String |
是 |
application/json |
请求参数
| 参数名 |
类型 |
必填 |
描述 |
| fileName |
String |
是 |
文件名 |
| fileContent |
String |
是 |
文件内容(Base64编码) |
| fileType |
String |
否 |
文件类型(预留字段) |
| userId |
String |
是 |
发起人用户 ID(须与创建草稿时一致) |
请求示例
JSON
{
"fileName": "template.pdf",
"fileContent": "JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFI+PgplbmRvYmoKNCAwIG9iago8PC9MZW5ndGggNTM1L0ZpbHRlci9GbGF0ZURlY29kZT4+CnN0cmVhbQp4nGNgYNgh4A/EYGVhZABkYAQwgWgDcIgDcQAZgYGPgBYH5AYGPoB2EAAKcAg==",
"userId": "123456"
}
响应参数
| 参数名 |
类型 |
描述 |
| fileId |
Long |
文件ID |
| fileName |
String |
文件名 |
| fileType |
String |
文件类型 |
| fileUrl |
String |
文件访问URL |
响应示例
JSON
{
"success": true,
"data": {
"fileId": 1,
"fileName": "contract.pdf",
"fileType": "application/pdf",
"fileUrl": "https://example.com/...(服务端返回的模板文件下载完整 URL)"
}
}
3.2 创建合同模板
- 接口路径:
POST /contract/templates
- 请求类型:JSON(
Content-Type: application/json)
- 功能说明:上传 Word(
.docx)创建合同模板,归属当前接入应用。企业须为接入应用下可用企业(建议从获取令牌返回的企业列表选取)。未传字段定义时,系统自动识别文档中的 {{关键词}}。创建后可用于模板发起 / 批量发起合同。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
| Content-Type |
String |
是 |
application/json |
请求参数
| 参数名 |
类型 |
必填 |
描述 |
| name |
String |
是 |
模板名称 |
| orgId |
String |
是 |
所属企业 ID(须为当前接入应用下的企业,建议取自获取令牌返回的企业列表) |
| fileName |
String |
是 |
Word 文件名,须以 .docx 结尾 |
| fileContent |
String |
是 |
Word 文件 Base64(可含 data:...;base64, 前缀) |
| description |
String |
否 |
模板描述 |
| category |
String |
否 |
分类 |
| fields |
String |
否 |
字段定义 JSON,如 [{"key":"甲方名称","label":"甲方名称","required":true}];不传则自动提取 |
| sealPositions |
String |
否 |
默认签署/盖章位置 JSON(结构同模板详情 sealPositions) |
| status |
String |
否 |
状态,默认 ACTIVE |
请求示例
JSON
{
"name": "服务协议模板",
"orgId": "10001",
"fileName": "service-agreement.docx",
"fileContent": "UEsDBBQAAAAI...",
"description": "标准服务协议",
"sealPositions": "[{\"type\":\"sign_area\",\"page\":1,\"left\":100,\"top\":200,\"width\":126,\"height\":126,\"signerIndex\":1}]"
}
响应参数
data 结构与 §3.3 模板列表 单项相同(含 templateId、fields、fileObjectId 等)。
3.3 查询模板列表
- 接口路径:
GET /contract/templates(可选 Query:orgId)
- 请求类型:Query 参数(
orgId 非必填)
- 功能说明:查询当前接入应用下已启用的合同模板。可按企业筛选;不传企业则返回该应用下全部启用模板。
企业请从获取令牌返回的企业列表中选取。传入不可用的企业时接口返回业务错误。
请求参数
| 参数名 |
类型 |
必填 |
描述 |
| orgId |
String |
否 |
企业 ID(建议取自获取令牌返回的企业列表)。不传则返回当前接入应用下全部启用模板 |
请求示例
HTTP
GET /api/v1/contract/templates
Authorization: Bearer <token>
# 或按企业筛选
GET /api/v1/contract/templates?orgId=1
Authorization: Bearer <token>
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
响应参数
| 参数名 |
类型 |
描述 |
| data |
Array |
模板列表 |
| data[].templateId |
Long |
模板 ID |
| data[].orgEntityId |
Long |
所属企业组织 ID |
| data[].orgEntityName |
String |
所属企业名称(由 orgEntityId 解析;未绑定企业时为空) |
| data[].name |
String |
模板名称 |
| data[].description |
String |
模板描述 |
| data[].category |
String |
模板分类 |
| data[].status |
String |
模板状态 |
| data[].fileObjectId |
Long |
模板源文件 ID |
| data[].fileName |
String |
模板源文件名 |
| data[].fields |
String |
模板字段 JSON,如 [{"key":"甲方名称","label":"甲方名称","required":true}] |
| data[].pageCount |
Integer |
页数 |
| data[].approvalFlowId |
Long |
关联审批流 ID |
| data[].approvalFlowName |
String |
关联审批流名称 |
| data[].sealPositions |
String |
默认签署/盖章位置配置 JSON,如 [{"type":"sign_area","page":1,"left":100,"top":200,"width":126,"height":126,"signerIndex":1}];其中 type 为 sign_area(签署区域)/sign_date(签署日期)/page_seal(骑缝章),signerIndex 为签署方序号(从 1 开始,对应发起时 signers 的签署顺序 order)。未配置时为 null |
| data[].createdAt |
String |
创建时间 |
响应示例
JSON
{
"success": true,
"data": [
{
"templateId": 1,
"orgEntityId": 1,
"orgEntityName": "示例科技有限公司",
"name": "劳动合同",
"description": "标准劳动合同模板",
"category": "人事",
"status": "ACTIVE",
"fileObjectId": 100,
"fileName": "labor.docx",
"fields": "[{\"key\":\"甲方名称\",\"label\":\"甲方名称\",\"required\":true}]",
"pageCount": 3,
"approvalFlowId": null,
"approvalFlowName": null,
"sealPositions": "[{\"type\":\"sign_area\",\"page\":1,\"left\":100,\"top\":200,\"width\":126,\"height\":126,\"signerIndex\":1}]",
"createdAt": "2026-05-01 10:00:00"
}
]
}
3.4 查询模板详情
- 接口路径:
GET /contract/templates/{templateId}
- 请求类型:无 JSON/表单请求体;参数见 URL Path
- 功能说明:根据模板 ID 获取模板详情,含字段定义等信息
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
路径参数
| 参数名 |
类型 |
必填 |
描述 |
| templateId |
String |
是 |
模板 ID |
响应参数
与 §3.3 列表项结构相同,data 为单个模板对象。
响应示例
JSON
{
"success": true,
"data": {
"templateId": 1,
"orgEntityId": 1,
"orgEntityName": "示例科技有限公司",
"name": "劳动合同",
"description": "标准劳动合同模板",
"category": "人事",
"status": "ACTIVE",
"fileObjectId": 100,
"fileName": "labor.docx",
"fields": "[{\"key\":\"甲方名称\",\"label\":\"甲方名称\",\"required\":true}]",
"pageCount": 3,
"approvalFlowId": null,
"approvalFlowName": null,
"sealPositions": "[{\"type\":\"sign_area\",\"page\":1,\"left\":100,\"top\":200,\"width\":126,\"height\":126,\"signerIndex\":1}]",
"createdAt": "2026-05-01 10:00:00"
}
}
3.5 根据模板发起合同
- 接口路径:
POST /contract/create-from-template
- 请求类型:JSON(
Content-Type: application/json)
- 功能说明:按接入应用下的模板填写字段并生成合同;配置了默认签署位置时将直接进入待签署。传入发起人时,合同与生成文件归属该发起人(与 PDF 创建草稿一致);不传则使用接入应用默认账号。
典型流程:先调用 §3.3 / §3.4 获取模板及字段定义 → 填写 fieldValues、发起人与签署方 → 调用本接口(或 §3.6 批量发起)→ 使用 §3.10 获取签署链接引导用户签署。查询该发起人合同见 §3.13。
默认签署位置:若模板已配置默认盖章/签署位置,发起时会自动落到对应签署方,一般无需再打开设计页。未配置时合同可能仍为草稿,需后续补充签署位置后再发起。
签署意愿:可为每位签署方指定短信验证、人脸识别或两者;不传时默认仅人脸识别。字段说明见创建草稿中的签署方说明。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
| Content-Type |
String |
是 |
application/json |
请求参数
| 参数名 |
类型 |
必填 |
描述 |
| templateId |
Long |
是 |
模板 ID |
| title |
String |
否 |
合同标题,为空时使用模板名称 |
| fieldValues |
Object |
否 |
模板字段值,key 为字段标识(与模板 fields 中 key 对应) |
| userId |
String |
否 |
发起人用户 ID;有则合同归属该用户,可用用户合同列表查询;不传则用接入应用默认账号 |
| orgId |
String |
否 |
发起组织 ID;有发起人时须属于发起人租户下的企业(建议从企业列表按发起人选取) |
| signers |
Array |
否 |
签署方信息列表,结构同 §3.7 创建草稿 |
| signOrderMode |
Integer |
否 |
签署顺序模式:1-顺序签署,2-并行签署 |
| expireTime |
Long |
否 |
签署截止日期(毫秒时间戳) |
| callbackUrl |
String |
否 |
签署完成回调推送地址 |
| redirectUrl |
String |
否 |
签署完成后跳转地址 |
请求示例
JSON
{
"templateId": 1,
"title": "张三劳动合同",
"fieldValues": {
"甲方名称": "某某科技有限公司",
"乙方姓名": "张三",
"入职日期": "2026-06-01"
},
"userId": "123456",
"orgId": "1",
"signOrderMode": 1,
"callbackUrl": "https://your-domain.com/api/sign-callback",
"redirectUrl": "https://your-domain.com/sign/success",
"signers": [
{
"type": "ENTERPRISE",
"order": 1,
"orgId": "1",
"verifyMethods": "2"
},
{
"type": "PERSON",
"order": 2,
"name": "张三",
"mobile": "13800138000",
"verifyMethods": "1,2"
}
],
"expireTime": 1793568000000
}
响应参数
| 参数名 |
类型 |
描述 |
| contractId |
Long |
合同 ID |
| status |
String |
合同状态,发起成功后为 PENDING |
响应示例
JSON
{
"success": true,
"data": {
"contractId": 123456,
"status": "PENDING"
}
}
3.6 批量根据模板发起合同
- 接口路径:
POST /contract/batch-create-from-template
- 请求类型:JSON(
Content-Type: application/json)
- 功能说明:按
items 逐份调用与 §3.5 相同的模板发起逻辑(填充字段、生成 PDF、创建合同并自动发起签署)。各份独立处理,部分失败不影响其余成功项。
- 数量限制:
items 不能为空;单次请求最多 50 份,超出时整单拒绝并返回错误:单次最多发起50份合同
items[] 中每个元素的结构与参数说明同 §3.5 根据模板发起合同(含 templateId、fieldValues、userId、signers 等)。模板默认签署/盖章位置规则亦与 §3.5 一致。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
| Content-Type |
String |
是 |
application/json |
请求参数
| 参数名 |
类型 |
必填 |
描述 |
| items |
Array |
是 |
待发起的合同列表,1–50 份;每项结构同 §3.5 |
请求示例
JSON
{
"items": [
{
"templateId": 1,
"title": "张三劳动合同",
"fieldValues": {
"乙方姓名": "张三"
},
"userId": "123456",
"orgId": "1",
"signOrderMode": 1,
"signers": [
{
"type": "ENTERPRISE",
"order": 1,
"orgId": "1",
"verifyMethods": "2"
},
{
"type": "PERSON",
"order": 2,
"userId": "789012",
"verifyMethods": "1,2"
}
]
},
{
"templateId": 1,
"title": "李四劳动合同",
"fieldValues": {
"乙方姓名": "李四"
},
"userId": "123456",
"orgId": "1",
"signOrderMode": 1,
"signers": [
{
"type": "ENTERPRISE",
"order": 1,
"orgId": "1",
"verifyMethods": "2"
},
{
"type": "PERSON",
"order": 2,
"userId": "789013",
"verifyMethods": "1,2"
}
]
}
]
}
响应参数
| 参数名 |
类型 |
描述 |
| total |
Integer |
请求总份数 |
| successCount |
Integer |
成功份数 |
| failCount |
Integer |
失败份数 |
| results |
Array |
各份处理结果,顺序与 items 一致 |
| results[].index |
Integer |
在 items 中的序号,从 0 开始 |
| results[].success |
Boolean |
该份是否成功 |
| results[].contract |
Object |
成功时返回,含 contractId、status 等,结构同 §3.5 响应 |
| results[].errorMessage |
String |
失败时的错误原因 |
响应示例
JSON
{
"success": true,
"data": {
"total": 2,
"successCount": 2,
"failCount": 0,
"results": [
{
"index": 0,
"success": true,
"contract": {
"contractId": 123456,
"status": "PENDING"
}
},
{
"index": 1,
"success": true,
"contract": {
"contractId": 123457,
"status": "PENDING"
}
}
]
}
}
HTTP 状态码为 200 时,仍可能有部分 results[].success 为 false,请按序号检查每份结果。仅当 items 为空或超过 50 份时,整单以业务错误拒绝。
3.7 创建合同草稿
- 接口路径:
POST /contract/create
- 请求类型:JSON(
Content-Type: application/json)
- 功能说明:使用已上传的 PDF 创建草稿合同,并保存签署方;随后需完成设计签署位置并发起签署
- 注意事项:发起人须与上传 PDF 时一致;签署方可为本平台其他企业或个人
若使用 Word 模板且无需自行设计位置,请使用模板发起或批量模板发起。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
| Content-Type |
String |
是 |
application/json |
请求参数
| 参数名 |
类型 |
必填 |
描述 |
| title |
String |
是 |
合同标题 |
| fileId |
Long |
是 |
合同 PDF 文件 ID(§3.1 上传返回) |
| userId |
String |
是 |
发起人用户 ID(须与上传 PDF 时一致) |
| orgId |
String |
否 |
发起组织 ID |
| signOrderMode |
Integer |
否 |
签署顺序模式:1-顺序签署,2-并行签署 |
| signers |
Array |
否 |
签署方列表,见下表 |
| expireTime |
Long |
否 |
签署截止日期(毫秒时间戳) |
| callbackUrl |
String |
否 |
签署完成回调推送地址 |
| redirectUrl |
String |
否 |
签署完成后跳转地址 |
signers[] 元素
每个元素描述一名签署方,可通过平台 ID 或姓名、手机号等方式指定。
| 参数名 |
类型 |
必填 |
描述 |
| type |
String |
是 |
PERSON 个人;ENTERPRISE 或 COMPANY 企业/个体户 |
| order |
Integer |
否 |
签署顺序,默认按数组顺序从 1 递增 |
| userId |
String |
否 |
平台用户 ID(个人签署方;与姓名+手机号二选一)。可为外部签署人 |
| orgId |
String |
否 |
平台企业 ID(企业签署方;与企业名称等信息二选一)。可为外部签署企业 |
| name |
String |
条件 |
签署方名称:个人为姓名,企业为企业全称 |
| mobile |
String |
条件 |
手机号:个人用于身份验证;企业为经办人/接收短信手机号 |
| contact |
String |
否 |
同 mobile,二者任填其一 |
| unifiedSocialCreditCode |
String |
否 |
统一社会信用代码(企业可选) |
| idCardNumber |
String |
否 |
身份证号(个人可选) |
| verifyMethods |
String |
否 |
签署要求(意愿验证):1 短信验证,2 人脸识别,1,2 两者均需;不传默认 2 |
请求示例(平台 ID 方式)
JSON
{
"title": "服务协议",
"fileId": 1,
"signOrderMode": 1,
"signers": [
{
"type": "PERSON",
"order": 1,
"userId": "123456",
"verifyMethods": "2"
},
{
"type": "ENTERPRISE",
"order": 2,
"orgId": "789012",
"verifyMethods": "1,2"
}
],
"userId": "123456"
}
请求示例(姓名/手机号)
JSON
{
"title": "服务协议",
"fileId": 1,
"signOrderMode": 1,
"callbackUrl": "https://your-domain.com/api/sign-callback",
"redirectUrl": "https://your-domain.com/sign/success",
"signers": [
{
"type": "PERSON",
"order": 1,
"name": "张三",
"mobile": "13800138000",
"verifyMethods": "1,2"
},
{
"type": "ENTERPRISE",
"order": 2,
"name": "某某科技有限公司",
"mobile": "13900139000",
"unifiedSocialCreditCode": "91330100MA2XXXXXXX",
"verifyMethods": "2"
}
],
"expireTime": 1793568000000,
"userId": "123456"
}
响应参数
| 参数名 |
类型 |
描述 |
| contractId |
Long |
合同 ID |
| title |
String |
合同标题 |
| status |
String |
合同状态,创建成功为 DRAFT |
响应示例
JSON
{
"success": true,
"data": {
"contractId": 123456,
"title": "服务协议",
"status": "DRAFT"
}
}
3.8 获取设计合同页面
- 接口路径:
GET /contract/design-page/{contractId}
- 请求类型:无 JSON/表单请求体;参数见 URL Path
- 功能说明:获取合同设计页面 URL,用于配置签署控件位置
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
路径参数
| 参数名 |
类型 |
必填 |
描述 |
| contractId |
Long |
是 |
合同ID |
响应参数
| 参数名 |
类型 |
描述 |
| contractId |
Long |
合同ID |
| token |
String |
页面访问令牌 |
| tokenType |
String |
令牌类型:design |
| expiresIn |
Integer |
令牌有效期(秒),默认 2592000(30 天) |
| pcUrl |
String |
PC端设计页面URL |
| h5Url |
String |
H5端设计页面URL |
响应示例
JSON
{
"success": true,
"data": {
"contractId": 1,
"token": "abc123xyz",
"tokenType": "design",
"expiresIn": 2592000,
"pcUrl": "https://example.com/open-contract/pc/design?token=abc123xyz",
"h5Url": "https://example.com/open-contract/h5/design?token=abc123xyz"
}
}
注意:返回 URL 含 token 参数,凭 token 打开设计页。令牌默认有效期 30 天,过期后重新调用本接口获取。
3.9 发起签署
- 接口路径:
POST /contract/initiate-sign/{contractId}
- 请求类型:JSON(
Content-Type: application/json);Body 可为空或省略,按业务需要传参与默认一致
- 功能说明:发起合同签署,会创建原文件的副本作为签署文件,保留原文件
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
路径参数
| 参数名 |
类型 |
必填 |
描述 |
| contractId |
String |
是 |
合同ID |
响应参数
| 参数名 |
类型 |
描述 |
| contractId |
Long |
合同ID |
| status |
String |
合同状态 |
| message |
String |
操作信息 |
响应示例
JSON
{
"success": true,
"data": {
"contractId": 1,
"status": "PENDING",
"message": "发起签署成功"
}
}
3.10 获取签署链接
- 接口路径:
GET /contract/sign-url/{contractId}
- 请求类型:无 JSON/表单请求体;参数见 URL Path 与 Query
- 功能说明:获取合同签署链接,用于引导用户完成签署
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
路径参数
| 参数名 |
类型 |
必填 |
描述 |
| contractId |
String |
是 |
合同ID |
查询参数
| 参数名 |
类型 |
必填 |
描述 |
| userId |
String |
否 |
用户 ID(可选,用于指定签署方视角) |
| orgId |
String |
否 |
组织 ID(可选,用于指定签署方视角) |
| callbackUrl |
String |
否 |
签署完成回调推送地址(覆盖创建合同时的配置,见 §3.10.1) |
| redirectUrl |
String |
否 |
签署完成后跳转地址(覆盖创建合同时的配置,见 §3.10.1) |
响应参数
| 参数名 |
类型 |
描述 |
| contractId |
Long |
合同ID |
| token |
String |
页面访问令牌 |
| tokenType |
String |
令牌类型:sign |
| expiresIn |
Integer |
令牌有效期(秒),默认 2592000(30 天) |
| pcUrl |
String |
PC端签署链接 |
| h5Url |
String |
H5端签署链接 |
响应示例
JSON
{
"success": true,
"data": {
"contractId": 1,
"token": "abc123xyz",
"tokenType": "sign",
"expiresIn": 2592000,
"pcUrl": "https://example.com/open-contract/pc/sign?token=abc123xyz",
"h5Url": "https://example.com/open-contract/h5/sign?token=abc123xyz"
}
}
注意:返回 URL 含 token 参数,签署人打开链接后按页面提示完成身份验证与签署。令牌默认有效期 30 天,过期后重新调用本接口获取。
3.10.1 签署完成回调与跳转
在 §3.7 创建草稿、§3.5 模板发起合同、§3.6 批量模板发起 或 §3.10 获取签署链接 时,可传入以下可选参数:
| 参数名 |
说明 |
callbackUrl |
签署结果通知地址。平台向该地址 POST JSON,通知签署进度(见下方示例) |
redirectUrl |
签署完成跳转地址。当前签署人在签署页完成签署后,将跳转至该地址 |
callbackUrl 通知说明
- 请求方式:
POST,Content-Type: application/json
- 有签署方完成签署时推送一次;全部签署方均完成后会再推送一次「合同已完成」通知
- 请使用 HTTPS 地址,并在您的服务端按
contractId 更新业务状态
单方完成签署 — 通知示例
JSON
{
"event": "signer.signed",
"contractId": 123456,
"title": "服务协议",
"status": "PENDING",
"signerId": 789,
"signerName": "张三",
"signerContact": "13800138000",
"signedAt": 1719500000000,
"timestamp": 1719500000000
}
合同全部完成 — 通知示例
JSON
{
"event": "contract.completed",
"contractId": 123456,
"title": "服务协议",
"status": "SIGNED",
"completedAt": 1719503600000,
"timestamp": 1719503600000
}
redirectUrl 说明
- 浏览器 H5 / PC:填写您的业务页面完整 URL,如
https://your-domain.com/sign/success
- 微信小程序 web-view:请填写您小程序内的页面路径,如
pages/order/sign-success?contractId=123456(对接步骤见 §3.10.2)
- 未填写时,签署成功页仅展示完成提示,不自动跳转
3.10.2 微信小程序 web-view 对接
若希望在您自己的微信小程序内完成签署,可将 §3.10 返回的 h5Url 放入小程序 <web-view> 组件打开。签署页为平台提供的 H5,签署流程(手机号验证、实名、阅读、签署)与独立 H5 一致。
对接步骤
- 创建或发起合同时传入
redirectUrl,填写您小程序的成功页路径,例如 pages/order/sign-success?contractId=123456
- 调用
GET /contract/sign-url/{contractId} 获取 h5Url
- 在小程序页面中使用
<web-view src="{{h5Url}}"></web-view> 打开签署链接
- (推荐)配置
callbackUrl,由您的服务端接收签署结果通知,与页面跳转互为补充
前置条件
h5Url 的域名须已加入微信小程序「业务域名」白名单
redirectUrl 须为您小程序 app.json 中已注册的页面路径,以 pages/ 开头
- 请勿将
redirectUrl 填写为外部 H5 地址:web-view 内无法像浏览器一样跳转到任意外链
签署成功后的跳转
签署完成后,平台 H5 签署页会自动处理跳转(无需您自行编写 H5 代码):
| redirectUrl 配置 |
签署成功后的行为 |
已填写 pages/... 路径 |
H5 调用微信 JSSDK wx.miniProgram.redirectTo,跳转到您指定的小程序页面(推荐) |
| 未填写,或填写为 https 外链 |
H5 返回 web-view 上一页;您可在小程序 bindmessage 中接收签署成功消息并自行跳转(见下方说明) |
bindmessage(可选)
签署成功时,H5 会向小程序发送消息(event 为 openContract.signSuccess)。按微信规则,消息在 web-view 页面返回或关闭时才会送达,请在承载 web-view 的小程序页监听 bindmessage:
消息字段
| 字段 |
说明 |
event |
固定为 openContract.signSuccess |
contractId |
合同 ID |
contractTitle |
合同标题 |
redirectUrl |
创建合同时配置的跳转地址 |
timestamp |
时间戳(毫秒) |
小程序示例(微信原生语法)
XML
<!-- 签署页 wxml -->
<web-view src="{{signH5Url}}" bindmessage="onSignMessage"></web-view>
JavaScript
// 签署页 js
Page({
data: {
signH5Url: '' // 来自 §3.9 接口返回的 h5Url
},
onSignMessage(e) {
const messages = e.detail.data || []
messages.forEach(function (msg) {
if (!msg || msg.event !== 'openContract.signSuccess') return
// 可按 contractId 更新本地业务状态
if (msg.redirectUrl && /^pages\//.test(msg.redirectUrl)) {
wx.redirectTo({ url: '/' + msg.redirectUrl.replace(/^\//, '') })
}
})
}
})
说明:若已正确配置 pages/... 格式的 redirectUrl,签署成功后 H5 会直接跳转,多数场景无需依赖 bindmessage。bindmessage 适用于未配置跳转地址、或需在返回上一页时同步业务状态的场景。使用 Taro、uni-app 等框架时,请改用对应框架的 web-view 与消息监听写法,跳转 API 与微信原生 wx.redirectTo 等价即可。
3.11 获取合同预览地址
- 接口路径:
GET /contract/preview-url/{contractId}
- 请求类型:无 JSON/表单请求体;参数见 URL Path 与 Query
- 功能说明:获取合同预览地址,用于查看合同内容
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
路径参数
| 参数名 |
类型 |
必填 |
描述 |
| contractId |
String |
是 |
合同ID |
查询参数
| 参数名 |
类型 |
必填 |
描述 |
| userId |
String |
否 |
用户ID(userId和orgId必须提供一个) |
| orgId |
String |
否 |
组织ID(userId和orgId必须提供一个) |
响应参数
| 参数名 |
类型 |
描述 |
| contractId |
Long |
合同ID |
| token |
String |
页面访问令牌 |
| tokenType |
String |
令牌类型:preview |
| expiresIn |
Integer |
令牌有效期(秒),默认 2592000(30 天) |
| pcUrl |
String |
PC端预览链接 |
| h5Url |
String |
H5端预览链接 |
响应示例
JSON
{
"success": true,
"data": {
"contractId": 1,
"token": "abc123xyz",
"tokenType": "preview",
"expiresIn": 2592000,
"pcUrl": "https://example.com/open-contract/pc/detail?token=abc123xyz",
"h5Url": "https://example.com/open-contract/h5/detail?token=abc123xyz"
}
}
注意:预览页无需登录,可直接查看合同内容。令牌默认有效期 30 天,过期后重新调用本接口获取。
3.12 查询组织合同列表
- 接口路径:
GET /contract/list
- 请求类型:无 JSON/表单请求体;参数见 URL Query
- 功能说明:按企业分页查询合同;可按状态、合同 ID 过滤。适用于按企业维度查询;若合同归属指定发起人,请优先使用 §3.13 用户合同列表。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
查询参数
| 参数名 |
类型 |
必填 |
描述 |
| orgId |
String |
是 |
组织ID |
| page |
Integer |
否 |
页码,默认1 |
| pageSize |
Integer |
否 |
每页数量,默认10 |
| status |
String |
否 |
合同状态 |
| contractIds |
String |
否 |
合同ID集合,逗号分隔(如 1,2,3),最多 100 个;与 orgId/status 组合过滤 |
响应参数
| 参数名 |
类型 |
描述 |
| totalSize |
Integer |
总记录数 |
| results |
Array |
合同列表 |
| results[].contractId |
Long |
合同ID |
| results[].title |
String |
合同标题 |
| results[].status |
String |
合同状态 |
| results[].createdAt |
String |
创建时间 |
响应示例
JSON
{
"success": true,
"data": {
"totalSize": 100,
"results": [
{
"contractId": 1,
"title": "服务协议",
"status": "DRAFT",
"createdAt": "2026-04-19 10:00:00"
}
]
}
}
3.13 查询用户合同列表
- 接口路径:
GET /contract/tenant-list
- 请求类型:无 JSON/表单请求体;参数见 URL Query
- 功能说明:查询指定用户作为发起人创建的合同(与该用户登录平台后可见范围一致);可按企业、状态、合同 ID 过滤
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
查询参数
| 参数名 |
类型 |
必填 |
描述 |
| userId |
String |
是 |
发起人用户 ID |
| orgId |
String |
否 |
组织 ID,传入则仅返回该组织下合同 |
| page |
Integer |
否 |
页码,默认 1 |
| pageSize |
Integer |
否 |
每页数量,默认 10 |
| status |
String |
否 |
合同状态,如 DRAFT、PENDING、SIGNED |
| contractIds |
String |
否 |
合同ID集合,逗号分隔(如 1,2,3),最多 100 个;与 orgId/status 组合过滤 |
响应参数
| 参数名 |
类型 |
描述 |
| totalSize |
Integer |
总记录数 |
| page |
Integer |
当前页码 |
| pageSize |
Integer |
每页数量 |
| results |
Array |
合同列表,项结构同 §3.12 |
响应示例
JSON
{
"success": true,
"data": {
"totalSize": 100,
"page": 1,
"pageSize": 10,
"results": [
{
"contractId": 1,
"title": "服务协议",
"status": "PENDING",
"createdAt": "2026-04-19 10:00:00"
}
]
}
}
3.14 发送短信验证码
- 接口路径:
POST /contract/send-sms-code
- 请求类型:表单(
application/x-www-form-urlencoded)或 URL Query;参数名 mobile(与下列「查询参数」一致)
- 功能说明:向指定手机号发送签署场景短信验证码,用于意愿认证(业务类型 SIGN)
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
查询参数
| 参数名 |
类型 |
必填 |
描述 |
| mobile |
String |
是 |
接收验证码的手机号 |
响应参数
| 参数名 |
类型 |
描述 |
| data |
String |
固定为 OK 表示已触发发送 |
响应示例
JSON
{
"success": true,
"data": "OK"
}
说明:发送频率、有效期等规则与系统内签署验证码策略一致;请勿频繁调用以免触发限流。
3.15 获取活体验证(人脸识别)
- 接口路径:
POST /contract/face-recognition
- 请求类型:JSON(
Content-Type: application/json)
- 功能说明:根据姓名与身份证号发起 H5 活体认证,返回二维码链接与 token(需 Bearer 令牌,无需传递用户 ID)
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
| Content-Type |
String |
是 |
application/json |
请求体(JSON)
| 参数名 |
类型 |
必填 |
描述 |
| realName |
String |
是 |
真实姓名 |
| idCard |
String |
是 |
身份证号 |
| isReturnUrl |
Boolean |
否 |
为 true 时 data.qrCodeUrl 直接为认证页 URL;否则为二维码图片地址 |
| returnUrl |
String |
否 |
认证完成后的跳转地址(未传时由服务端使用占位默认值) |
请求示例
JSON
{
"realName": "张三",
"idCard": "320***********1234",
"isReturnUrl": true,
"returnUrl": "https://example.com/h5/sign/callback"
}
响应参数(data 对象)
| 参数名 |
类型 |
描述 |
| qrCodeUrl |
String |
二维码图片 URL 或认证页 URL(取决于 isReturnUrl) |
| token |
String |
本次活体会话 token,用于后续查询认证结果 |
响应示例
JSON
{
"success": true,
"data": {
"qrCodeUrl": "https://...",
"token": "xxxxxxxx"
}
}
说明:返回的 token 用于后续签署等流程中的活体验证;服务端会将姓名、证件号与 token 短时关联缓存。开放接口中该 token 有效期为 12 小时(其他场景默认 30 分钟)。需在个人开户/实名前为指定平台用户发起活体、并与该用户 ID 绑定时,使用 §5.5 POST /person/face-recognition(userId 可选);查询结果仍可用本节下一小节 §3.15 或 §5.6(路径不同,参数与响应结构一致)。
3.16 根据 token 查询活体是否认证成功
- 接口路径:
GET /contract/face-recognition/success
- 请求类型:无 JSON/表单请求体;参数
token 见 URL Query
- 功能说明:根据活体 token 查询认证结果,返回是否通过与是否计费等信息
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
查询参数
| 参数名 |
类型 |
必填 |
描述 |
| token |
String |
是 |
活体 token(POST /contract/face-recognition 返回的 data.token) |
响应参数
| 参数名 |
类型 |
描述 |
| data |
Object |
活体状态对象 |
| data.passed |
Boolean |
是否通过:true 通过;false 未通过/未完成 |
| data.charged |
Boolean |
是否计费:按返回 code 判断(R101、R102、R214、R215、R216、R218、R219、R221、R233、R234、R235 视为计费) |
| data.code |
String |
认证结果码(用于判断通过与计费) |
| data.codeDesc |
String |
结果描述 |
响应示例
JSON
{
"success": true,
"data": {
"passed": true,
"charged": true,
"code": "R102",
"codeDesc": "认证成功"
}
}
3.17 根据 token 查询活体token是否过期
- 接口路径:
GET /contract/face-recognition/check-token
- 请求类型:无 JSON/表单请求体;参数
token 见 URL Query
- 功能说明:根据活体 token 查询 token 是否在 Redis 中存在(即是否过期),返回剩余有效期等信息。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
查询参数
| 参数名 |
类型 |
必填 |
描述 |
| token |
String |
是 |
活体 token(POST /contract/face-recognition 返回的 data.token) |
响应参数
| 参数名 |
类型 |
描述 |
| data |
Object |
Token 有效性信息对象 |
| data.valid |
Boolean |
token 是否有效:true 未过期;false 已过期或不存在 |
| data.remainingSeconds |
Long |
剩余有效期(秒)。-2 表示 token 不存在;>0 为剩余秒数;null 表示查询失败 |
| data.message |
String |
描述信息,如“活体token有效,剩余43185秒”或“活体token已过期或不存在” |
响应示例(token 有效)
JSON
{
"success": true,
"message": "token有效",
"data": {
"valid": true,
"remainingSeconds": 43185,
"message": "活体token有效,剩余43185秒"
}
}
响应示例(token 已过期)
JSON
{
"success": true,
"message": "token已过期或不存在",
"data": {
"valid": false,
"remainingSeconds": -2,
"message": "活体token已过期或不存在"
}
}
使用场景:在调用 §3.18 开放签署 PDF 之前,可先通过本接口检查 token 是否仍然有效,避免使用过期 token 发起签署请求。注意:本接口仅检查 token 是否存在,不验证活体认证是否通过(请使用 §3.15 查询认证结果)。
3.18 开放签署 PDF(关键词落章)
- 接口路径:
POST /contract/sign-pdf
- 请求类型:JSON(
Content-Type: application/json)
- 能力:上传待签 PDF(
fileContentBase64),在文档内用 keyword 定位落章点,经意愿校验后在该位置落章,返回已签 PDF 的 Base64。本接口不持久化合同主数据。须传 contractNo 作业务与存证编号;已配链时可回 openSignEvidenceId、transactionHash。签章区域固定 126×126。verifyType 未传时默认 1,2(需按实参传 faceToken、smsCode)。
联调前
- 意愿含短信(
verifyType 含 2)时:先调 POST /contract/send-sms-code,业务类型 SIGN,再向本接口传 smsCode。
- 意愿含活体(含
1)时:先调 POST /contract/face-recognition 取 faceToken,再向本接口传入。
- 参与人为新个人、或三要素在平台创建新企业时,须按下文「企业新建」对活体、法人三要素的约束准备参数。
印模用名
当次落章在平台上与哪一枚印匹配,由「印模用名」决定:只根据请求体你填的字段推导,不会用库内企业名自动顶替。
| 签署方 |
当次印模用名 |
企业 ENTERPRISE / COMPANY |
enterpriseName 非空时取其值;否则取 participantName |
个人 PERSONAL |
取 participantName |
仅会选用平台印章「名称」与当次印模用名逐字相同的章(详见「选章与 sealId」)。participantMobile 须为解析到签署人平台账号的绑定手机。通常 participantName 填经办人真名,并与账号登记姓名一致;若将 participantName 填为企业/印模用名(与账号名不同),则须该账号在本企业下或本人名下存在同「名称」的可用章(本企业章、本人章或用印授权,与 §6.5 同源数据),否则不通过。
按参与方准备参数
个人(participantType=PERSONAL):以 participantMobile 定位用户;participantName 与实名、章面一致。含 1 时传 faceToken,含 2 时传 smsCode。无个人账号时可由当次活体会话在平台完成开户。
企业:目标已存在且可唯一定位:企业名/统一社会信用代码在平台能唯一条命中已认证企业,或你直接传 participantOrgId(须已认证)。participantUserId 一般可省略,以 participantMobile 在该目标企业下已加入用户中找经办。若多人在同机号,请补充 enterpriseName、participantName 等由服务端消歧,仍不唯一时可再传 participantUserId。仅按名命中多家已认证企业时,须传 participantOrgId 指定其一。
多数场景只传 participantMobile 与企业相关字段即可不必在本地存 sealId、participantUserId。确需多枚章中强指定时 sealId 可选,且该章「名称」须与当次印模用名一致(见下表 sealId 行)。用印授权由服务端在 §6.5 同数据上匹配,一般不需要为签署先调授权查询接口(§6.5.4 为运营/对账可选)。
企业:三要素在平台新建:当名称/码尚不能唯一定位已认证企业时,verifyType 须含 1 并传 faceToken。请求带 unifiedSocialCreditCode、legalPersonName、legalPersonIdCard 等,以 enterpriseName / participantName 声明拟盖的企业章/印模用名(企业盖章时 participantName 可填企业名,不必同法人体检名)。首次在平台创建该企业时,法人姓名/证件号须与当前 faceToken 活体会话中实名、证件号一致。
各参与方通用:若 verifyType 含 1,且已存在与活体同证件的个人档案且其预留手机已填写,该号码须与 participantMobile 一致,否则拒签。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
| Content-Type |
String |
是 |
application/json |
请求体(JSON)主要字段
| 参数名 |
类型 |
必填 |
描述 |
| contractNo |
String |
是 |
业务合同编号;用于存证与蚂蚁链摘要,建议接入方保证在自身业务域内唯一 |
| fileContentBase64 |
String |
是 |
PDF 文件 Base64(可含 data: 前缀) |
| fileType |
String |
是 |
目前仅支持 pdf |
| keyword |
String |
是 |
用于定位签章位置的关键词 |
| keywordOccurrenceIndex |
Integer |
否 |
第几次出现(从 0 开始);默认 0 |
| sealId |
Long |
否 |
一般可不传。不传时,仅在 「名称」与当次印模用名逐字相同 的候选项中落章;同一名称多枚时优先选默认章(isDefault=true,详见「印章自动选用与用印授权」)。须指定某一枚时传 sealId:该章的「名称」须与当次印模用名一致,否则报错;若名称一致但非本企业组织下章、且对签署人尚无用印授权,将不采用该 id,改在同印模用名候选项中按自动选章(仍优先默认章)。章属本企业组织、或已获用印授权时,使用所传 sealId 落章。 |
| verifyType |
String |
否 |
1 仅活体,2 仅短信,1,2 两者;不传默认 1,2 |
| faceToken |
String |
条件 |
验证类型含 1 或(个人且用户不存在,或企业三要素新建需开户)时必传;活体流程返回的 token。含 1 时,若已有个人实名档案与活体姓名、证件号一致,其预留手机号须与 participantMobile 一致 |
| smsCode |
String |
条件 |
验证类型含 2 时必传;与 participantMobile 对应,业务类型 SIGN |
| participantName |
String |
是 |
参与人相关姓名:个人须与实名人名、个人章印模、活体姓名等一致;企业可填经办人姓名,与解析账号登记姓名须一致,或与同机号/账号在当次可用人名/同名企业章的核对规则见上文「印模用名与参与人关联」;亦可将本字段填为企业/印模用名(与 enterpriseName 二选一/并存关系见 enterpriseName 说明),此时以印模、授权为准 |
| participantMobile |
String |
是 |
参与人手机号,须为本次签署在平台中解析到账号所绑定的手机,并与短信/活体核对目标一致 |
| participantType |
String |
是 |
PERSONAL 个人;ENTERPRISE 或 COMPANY 企业 |
| participantUserId |
Long |
条件 |
企业已存在且已认证时可省略:用 participantMobile 在目标企业组织下解析经办用户;解析失败或多解时再传本字段。企业将按名称新建(三要素)时可省略,须 verifyType 含 1 且传 faceToken。个人可选,用于多账号时指定 |
| participantOrgId |
Long |
否 |
企业组织实体 ID;须为平台内已认证企业。不传则按企业名称(及可选统一社会信用代码)全局匹配;多条命中时必填本字段 |
| enterpriseName |
String |
条件 |
企业参与时建议填写:公章/印模上主体名称,亦作为印模用名优先来源。无 participantOrgId 时用于匹配/创建企业。未传时印模用名退化为 participantName,由接入方保证与拟盖印章「名称」一致;二者语义区分:本字段偏企业全称/公章名,participantName 常填经办人,也可在对接上改填企业名(与上文「印模用名与参与人关联」一起读) |
| unifiedSocialCreditCode |
String |
条件 |
统一社会信用代码;企业不在系统中与三要素一并必填 |
| legalPersonName |
String |
条件 |
法人姓名;企业新建时必填。首次建企且 verifyType 含活体时,须与 faceToken 对应活体会话中的姓名一致 |
| legalPersonIdCard |
String |
条件 |
法人身份证号;企业新建时必填。首次建企且含活体时,须与 faceToken 对应活体会话中的证件号一致 |
| offsetX / offsetY |
Float |
否 |
相对关键词命中点的偏移(单位:像素) |
| sealWidth / sealHeight |
Float |
否 |
印章宽度/高度(单位:点,pt)。默认值:126pt(约 44.4mm);最小值:28.4pt(约 10mm)。不传时使用默认值,保持原有尺寸不变。适用于需要自定义印章大小的场景 |
| destroyFaceTokenAfterUse |
Boolean |
否 |
活体token是否用完即销毁(默认 false)。true: 签署完成后立即销毁活体token;false: 活体token保留至自然过期(12小时或30分钟)。适用于一次性签署场景,提升安全性 |
选章与用印授权
在已得到当次印模用名(见上表)且已解析出签署人(通常由 participantMobile 在企业内定位)的前提下,只在平台印章「名称」与印模用名逐字相同的集合中选章;不要求必传 sealId。显式传 sealId 时,该章「名称」须仍与印模用名一致。无可用同名章或未获授权时签署失败。
① 本企业组织下:名称与印模用名相同的多枚中优先默认章(isDefault=true),否则按服务端规则取定。个人组织同。
② 本人制章(制章人为当前签署人):同名多枚时优先默认章。
③ 用印授权(§6.5 同源、未撤销):仍须名与印模用名一致,多枚时优先默认。§6.5.4 列表为运营/对账用,非签署必调。
响应参数(data)
| 参数名 |
类型 |
描述 |
| contractNo |
String |
回显请求中的业务合同编号 |
| signedFileBase64 |
String |
签署后的 PDF Base64 |
| signerUserId |
Long |
签署人用户 ID |
| sealId |
Long |
实际落章使用的印章 ID |
| orgEntityId |
Long |
仅当签署方为企业(ENTERPRISE/COMPANY)时返回:落章所属企业组织实体 ID;个人签署不返回该字段(值为空) |
| openSignEvidenceId |
Long |
本笔开放签署的存证业务标识;蚂蚁链未配置或上链失败时可能为空 |
| transactionHash |
String |
蚂蚁链交易哈希;未上链时为空 |
补充:三要素新建企业通过后,由服务端创建企业及默认章;首次建企时法人姓名、证件号须与当次 faceToken 活体会话一致。个人新用户须先完成 POST /contract/face-recognition。含短信意愿时须先 POST /contract/send-sms-code 再传 smsCode(同「联调前」)。
6. 印章管理
6.1 添加印章
- 接口路径:
POST /seal/add
- 请求类型:JSON(
Content-Type: application/json)
- 功能说明:为指定用户添加印章(系统自动生成印模)。用户登录平台后可查看并使用该印章。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
请求参数
| 参数名 |
类型 |
必填 |
描述 |
| name |
String |
是 |
印章名称 |
| type |
Integer |
是 |
印章类型(1-个人章,2-企业章) |
| orgId |
Long |
否 |
所属组织ID(企业章时必填) |
| userId |
Long |
是 |
印章持有人用户 ID(用户登录后可见该章;授权短信发往该用户手机) |
| sealShape |
Integer |
否 |
签章形状(0-圆形,1-椭圆,默认0,仅企业章有效) |
| isDefault |
Integer |
否 |
是否设置为默认印章(0-否,1-是,默认0) |
请求示例(个人章)
JSON
{
"name": "张三印章",
"type": 1,
"userId": 1,
"isDefault": 1
}
请求示例(企业章-圆形)
JSON
{
"name": "测试公司公章",
"type": 2,
"orgId": 1,
"sealShape": 0,
"isDefault": 1
}
请求示例(企业章-椭圆)
JSON
{
"name": "测试公司合同章",
"type": 2,
"orgId": 1,
"sealShape": 1,
"isDefault": 0
}
响应参数
| 参数名 |
类型 |
描述 |
| sealId |
Long |
印章ID |
| name |
String |
印章名称 |
| type |
Integer |
印章类型(1-个人章,2-企业章) |
| userId |
Long |
用户ID(个人章) |
| orgId |
Long |
组织ID(企业章) |
| sealShape |
Integer |
签章形状(0-圆形,1-椭圆) |
| isDefault |
Boolean |
是否默认印章 |
| status |
String |
印章状态 |
响应示例
JSON
{
"success": true,
"data": {
"sealId": 1,
"name": "张三印章",
"type": 1,
"userId": 1,
"orgId": null,
"sealShape": 0,
"isDefault": true,
"status": "ACTIVE"
}
}
6.2 上传印章图片
- 接口路径:
POST /v1/seal/upload-image
- 请求类型:JSON(
Content-Type: application/json)
- 功能说明:上传图片生成印章。支持个人章和企业章,系统使用固定尺寸(个人章 300×150px,企业章 210×210px),无需传递印章大小参数。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <accessToken> |
请求参数
| 参数名 |
类型 |
必填 |
描述 |
| userId |
Long |
是 |
用户ID(印章所属用户) |
| imageBase64 |
String |
是 |
图片 Base64 格式(可包含 data:image/xxx;base64, 前缀)。图片大小不能超过 2MB |
| name |
String |
是 |
印章名称 |
| type |
Integer |
是 |
印章类型:1=个人章,2=企业章 |
| orgId |
Long |
条件 |
组织ID(企业章时必填) |
| isDefault |
Integer |
否 |
是否设置为默认印章:0=否,1=是,默认 0 |
请求示例(个人章)
JSON
{
"userId": 123456,
"imageBase64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...",
"name": "张三的个人章",
"type": 1,
"isDefault": 0
}
请求示例(企业章-设为默认)
JSON
{
"userId": 123456,
"imageBase64": "iVBORw0KGgoAAAANSUhEUgAA...",
"name": "某某科技有限公司",
"type": 2,
"orgId": 789012,
"isDefault": 1
}
响应参数
| 参数名 |
类型 |
描述 |
| sealId |
Long |
印章ID |
| name |
String |
印章名称 |
| type |
Integer |
印章类型(1-个人章,2-企业章) |
| userId |
Long |
用户ID |
| orgId |
Long |
组织ID(企业章) |
| isDefault |
Boolean |
是否默认印章 |
响应示例
JSON
{
"code": 200,
"msg": "操作成功",
"data": {
"sealId": 345678,
"name": "某某科技有限公司",
"type": 2,
"userId": 123456,
"orgId": 789012,
"isDefault": true
}
}
注意事项
- 图片大小限制:图片不能超过 2MB
- 印章类型校验:type 必须为 1(个人章)或 2(企业章)
- 组织ID要求:企业章(type=2)时必须传递 orgId
- 企业章权限校验:只有企业的创建者才能为企业创建印章。如果用户不是企业创建者,将返回错误:“只有企业创建者才能为企业创建印章”
- 默认印章:同一企业下仅允许一枚默认章;设置新默认时自动取消原默认
- 印章样式:个人章使用矩形样式(rectangle),企业章使用圆形样式(circle-enterprise)
6.3 设置默认印章
- 接口路径:
POST /seal/set-default/{sealId}
- 请求类型:无 JSON/表单请求体;参数见 URL Path
- 功能说明:设置默认印章,用于自动签署
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
路径参数
| 参数名 |
类型 |
必填 |
描述 |
| sealId |
String |
是 |
印章ID |
响应参数
| 参数名 |
类型 |
描述 |
| set |
Boolean |
是否设置成功 |
响应示例
JSON
{
"success": true,
"data": {
"set": true
}
}
6.3 查询印章详情
- 接口路径:
GET /seal/get/{sealId}
- 请求类型:无 JSON/表单请求体;参数见 URL Path
- 功能说明:查询印章详情
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
路径参数
| 参数名 |
类型 |
必填 |
描述 |
| sealId |
Long |
是 |
印章ID |
响应参数
| 参数名 |
类型 |
描述 |
| sealId |
Long |
印章ID |
| name |
String |
印章名称 |
| type |
Integer |
印章类型(1-个人章,2-企业章) |
| userId |
Long |
用户ID(个人章) |
| orgId |
Long |
组织ID(企业章) |
| sealShape |
Integer |
签章形状(0-圆形,1-椭圆) |
| isDefault |
Boolean |
是否默认印章 |
| status |
String |
印章状态 |
| createdAt |
String |
创建时间 |
响应示例
JSON
{
"success": true,
"data": {
"sealId": 1,
"name": "个人印章",
"type": 1,
"userId": 1,
"orgId": null,
"sealShape": 0,
"isDefault": true,
"status": "ACTIVE",
"createdAt": "2026-04-19T10:00:00"
}
}
6.4 查询印章列表
- 接口路径:
GET /seal/list
- 请求类型:无 JSON/表单请求体;参数见 URL Query
- 功能说明:查询指定用户名下的印章;可按企业过滤
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
查询参数
| 参数名 |
类型 |
必填 |
描述 |
| userId |
String |
是 |
用户 ID |
| orgId |
String |
否 |
组织 ID,传入则仅返回该组织下印章 |
响应参数
| 参数名 |
类型 |
描述 |
| totalSize |
Integer |
总记录数 |
| results |
Array |
印章列表 |
| results[].sealId |
Long |
印章ID |
| results[].name |
String |
印章名称 |
| results[].type |
Integer |
印章类型(1-个人章,2-企业章) |
| results[].userId |
Long |
用户ID(个人章) |
| results[].orgId |
Long |
组织ID(企业章) |
| results[].sealShape |
Integer |
签章形状(0-圆形,1-椭圆) |
| results[].isDefault |
Boolean |
是否默认印章 |
| results[].status |
String |
印章状态 |
| results[].createdAt |
String |
创建时间 |
响应示例
JSON
{
"success": true,
"data": {
"totalSize": 3,
"results": [
{
"sealId": 1,
"name": "个人印章",
"type": 1,
"userId": 1,
"orgId": null,
"sealShape": 0,
"isDefault": true,
"status": "ACTIVE",
"createdAt": "2026-04-19T10:00:00"
},
{
"sealId": 2,
"name": "公司公章",
"type": 2,
"userId": null,
"orgId": 1,
"sealShape": 0,
"isDefault": true,
"status": "ACTIVE",
"createdAt": "2026-04-19T10:00:00"
},
{
"sealId": 3,
"name": "公司合同章",
"type": 2,
"userId": null,
"orgId": 1,
"sealShape": 1,
"isDefault": false,
"status": "ACTIVE",
"createdAt": "2026-04-19T10:00:00"
}
]
}
}
6.5 印章授权
在平台内为某枚印章管理用印权限(授权、撤销、按章查询列表)。被授权人可与印章、印章持有人不属同一企业。发码与校验时,持有人手机须有效。
建议流程:① 先调用「发码」接口,将短信发至该印章持有人在平台绑定的手机(与制章时可选传的 userId 为同一用户,用于接码)。② 持有人将短信验证码交予您方业务系统,由业务系统调用「确认授权」完成授权关系。
授权成功后,若已配置蚂蚁链,服务端将自动把本次授权摘要上链存证,含印章名称、持有人/授权人及被授权人姓名与手机号、业务 ID 等,无需单独再传存证材料。
下述 6.5.1~6.5.4 共 4 个接口均须在请求头携带 Authorization: Bearer <token>。完整请求 URL 为文档中的基础路径,与本节各条「接口路径」所列相对路径拼接。变更印章刻制/持有人(所有人)见本节 6.6,短信类型与 6.5.1 同为 SEAL_AUTH。
与 §3.18 开放签署 PDF 联用:对一线业务只传参与人手机及参与人/企业等资料、可不传 sealId 的对接,§3.17 在服务端用印授权与这里同数据,且仅在 与当次印模用名(见 §3.17)一致的印章上落章。无需为签署先调 6.5.4。6.5.4 等授权查询接口适用于运营、排查或事后核对,非接 §3.17 前必须步骤。
6.5.1 发送授权短信
- 接口路径:
POST /seal/authorization/send-sms-code
- 请求类型:无请求体;参数通过 URL Query 传递
- 功能说明:向该印章持有人在平台绑定的手机号发送本次授权用短信验证码,用于稍后在「确认授权」中校验(与签署意愿类短信区分)。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <accessToken> |
请求参数
| 参数名 |
位置 |
类型 |
必填 |
描述 |
| sealId |
Query |
Long |
是 |
目标印章 ID,须为平台内未删除的印章,且能解析出持有人与手机号 |
响应参数
顶层为统一结构:code、success、data、msg。本接口成功时仅通过 msg 返回提示,data 一般为 null。
| 参数名 |
类型 |
说明 |
| msg |
String |
成功时如「验证码已发送」;失败时见错误信息 |
| data |
null |
本接口不返回业务数据时为空 |
请求示例
HTTP
POST /seal/authorization/send-sms-code?sealId=1001
Authorization: Bearer <accessToken>
响应示例
JSON
{
"code": 200,
"success": true,
"msg": "验证码已发送",
"data": null
}
6.5.2 确认授权
- 接口路径:
POST /seal/authorization/grant
- 请求类型:JSON(
Content-Type: application/json)
- 功能说明:用持有人手机收到的验证码完成授权。通过后写入或恢复一条
sealId + 被授权 userId 的授权关系;并尝试上蚂蚁链存证。验证码须与 6.5.1 为同一批、发至同一手机号。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <accessToken> |
| Content-Type |
String |
是 |
application/json |
请求体参数
| 参数名 |
类型 |
必填 |
描述 |
| sealId |
Long |
是 |
印章 ID,须为平台内未删除的印章 |
| userId |
Long |
是 |
被授权方在平台上的用户 ID,可与印章/持有人在不同企业或不同归属侧 |
| smsCode |
String |
是 |
6.5.1 发至印章持有人手机上的短信验证码 |
响应参数
顶层为 code、success、msg、data;成功时 data 为下表对象,msg 多为 null。
data 对象字段
| 参数名 |
类型 |
说明 |
| authId |
Long |
本笔授权在平台侧的业务标识,撤销接口 6.5.3 使用 |
| sealId |
Long |
印章 ID |
| userId |
Long |
被授权用户 ID |
| sealAuthEvidenceId |
Long |
本笔授权对应的蚂蚁链存证业务标识;未配链或上链失败时可为 null |
| transactionHash |
String |
蚂蚁链交易哈希;未上链时可为 null |
请求体示例
JSON
{
"sealId": 1001,
"userId": 2002,
"smsCode": "123456"
}
响应示例
JSON
{
"code": 200,
"success": true,
"msg": null,
"data": {
"authId": 5001,
"sealId": 1001,
"userId": 2002,
"sealAuthEvidenceId": 90001,
"transactionHash": "0xabc123..."
}
}
6.5.3 撤销授权
- 接口路径:
POST /seal/authorization/revoke/{authId}
- 请求类型:无请求体;
authId 在 Path 中
- 功能说明:将指定授权记录置为已撤销(软删),被授权人不再具备该章用印权限。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <accessToken> |
请求参数
| 参数名 |
位置 |
类型 |
必填 |
描述 |
| authId |
Path |
Long |
是 |
6.5.2 返回的、平台内未撤销的 authId |
响应参数
本接口与 6.5.1 相同,成功时以 msg 返回「撤销成功」等提示,data 一般为 null。
| 参数名 |
类型 |
说明 |
| msg |
String |
成功时如「撤销成功」 |
| data |
null |
无业务数据时为空 |
请求示例
HTTP
POST /seal/authorization/revoke/5001
Authorization: Bearer <accessToken>
响应示例
JSON
{
"code": 200,
"success": true,
"msg": "撤销成功",
"data": null
}
6.5.4 查询某印章的授权列表
- 接口路径:
GET /seal/authorization/list
- 请求类型:无请求体;
sealId 在 URL Query
- 功能说明:查询指定印章在当前的、未撤销的授权关系列表(每条结构同 6.5.2 的
data 对象,含可返回的存证与交易哈希)。用于运营/对账、核对某章已授权人;不是调 §3.17 的前置必调接口——仅传参与人手机时 §3.17 在服务端会自行按授权与组织选章,与上表数据一致。须已知 sealId 才能查本接口;日常签署对接可不依赖本接口。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <accessToken> |
请求参数
| 参数名 |
位置 |
类型 |
必填 |
描述 |
| sealId |
Query |
Long |
是 |
要查询的印章 ID,须为平台内未删除的印章 |
响应参数
| 参数名 |
类型 |
说明 |
| data |
Array |
无授权时可能为空数组 []。元素为对象,字段同 6.5.2「响应参数(data 对象)」表 |
请求示例
HTTP
GET /seal/authorization/list?sealId=1001
Authorization: Bearer <accessToken>
响应示例
JSON
{
"code": 200,
"success": true,
"msg": null,
"data": [
{
"authId": 5001,
"sealId": 1001,
"userId": 2002,
"sealAuthEvidenceId": 90001,
"transactionHash": "0xabc123..."
}
]
}
6.6 变更印章所有人
将印章的刻制/持有人从当前平台用户变更为另一用户。仍须通过原持有人手机接收的 SEAL_AUTH 短信完成意愿校验(与 6.5.1 同一发码通道)。
企业章:新持有人须已加入该企业;可先调用加入企业接口。个人章无此限制。
若已配置蚂蚁链,变更成功后会将摘要上链并生成存证;响应中可返回 sealOwnerTransferEvidenceId、ownerTransferTransactionHash;未配链或上链失败时二者可为空,不影响持有人已变更。
- 接口路径:
POST /seal/transfer-owner
- 请求类型:JSON
- 功能说明:见上。须先
POST /seal/authorization/send-sms-code?sealId=… 向原持有人发码,再提交本接口中的 smsCode。
请求体(JSON)
| 参数名 |
类型 |
必填 |
描述 |
| sealId |
Long |
是 |
印章 ID |
| newOwnerUserId |
Long |
是 |
变更后的所有人用户 ID |
| smsCode |
String |
是 |
发至原持有人手机的 SEAL_AUTH 验证码 |
响应 data 主要字段
| 参数名 |
类型 |
说明 |
| sealId / name / orgId / userId / type / sealShape / isDefault |
— |
与 6.3 印章详情一致;userId 为变更后的新持有人 |
| sealOwnerTransferEvidenceId |
Long |
本笔变更对应的蚂蚁链存证业务标识;未上链时为 null |
| ownerTransferTransactionHash |
String |
蚂蚁链交易哈希;未上链时为 null |
请求示例
{
"sealId": 1001,
"newOwnerUserId": 2002,
"smsCode": "123456"
}
响应示例
{
"success": true,
"data": {
"sealId": 1001,
"name": "某某公司",
"orgId": 500,
"userId": 2002,
"isDefault": true,
"sealOwnerTransferEvidenceId": 90002,
"ownerTransferTransactionHash": "0xdef456..."
}
}