接口签署
POST/openapi/v1/envelopes/{envelopeId}/recipients/{recipientId}/sign
客户服务端携带签署人 Signing PIN,代替其完成签署(签署人无需进入签署页)。
- 签署人须已配置 Signing PIN 并对发件人确认过 ERSD 授权书(首次同意在签署页/前端完成);两者任一缺失都会报错
- 支持幂等:
Idempotency-Key请求头优先,其次请求体IdempotencyKey,两者都未传报错;同 key 命中此前成功请求时原样返回(IdempotentReplay=true) - 签名资源解析:未在
Tabs中显式绑定的签署控件,使用SignatureId/SealId作为默认签名资产,二者至少提供其一;签名图/印章须属于该签署人 - 路径参数
envelopeId、recipientId在 URL 中指定,不在请求体中
适用控件与默认资产
- 本接口代签署人完成「签名 / 盖章」,只覆盖签署类控件(如
signHere签名、initialHere首字母、stamp印章)。若信封上还存在需填写的其他控件(text/date/email/number等填写型字段),本接口不会代为填写——此类信封请先由签署人在签署页完成填写后再调用,否则将报「控件未填写」错误 Tabs为可选项,一般无需逐个控件绑定:未在Tabs中指定的签署控件会按SignatureId(签名)或SealId(印章)作为默认资产
Credential(JWE)
按 JWE(RFC7516)加密签署 PIN:alg=RSA-OAEP-256、enc=A256GCM。
- 公钥:
GET {baseUrl}/.well-known/jwks.json取use=enc的 key(含kid)。 - 明文 payload:
{"typ":"sign_pin","secret":"<PIN>","context":{"userId":"<收件人 UserId>","envelopeId":"<路径 envelopeId>","recipientId":"<路径 recipientId>"},"iat":<秒>,"exp":<iat+60>,"jti":"<uuid>"}- 加密为 5 段 Compact(
protected.encryptedKey.iv.ciphertext.tag)填入Credential。
要点:必须 5 段(WebCrypto 需把末尾 16 字节 tag 单独成段);header 作 AAD;exp≤60s、jti 一次性(重试需重签);context 与收件人及 URL 一致。
明文 PIN:默认不接受,需联系我们开通。
请求参数
Header 参数
Authorization必填string
Bearer <access_token>
X-Operator-User-Id选填string
操作用户 ID。授权码模式下无需传(自动使用授权用户);客户端凭据模式下可选,不填时使用系统用户 ID。
Idempotency-Key选填string
幂等键(与请求体 IdempotencyKey 二选一,本 header 优先)
Body 请求体
application/jsonSignatureId选填string
签名资源(与 SealId 同为控件未显式绑定时的默认资产,二选一可用)
SealId选填string
印章资源(与 SignatureId 同为控件未显式绑定时的默认资产)
Tabs选填array<object>
控件级资产绑定(可选)。未在 Tabs 中出现的签署控件按 SignatureId / SealId 默认资产处理。
子属性
TabId必填string
控件 ID(必填)
SignatureId选填string
该控件使用的签名资源 ID(可选)
SealId选填string
该控件使用的印章 ID(可选)
IdempotencyKey选填string
幂等键(可选)。与 Idempotency-Key 请求头二选一,header 优先;两者都未传报错。 幂等键可复用,但每次重试必须携带新签发的 Credential(凭据为一次性票据,不随幂等键重放)。
Credential选填string
JWE 加密凭据(RSA-OAEP-256+A256GCM,typ=sign_pin,context 含 userId/envelopeId/recipientId),与 SigningPin 二选一。凭据有效期 60 秒且一次性使用。
SigningPin选填string
签署 PIN(默认不接受明文,需联系我们开通)
响应参数
Response.Data
EnvelopeStatus选填string
信封当前状态
RecipientStatus选填string
本次签署的接收人状态
SignedAt选填string
签署完成时间(RFC3339)
EnvelopeCompleted选填boolean
信封是否已完成(全部签署人完成签署)
IdempotentReplay选填boolean
是否为幂等重放(命中此前成功请求的原样返回)
错误码
| 错误码 | 说明 |
|---|---|
INVALID_REQUEST | 参数错误(缺幂等键 / 路径参数为空等) |
NOT_FOUND | 信封不存在 |
RECIPIENT.NOT_RECIPIENT | 指定的 recipientId 不是该信封的签署人(或为抄送人) |
ENVELOPE.INVALID_STATUS | 信封状态不允许签署(已完成、已作废、草稿等) |
SIGNING.RECIPIENT_ALREADY_SIGNED | 该签署人已完成签署 |
SIGNING.RECIPIENT_DECLINED | 该签署人已拒签 |
SIGNING.CONSENT_REQUIRED | 该签署人尚未确认 ERSD 授权书,需先完成同意 |
AUTH.PIN_NOT_CONFIGURED | 该签署人未配置 Signing PIN |
AUTH.PIN_INVALID | Signing PIN 不正确 |
AUTH.PIN_LOCKED | 连续输错 PIN 次数过多,已临时锁定 |
AUTH.CREDENTIAL_REQUIRED | 该 app 未开启明文豁免,须使用 JWE Credential |
AUTH.CREDENTIAL_INVALID | 凭据无效(解密/绑定失败、已重放等) |
AUTH.CREDENTIAL_EXPIRED | 凭据已过期(请校准客户端时钟后重试) |
SIGNING.ENVELOPE_NOT_SIGNABLE | 信封当前不可签 |
SIGNING.RECIPIENT_NOT_SIGNABLE | 签署人当前不可签 |
INTERNAL_ERROR | 服务内部错误 |