苏心签开放接口文档

v1.0.24 | 专业的电子合同服务接口

1. 概述

1.1 文档说明

本文档描述了苏心签开放接口的使用方法和接口规范,帮助开发者快速集成苏心签的电子合同服务。

1.2 接口基础信息

  • 基础路径https://pc.suxin365.com/api/v1
  • 认证方式:Bearer Token 认证
  • 请求方法:GET/POST/DELETE
  • 响应格式:JSON
  • 字符编码:UTF-8

1.3 响应结构

所有接口返回统一的响应结构:

成功响应
JSON
{
  "success": true,
  "data": { /* 业务数据 */ }
}
失败响应
JSON
{
  "success": false,
  "code": "5001",
  "msg": "错误信息"
}

1.4 分页参数

涉及分页的接口支持以下参数:

  • page:页码,默认值 1
  • pageSize:每页数量,默认值 10
分页响应结构
JSON
{
  "success": true,
  "data": {
    "totalSize": 100,
    "results": [ /* 数据列表 */ ]
  }
}

2. 认证接口

2.1 获取访问令牌

  • 接口路径POST /auth/token
  • 请求类型:JSON(Content-Type: application/json
  • 功能说明:使用 API Key 获取访问令牌,用于后续接口调用
参数名 类型 必填 描述
appId String 应用ID
apiKey String API密钥
请求示例
JSON
{
  "appId": "app_test_1234567890",
  "apiKey": "sk_test_1234567890"
}

响应参数

参数名 类型 描述
accessToken String 访问令牌
expire Integer 令牌有效期(秒)
userId String 当前接入应用的默认用户 ID;PDF 上传发起等场景可作发起人使用
orgs Array 当前接入应用可用的企业列表;创建模板等归属接入应用的场景可从中选取企业 ID;按发起人发起合同时请改用企业列表接口
orgs[].orgId String 企业 ID
orgs[].orgName String 企业名称
响应示例
JSON
{
  "success": true,
  "data": {
    "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "expire": 3600,
    "userId": "123456",
    "orgs": [
      { "orgId": "1", "orgName": "示例科技有限公司" },
      { "orgId": "88", "orgName": "授权访问企业有限公司" }
    ]
  }
}

2.2 使用令牌

  • 认证方式:在请求头中添加 Authorization: Bearer <token>
  • 令牌有效期:默认 3600 秒(1小时)
  • 错误示例
    • 缺少认证信息 - 缺少认证头
    • 认证方案无效 - 认证方案错误
    • 令牌无效或已过期 - 令牌无效或已过期

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 模板列表 单项相同(含 templateIdfieldsfileObjectId 等)。

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}];其中 typesign_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 为字段标识(与模板 fieldskey 对应)
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 根据模板发起合同(含 templateIdfieldValuesuserIdsigners 等)。模板默认签署/盖章位置规则亦与 §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 成功时返回,含 contractIdstatus 等,结构同 §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[].successfalse,请按序号检查每份结果。仅当 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 个人;ENTERPRISECOMPANY 企业/个体户
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 通知说明

  • 请求方式:POSTContent-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 一致。

对接步骤

  1. 创建或发起合同时传入 redirectUrl,填写您小程序的成功页路径,例如 pages/order/sign-success?contractId=123456
  2. 调用 GET /contract/sign-url/{contractId} 获取 h5Url
  3. 在小程序页面中使用 <web-view src="{{h5Url}}"></web-view> 打开签署链接
  4. (推荐)配置 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 会向小程序发送消息(eventopenContract.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 会直接跳转,多数场景无需依赖 bindmessagebindmessage 适用于未配置跳转地址、或需在返回上一页时同步业务状态的场景。使用 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 合同状态,如 DRAFTPENDINGSIGNED
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 truedata.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 作业务与存证编号;已配链时可回 openSignEvidenceIdtransactionHash。签章区域固定 126×126verifyType 未传时默认 1,2(需按实参传 faceTokensmsCode)。

联调前

  • 意愿含短信verifyType2)时:先调 POST /contract/send-sms-code,业务类型 SIGN,再向本接口传 smsCode
  • 意愿含活体(含 1)时:先调 POST /contract/face-recognitionfaceToken,再向本接口传入。
  • 参与人为新个人、或三要素在平台创建新企业时,须按下文「企业新建」对活体、法人三要素的约束准备参数。

印模用名

当次落章在平台上与哪一枚印匹配,由「印模用名」决定:只根据请求体你填的字段推导,不会用库内企业名自动顶替。

签署方 当次印模用名
企业 ENTERPRISE / COMPANY enterpriseName 非空时取其值;否则取 participantName
个人 PERSONAL participantName

仅会选用平台印章「名称」与当次印模用名逐字相同的章(详见「选章与 sealId」)。participantMobile 须为解析到签署人平台账号的绑定手机。通常 participantName 填经办人真名,并与账号登记姓名一致;若将 participantName 填为企业/印模用名(与账号名不同),则须该账号在本企业下或本人名下存在同「名称」的可用章(本企业章、本人章或用印授权,与 §6.5 同源数据),否则不通过。

按参与方准备参数

个人participantType=PERSONAL):以 participantMobile 定位用户;participantName 与实名、章面一致。含 1 时传 faceToken,含 2 时传 smsCode。无个人账号时可由当次活体会话在平台完成开户。

企业:目标已存在且可唯一定位:企业名/统一社会信用代码在平台能唯一条命中已认证企业,或你直接传 participantOrgId(须已认证)。participantUserId 一般可省略,以 participantMobile该目标企业下已加入用户中找经办。若多人在同机号,请补充 enterpriseNameparticipantName 等由服务端消歧,仍不唯一时可再传 participantUserId。仅按名命中多家已认证企业时,须传 participantOrgId 指定其一。

多数场景只传 participantMobile 与企业相关字段即可不必在本地存 sealIdparticipantUserId。确需多枚章中强指定时 sealId 可选,且该章「名称」须与当次印模用名一致(见下表 sealId 行)。用印授权由服务端在 §6.5 同数据上匹配,一般不需要为签署先调授权查询接口(§6.5.4 为运营/对账可选)。

企业:三要素在平台新建:当名称/码尚不能唯一定位已认证企业时,verifyType 须含 1 并传 faceToken。请求带 unifiedSocialCreditCodelegalPersonNamelegalPersonIdCard 等,以 enterpriseName / participantName 声明拟盖的企业章/印模用名(企业盖章时 participantName 可填企业名,不必同法人体检名)。首次在平台创建该企业时,法人姓名/证件号须与当前 faceToken 活体会话中实名、证件号一致。

各参与方通用:若 verifyType1,且已存在与活体同证件的个人档案且其预留手机已填写,该号码须与 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 个人;ENTERPRISECOMPANY 企业
participantUserId Long 条件 企业已存在且已认证时可省略:用 participantMobile 在目标企业组织下解析经办用户;解析失败或多解时再传本字段。企业将按名称新建(三要素)时可省略,须 verifyType1 且传 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(同「联调前」)。

4. 企业账号管理

企业相关能力:查询用户已加入的企业、创建企业、查询企业详情、企业三要素核验,以及将用户加入企业。

4.1 查询用户企业列表

  • 接口路径GET /org/list
  • 请求类型:无 Body;Query 必填 userId
  • 功能说明:查询指定用户已加入的企业(含公司、个体户),用于用户侧业务选企。

请求头

请求头 类型 必填 描述
Authorization String Bearer <token>

查询参数

参数名 类型 必填 描述
userId String 平台用户 ID

响应参数

参数名 类型 描述
data Array 企业列表
data[].orgId String 企业组织 ID
data[].name String 企业名称
data[].unifiedCode String 统一社会信用代码
data[].entityType String 组织类型:COMPANY / SELF_EMPLOYED
data[].certifyStatus String 认证状态:VERIFIED / UNVERIFIED
data[].source String 来源:用户已加入该企业
响应示例
JSON
{
  "success": true,
  "data": [
    {
      "orgId": "1",
      "name": "某某科技有限公司",
      "unifiedCode": "91330000MA2XXXXXX",
      "entityType": "COMPANY",
      "certifyStatus": "VERIFIED",
      "source": "OWN"
    },
    {
      "orgId": "88",
      "name": "合作方有限公司",
      "unifiedCode": "91330000MA2YYYYYY",
      "entityType": "COMPANY",
      "certifyStatus": "VERIFIED",
      "source": "SEAL_AUTH"
    }
  ]
}

4.2 添加企业账号

  • 接口路径POST /org/add
  • 请求类型:JSON(Content-Type: application/json
  • 功能说明:添加企业账号,用于合同签署

请求头

请求头 类型 必填 描述
Authorization String Bearer <token>

请求参数

参数名 类型 必填 描述
userId Long 用户ID
name String 企业名称
unifiedCode String 统一社会信用代码
legalName String 法定代表人姓名
legalIdCard String 法定代表人身份证号
请求示例
JSON
{
  "userId": 1,
  "name": "测试公司",
  "unifiedCode": "91110000MA12345678",
  "legalName": "张三",
  "legalIdCard": "110101199001011234"
}

响应参数

参数名 类型 描述
orgId Long 组织ID
name String 企业名称
unifiedCode String 统一社会信用代码
certifyStatus String 认证状态
legalName String 法人姓名
响应示例
JSON
{
  "success": true,
  "data": {
    "orgId": 1,
    "name": "测试公司",
    "unifiedCode": "91110000MA12345678",
    "certifyStatus": "UNVERIFIED",
    "legalName": "张三"
  }
}

4.3 查询企业账号

  • 接口路径GET /org/get/{orgId}
  • 请求类型:无 JSON/表单请求体;参数见 URL Path
  • 功能说明:查询企业账号详情

请求头

请求头 类型 必填 描述
Authorization String Bearer <token>

路径参数

参数名 类型 必填 描述
orgId Long 组织ID

响应参数

参数名 类型 描述
orgId Long 组织ID
name String 企业名称
unifiedCode String 统一社会信用代码
certifyStatus String 认证状态
legalName String 法人姓名
响应示例
JSON
{
  "success": true,
  "data": {
    "orgId": 1,
    "name": "测试公司",
    "unifiedCode": "91110000MA12345678",
    "certifyStatus": "UNVERIFIED",
    "legalName": "张三"
  }
}

4.4 按企业三要素查询企业与印章

  • 接口路径POST /org/lookup-identity
  • 请求类型:JSON(Content-Type: application/json
  • 功能说明调用与控制台「企业法人认证」POST /auth/enterprise/legal-person 同源的创瑞企业三要素核验(企名+统一社会信用代码+法人姓名),通过后再在平台内查组织与印章。在全部未删除的 COMPANY / SELF_EMPLOYED 中按企名+统一社会信用代码匹配;每条印章含制章人用户 ID制章人手机号。多命中时取组织 id 最大的一条。响应中 legalName 为经核验的法人姓名;若与平台主账号登记略有不一致,仅记日志不拦截。

请求体(JSON)

参数名 类型 必填 描述
name String 企业名称
unifiedCode String 统一社会信用代码
legalName String 法人姓名

响应 data 主要字段

参数名 类型 描述
orgId / name / unifiedCode / certifyStatus 企业组织标识、名称、统一码、认证状态(如 VERIFIED / UNVERIFIED
legalName String 与三要素通过校验的登记用户姓名
seals Array 该组织下印章列表。元素含 sealIdnameisDefaultsealCreatedByUserIdsealCreatedByUserMobile
请求示例
JSON
{
  "name": "某科技公司",
  "unifiedCode": "91110000MA12345678",
  "legalName": "张三"
}
响应示例
JSON
{
  "success": true,
  "data": {
    "orgId": 1001,
    "name": "某科技公司",
    "unifiedCode": "91110000MA12345678",
    "certifyStatus": "VERIFIED",
    "legalName": "张三",
    "seals": [
      {
        "sealId": 1,
        "name": "某科技公司",
        "isDefault": true,
        "sealCreatedByUserId": 2,
        "sealCreatedByUserMobile": "13800138000"
      }
    ]
  }
}

4.5 用户加入企业

  • 接口路径POST /org/join
  • 请求类型:JSON(Content-Type: application/json
  • 功能说明:将指定用户加入指定企业。开放接口加入后即可使用(无需企业管理员再审核)。常用于变更企业章持有人之前,先让新持有人加入目标企业。

请求头

请求头 类型 必填 描述
Authorization String Bearer <token>

请求体(JSON)

参数名 类型 必填 描述
userId Long 要加入组织的平台用户 ID
orgId Long 企业/个体户组织实体 ID(OrgEntity.id

响应

成功时返回入企结果(含企业、用户及加入时间等)。

请求示例
JSON
{
  "userId": 100,
  "orgId": 2001
}
响应示例
JSON
{
  "success": true,
  "data": {
    "id": 3001,
    "orgEntityId": 2001,
    "userId": 100,
    "status": "ACTIVE",
    "joinTime": "2026-04-26T10:00:00"
  }
}
  • 接口路径POST /contract/change-legal-person
  • 请求类型:JSON(Content-Type: application/json
  • 功能说明:按企业名称与统一社会信用代码定位企业,将法人变更为指定用户。若新法人尚无账号,系统将自动开户。注意:变更后企业归新法人使用,企业下印章一并跟随。

请求头

请求头 类型 必填 描述
Authorization String Bearer <token>
Content-Type String application/json

请求体(JSON)

参数名 类型 必填 描述
enterpriseName String 企业名称,用于定位企业
unifiedSocialCreditCode String 统一社会信用代码,用于精确定位企业(必传)
newLegalName String 新法人姓名
newLegalIdCard String 新法人身份证号
faceToken String 活体认证 token,用于验证新法人身份。需先调用 §3.14 获取
contactPhone String 联系电话,用于创建新用户和更新企业联系方式(必传)
请求示例
JSON
{
  "enterpriseName": "测试有限公司",
  "unifiedSocialCreditCode": "91110000MA12345678",
  "newLegalName": "李四",
  "newLegalIdCard": "320***********5678",
  "faceToken": "xyz789abc",
  "contactPhone": "13800138000"
}

响应参数

参数名 类型 描述
data Object 变更结果对象
data.orgId Long 企业组织ID
data.newLegalUserId Long 新法人用户ID
data.sealCount Integer 已迁移的印章数量
响应示例
JSON
{
  "success": true,
  "message": "法人变更成功",
  "data": {
    "orgId": 123456,
    "newLegalUserId": 987654321,
    "sealCount": 2
  }
}

业务规则

  • 企业查询:使用企业名称 + 统一社会信用代码进行精确匹配,确保定位到唯一的企业
  • 新法人处理
    • 若新法人已存在:直接使用该用户作为企业新法人
    • 若新法人不存在:自动创建新用户并关联为企业法人
  • 企业归属迁移
    • 企业将迁移到新法人的账号下
    • 企业下所有印章也会跟随企业同步迁移
  • 活体验证:必须提供有效的活体 token,用于验证新法人身份真实性
  • 审计记录:系统会自动记录法人变更信息,包括变更时间等

注意事项

  • 变更后企业归属到新法人的账号下,原法人不再拥有该企业
  • 企业下的所有印章也会跟随企业迁移到新法人账号
  • 建议变更前确认新法人已完成实名认证
  • 联系电话将用于创建新用户(如需要)和更新企业联系方式

5. 个人账号管理

5.1 添加个人账号

  • 接口路径POST /person/add
  • 请求类型:JSON(Content-Type: application/json
  • 功能说明:添加个人账号,用于合同签署

请求头

请求头 类型 必填 描述
Authorization String Bearer <token>

请求参数

参数名 类型 必填 描述
name String 姓名
mobile String 手机号
请求示例
JSON
{
  "name": "张三",
  "mobile": "13800138000"
}

响应参数

参数名 类型 描述
userId Long 用户ID
name String 姓名
mobile String 手机号
realNameStatus String 实名状态
响应示例
JSON
{
  "success": true,
  "data": {
    "userId": 1,
    "name": "张三",
    "mobile": "13800138000",
    "realNameStatus": "UNVERIFIED"
  }
}

5.2 查询个人账号

  • 接口路径GET /person/get/{userId}
  • 请求类型:无 JSON/表单请求体;参数见 URL Path
  • 功能说明:查询个人账号详情

请求头

请求头 类型 必填 描述
Authorization String Bearer <token>

路径参数

参数名 类型 必填 描述
userId Long 用户ID

响应参数

参数名 类型 描述
userId Long 用户ID
name String 姓名
mobile String 手机号
realNameStatus String 实名状态
响应示例
JSON
{
  "success": true,
  "data": {
    "userId": 1,
    "name": "张三",
    "mobile": "13800138000",
    "realNameStatus": "UNVERIFIED"
  }
}

5.3 按手机号查询姓名与身份证

  • 接口路径POST /person/lookup-by-mobile
  • 请求类型:JSON(Content-Type: application/json
  • 功能说明:根据手机号查询平台用户姓名与身份证号。与 §5.9 按实名查用户与章 互为反向查询:本接口由手机查实名,§5.9 由姓名+身份证查用户与印章。

请求头

请求头 类型 必填 描述
Authorization String Bearer <token>
Content-Type String application/json

请求参数

参数名 类型 必填 描述
mobile String 手机号

响应参数

参数名 类型 描述
userId Long 用户 ID
mobile String 手机号
realName String 姓名;已完成个人实名时取个人组织姓名,否则取用户表姓名
idNumber String 身份证号;用户已完成个人实名/制章时返回,未实名时为空
请求示例
JSON
{
  "mobile": "13800138000"
}
响应示例
JSON
{
  "success": true,
  "data": {
    "userId": 123456,
    "mobile": "13800138000",
    "realName": "张三",
    "idNumber": "110101199001011234"
  }
}
业务说明
  • 手机号在平台内唯一匹配到一名用户时返回结果
  • 若该手机号对应多个用户,接口报错,请改用 userId§5.9 按姓名+身份证查询
  • 若手机号未注册,返回「未找到该手机号对应的用户」

5.4 账号注销

  • 接口路径DELETE /person/delete/{userId}
  • 请求类型:无 JSON/表单请求体;参数见 URL Path
  • 功能说明:注销个人账号

请求头

请求头 类型 必填 描述
Authorization String Bearer <token>

路径参数

参数名 类型 必填 描述
userId String 用户ID

响应参数

参数名 类型 描述
deleted Boolean 是否注销成功
响应示例
JSON
{
  "success": true,
  "data": {
    "deleted": true
  }
}

5.5 获取个人活体验证(人脸识别)

  • 接口路径POST /person/face-recognition
  • 请求类型:JSON(Content-Type: application/json
  • 功能说明:与 §3.14 POST /contract/face-recognition 同源(姓名、身份证号发起 H5 活体,返回二维码或认证页 URL 与 token)。userId 为可选参数:传递 userId 时进行系统用户实名认证;不传 userId 时仅进行活体验证。

请求头

请求头 类型 必填 描述
Authorization String Bearer <token>
Content-Type String application/json

请求体(JSON)

参数名 类型 必填 描述
userId Long 平台个人用户 ID(传递时进行系统用户实名认证,不传时仅活体验证)
realName String 真实姓名
idCard String 身份证号
isReturnUrl Boolean truedata.qrCodeUrl 直接为认证页 URL;否则为二维码图片地址
returnUrl String 认证完成后的跳转地址(未传时由服务端使用占位默认值)
请求示例(不传 userId)
HTTP
POST /person/face-recognition
Content-Type: application/json

{
  "realName": "张三",
  "idCard": "320***********1234"
}
请求示例(传递 userId)
HTTP
POST /person/face-recognition
Content-Type: application/json

{
  "userId": 123,
  "realName": "张三",
  "idCard": "320***********1234",
  "isReturnUrl": true,
  "returnUrl": "https://example.com/h5/callback"
}

响应参数(data 对象)

§3.14 相同:qrCodeUrltoken

参数名 类型 描述
qrCodeUrl String 二维码图片 URL 或认证页 URL(取决于 isReturnUrl
token String 本次活体会话 token,用于 §5.6§3.15 查询结果
响应示例
JSON
{
  "success": true,
  "data": {
    "qrCodeUrl": "https://...",
    "token": "xxxxxxxx"
  }
}
业务说明
  • userId 为可选参数:不传 userId 时,系统会自动将 requestNotice 设为 false(不发送通知)
  • 传递 userId 时:进行系统用户实名认证,requestNotice 默认为 true,会发送活体验证结果通知
  • 不传 userId 时:仅进行活体验证,不与系统用户绑定
  • 返回的 token 有效期为 12 小时,用于后续签署等流程中的活体验证

5.6 根据 token 查询个人侧活体是否认证成功

  • 接口路径GET /person/face-recognition/success
  • 请求类型:无 JSON/表单请求体;参数 token 见 URL Query
  • 功能说明:与 §3.15 GET /contract/face-recognition/success 一致,仅路径前缀为 /person;根据活体 token 返回是否通过、是否计费及结果码等。

请求头

请求头 类型 必填 描述
Authorization String Bearer <token>

查询参数

参数名 类型 必填 描述
token String 活体 token(POST /person/face-recognition/{userId} 或合同侧活体接口返回的 data.token

响应参数

§3.15 相同:data.passeddata.chargeddata.codedata.codeDesc

参数名 类型 描述
data Object 活体状态对象
data.passed Boolean 是否通过:true 通过;false 未通过/未完成
data.charged Boolean 是否计费:按返回 code 判断(与 §3.15 所列计费码一致)
data.code String 认证结果码(用于判断通过与计费)
data.codeDesc String 结果描述
响应示例
JSON
{
  "success": true,
  "data": {
    "passed": true,
    "charged": true,
    "code": "R102",
    "codeDesc": "认证成功"
  }
}

5.7 运营商三要素验证

  • 接口路径POST /person/three-factor-verification
  • 请求类型:JSON(Content-Type: application/json
  • 功能说明:验证姓名、身份证号、手机号三要素是否匹配。仅返回验证结果,不进行用户创建、组织创建等额外操作。适用于外部系统身份预验证。

请求头

请求头 类型 必填 描述
Authorization String Bearer <token>
Content-Type String application/json

请求体(JSON)

参数名 类型 必填 描述
realName String 真实姓名
idCard String 身份证号
phone String 手机号
请求示例
JSON
{
  "realName": "张三",
  "idCard": "320***********1234",
  "phone": "13800138000"
}

响应参数

参数名 类型 描述
data Object 验证结果对象
data.verified Boolean 是否验证通过:true 三要素一致;false 不一致或验证失败
data.charged Boolean 是否计费:true 计费;false 不计费
data.code String 状态码(详见下方状态码说明)
data.message String 验证结果描述或错误原因

状态码说明

状态码 含义 是否计费
1 手机三要素一致 ✅ 是
2 手机三要素不一致 ✅ 是
3 请求参数错误 ❌ 否
10001 查询无结果 ❌ 否
10002 授权不通过 ❌ 否
10003 白名单不通过 ❌ 否
10004 余额不足 ❌ 否
10005 无效的证件号 ❌ 否
20000 系统异常 ❌ 否
20001 参数错误 ❌ 否
20002 参数映射异常 ❌ 否
20003 运营商无可用供应商 ❌ 否
20004 无效的签名算法 ❌ 否
20005 模板未找到 ❌ 否
响应示例(验证通过)
JSON
{
  "success": true,
  "message": "三要素验证通过",
  "data": {
    "verified": true,
    "charged": true,
    "code": "1",
    "message": "手机三要素一致"
  }
}
响应示例(验证失败但计费)
JSON
{
  "success": true,
  "message": "三要素验证失败",
  "data": {
    "verified": false,
    "charged": true,
    "code": "2",
    "message": "手机三要素不一致"
  }
}
响应示例(不计费错误)
JSON
{
  "success": true,
  "message": "三要素验证失败",
  "data": {
    "verified": false,
    "charged": false,
    "code": "10004",
    "message": "余额不足"
  }
}

注意:本接口仅进行验证,不会创建用户、组织或印章,也不会发送通知。如需完成实名认证并创建个人账号,请使用其他接口。

5.8 获取独立认证页面

  • 接口路径POST /person/certify-page
  • 请求类型:JSON(Content-Type: application/json
  • 功能说明:获取个人账号的独立认证页面链接

请求头

请求头 类型 必填 描述
Authorization String Bearer <token>

请求参数

参数名 类型 必填 描述
userId Long 用户ID
notifyUrl String 实名认证完成回调推送地址
redirectUrl String 实名认证完成后跳转地址

响应参数

参数名 类型 描述
h5Url String 实名链接(H5)
pcUrl String 实名链接(PC)
userId Long 用户ID

notifyUrlredirectUrl 由服务端与 token 关联存储,打开链接后通过 GET /login-by-token 获取,不会出现在 URL 查询参数中。

链接格式:{前端域名}/open-verification/{h5|pc}/{token},token 默认有效期 3600 秒。

响应示例
JSON
{
  "success": true,
  "data": {
    "h5Url": "https://example.com/open-verification/h5/abcdef123456",
    "pcUrl": "https://example.com/open-verification/pc/abcdef123456",
    "userId": 123
  }
}

5.9 按姓名、身份证号查询用户与可用印章

  • 接口路径POST /person/lookup-identity
  • 请求类型:JSON(Content-Type: application/json
  • 功能说明:按姓名与身份证号查找个人,返回用户、可用印章(自有与授权)及已加入的企业。

请求体(JSON)

参数名 类型 必填 描述
realName String 真实姓名
idNumber String 身份证号

响应 data 主要字段

参数名 类型 描述
userId / mobile Long / String 匹配到的平台用户与绑定手机
boundEnterprises Array 用户已加入/绑定的企业组织(ACTIVE)。元素含 orgIdnameunifiedCodeentityTypeCOMPANY / SELF_EMPLOYED
seals Array 可用印章列表。元素含 sealIdnameisDefaultrelationTypesealOrgIdsealOrgTypesealOrgNamesealOrgIdNumber(个人组织为身份证号,企业组织为统一社会信用代码)、sealCreatedByUserIdsealCreatedByUserMobilesealCreatedByUserIdNumber(制章人身份证号,取自其个人实名组织)
请求示例
JSON
{
  "realName": "张三",
  "idNumber": "110101199001011234"
}
响应示例
JSON
{
  "success": true,
  "data": {
    "userId": 1,
    "mobile": "13800138000",
    "boundEnterprises": [
      {
        "orgId": 100,
        "name": "某科技公司",
        "unifiedCode": "91110000MA12345678",
        "entityType": "COMPANY"
      }
    ],
    "seals": [
      {
        "sealId": 10,
        "name": "张三",
        "isDefault": true,
        "relationType": "OWN",
        "sealOrgId": 50,
        "sealOrgType": "PERSONAL",
        "sealOrgName": "张三",
        "sealOrgIdNumber": "110101199001011234",
        "sealCreatedByUserId": 1,
        "sealCreatedByUserMobile": "13800138000",
        "sealCreatedByUserIdNumber": "110101199001011234"
      }
    ]
  }
}

5.10 通过验证码修改手机号

  • 接口路径POST /person/change-mobile-by-sms
  • 请求类型:JSON(Content-Type: application/json
  • 功能说明:通过原手机号和新手机号的验证码修改手机号。需要分别发送原手机号和新手机号的验证码。

请求头

请求头 类型 必填 描述
Authorization String Bearer <token>

请求体(JSON)

参数名 类型 必填 描述
oldMobile String 原手机号(通过原手机号自动定位用户)
oldCode String 原手机号验证码(场景码:CHANGE_MOBILE_OLD)
newMobile String 新手机号
newCode String 新手机号验证码(场景码:CHANGE_MOBILE_NEW)
请求示例
JSON
{
  "oldMobile": "13800138000",
  "oldCode": "123456",
  "newMobile": "13900139000",
  "newCode": "654321"
}
响应示例
JSON
{
  "success": true,
  "data": "手机号修改成功"
}
业务说明
  • 需要先调用短信接口发送原手机号验证码(场景码:CHANGE_MOBILE_OLD
  • 需要先调用短信接口发送新手机号验证码(场景码:CHANGE_MOBILE_NEW
  • 修改成功后会自动同步更新 tenant 表和 orgEntity 表的联系电话
  • 新手机号不能已被其他用户使用

5.11 通过活体认证修改手机号

  • 接口路径POST /person/change-mobile-by-face
  • 请求类型:JSON(Content-Type: application/json
  • 功能说明:通过姓名、身份证号匹配并验证活体认证后修改手机号。适用于原手机号不可用的场景。

请求头

请求头 类型 必填 描述
Authorization String Bearer <token>

请求体(JSON)

参数名 类型 必填 描述
userId Long 用户ID(当姓名+身份证号匹配到多个用户时必填)
realName String 真实姓名
idCard String 身份证号
faceToken String 活体认证token(通过活体验证接口获取)
newMobile String 新手机号
请求示例(单个用户匹配)
JSON
{
  "realName": "张三",
  "idCard": "110101199001011234",
  "faceToken": "face_token_xxx",
  "newMobile": "13900139000"
}
请求示例(多个用户匹配)
JSON
{
  "userId": 123456,
  "realName": "张三",
  "idCard": "110101199001011234",
  "faceToken": "face_token_xxx",
  "newMobile": "13900139000"
}
响应示例
JSON
{
  "success": true,
  "data": "手机号修改成功"
}
业务说明
  • 需要先调用活体验证接口(/person/face-recognition)获取 faceToken
  • 系统会根据姓名和身份证号自动匹配用户
  • 当姓名+身份证号匹配到多个用户时,必须传递 userId 参数指定具体用户
  • 验证活体认证状态必须为通过(passed = true)
  • 新手机号不能已被其他用户使用
  • 活体 token 有效期通常为 1 小时,请及时使用

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.44 个接口均须在请求头携带 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,须为平台内未删除的印章,且能解析出持有人与手机号

响应参数

顶层为统一结构:codesuccessdatamsg。本接口成功时仅通过 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 发至印章持有人手机上的短信验证码

响应参数

顶层为 codesuccessmsgdata;成功时 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}
  • 请求类型:无请求体;authIdPath
  • 功能说明:将指定授权记录置为已撤销(软删),被授权人不再具备该章用印权限。

请求头

请求头 类型 必填 描述
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 同一发码通道)。

企业章:新持有人须已加入该企业;可先调用加入企业接口。个人章无此限制。

若已配置蚂蚁链,变更成功后会将摘要上链并生成存证;响应中可返回 sealOwnerTransferEvidenceIdownerTransferTransactionHash;未配链或上链失败时二者可为空,不影响持有人已变更。

  • 接口路径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
请求示例
JSON
{
  "sealId": 1001,
  "newOwnerUserId": 2002,
  "smsCode": "123456"
}
响应示例
JSON
{
  "success": true,
  "data": {
    "sealId": 1001,
    "name": "某某公司",
    "orgId": 500,
    "userId": 2002,
    "isDefault": true,
    "sealOwnerTransferEvidenceId": 90002,
    "ownerTransferTransactionHash": "0xdef456..."
  }
}

7. 错误码说明

错误码 描述
4001 参数校验失败
4002 业务操作失败
4003 资源不存在
4010 未授权
5000 系统内部错误

8. 调用示例

8.1 获取令牌

BASH
curl -X POST \
  https://your.domain/api/v1/auth/token \
  -H "Content-Type: application/json" \
  -d '{"appId": "app_test_1234567890", "apiKey": "sk_test_1234567890"}'

8.2 创建合同草稿

须先通过 §3.1 上传 PDF 取得 fileId

BASH
curl -X POST \
  https://your.domain/api/v1/contract/create \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -H "Content-Type: application/json" \
  -d '{"title": "服务协议", "fileId": 1, "userId": "123456", "signers": [{"type": "PERSON", "order": 1, "userId": "123456"}]}'

8.3 用户加入企业

将平台已有用户加入指定企业/个体户(与 §4.5 一致)。须先 8.1 取令牌,请求中携带平台内有效 userIdorgId

BASH
curl -X POST \
  https://your.domain/api/v1/org/join \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -H "Content-Type: application/json" \
  -d '{"userId": 100, "orgId": 2001}'

9. 常见问题

9.1 令牌过期怎么办?

当令牌过期时,需要重新调用 /api/v1/auth/token 接口获取新的令牌。建议在令牌过期前提前刷新。

9.2 如何处理签名失败?

签名失败通常是由于签名人信息不匹配或印章不存在导致的。请检查签名人信息和印章是否正确。

9.3 接口调用频率限制

为保证系统稳定性,每个应用(按 API Key / 开放凭证)的接口调用频率限制为:

  • 认证接口:100次/分钟
  • 其他接口:500次/分钟

10. 版本说明

版本 发布日期 变更说明
v1.0 2026-04-19 初始版本
v1.0.1 2026-04-23 合同开放接口新增 POST /contract/send-sms-code(发送签署短信验证码)
合同开放接口新增 POST /contract/face-recognition(活体验证,请求体无需 userId)
合同开放接口新增 POST /contract/sign-pdf(关键词落章 + 意愿校验 + 返回签署 PDF Base64)
v1.0.2 2026-04-24 合同开放接口 GET /contract/face-recognition/success 响应升级:返回 passed/charged/code/codeDesc,并按 code(R101、R102、R214、R215、R216、R218、R219、R221、R233、R234、R235)判断是否计费
v1.0.3 2026-04-25 POST /contract/sign-pdf:企业已认证且可唯一解析目标企业组织时,participantUserId 改为可选,默认按 participantMobile 在该组织下匹配经办用户;verifyType 含活体时,若已存在与活体姓名、身份证一致的个人组织档案且预留手机号已填,须与 participantMobile 一致。开放接口 印章授权POST /seal/authorization/send-sms-codePOST /seal/authorization/grant(成功后摘要上蚂蚁链)、POST /seal/authorization/revoke/{authId}GET /seal/authorization/list;授权短信发往印章持有人手机
v1.0.4 2026-04-25 POST /contract/sign-pdf 文档:补充印模用名与参与人关联enterpriseName/participantName 来源、与账号手机/姓名及同名企业章/授权的关系)、只选用与当次印模用名完全一致的 Seal 名称的选章规则,以及 sealIdparticipantName 等参数说明
v1.0.5 2026-04-26 新增 POST /org/lookup-identityPOST /person/lookup-identity。其中 POST /org/lookup-identity 先经与 POST /auth/enterprise/legal-person 同源创瑞企业三要素核验、再于平台内查组织与章,在 COMPANY / SELF_EMPLOYED 中按企名+统一社会信用代码匹配。
新增 POST /org/joinPOST /seal/transfer-owner。企业章变更所有人时,新所有人须已在目标 orgId 下为 ACTIVE 成员,成功后可上链 sealOwnerTransferEvidenceId 等。
POST /contract/sign-pdf 补充:首次在平台建企时 legalPersonNamelegalPersonIdCard 须与 faceToken 活体会话中实名、证件号一致等说明
v1.0.6 2026-04-27 个人开放接口补充文档:POST /person/face-recognition(发起 H5 活体,userId 为可选参数)、GET /person/face-recognition/success(查询活体结果,与合同侧 GET /contract/face-recognition/success 响应结构一致)。原 §5.4/§5.5 独立认证页与按实名查询顺延为 §5.6/§5.7。
v1.0.7 2026-05-07 活体 Token 管理增强
• 新增 GET /contract/face-recognition/check-token(查询活体 token 是否过期,返回剩余有效期)
• 开放接口活体 token 有效期延长至 12 小时(其他场景默认 30 分钟)
POST /contract/sign-pdf 新增 destroyFaceTokenAfterUse 参数(默认 false,签署后立即销毁 token,提升安全性)

企业变更法人功能
• 新增 POST /contract/change-legal-person(通过企业名称和信用代码定位企业,变更法人)
• 支持自动创建新法人用户和企业归属迁移
• 企业下所有印章跟随企业同步迁移到新法人账号
• 入参调整:使用 enterpriseName + unifiedSocialCreditCode 替代 orgId,降低接入门槛
v1.0.8 2026-05-07 运营商三要素验证功能
• 新增 POST /person/three-factor-verification(验证姓名、身份证号、手机号三要素)
纯验证接口:仅返回验证结果,不创建用户、组织或印章
• 支持详细的计费判断:status=1/2 计费,错误码不计费
• 完整的状态码体系:1(一致)、2(不一致)、3(参数错误)、10001-10005(业务错误)、20000-20005(系统错误)
v1.0.9 2026-05-07 开放签署 PDF 增强
POST /contract/sign-pdf 新增 sealWidthsealHeight 参数(单位:pt)
• 默认值:126pt(约 44.4mm),保持原有尺寸不变
• 最小值:28.4pt(约 10mm),防止印章过小
• 可选参数,不传时使用默认值,向后兼容

上传印章图片功能
• 新增 POST /v1/seal/upload-image(上传图片生成印章)
• 支持个人章和企业章,使用固定尺寸(个人章 300×150px,企业章 210×210px)
• 企业章权限校验:只有企业创建者才能为企业创建印章
• 图片大小限制:不超过 2MB
• 支持设置默认印章,自动处理互斥逻辑
v1.0.10 2026-05-23 个人账号手机号修改功能
• 新增 POST /person/change-mobile-by-sms(通过验证码修改手机号,无需 userId)
• 新增 POST /person/change-mobile-by-face(通过活体认证修改手机号,多用户匹配时需 userId)
• 支持两种验证方式:原手机号验证码、活体人脸识别
• 短信验证码场景码:CHANGE_MOBILE_OLD(原手机号)、CHANGE_MOBILE_NEW(新手机号)
• 活体认证需先调用 POST /person/face-recognition 获取 faceToken(userId 可选)

域名变更
• 基础路径从 https://pc.suxin365.com/api/v1 变更为 https://pc.suxin365.com/api/v1
v1.0.11 2026-05-27 按实名查询用户与印章增强
POST /person/lookup-identity 响应 seals[] 补充印章所属组织(sealOrgIdsealOrgTypesealOrgNamesealOrgIdNumber)及制章人信息(sealCreatedByUserIdsealCreatedByUserMobilesealCreatedByUserIdNumber
• 新增 boundEnterprises:返回用户已加入的企业组织列表(ACTIVE,含 COMPANY / SELF_EMPLOYED
v1.0.12 2026-05-27 加入企业审核(控制台)
• 控制台「加入企业」提交后成员关系状态为 PENDING,须企业管理员审核通过后变为 ACTIVE
• 开放接口 POST /org/join 仍为直接加入(ACTIVE),与控制台行为区分
v1.0.13 2026-05-30 合同模板开放接口
• 新增 GET /contract/templates(查询租户启用的模板列表)
• 新增 GET /contract/templates/{templateId}(查询模板详情,含字段定义)
• 新增 POST /contract/create-from-template(按模板填充字段、生成 PDF 并发起合同,状态为 PENDING
• 新增 GET /contract/tenant-list(租户合同列表,orgId 可选)
• 原 §3.2–§3.12 合同管理小节顺延为 §3.5–§3.16
v1.0.14 2026-05-30 PDF 上传创建合同流程重构
POST /contract/upload-templatePOST /contract/create 租户 ID 统一取自 API Key,并校验 userId / 文件 / 签署方归属
• 创建合同:签署方类型规范为 PERSON / ENTERPRISE(兼容传 COMPANY);修复签署顺序关联;补全 PDF 预览图转换
• 移除未实现的 callbackUrlwillingnessTyperedirectUrl 请求参数
• 文档 §3 补充 PDF 与模板两条发起路径说明
v1.0.15 2026-05-30 个人账号查询增强
• 新增 POST /person/lookup-by-mobile(按手机号查询用户姓名与身份证号)
• 个人账号 §5.3–§5.10 顺延为 §5.4–§5.11
v1.0.16 2026-06-25 模板默认签署/盖章位置
GET /contract/templatesGET /contract/templates/{templateId} 响应新增 sealPositions(模板默认签署/盖章位置 JSON)
POST /contract/create-from-template 发起时自动应用模板默认位置,按 signerIndex 映射到 signers 的签署顺序 order 生成签署控件,无需再调用设计页
v1.0.17 2026-06-25 获取令牌返回默认组织/用户
POST /auth/token 响应新增 userId(API Key 对应租户管理员)与 orgId(API Key 对应默认组织),可直接用于发起合同等接口的 userId / orgId
v1.0.18 2026-06-27 签署完成回调与跳转
• 创建/发起合同、获取签署链接支持 callbackUrlredirectUrl
callbackUrl 接收签署进度 POST 通知;redirectUrl 用于签署完成后页面跳转
• 新增 §3.8.2 微信小程序 web-view 对接说明
signers[] 支持按姓名、手机号指定签署方
v1.0.19 2026-06-27 签署方与链接
signers[] 支持按姓名、手机号指定签署方
• 设计页、签署链接、预览链接 token 默认有效期延长至 30 天
v1.0.20 2026-07-04 批量模板发起合同
• 新增 POST /contract/batch-create-from-template(按 items 批量发起,结构与 §3.4 单项相同)
• 单次请求最多 50 份,超出整单拒绝;各份独立处理,部分失败不影响其余成功项
• 原 §3.5–§3.16 合同管理小节顺延为 §3.6–§3.17
v1.0.21 2026-07-04 企业列表与模板按企业筛选
• 新增 GET /org/list(按 API Key 商户返回可访问企业:本商户创建 + 印章授权)
GET /contract/templates 新增必填参数 orgId,按企业筛选模板;模板新增 orgEntityId 字段
• 企业账号 §4.1–§4.5 顺延为 §4.2–§4.6
v1.0.22 2026-07-06 开放接口 ID 参数类型调整
• 模板列表 orgId、模板详情 templateId、签署链接/预览地址 contractId/userId/orgId、组织/租户合同列表 orgId、发起签署 contractId、企业列表响应 orgId 等路径/Query 参数改为 String(避免大整数 JSON 精度丢失)
v1.0.23 2026-07-07 获取令牌返回可访问企业列表
POST /auth/token 响应将原单个 orgId 调整为 orgs 数组,元素含 orgIdorgName(当前接入应用可用的企业);userId 改为 String 类型
v1.0.24 2026-07-10 模板列表 orgId 可选并返回企业名称
GET /contract/templatesorgId 改为非必填;未传时返回该 API Key 租户下全部启用模板
• 列表/详情响应新增 orgEntityName(由 orgEntityId 解析的企业名称)

接口列表

接口路径 方法 请求类型 功能说明
POST /auth/token POST JSON 获取访问令牌
POST /contract/upload-template POST JSON 上传合同 PDF(PDF 发起流程第一步)
POST /contract/templates POST JSON 创建合同模板(Word .docx)
GET /contract/templates GET Query(orgId 可选) 查询启用的合同模板列表
GET /contract/templates/{templateId} GET 无 Body(Path) 查询模板详情
POST /contract/create-from-template POST JSON 根据模板生成 PDF 并发起合同(待签署)
POST /contract/batch-create-from-template POST JSON 批量根据模板发起合同(单次最多 50 份,部分失败可返回明细)
GET /contract/design-page/{contractId} GET 无 Body(Path/Query) 获取设计合同页面
POST /contract/create POST JSON 创建合同草稿(DRAFT,PDF 流程)
POST /contract/initiate-sign/{contractId} POST JSON(Body 可空) 发起签署
GET /contract/sign-url/{contractId} GET 无 Body(Path/Query) 获取签署链接
GET /contract/list GET 无 Body(Query) 按组织 ID 查询合同列表
GET /contract/tenant-list GET 无 Body(Query) 查询用户作为发起人创建的合同列表
GET /contract/preview-url/{contractId} GET 无 Body(Path/Query) 获取合同预览地址
POST /contract/send-sms-code POST 表单或 Query(mobile 发送短信验证码(签署意愿)
POST /contract/face-recognition POST JSON 获取活体验证(人脸识别)二维码
GET /contract/face-recognition/success GET 无 Body(Query:token 根据 token 查询活体是否认证成功
POST /contract/sign-pdf POST JSON 开放签署 PDF(关键词落章、意愿校验)
GET /org/list GET 无 Body(Query:必填 userId 查询用户已加入的企业列表
POST /org/add POST JSON 添加企业账号
GET /org/get/{orgId} GET 无 Body(Path) 查询企业账号
POST /org/lookup-identity POST JSON 先创瑞企业三要素核验,再查企业与印章(含制章人用户 ID、手机号)
POST /org/join POST JSON 用户加入企业/个体户
POST /person/add POST JSON 添加个人账号
GET /person/get/{userId} GET 无 Body(Path) 查询个人账号
POST /person/lookup-by-mobile POST JSON 按手机号查询用户姓名与身份证号
POST /person/lookup-identity POST JSON 按姓名、身份证号查询用户手机号、可用印章(含制章人/组织信息)及绑定企业
DELETE /person/delete/{userId} DELETE 无 Body(Path) 账号注销
POST /person/face-recognition POST JSON 获取个人活体验证(人脸识别)二维码或认证页 URL
GET /person/face-recognition/success GET 无 Body(Query:token 根据 token 查询个人侧活体是否认证成功
POST /person/certify-page POST JSON 获取独立认证页面
POST /seal/add POST JSON 添加印章
POST /seal/set-default/{sealId} POST 无 Body(Path) 设置默认印章
GET /seal/get/{sealId} GET 无 Body(Path) 查询印章详情
GET /seal/list GET 无 Body(Query:必填 userId,可选 orgId 查询用户名下印章列表
POST /seal/authorization/send-sms-code POST 无 Body(Query:sealId 发送印章授权短信(持有人手机)
POST /seal/authorization/grant POST JSON 确认印章授权
POST /seal/authorization/revoke/{authId} POST 无 Body(Path) 撤销印章授权
GET /seal/authorization/list GET 无 Body(Query:sealId 某印章的授权用户列表
POST /seal/transfer-owner POST JSON 变更印章所有人(刻制/持有人),可上链存证