3. 合同管理
合同发起支持两种业务路径:
PDF 上传发起
同一发起人完成上传与创建;发起人可在平台查看,也可用用户合同列表查询。
flowchart TD
A["上传 PDF"] --> B["获得文件"]
B --> C["创建草稿"]
C --> D["设计签署位置"]
C --> K["发起签署时传关键词"]
D --> E["发起签署"]
K --> E
E --> F["获取签署链接"]
C --> G["用户合同列表查询"]
模板发起
模板来自接入应用;传入发起人后合同归发起人,可用用户合同列表查询。
flowchart TD
T0["创建模板 可选"] --> T1["查询模板"]
T1 --> T2["模板发起或批量发起"]
T2 --> T3["获取签署链接"]
T2 --> T4["用户合同列表查询"]
创建或发起合同时,可选填签署完成通知地址与跳转地址,说明见 §3.10.1。
合同状态说明
合同落库字段 status 仅有下列四种取值(字符串,大小写敏感)。列表筛选、创建/发起/撤回响应中的 status 均为此字段;轮询进度请用 §3.14。
| status |
含义 |
如何进入 |
可继续操作 |
DRAFT |
草稿:已创建合同,尚未对外发起签署 |
§3.7 创建草稿(PDF 流程);模板发起不会停留在草稿 |
设计页摆放控件,或发起签署时传关键词定位 → §3.9 发起签署;可用 §3.17 删除;不可签署、不可撤回 |
PENDING |
待签署:已发起,等待一方或多方完成签署 |
§3.9,或 §3.5 / §3.6 模板发起成功后 |
获取签署链接、签署;可用 §3.16 撤回;用 §3.14 看各方是否已签 |
SIGNED |
已签署:需签署的参与方全部签完 |
最后一方签署成功后由系统自动更新 |
可预览/下载;不可再撤回;§3.14 的 completedTime 有值 |
REVOKED |
已撤回:发起方主动撤销待签合同 |
仅能从 PENDING 经 §3.16 撤回 |
不可再签署;可用 §3.17 删除;草稿、已签合同不能撤回 |
展示状态 displayStatus(仅 §3.14 返回,不落库):一般与 status 相同;当 status = PENDING 且当前时间已超过签署截止时间 deadline 时,displayStatus = EXPIRED(表示逾期未签完,落库仍为 PENDING,仍可尝试签署或撤回,除非业务另行拦截)。
状态流转
DRAFT → PENDING → SIGNED;PENDING 也可撤回为 REVOKED。EXPIRED 仅为展示值。
flowchart LR
DRAFT["DRAFT 草稿"] -->|发起签署| PENDING["PENDING 待签署"]
PENDING -->|全部签完| SIGNED["SIGNED 已签署"]
PENDING -->|撤回| REVOKED["REVOKED 已撤回"]
PENDING -.->|逾期展示| EXPIRED["EXPIRED 仅展示"]
接入方判断建议:签完看 status === "SIGNED";进行中看 PENDING 并结合 §3.14 的 participants[].signed;是否逾期看 displayStatus === "EXPIRED";列表筛选请传落库值(勿传 EXPIRED)。
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)
- 功能说明:按接入应用下的模板填写字段并生成合同;配置了默认签署位置时将直接进入待签署。未配置默认位置时可传
keywordControls 按关键词定位并自动发起。传入发起人时,合同与生成文件归属该发起人(与 PDF 创建草稿一致);不传则使用接入应用默认账号。
典型流程:先调用 §3.3 / §3.4 获取模板及字段定义 → 填写 fieldValues、发起人与签署方 → 调用本接口(或 §3.6 批量发起)→ 使用 §3.10 获取签署链接引导用户签署。查询该发起人合同见 §3.13。
签署位置:优先使用模板默认位置;否则可传 keywordControls(字段同 §3.9)。二者皆无时合同可能仍为草稿,需后续补充位置后再发起。
签署意愿:可为每位签署方指定短信验证、人脸识别或两者;不传时默认仅人脸识别。字段说明见创建草稿中的签署方说明。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| 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 |
否 |
签署完成后跳转地址 |
| keywordControls |
Array |
否 |
按关键词定位签署位置并自动发起;模板已有默认位置时忽略。字段同 §3.9 |
请求示例
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"
}
],
"keywordControls": [
{
"keyword": "甲方(盖章)",
"occurrenceIndex": 0,
"signerName": "某某科技有限公司",
"controlType": "sign_area",
"width": "126",
"height": "126"
},
{
"keyword": "乙方(签字)",
"occurrenceIndex": 0,
"signerName": "张三",
"controlType": "sign_area"
}
],
"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 可为空
- 功能说明:发起合同签署。可选传入
keywordControls,按 PDF 中的关键词定位签署位置(可跳过设计页)。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
路径参数
| 参数名 |
类型 |
必填 |
描述 |
| contractId |
String |
是 |
合同ID |
请求参数
| 参数名 |
类型 |
必填 |
描述 |
| keywordControls |
Array |
否 |
按关键词生成签署位置;不传则沿用已有控件(如设计页已摆放) |
| keywordControls[].keyword |
String |
是 |
PDF 中的定位关键词 |
| keywordControls[].occurrenceIndex |
Integer |
否 |
第几次出现,从 0 起;默认 0 |
| keywordControls[].controlType |
String |
否 |
控件类型,默认 sign_area |
| keywordControls[].participantId |
Long |
否 |
关联签署方 ID(优先) |
| keywordControls[].signerName |
String |
否 |
按签署方姓名匹配;与 participantId 二选一。仅一名签署方时可省略 |
| keywordControls[].width / height |
String |
否 |
控件宽高,默认 126 |
| keywordControls[].offsetX / offsetY |
Float |
否 |
相对关键词位置的偏移,默认 0 |
请求示例
JSON
{
"keywordControls": [
{
"keyword": "甲方(盖章)",
"occurrenceIndex": 0,
"signerName": "某某科技有限公司",
"controlType": "sign_area",
"width": "126",
"height": "126",
"offsetX": 0,
"offsetY": 0
},
{
"keyword": "乙方(签字)",
"occurrenceIndex": 0,
"signerName": "张三"
}
]
}
响应参数
| 参数名 |
类型 |
描述 |
| contractId |
Long |
合同ID |
| status |
String |
合同状态,发起成功后为 PENDING(见 合同状态说明) |
| 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 |
否 |
合同状态(落库值),见 合同状态说明:DRAFT / PENDING / SIGNED / REVOKED(勿传 EXPIRED) |
| 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 / REVOKED(勿传 EXPIRED) |
| 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 实时合同状态
- 接口路径:
GET /contract/status/{contractId}
- 请求类型:无 JSON/表单请求体;参数见 Path
- 功能说明:查询合同当前状态及各参与方签署进度,适合接入方轮询「是否已签完 / 谁已签」;比列表接口更细,含截止时间与展示状态
- 租户校验:不校验 API Key 所属租户与合同归属是否一致,仅按合同 ID 查询
- 状态取值:响应中的
status 为落库状态,完整含义与流转见本章开头 合同状态说明;另有仅本接口返回的展示字段 displayStatus(可出现 EXPIRED,不落库)
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
路径参数
| 参数名 |
类型 |
必填 |
描述 |
| contractId |
String |
是 |
合同ID |
响应参数
| 参数名 |
类型 |
描述 |
| contractId |
Long |
合同ID |
| title |
String |
合同标题 |
| status |
String |
落库状态:DRAFT / PENDING / SIGNED / REVOKED,详见 合同状态说明 |
| displayStatus |
String |
展示状态:一般与 status 相同;仅当 PENDING 且已超过 deadline 时为 EXPIRED(不改落库 status,仍可签署或撤回)。列表筛选请勿使用 EXPIRED |
| deadline |
String |
签署截止时间,格式 yyyy-MM-dd HH:mm:ss;未设置则为 null |
| completedTime |
String |
全部签署完成时间;未完成则为 null |
| createdAt |
String |
创建时间 |
| isSequentialSigning |
Boolean |
是否顺序签署 |
| orgEntityId |
Long |
发起方组织 ID |
| participants |
Array |
参与方列表(按 sort 升序),结构见下表 |
participants[] 项结构
| 参数名 |
类型 |
描述 |
| participantId |
Long |
参与方 ID |
| type |
String |
PERSON / ENTERPRISE |
| name |
String |
参与方名称 |
| contact |
String |
联系方式 |
| sign |
Boolean |
是否需要签署 |
| signed |
Boolean |
是否已签署 |
| signedTime |
String |
签署时间;未签则为 null |
| sort |
Integer |
排序 |
响应示例
JSON
{
"success": true,
"data": {
"contractId": 1,
"title": "服务协议",
"status": "PENDING",
"displayStatus": "PENDING",
"deadline": "2026-08-01 23:59:59",
"completedTime": null,
"createdAt": "2026-07-29 10:00:00",
"isSequentialSigning": false,
"orgEntityId": 1001,
"participants": [
{
"participantId": 11,
"type": "PERSON",
"name": "张三",
"contact": "13800138000",
"sign": true,
"signed": true,
"signedTime": "2026-07-29 11:20:00",
"sort": 1
},
{
"participantId": 12,
"type": "ENTERPRISE",
"name": "某某科技有限公司",
"contact": "13900139000",
"sign": true,
"signed": false,
"signedTime": null,
"sort": 2
}
]
}
}
说明:
- 判断是否签完:
status === "SIGNED"(勿仅用 displayStatus)
- 判断是否进行中:
status === "PENDING";各方进度看 participants 中 sign === true 的 signed
- 判断是否逾期未签完:
displayStatus === "EXPIRED"(此时落库仍为 PENDING)
- 判断是否已撤回:
status === "REVOKED"
- 状态全集与流转图见 合同状态说明
3.15 签署人签订记录
- 接口路径:
GET /contract/signing-records/{contractId}
- 请求类型:无 JSON/表单请求体;参数见 Path
- 功能说明:返回该合同下签署人的签订审计记录(按签署时间正序),含验证方式、成功/失败及 IP 等;与 §3.14 的参与方进度互补——进度看谁签了,记录看每次签署明细
- 租户校验:不校验 API Key 所属租户与合同归属是否一致,仅按合同 ID 查询
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
路径参数
| 参数名 |
类型 |
必填 |
描述 |
| contractId |
String |
是 |
合同ID |
响应参数
data 为数组,每项字段如下:
| 参数名 |
类型 |
描述 |
| recordId |
Long |
记录 ID |
| participantId |
Long |
参与方 ID |
| userId |
Long |
实际签署操作人用户 ID(平台用户 ID);企业参与方为授权经办人,个人参与方为签署人本人 |
| orgId |
Long |
企业组织 ID;企业参与方返回对应企业,个人参与方为 null |
| signerName |
String |
签署人姓名 |
| signerContact |
String |
签署人联系方式 |
| signerType |
String |
PERSON / ENTERPRISE |
| signedTime |
String |
签署时间 yyyy-MM-dd HH:mm:ss |
| verifyMethod |
String |
验证方式:SMS / FACE / BOTH |
| smsVerified |
Boolean |
是否短信验证通过 |
| faceVerified |
Boolean |
是否人脸验证通过 |
| signingOrder |
Integer |
签署顺序(可空) |
| status |
String |
SUCCESS / FAILED |
| failReason |
String |
失败原因(成功时为 null) |
| ipAddress |
String |
签署时 IP |
| userAgent |
String |
签署时 User-Agent |
| location |
String |
地理位置(可空) |
| fileHash |
String |
签署后文件 SHA-256 |
| remarks |
String |
意愿留痕说明 |
响应示例
JSON
{
"success": true,
"data": [
{
"recordId": 101,
"participantId": 11,
"userId": 10001,
"orgId": null,
"signerName": "张三",
"signerContact": "13800138000",
"signerType": "PERSON",
"signedTime": "2026-07-29 11:20:00",
"verifyMethod": "BOTH",
"smsVerified": true,
"faceVerified": true,
"signingOrder": 1,
"status": "SUCCESS",
"failReason": null,
"ipAddress": "1.2.3.4",
"userAgent": "Mozilla/5.0",
"location": null,
"fileHash": "a1b2c3...",
"remarks": "短信意愿核验通过(手机号:138****8000);人脸活体意愿核验通过"
},
{
"recordId": 102,
"participantId": 12,
"userId": 10002,
"orgId": 863409687826006869,
"signerName": "某某科技有限公司",
"signerContact": "13900139000",
"signerType": "ENTERPRISE",
"signedTime": "2026-07-29 11:35:00",
"verifyMethod": "SMS",
"smsVerified": true,
"faceVerified": false,
"signingOrder": 2,
"status": "SUCCESS",
"failReason": null,
"ipAddress": "1.2.3.5",
"userAgent": "Mozilla/5.0",
"location": null,
"fileHash": "d4e5f6...",
"remarks": "短信意愿核验通过"
}
]
}
说明:尚无任何人签署时返回空数组 []。
3.16 合同撤回
- 接口路径:
POST /contract/revoke/{contractId}
- 请求类型:JSON(
Content-Type: application/json);Body 可为空或省略
- 功能说明:撤回待签署合同,状态由
PENDING 变为 REVOKED;草稿/已签/已撤回不可调用
- 租户校验:不校验 API Key 所属租户与合同归属、不校验发起方组织;仅校验合同状态为
PENDING
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
| Content-Type |
String |
否 |
有 Body 时建议 application/json |
路径参数
| 参数名 |
类型 |
必填 |
描述 |
| contractId |
String |
是 |
合同ID |
请求参数(Body,均可选)
| 参数名 |
类型 |
必填 |
描述 |
| userId |
String |
否 |
操作人用户 ID;不传则使用合同创建人 |
| remarks |
String |
否 |
撤回备注,写入操作记录;默认「合同撤回」 |
响应参数
| 参数名 |
类型 |
描述 |
| contractId |
Long |
合同ID |
| title |
String |
合同标题 |
| status |
String |
撤回后为 REVOKED(见 合同状态说明) |
| createdAt |
String |
创建时间 |
请求示例
JSON
{
"userId": "10001",
"remarks": "对方要求暂停签署"
}
响应示例
JSON
{
"success": true,
"msg": "撤回成功",
"data": {
"contractId": 1,
"title": "服务协议",
"status": "REVOKED",
"createdAt": "2026-07-29 10:00:00"
}
}
常见错误:非 PENDING 状态(如已签完、已撤回、草稿)会返回「当前状态的合同无法撤回」;合同不存在或已删除同其他合同接口。
3.17 删除合同
- 接口路径:
DELETE /contract/delete/{contractId}
- 请求类型:无 JSON Body;可选 Query 参数
- 功能说明:删除合同。仅
DRAFT(草稿)或 REVOKED(已撤回)可删;PENDING(待签署)与 SIGNED(已签署)不可删。删除后列表与状态查询将查不到该合同
- 租户校验:不校验 API Key 所属租户与合同归属是否一致;仅校验合同状态允许删除
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
路径参数
| 参数名 |
类型 |
必填 |
描述 |
| contractId |
String |
是 |
合同ID |
查询参数
| 参数名 |
类型 |
必填 |
描述 |
| userId |
String |
否 |
操作人用户 ID;不传则使用合同创建人 |
响应参数
| 参数名 |
类型 |
描述 |
| data |
Long |
被删除的合同 ID |
请求示例
HTTP
DELETE /api/v1/contract/delete/1?userId=10001
Authorization: Bearer <token>
响应示例
JSON
{
"success": true,
"msg": "删除成功",
"data": 1
}
常见错误:PENDING / SIGNED 会返回「该合同已提交签署或已完成签署,无法删除」;已删除或不存在返回「合同不存在或已删除」。若需去掉待签合同,请先 §3.16 撤回 再删除。
3.18 下载合同文件
- 接口路径:
GET /contract/download/{contractId}
- 请求类型:无 JSON Body;Query 参数
type 区分下载内容
- 功能说明:一个接口按类型下载:签署后的合同 PDF、证据报告 PDF、或归档 OFD。成功时直接返回文件二进制流(非 JSON
Result),失败时仍返回 JSON 业务错误
- 租户校验:不校验 API Key 所属租户与合同归属是否一致,仅按合同 ID 查询(与 §3.14–§3.17 一致)
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <token> |
路径参数
| 参数名 |
类型 |
必填 |
描述 |
| contractId |
String |
是 |
合同 ID |
查询参数
| 参数名 |
类型 |
必填 |
描述 |
| type |
String |
否 |
下载类型,默认 CONTRACT。可选:
CONTRACT:签署后的合同 PDF(Content-Type: application/pdf)
EVIDENCE:区块链证据报告 PDF(application/pdf)
ARCHIVE:归档 OFD 文件(application/ofd;合同须已归档)
兼容别名:SIGNED_PDF/PDF→CONTRACT,EVIDENCE_REPORT→EVIDENCE,OFD/ARCHIVE_OFD→ARCHIVE
|
请求示例
HTTP
# 下载合同 PDF
GET /api/v1/contract/download/1?type=CONTRACT
Authorization: Bearer <token>
# 下载证据报告
GET /api/v1/contract/download/1?type=EVIDENCE
Authorization: Bearer <token>
# 下载归档文件
GET /api/v1/contract/download/1?type=ARCHIVE
Authorization: Bearer <token>
成功响应
- HTTP 200,Body 为文件字节流
Content-Disposition: attachment; filename*=UTF-8''...
Content-Type:合同/证据为 application/pdf;归档为 application/ofd
常见错误(JSON):合同不存在或已删除;合同文件不存在(尚未生成签署 PDF);ARCHIVE 时「合同尚未归档,无法下载归档文件」;type 非法。
3.19 发送短信验证码
- 接口路径:
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.20 获取活体验证(人脸识别)
- 接口路径:
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.21 或 §5.6(路径不同,参数与响应结构一致)。
3.21 根据 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.22 根据 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.23 开放签署 PDF 之前,可先通过本接口检查 token 是否仍然有效,避免使用过期 token 发起签署请求。注意:本接口仅检查 token 是否存在,不验证活体认证是否通过(请使用 §3.21 查询认证结果)。
3.23 开放签署 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 印章授权
在平台内为某枚印章管理用印权限(授权、撤销、按章查询列表)。被授权人可与印章、印章持有人不属同一企业。
推荐对接(引导页):调用 6.5.0 获取授权页链接,将返回的 h5Url/pcUrl 发给被授权人。被授权人打开页面完成手机号验证与个人实名(可自动开户)后,由企业法定代表人手机接收 SEAL_AUTH 验证码完成授权。适用于被授权人尚未开户/实名的场景。
服务端直连模式(保留):① 先调用「发码」接口,将短信发至该印章持有人在平台绑定的手机。② 持有人将短信验证码交予您方业务系统,由业务系统调用「确认授权」。被授权人须已开户且已个人实名。
授权成功后,若已配置蚂蚁链,服务端将自动把本次授权摘要上链存证,含印章名称、持有人/授权人及被授权人姓名与手机号、业务 ID 等,无需单独再传存证材料。
下述 6.5.0~6.5.4 接口(除引导页内嵌交互外)均须在请求头携带 Authorization: Bearer <token>。完整请求 URL 为文档中的基础路径,与本节各条「接口路径」所列相对路径拼接。变更印章刻制/持有人(所有人)见本节 6.6,短信类型与 6.5.1 同为 SEAL_AUTH。
与 §3.23 开放签署 PDF 联用:对一线业务只传参与人手机及参与人/企业等资料、可不传 sealId 的对接,§3.23 在服务端用印授权与这里同数据,且仅在 与当次印模用名(见 §3.23)一致的印章上落章。无需为签署先调 6.5.4。6.5.4 等授权查询接口适用于运营、排查或事后核对,非接 §3.23 前必须步骤。
6.5.0 获取印章授权页链接(推荐)
- 接口路径:
POST /seal/authorization/page-link
- 请求类型:JSON(
Content-Type: application/json)
- 功能说明:签发 PC/H5 引导页链接。被授权人打开链接完成身份核验与实名后,由企业法定代表人手机收到的
SEAL_AUTH 验证码确认授权。印章须关联已认证企业(有 orgId),个人章不适用本接口。
请求头
| 请求头 |
类型 |
必填 |
描述 |
| Authorization |
String |
是 |
Bearer <accessToken> |
| Content-Type |
String |
是 |
application/json |
请求参数
| 参数名 |
类型 |
必填 |
描述 |
| sealId |
Long |
是 |
待授权印章 ID(须为企业章,已关联企业组织) |
| granteeMobile |
String |
是 |
被授权人手机号;链接绑定此号,打开页须验证此手机号 |
| granteeUserId |
Long |
否 |
若被授权人已开户可预填;须与 granteeMobile 为同一用户 |
| callbackUrl |
String |
否 |
授权成功后服务端 POST 通知地址 |
| redirectUrl |
String |
否 |
引导页成功后跳转地址 |
请求示例
POST /seal/authorization/page-link
Authorization: Bearer <accessToken>
Content-Type: application/json
{
"sealId": 1001,
"granteeMobile": "13800138000",
"callbackUrl": "https://your.example.com/seal-auth/callback",
"redirectUrl": "https://your.example.com/done"
}
响应参数(data)
| 字段 |
类型 |
描述 |
| pcUrl |
String |
PC 引导页:{front}/open-seal-auth/pc?token=… |
| h5Url |
String |
H5 引导页:{front}/open-seal-auth/h5?token=… |
| token |
String |
授权页令牌(72 小时有效) |
| expiresIn |
Integer |
有效期秒数(259200) |
| sealId |
Long |
印章 ID |
引导页流程说明
- 被授权人打开
h5Url/pcUrl,使用链接绑定的手机号收短信完成身份验证(未开户则自动开户)。
- 若未个人实名,引导完成人脸/三要素/银行卡实名。
- 确认印章与企业信息后,点击向法定代表人发送验证码。
- 输入法人收到的验证码并确认,写入用印授权(与 6.5.2 同源
SealUserAuth,可上蚂蚁链)。
- 若配置了
callbackUrl,服务端 POST:{ token, status, sealId, userId, authId, … }。
注意:引导页意愿确认短信发往企业法定代表人手机;6.5.1/6.5.2 直连模式仍发往印章持有人手机。二者验证码接收方不同,请勿混用。
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.23 的前置必调接口——仅传参与人手机时 §3.23 在服务端会自行按授权与组织选章,与上表数据一致。须已知 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..."
}
}