跳到主要内容

授权签

目录

本(己方)企业授权签​

本方企业(即"合同发起方")在作为签署方时可以不手动进入签署页面进行签署操作,由腾讯电子签负责自动给合同进行盖章动作。

一. 开通本(己方)企业授权签功能​

  1. 通过生成子客登录链接生成子客超级管理员或者法人的登录链接,对应的子客的超级管理员或者法人点击登录子客控制台, 然后到 企业中心->拓展服务点击企业授权签署栏目的开通按钮进行授权签的开通。

  2. 需要子客超级管理员或者法人用微信来扫描弹窗中的二维码,到微信小程序签署《“开通企业授权签”知情同意书》。


  1. 子客超级管理员或者法人在微信小程序查看并签署《“开通企业授权签”知情同意书》。
查看签署
>
  1. 《“开通企业授权签”知情同意书》签署完成后,控制台显示本企业授权签已开通。

  1. 本(己方)企业授权签开通后,可以选择那些模板本企业是授权签,也可以配置哪些员工可以发起授权签的合同。

二. 使用模板发起本(己方)企业授权签的合同​

电子签为您提供了 通过文件发起签署流程 以及 通过模板发起签署流程 两种发起方式,如果您选择模板发起请阅读本节内容,如果您选择文件发起请阅读下一节内容。

这部分的流程可以参考 创建模板&设置成本企业授权签 和 【用模板创建签署流程】编写示例视频教程这两个视频教程。

  1. 开通本(己方)企业授权签后,下面介绍怎么将创建授权签的合同模板,首先进入模板的创建流程。

  1. 按照下面的图示创建合同模板
  • 上传PDF
  • 增加签署控件
  • 本(己方)企业作为其中一个签署方
  • 分配签署控件给本(己方)企业
  • 保存模板
  1. 将模板配置成本(己方)企业授权签模板,按照下面的步骤进行
  • 进入企业授权签管理界面
  • 点击添加授权签模板进入模板添加为本(己方)企业授权签模板的选择界面
  • 选择刚才创建的模板,点击下一步进入本(己方)企业授权签使用的印章的选择页面
  • 点击选择印章,在出现的弹窗中选择需要使用的印章后,点击确认
  • 点击印章选择页面上的下一步,保存授权签的印章选择,
  • 可以看到是否设置成功的界面。如果设置失败也会展示失败的原因,可以修改后重试

三. 设置/重置员工授权PIN码​

员工 授权 PIN 码 用于通过第三方应用 API 接口以该员工为经办人发起授权签合同。

  1. 通过生成子客登录链接生成员工的登录链接,对应的员工点击登录子客控制台, 然后到 企业中心->拓展服务点击企业授权签署栏目的员工PIN码设置进行PIN码设置。

  2. 未设置时单击设置,在弹窗中单击确认,系统生成32位 授权 PIN 码 并仅当次展示,单击复制并妥善保存。


  3. 弹窗可以看到已经设置成功


  4. 已设置后仅保留重置入口。单击重置,在确认弹窗中单击确定,新 授权 PIN 码 仅当次展示,请立即复制保存。


四. 接口发起本(己方)企业授权签的合同​

通过模版发起合同(CreateFlowsByTemplates)时指定需要授权签的企业(即发起方企业)的ApproverType为ORGANIZATION_PIN_CODE_SIGN。示例:

入参


{
"Agent": {
"AppId": "yDwhxUUckp3gl8j5UuFX33LSNozpRsbi",//应用的appid
"ProxyOrganizationOpenId": "org_dianziqian",//本企业的org_open_id
"ProxyOperator": {
"OpenId": "n9527"//发起员工的openid
}
},
"FlowInfos": [{
"FlowName": "小狗买卖合同(15:15:35)",//这个合同的名字
"TemplateId": "yDCHZUUckpa92gkgUEGCHIpxTXEX7JWe",//使用的模板的id
"FlowApprovers": [{
"ApproverType": "ORGANIZATION_PIN_CODE_SIGN",//本(己方)企业授权PIN码签的参与方式
"PinCode":"签署校验码",
}
]
}
]
}

出参


{
"Response": {
"FlowIds": [
"yDCHZUUckpa983dbUuc3g1LBm7eN2CjI"//生成的合同的id
],
"FlowApprovers": [
{
"FlowId": "yDCHZUUckpa983dbUuc3g1LBm7eN2CjI",
"Approvers": [
{
"SignId": "yDCHZUUckpa983daUuc3g1LBhgK5L5in",
"RecipientId": "yDCHZUUckpa9835pUuc3g1LwmPSDXHmJ",
"ApproverRoleName": "典子谦示例企业"
}
]
}
],
"RequestId": "a96086f2-483a-497d-a07b-3cb958bb21aa"
}
}

注意:通过模版发起本企业授权签合同时,本企业经办人不填,会以发起方(Agent中指定的企业和员工)作为经办人,不可更改。即使在 FlowApprovers 中额外指定了本企业经办人(如OpenId 等员工信息)也不生效,仍会用发起方员工来填充。

上述示例签署的效果


三. 使用PDF文件发起本(己方)企业授权签的合同​

限制:通过文件发起合同时本(己方)企业授权签能力为白名单功能,使用前请联系对接的客户经理沟通。

  1. 开通本(己方)企业授权签后,下面介绍怎么配置使用PDF文件发起(己方)企业授权签的合同。
  • 进入企业授权签管理界面


  • 依次点击企业合作方授权->前往授权进入授权页面


  • 在授权页面选择授权那些印章可用于文件发起的授权签


  • 保存印章授权,会出现授权二维码,需要子客的超级管理员或者法人用微信扫描后签署《授权同意书》


  • 子客的超级管理员或者法人签署《授权同意书》


  • 可以到控制台看到授权完成


提示: 除了通过以上方式进入控制台进行授权外,还可以通过接口获取的授权链接进行授权。接口请参见创建他方企业授权签授权链接(PlatformAppAuthorization参数指定为true),通过此接口SealTypes字段还可以指定可被授权的印章类型。

  1. 接口发起本(己方)企业授权签的合同

通过文件发起合同(ChannelCreateFlowByFiles)指定本(己方)企业授权签的示例如下,为方便描述我们将接口入参以 json 格式进行展示:

入参


{
"Agent": {
"AppId": "yDwhxUUckp3gl8j5UuFX33LSNozpRsbi",//应用的appid
"ProxyOrganizationOpenId": "org_dianziqian",//本企业的org_open_id
"ProxyOperator": {
"OpenId": "n9527"//发起员工的openid
}
},
"FlowName": "小狗买卖(16:00:47)", //合同的名字
"FlowApprovers": [
{
"OrganizationName": "典子谦示例企业", //本企业的名字(这个是必填的)
"ApproverType": "ORGANIZATION_PIN_CODE_SIGN", //文件发起 , 本(己方)企业员工授权PIN码签参与类型,必须为ORGANIZATION_PIN_CODE_SIGN
"PinCode":"签署校验码",
"SignComponents": [ //签署控件(必填)
{
"ComponentType": "SIGN_SEAL", // 企业印章控件
"ComponentWidth": 250,//印章的宽
"ComponentHeight": 80,//印章的高
"ComponentPage": 1,//印章在的页码
"ComponentPosX": 146.15625,//印章的位置横坐标
"ComponentPosY": 472.78125 //印章的位置纵坐标
}
]
}
],
"FileIds": [
"yDCHbUUckpaxdgecUuGS8n5yFs4WLvvy" //上传文件返回的文件ID
]
}

出参

{
"Response": {
"FlowId": "yDCHZUUckpa981suUuc3g1LkZEubftIM",//生成的合同的ID
"Approvers": [
{
"SignId": "yDCHZUUckpa981saUuc3g1LR3TMMuh6B",
"RecipientId": "yDCHZUUckpa981sbUuc3g1L8jxYxkEtM",
"ApproverRoleName": ""
}
],
"RequestId": "9666be69-48a0-461d-bd6f-a29c2b37f116"
}
}

注意:通过文件发起本企业授权签合同时,本企业经办人不填,会以发起方(Agent中指定的员工)作为经办人,不可更改。即使在 FlowApprovers 中额外指定了本企业经办人(如OpenId 等员工信息)也不生效,仍会用发起方员工来填充。

上述示例签署的效果


合作方(他方)企业授权签​

合作方(他方)企业授权签是指非发起方企业签署时不手动进入签署页面进行签署操作,由腾讯电子签负责自动给合同进行盖章动作。

1. 合作方(他方)企业授权签业务限制​

  • 合作方授权签能力为白名单功能,使用前请联系对接的客户经理沟通。
  • “合作方”只支持和发起方同一个应用(AppId)下的子客企业,不能跨应用,也不支持SaaS企业。

2. 合作方(他方)企业授权​

示例会出现两个企业,一个是典子谦示例企业,另一个是益达呱呱的子客

我们准备实现典子谦示例企业发起合同给益达呱呱的子客, 益达呱呱的子客这个企业签署方授权签的效果。

在这个示例中益达呱呱的子客就是合作方(他方)授权签 需要通过生成子客登录链接生成合作方(他方)企业的超级管理员或者法人登录链接, 合同方企业的超级管理员或者法人点击链接进入控制台后按照下面的操作进行授权。

  • 合作方益达呱呱的子客的法人或超管登陆子客控制台,并开通本方授权签,这个可以参照上面的开通本(己方)企业授权签功能章节
  • 合作方益达呱呱的子客的法人或超管依次点击管理->企业合作方授权进入到授权页面
  • 合作方益达呱呱的子客的法人或超管进行印章的授权
  • 合作方益达呱呱的子客的法人或超管微信扫二维码签署《授权同意书》
  • 合作方益达呱呱的子客的法人或超管微信扫描二维码后签署《授权同意书》
  • 控制台可以看到授权成功

提示: 除了通过以上方式进入控制台进行授权外,还可以通过接口获取的授权链接进行授权。接口请参见创建他方企业授权签授权链接,通过此接口SealTypes字段还可以指定可被授权的印章类型。

3. 设置/重置合作方授权 PIN 码​

授权 PIN 码 由授权方企业的法人或超管设置,用于被授权方通过 API 接口发起授权签合同时校验。同一合作方企业的所有授权(按模板、按印章)共用1个 授权 PIN 码。

  1. 通过生成子客登录链接生成员工的登录链接,对应的员工点击登录子客控制台, 然后到 企业中心->拓展服务点击企业授权签署栏目的管理,在我给合作方授权列表中找到目标企业,进行PIN码设置。

  2. 单击该企业的 设置 PIN 码(未设置时)或 重置 PIN 码(已设置时)。


  3. 在确认弹窗中单击确定,成功弹窗当次展示 授权 PIN 码,单击复制保存并提供给被授权方。


  4. 弹窗可以看到设置成功


  5. 多个企业需重置时,勾选企业后单击列表上方批量重置 PIN 码,生成1个新 授权 PIN 码 复用到所选企业。


4. 模版发起合作方(他方)企业授权签的合同​

创建模版时需要注意,对于“合作方企业”,在模版中签署方需要选择「企业签署方」,无需给合作方企业的签署控制选择印章(盖合作方授权时选的印章,选取优先级 【公章、合同专用章、其他】),且模版无需指定授权签类型。

注意:他方授权签无需要传员工OpenId,经办人默认为他方企业超管。即使传了员工OpenId等员工信息也不生效,会用合作方(他方)给我们授权签授权的授权人(他方企业超管)来授权签。示例:

入参

{
"Agent": {
"AppId": "yDwhxUUckp3gl8j5UuFX33LSNozpRsbi",//应用的appid
"ProxyOrganizationOpenId": "org_dianziqian",//发起方企业的org_open_id
"ProxyOperator": {
"OpenId": "n9527"//发起方企业员工的openid
}
},
"FlowInfos": [
{
"FlowName": "小狗买卖合同(17:07:48)",//流程的名字
"TemplateId": "yDCHZUUckpa98o6dUuc3g1LP0cK3sr2h",//使用模板的ID
"FlowApprovers": [
{
"OrganizationName": "典子谦示例企业",//本方企业的名字, 这个参与方是手动签署
"OpenId": "ggboud",//本方企业员工的openid
"OrganizationOpenId": "org_dianziqian",//本方企业的org_open_id
"ApproverType": "ORGANIZATION_PIN_CODE_SIGN",//本(己方)企业员工授权签参与类型
"PinCode":"签署校验码",
"RecipientId": "yDCHZUUckpa98oi9Uuc3g1LBvOjPT147"//本方参与的角色ID,可以通过拉取模板的信息得到
},
{
"OrganizationName": "益达呱呱的子客",//合作方企业的名字,这个合作方是授权签的
"OrganizationOpenId": "org_guagua",//合作方企业的org_open_id
"ApproverType": "OTHER_ORGANIZATION_PIN_CODE_SIGN",//合作方企业的签署方式(合作方(他方)企业授权PIN码签)
"PinCode":"签署校验码",
"RecipientId": "yDCHZUUckpa98oixUuc3g1LE93SM8QeS"//合作方企业参与的角色ID,可以通过拉取模板的信息得到
}
]
}
]
}

出参

{
"Response": {
"FlowIds": [
"yDCHZUUckpa98oigUuc3g1LSgoY7jl68" //生成的合同的合同ID
],
"FlowApprovers": [
{
"FlowId": "yDCHZUUckpa98oigUuc3g1LSgoY7jl68",
"Approvers": [
{
"SignId": "yDCHZUUckpa98oidUuc3g1LEQfe9v8Hx",
"RecipientId": "yDCHZUUckpa98oi9Uuc3g1LBvOjPT147",
"ApproverRoleName": "典子谦示例企业"
},
{
"SignId": "yDCHZUUckpa98oecUuc3g1LExd2HDPVt",
"RecipientId": "yDCHZUUckpa98oixUuc3g1LE93SM8QeS",
"ApproverRoleName": "他方企业"
}
]
}
],
"RequestId": "ec65e0ef-a7f1-48a6-aea6-5a156fef4843"
}
}

上述示例签署的效果(本方企业典子谦示例企业还没有签署) 列表


合同


5. 文件发起合作方(他方)企业授权签的合同​

文件发起合同接口(ChannelCreateFlowByFiles),为方便描述我们将接口入参以 json 格式进行展示:

注意:他方授权签无需要传员工OpenId,经办人默认为他方企业超管。即使传了员工OpenId等员工信息也不生效,会用合作方(他方)给我们授权签授权的授权人(他方企业超管)来授权签。示例:

{
"Agent": {
"AppId": "yDwhxUUckp3gl8j5UuFX33LSNozpRsbi",//应用的appid
"ProxyOrganizationOpenId": "org_dianziqian",//发起方企业的org_open_id
"ProxyOperator": {
"OpenId": "n9527"//发起方企业员工的openid
}
},
"FlowName": "小狗买卖合同(17:25:40)",
"Unordered": true,
"FlowApprovers": [{
"OrganizationName": "益达呱呱的子客",//合作方企业的名字,这个合作方是授权签的
"OrganizationOpenId": "org_guagua",//合作方企业的org_open_id
"ApproverType": "OTHER_ORGANIZATION_PIN_CODE_SIGN",//合作方企业的签署方式(合作方(他方)企业授权PIN码签)
"PinCode":"签署校验码",
"SignComponents": [{
"ComponentType": "SIGN_SEAL", // 企业印章控件
"ComponentWidth": 250,//印章的宽
"ComponentHeight": 80,//印章的高
"ComponentPage": 1,//印章在的页码
"ComponentPosX": 146.15625,//印章的位置横坐标
"ComponentPosY": 472.78125 //印章的位置纵坐标
"ComponentValue": "" // 印章ID非必传,若未指定,则按照授权印章列表中的 【公章、合同专用章、其他】的优先级自动选择印章
}
]
}
],
"FileIds": [
"yDCHZUUckpa98oigUuc3g1LSgoY7jl68" //上传文件返回的文件ID
],
"Action": "ChannelCreateFlowByFiles"
}

PIN 码认证令牌计算规则​

当使用 PIN 码授权签进行身份验证时,需要按以下规则生成 PinCode。

计算公式​

PinCode = HEX(HMAC_SHA256(HEX(SHA256(对方授权的 PIN 码)),(合同名称)))
参数说明
PinCodePIN 码认证令牌,用于校验签署方的 PIN 码身份凭证。
对方授权的 PIN 码企业员工、合作方企业、他方个人授权的 PIN 码
合同名称签署流程名称,即FlowName
SHA256(对方授权的 PIN 码)对 对方授权的 PIN 码 进行 SHA-256 摘要计算后的结果,将十六进制字符串作为 HMAC-SHA256 的密钥。
HMAC_SHA256(key, message)使用 HMAC-SHA256 算法计算签名。本接口中,key = HEX(SHA256(对方授权的 PIN 码)),message = 合同名称。

计算代码示例​

Java(JDK 8 及以上)

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

public final class PinCodeUtil {

private static final String HMAC_SHA256 = "HmacSHA256";

private PinCodeUtil() {
}

/**
* 计算 PinCode。
*
* @param pin 对方授权的 PIN 码
* @param flowName 合同名称
* @return 64 位小写十六进制字符串
*/
public static String calculate(String pin, String flowName) {
if (pin == null || flowName == null) {
throw new IllegalArgumentException("pin、flowName 均不能为 null");
}
return hmacSha256Hex(sha256Hex(pin), flowName);
}

private static String sha256Hex(String plainText) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
return toHex(digest.digest(plainText.getBytes(StandardCharsets.UTF_8)));
} catch (Exception e) {
throw new IllegalStateException("SHA-256 计算失败", e);
}
}

private static String hmacSha256Hex(String key, String message) {
try {
Mac mac = Mac.getInstance(HMAC_SHA256);
byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
mac.init(new SecretKeySpec(keyBytes, HMAC_SHA256));
return toHex(mac.doFinal(message.getBytes(StandardCharsets.UTF_8)));
} catch (Exception e) {
throw new IllegalStateException("HMAC-SHA256 计算失败", e);
}
}

private static String toHex(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 2);
for (byte b : bytes) {
String hex = Integer.toHexString(b & 0xff);
if (hex.length() == 1) {
sb.append('0');
}
sb.append(hex);
}
return sb.toString();
}
}

调用方式:String pinCode = PinCodeUtil.calculate("123456", "劳动合同-张三")

Go

package pincode

import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
)

// CalculatePinCode 计算 PinCode。
// pin 为对方授权的 PIN 码,flowName 为合同名称,返回 64 位小写十六进制字符串。
func CalculatePinCode(pin, flowName string) string {
return hmacSha256Hex(sha256Hex(pin), flowName)
}

func sha256Hex(plainText string) string {
sum := sha256.Sum256([]byte(plainText))
return hex.EncodeToString(sum[:])
}

func hmacSha256Hex(key, message string) string {
mac := hmac.New(sha256.New, []byte(key))
mac.Write([]byte(message))
return hex.EncodeToString(mac.Sum(nil))
}

调用方式:pinCode := pincode.CalculatePinCode("123456", "劳动合同-张三")

Python(3.x)

import hashlib
import hmac


def calculate_pin_code(pin: str, flow_name: str) -> str:
"""计算 PinCode,返回 64 位小写十六进制字符串。

:param pin: 对方授权的 PIN 码
:param flow_name: 合同名称
"""
if pin is None or flow_name is None:
raise ValueError("pin、flow_name 均不能为 None")
key = hashlib.sha256(pin.encode("utf-8")).hexdigest()
return hmac.new(key.encode("utf-8"), flow_name.encode("utf-8"), hashlib.sha256).hexdigest()

调用方式:pin_code = calculate_pin_code("123456", "劳动合同-张三")