创建合同草稿
描述
根据业务分类的预设配置或者接口的传参,创建相应的合同草稿,业务分类在契约锁云平台中配置。若合同文件已提前在云平台业务分类中维护,可通过send参数设置创建并直接发起合同。创建合同草稿后,支持传入合同id或bizId,进行草稿合同信息的覆盖修改。草稿文件超1年不发起,将自动删除。
业务分类配置介绍:
签署方:
(1)签署方预设时,用户传入的签署方与业务分类配置的签署方必须完全一致(数量、类型、顺序均匹配),此时会使用业务分类配置的签署流程、签署位置、印章等(发起方除外,发起方的签署流程下面介绍)。
(2)签署方非预设时,以参数中传入的签署方为准(发起方除外)。
发起方签署流程:
(1)发起方流程预设时,发起方使用预设的签署流程、签署位置、印章等。
(2)发起方流程非预设时,创建合同时, 需要主动传入签署动作。
文件模板:
发起合同时,必须保证合文件模板中发起方的必填参数均已填写完成。
请求地址
/v2/contract/draft
请求方法
POST
请求格式
application/json;charset=UTF-8
请求参数
Contract(合同):
参数 | 类型 | 是否必传 | 长度 | 描述 | 示例 |
---|---|---|---|---|---|
id | String | 合同ID(接口返回值) | 2282107372149145600 | ||
bizId | String | N | 50 | 业务ID; 一个合同对应一个bizId,不能重复 | 694883721044197377 |
tenantName | String | N | 100 | 子公司名称,若需以子公司身份发起合同需要传递该值,默认为对接方公司 | 阿里巴巴 |
subject | String | CY | 100 | 合同主题(合同名称) 若业务分类中未配置文件主题按规则生成,则需要传递 | 伊利创建电子签 |
description | String | N | 300 | 合同描述 | 这是一段描述 |
sn | String | N | 50 | 合同编号;可由用户传入, 也可由契约锁自动生成 | 001 |
expireTime | String | N | 合同截止签署时间;
格式为yyyy-MM-dd HH:mm:ss,
默认截止签署时间为业务分类中配置的时间 截止签署时间距发起时间不能大于2年,大于2年时将会自动调整为发起时间+2年 |
2022-03-24 23:59:59 | |
endTime | String | N | 合同到期时间; 格式为yyyy-MM-dd HH:mm:ss, 传递后会重置为当天23:59:59 | 2022-03-25 23:59:59 | |
ordinal | Boolean | N | 是否顺序签署;默认为true | true | |
send | Boolean | N | 是否发起合同; 发起合同后不能再进行添加文档、 指定签署位置等操作 | true | |
category | Category | N | 业务分类;默认为云平台的“默认业务分类” | 详见Category | |
creator | User | N | 创建人;默认为虚拟用户, 创建人必须已经加入对接方的公司 | 详见User | |
status | String | 合同状态(接口返回值):DRAFT(草稿) RECALLED(已撤回),SIGNING(签署中),REJECTED(已退回),COMPLETE(已完成),EXPIRED(已截止签署),FILLING(拟定中),INVALIDING(作废中),INVALIDED(已作废) | DRAFT | ||
signatories | List<Signatory> | Y | 签署方;签署合同的公司/个人 | 详见Signatory详情 | |
signFlowStrategy | String | N | 接收方签署策略 ANY_SIGN_FINISH(任意一个接收方签署完成,则合同完成);ALL_SIGN_FINISH(需要所有接收方签署完成) | ALL_SIGN_FINISH | |
templateParams | List<TemplateParam> | N | 模板参数,用于文件模板的填参(支持格式为文本、单选框、多选框格式的参数) | 详见TemplateParam | |
documents | List<Document> | 合同文档(接口返回值) | 详见Document | ||
copySendTime | String | N | 指定合同抄送时机 SEND:发起时抄送;FINISH:签署完成时抄送 不传时,以业务分类及公司配置为准 |
SEND | |
copySendReceivers | List<CopySendReceiver> | N | 抄送人列表 | 详见CopySendReceiver | |
tags | List<String> | N | 标签列表 | ["标签1", "标签2"] | |
relatedContractIds | List<String> | N | 关联的合同ID列表(最多50份) | ["2946976877122183945", "2947028052307632719"] | |
customFields | List<ContractCustomField> | N | 合同自定义参数(填充参数,需在业务分类下对自定义文件表单进行配置) | 详见ContractCustomField | |
businessData | String | N | 100 | 自定义业务参数,会在合同回调时作为参数回调 | 用户自定义业务数据 |
notifySponsor | boolean | N | 通知发起方经办人 【作用】 控制发起电子签约文件时,是否需要通知发起方的经办人 【传参】 true(发送消息通知),false(不发送消息通知);不传值默认为:false(不发送消息通知) |
true | |
callbackUrl | String | N | 300 | 合同回调地址 【作用】 合同状态变更时,向回调地址回调合同信息 【传参】 若接口未传入回调地址,则向应用配置的回调地址回调合同信息 |
https://test.callbackurl.com |
Category(业务分类):
参数 | 类型 | 是否必传 | 长度 | 描述 | 示例 |
---|---|---|---|---|---|
id | String | CY | 业务分类ID | 2963764365425430651 | |
name | String | CY | 100 | 业务分类名称; 如果id为空时,使用name来确定业务分类, 需要保证name对应的业务分类唯一 | 一类业务 |
User(个人用户):
参数 | 类型 | 是否必传 | 长度 | 描述 | 示例 |
---|---|---|---|---|---|
name | String | CY | 50 | 名称,作为抄送接收方参数时,该参数必传 | 张三 |
contact | String | Y | 联系方式 | 10000000001 | |
contactType | String | Y | MOBILE, EMAIL, EMPLOYEEID, NUMBER, BIZID | 联系类型:MOBILE(手机号),EMAIL(邮箱),EMPLOYEEID(员工ID),NUMBER(员工编号),BIZID(用户在对接方系统的唯一标识) | MOBIEL |
Signatory(签署方):
参数 | 类型 | 是否必传 | 长度 | 描述 | 示例 |
---|---|---|---|---|---|
id | String | 签署方ID(接口返回值) | 2963768923413336403 | ||
tenantType | String | Y | 签署方类型:COMPANY(公司), PERSONAL(个人) | COMPANY | |
status | String | 签署方状态(接口返回值):DRAFT(草稿) RECALLED(已撤回),SIGNING(签署中),REJECTED(已退回),SIGNED(已完成),EXPIRED(已截止签署),FILLING(拟定中),WAITING(待签署),INVALIDING(作废中),INVALIDED(已作废) | DRAFT | ||
tenantName | String | CY | 视乎签署方类型而定, PERSONAL-50 COMPANY-100 | 签署方名称, delaySet为false时必填 | 腾讯公司 |
receiver | User | CY | 接收人 ,delaySet为false时必填,tenantType为个人时必填 | 详见User | |
serialNo | Integer | N | 签署顺序 | 1 | |
actions | List<Action> | CY | 签署动作(签署流程)tenantType为COMPANY时必填 | 详见Action | |
stampers | List<Stamper> | N | 指定签署位置 | 详见Stamper | |
attachments | List<Attchment> | N | 附件要求;用于指定用户签署时上传的附件 | 详见Attachment | |
userAuthInfo | UserAuthInfo | N | 指定签署方认证信息 | 详见UserAuthInfo | |
category | Category | N | 仅公司类型接收方(内部企业)生效,可指定该签署方对应的业务分类 | 详见Category | |
delaySet | Boolean | N | 是否延迟设置签署方信息,默认为false | false | |
defaultCategoryAccepted | Boolean | N | 仅公司类型接收方(内部企业)生效,当业务分类不传时,是否取接收方默认业务分类【传参方式】TRUE:满足发起方配置的签署要求基础上,同需满足接收方默认业务分类配置的签署要求进行签署 FLASE:接收方按发起方配置的签署要求进行签署 | false | |
fixedFlow | Boolean | N | 完全通过接口指定签署方签署节点 【作用】 1、业务分类可预设签署方的签署节点,对应签署方按分类预设的签署节点进行签署(组织接收方可自行动态添加签署节点) 2、可配置当前参数实现签署方的签署节点完全由接口指定,配置生效后,分类预设的签署节点将不生效,组织接收方也无法自行添加签署节点 【传参】 取值范围:true(完全通过接口指定签署节点),false(不完全通过接口指定签署节点);不传值默认为:false(完全通过接口指定签署节点) |
false | |
signatoryNo | String | N | 50 | 签署方编号 【作用】 支持业务系统传入签署方唯一标识,方便后续通过此唯一标识定位签署方,一份电子签约文件中每个签署方的编号不允许重复 |
signatory_1 |
signValidateWay | String | N | 仅对SAAS用户生效,意愿校验方式:【作用】用于指定签署时使用的意愿校验方式【传参】 SAAS_CONFIG(按照服务商配置)、DEFAULT(签署密码/验证码校验)、SIGNPWD(仅签署密码)、PIN(验证码校验)、FACE(扫脸校验-不可降级)、FACE_DEFAULT(扫脸校验-失败降级密码验证码)。不传值时默认为:SAAS_CONFIG(按照服务商配置) | SAAS_CONFIG |
Action(签署动作/签署流程):
参数 | 类型 | 是否必传 | 长度 | 描述 | 示例 |
---|---|---|---|---|---|
id | String | 签署节点ID(接口返回值) | 2963773216610636689 | ||
type | String | Y | 类型:COMPANY(企业签章),OPERATOR(经办人签字) LP(法定代表人签字),AUDIT(审批),PERSONAL(审批并签字) | COMPANY | |
status | String | 动作状态(接口返回值):INIT(初始化) START(已启动),FINISH(已完成),STOP(意外终止) | START | ||
name | String | N | 50 | 名称 | 签署动作 |
serialNo | Integer | N | 执行顺序,从0开始 | 0 | |
autoSign | Boolean | N | 是否可以自动签,默认为false不进行自动签(仅支持发起方下的企业签章动作;若该值为true时,对应的业务分类 不应预设签署方,并且参数send需要设为false,后续调用发起合同接口) | false | |
corpSealIds | List<Long> | N | 9 | 印章ID集合 【作用】 用于指定签署时可选印章列表,仅对发起方和内部企业接收方生效 【传参方式】 可传一个或多个,最多不可超过9个 【特殊说明】 1、当指定了多个印章时,该签署节点将不可进行批量签署,且调用静默签署接口时需要在接口重新指定印章; 2、对于内部企业接收方,仅当内部接收方没有收件流程设置,且defaultCategoryAccepted为false或者在接口指定了非默认的业务分类时生效 |
[2963869214318056324, 2963995940230582347] |
corpOperators | List<User> | N | 操作人 【作用】 1、可指定印章签章人或审批人 2、支持指定发起方和接收方签章人 【特殊说明】 1、对于内部企业接收方,仅当内部接收方没有收件流程设置,且defaultCategoryAccepted为false或者在接口指定了非默认的业务分类时生效 2、对于外部企业接收方,仅当操作人同为经办人时才生效,且不可用于审批或审批签字节点 |
详见User | |
stampers | List<Stamper> | N | 指定签署位置 | 详见Stamper | |
actionNo | String | N | 50 | 签署节点编号 【作用】 可传入业务系统自行定义的签署节点的唯一编号,方便后续通过此参数定位签署节点,一个签署方下每个签署节点的编号不允许重复 |
action_1 |
Attchment(附件要求):
参数 | 类型 | 是否必传 | 长度 | 描述 | 示例 |
---|---|---|---|---|---|
id | String | 附件ID(接口返回值) | 2964009334207730034 | ||
title | String | Y | 100 | 名称 | 测试用附件001 |
required | Boolean | N | 是否必须;默认为false | false | |
needSign | Boolean | N | 是否需要签署;默认为false | false |
UserAuthInfo(签署方认证信息):
参数 | 类型 | 是否必传 | 长度 | 描述 | 示例 |
---|---|---|---|---|---|
idCardNo | String | N | 指定认证身份证号码 | 123321200001019876 | |
bankNo | String | N | 指定认证银行卡号,仅银行卡认证时生效 | 3598156135289813 | |
bankMobile | String | N | 指定认证银行卡预留手机号,仅银行卡认证时生效 | 12345678910 | |
modifyFields | List<OpenAuthModifyField> | N | 认证可修改项 (姓名-USERNAME,身份证-IDCARDNO,银行卡号-BANKNO,银行卡预留手机号-BANKMOBILE) | ["USERNAME", "IDCARDNO"] |
CopySendReceiver(抄送人):
参数 | 类型 | 是否必传 | 长度 | 描述 | 示例 |
---|---|---|---|---|---|
name | String | Y | 50 | 抄送人姓名 | 王五 |
receiver | User | Y | 抄送人联系方式,联系方式类型只允许使用Mobile、Email | 详见User | |
createTime | String | N | 创建时间;格式为yyyy-MM-dd HH:mm:ss(接口返回值) | 2022-05-17 10:34:56 | |
send | String | N | 是否已经抄送(接口返回值) | true | |
prohibitType | String | N | 抄送人不可查看的内容。存证报告(NOTARY_FILE) | NOTARY_FILE | |
copySendPersonType | String | N | 抄送人用户类型 【作用】 指定抄送人所属用户类型。 外部个人:抄送给个人身份,与企业身份无关 内部个人:抄送给企业下内部员工,员工离职后不能查看被抄送的文件 【传参方式】 默认为外部个人。 EXTERNAL_USER:外部个人; INTERNAL_USER:内部个人 |
EXTERNAL_USER |
TemplateParam(合同文档参数):
参数 | 类型 | 是否必传 | 长度 | 描述 | 示例 |
---|---|---|---|---|---|
name | String | Y | 文档参数名称 | 参数1 | |
value | String | Y | 一、PDF模板、Word模板、旧版本HTML模板编辑器不同参数类型的传参规则如下: 1)普通文本:大小不超过300 2)日期:格式为yyyy-MM-dd,如:2019-06-04 3)身份证号:只能是15或18位的数字或字母,如:123456789123456789 4)单选:只能是单选的选项名称,如:val1 多选:只能是多选的选项名称,传入多个值时,用逗号隔开,如:val1,val2 5)图片,图片的base64格式加前缀「data:image/png;base64,」,其中image/png为实际的图片格式,示例如下:data:image/png;base64,/9j/4AAQSk 6)动态表格,value是一个Map(键值对)数组,每个Map对应表格的每行,Map的key和value对应列名和值,示例如下: [{"column1":"1","column2":"2","column3":"3","column4":"4"},{"column1":"5","column2":"6","column3":"7","column4":"8"}]表示一个2行4列的表格 二、新版本HTML编辑器的单多选、动态表格参数传参格式有调整,其他与旧版保持一致: 1)单选、多选、下拉选择:支持传入多选的选项名或对应的选项value值,传入多个值时,用逗号隔开,参数对应选项的value值可在模板详情接口(/v2/template/detail)进行查询 2)动态表格:提供了2种传参方式: -以key-value的形式传参,与旧版传参规则相同,在模板编辑页面维护好动态表格每1列的key值之后,按列进行传参 -以二维数组的形式传参,示例如下: [["1","2","3","4"],["1","2","3","4"]]表示一个2行4列的表格,如若需要合并单元格,传参示例如下: [["1",""#.1","3""4"],[#.2","6","7","#.3"]], #.1表示向左合并单元格,#.2表示向上合并单元格,#.3表示向左上合并单元格 |
详见描述 | |
readOnly | Boolean | N | 参数是否只读,默认为false;传入true时,在页面上进行合同填参时该参数不可编辑 | false |
当使用html模板时,合同文档参数的value值说明:
参数类型是单行文本时,value大小不超过300; 参数类型是日期时,value格式为:yyyy-MM-dd,如:2019-06-04; 参数类型是身份证号,value只能是15或18位的数字或字母,如:123456789123456789; 参数类型是单选,value只能是单选的选项,如:val1; 参数类型是多选,value只能是多选的选项,多个value用逗号隔开,如:val1,val2; 参数类型是表格,value是一个Map(键值对)数组,每个Map对应表格的每行,Map的key和value对应列名和值,示例如下: [{"column1":"1","column2":"2","column3":"3","column4":"4"},{"column1":"5","column2":"6","column3":"7","column4":"8"}]表示一个2行4列的表格。 参数类型是图片,value是图片的base64格式加前缀「data:image/png;base64,」,其中image/png为实际的图片格式,示例如下:data:image/png;base64,/9j/4AAQSk...。
ContractCustomField(合同自定义参数):
参数 | 类型 | 是否必传 | 长度 | 描述 | 示例 |
---|---|---|---|---|---|
key | String | CY | 255 | 参数key;key和name至少一个非空 | age |
name | String | CY | 100 | 参数名称;key和name至少一个非空 | age |
value | String | Y | 2020 | 参数值 | 25 |
Document(合同文档):
参数 | 类型 | 是否必传 | 长度 | 描述 | 示例 |
---|---|---|---|---|---|
id | String | 附件ID | 2964011533600084814 | ||
title | String | 100 | 名称 | 测试用附件001 | |
pageCount | Integer | 文档页数 | 5 | ||
createTime | String | 创建时间;格式为yyyy-MM-dd HH:mm:ss | 2022-06-16 23:59:59 |
Stamper(签署位置):
参数 | 类型 | 是否必传 | 长度 | 描述 | 示例 |
---|---|---|---|---|---|
type | String | Y | 签署类型: COMPANY(公章),PERSONAL(个人签名), LP(法人章),TIMESTAMP(时间戳), ACROSS_PAGE(骑缝章), ACROSS_PAGE_ODD(奇数页骑缝章),ACROSS_PAGE_EVEN(偶数页骑缝章),ACROSS_PAGE_SCOPE(指定页面范围骑缝章) |
COMPANY | |
acrossType | String | N | 骑缝章位置指定方式 【作用】 指定骑缝章位置时,可以通过此参数控制位置的指定方式 【传参】 取值范围:SINGLE_DOCUMENT(每份文档单独指定骑缝章位置),ALL_DOCUMENT(多份文档合并指定骑缝章位置);不传值默认为:SINGLE_DOCUMENT(每份文档单独指定骑缝章位置)。 |
SINGLE_DOCUMENT | |
sealPageConfig | String | N | 骑缝章自定义页面加盖 【传参】 1、可传入页码或页码范围,多组页码或页码范围之间用英文逗号(,)分隔,例如:2,4 ~ 7,8 ~ 11。 2、当rectType(签署位置类型)为ACROSS_PAGE_SCOPE(指定页面范围骑缝章)时,此参数必填。 |
1,2~3 | |
documentId | String | Y | 文件模板id,业务分类绑定文件时,支持传入绑定文件后生成的模板id(可调用业务分类详情接口获取)用于指定签署位置 | 2964011533600084814 | |
documentIds | String | N | 签署文档id集合 【作用】 用于指定签署位置所在的签署文档 |
2964011533600084814,2964011533611111111 | |
keyword | String | N | 关键字 | ||
keywordIndex | Integer | N | 关键字索引:1代表第1个关键字,0代表所有关键字 ,-1代表倒数第1个关键字;默认为1 |
0 | |
page | Integer | N | 坐标页码,0代表所有 ,-1代表最后一页 | 0 | |
offsetX | Decimal | N | 横坐标/关键字偏移量 | 0.1 | |
offsetY | Decimal | N | 纵坐标/关键字偏移量 | 0 | |
datePatterns | List |
N | 时间戳格式: HYPHEN(yyyy-mm-dd),Chinese(yyyy年mm月dd日(阿拉伯数字) ALL_Chinese(yyyy年mm月dd日(中文)),ENGLISH(dd MMM yyyy(英文)) 仅type为TIMESTAMP时生效,可指定多个格式 |
["HYPHEN"] |
签署位置说明:
签署位置有以下两种表现方式:
1、用关键字确定坐标:
keyword:关键字。
offsetX:横坐标偏移量;默认合同页的宽为1,所以取值范围是(-1, 1)。
offsetY:纵坐标偏移量;默认合同页的高为1,所有取值范围是(-1, 1)。
找到keyword的坐标(x, y),再加上偏移量(offsetX, offsetY),最终得到的坐标是(x+offsetX, y+offsetY)。
坐标原点是合同页的左下角,坐标是指印章图片的左下角的坐标。
2、直接确定坐标:
page:印章所在页码;从1开始。
offsetX:横坐标;默认合同页的宽为1,所以取值范围是(0, 1)。
offsetY:纵坐标;默认合同页的高为1,所以取值范围是(0, 1)。
由page确定页码,由(offsetX, offsetY)确定坐标。
坐标原点是合同页的左下角,坐标是指印章图片的左下角的坐标。
请求示例
Http示例
POST /v2/contract/draft HTTP/1.1
Host: [host]
x-qys-open-timestamp: [替换为请求头生成的Timestamp]
x-qys-open-signature: [替换为请求头生成的Signature]
x-qys-open-accesstoken: [替换为请求头生成的Token]
Content-Type: application/json
{
"sn": "123321",
"subject": "V2合同",
"description": "合同描述",
"expireTime": "2019-08-25 00:00:00",
"ordinal": true,
"send": false,
"category": {
"name": "V2"
},
"creator": {
"contact": "18435186216",
"contactType": "MOBILE"
},
"signatories": [
{
"tenantType": "COMPANY",
"tenantName": "思晨教育",
"receiver": {
"contact": "10100000000",
"contactType": "MOBILE"
},
"serialNo": 1,
"actions": [
{
"type": "COMPANY",
"name": "公章签署动作",
"serialNo": 1,
"operators": [
{
"contact": "10100000000",
"contactType": "MOBILE"
}
]
},
{
"type": "AUDIT",
"name": "审批动作",
"serialNo": 3,
"operators": [
{
"contact": "10100000000",
"contactType": "MOBILE"
}
]
},
{
"type": "LP",
"name": "法人签署动作",
"serialNo": 4
}
]
},
{
"tenantType": "PERSONAL",
"tenantName": "吉哲",
"receiver": {
"contact": "10100000000",
"contactType": "MOBILE"
},
"serialNo": 2
}
]
}
Java示例
// 初始化sdkClient
String serverUrl = "https://openapi.qiyuesuo.cn";
String accessKey = "替换为您申请的开放平台App Token";
String accessSecret = "替换为您申请的开放平台App Secret";
SdkClient sdkClient = new SdkClient(serverUrl, accessKey, accessSecret);
// 合同基本参数
Contract contract = new Contract();
contract.setSubject("测试合同");
contract.setCategory(new Category("个人-平台-预设签署方-默认流程"));
contract.setBizId("");
contract.setSend(false);
// 个人
Signatory signatory1 = new Signatory();
signatory1.setTenantName("个人接收方姓名");
signatory1.setTenantType("PERSONAL");
signatory1.setReceiver(new User("个人接收方姓名", "10100000000", "MOBILE"));
signatory1.setSerialNo(1);
// 对接方
Signatory signatory2 = new Signatory();
signatory2.setTenantName("测试合同");
signatory2.setTenantType("COMPANY");
signatory2.setReceiver(new User("公司接收方名称", "10100000000", "MOBILE"));
signatory2.setSerialNo(2);
Action action = new Action("COMPANY", 1);
signatory2.addAction(action);
// 设置签署方
contract.addSignatory(signatory1);
contract.addSignatory(signatory2);
// 设置模板参数
contract.addTemplateParam(new TemplateParam("param1", "value1"));
contract.addTemplateParam(new TemplateParam("param2", "value2"));
// 设置模板参数:表格类型的参数
//List
C#示例
//初始化sdkClient
String serverUrl = "https://openapi.qiyuesuo.cn";
String accessKey = "替换为您申请的开放平台App Token";
String accessSecret = "替换为您申请的开放平台App Secret";
SDKClient client = new SDKClient(accessKey, accessSecret, serverUrl);
ContractDraftRequest request = new ContractDraftRequest();
Contract contract = new Contract();
contract.Subject = "测试合同";
//添加对接方签署方
Signatory platformSignatory = new Signatory("COMPANY", new User("对接方经办人姓名", "101000000000", "MOBILE"), 1);
platformSignatory.TenantName = "测试公司";//对接方公司名称
//添加对接方签署流程,可根据需要调整
//目前对接方签署流程为:(1)员工审批 (2)法人章签署(3)公章签署
// 审批流程,并设置审批操作人
SignAction aduitAction = new SignAction("AUDIT", 1);
aduitAction.AddOperators(new User("101000000000", "MOBILE"));
platformSignatory.AddAction(aduitAction);
// 公章签署流程,并设置签署公章ID
SignAction sealAction = new SignAction("COMPANY", 2);
sealAction.SealId = "2490828768980361630";
platformSignatory.AddAction(sealAction);
// 法人章签署流程
platformSignatory.AddAction(new SignAction("LP", 3));
contract.AddSignatory(platformSignatory);
//添加个人签署方,并设置个人签署方需要上传的附件内容
Signatory personalSignatory = new Signatory("PERSONAL", new User("个人接收方姓名", "101000000000", "MOBILE"), 2);
personalSignatory.TenantName = "个人接收方姓名";//接收方名称
personalSignatory.AddAttachment(new Attachment("附件", true, false));//添加上传附件要求,并设置为必须上传
contract.AddSignatory(personalSignatory);
//设置合同基本信息
contract.ExpireTime = "2019-07-28 23:59:59";//设置合同截止签署时间,合同截止签署时间需要晚于发起时间
contract.Send = false; //合同不发起
request.Contract = contract;
string response = null;
try
{
response = client.Service(request);
}
catch (Exception e)
{
throw new Exception("创建合同草稿请求服务器失败,失败原因" + e.Message);
}
SdkResponse<Contract> sdkResponse = HttpJsonConvert.DeserializeResponse<Contract>(response);
if (!sdkResponse.ResponseCode.Equals("00000000"))
{
throw new Exception("创建合同草稿失败,失败原因:" + sdkResponse.Message);
}
Console.WriteLine("合同草稿创建成功");
PHP示例
// 初始化$sdkClient
class Util {
const url = "https://openapi.qiyuesuo.cn";
const accessKey = "替换为您申请的开放平台App Token";
const accessSecret = "替换为您申请的开放平台App Secret";
}
$sdkClient = Util::getSDk();
/\*\* 合同基本信息 \*\*/
$contract = new Contract();
// $contract->setId("");
$contract->setBizId("1111111");
$contract->setSubject("合同名称");
$contract->setDescription("合同描述");
$contract->setSn("123321");
$contract->setExpireTime("2019-07-25 00:00:00");
$contract->setOrdinal(true);
$contract->setSend(false);
/\*\*指定业务分类\*\*/
$category = new Category();
$category->setName("业务分类名称");
$contract->setCategory($category);
$creator = new User();
$creator->setContact("10100000000");
$creator->setContactType("MOBILE");
$contract->setCreator($creator);
/\*\*公司签署方\*\*/
$companySignatory = new Signatory();
$companySignatory->setTenantType("COMPANY");
$companySignatory->setTenantName("测试企业");
$companySignatory->setSerialNo(1);
/\*\*公司签署方接收人\*\*/
$receiver = new User();
$receiver->setContact("10100000000");
$receiver->setContactType("MOBILE");
$companySignatory->setReceiver($receiver);
/\*\*公章签署动作\*\*/
$companyAction = new Action();
$companyAction->setType("COMPANY");
$companyAction->setName("公章签署动作");
$companyAction->setSerialNo(1);
/\*\*公章签署操作人\*\*/
$companyOperator = new User();
$companyOperator->setContact("10100000000");
$companyOperator->setContactType("MOBILE");
$companyOperators = array();
array_push($companyOperators, $companyOperator);
$companyAction->setOperators($companyOperators);
/\*\*经办人签字动作\*\*/
$operatorAction = new Action();
$operatorAction->setType("OPERATOR");
$operatorAction->setName("经办人签字动作");
$operatorAction->setSerialNo(2);
/\*\*经办人签字操作人\*\*/
$operatorOperator = new User();
$operatorOperator->setContact("10100000000");
$operatorOperator->setContactType("MOBILE");
$operatorOperators = array();
array_push($operatorOperators, $operatorOperator);
$operatorAction->setOperators($operatorOperators);
/\*\*审批动作\*\*/
$auditAction = new Action();
$auditAction->setType("AUDIT");
$auditAction->setName("审批动作");
$auditAction->setSerialNo(3);
/\*\*审批操作人\*\*/
$auditOperator = new User();
$auditOperator->setContact("10100000000");
$auditOperator->setContactType("MOBILE");
$auditOperators = array();
array_push($auditOperators, $auditOperator);
$auditAction->setOperators($auditOperators);
/\*\*法人签署动作\*\*/
$lpAction = new Action();
$lpAction->setType("LP");
$lpAction->setName("法人签署动作");
$lpAction->setSerialNo(4);
$actions = array();
/\*\*公司签署方设置公章签署动作\*\*/
array_push($actions, $companyAction);
/\*\*公司签署方设置经办人签字动作\*\*/
array_push($actions, $operatorAction);
/\*\*公司签署方设置审批动作\*\*/
array_push($actions, $auditAction);
/\*\*公司签署方设置审批动作\*\*/
array_push($actions, $lpAction);
$companySignatory->setActions($actions);
/\*\*个人签署方\*\*/
$personalSignatory = new Signatory();
$personalSignatory->setTenantType("PERSONAL");
$personalSignatory->setTenantName("个人签署方名称");
$personalSignatory->setSerialNo(2);
$receiver = new User();
$receiver->setContact("10100000000");
$receiver->setContactType("MOBILE");
$personalSignatory->setReceiver($receiver);
/\*\*所有签署方\*\*/
$signatories = array();
array_push($signatories, $companySignatory);
array_push($signatories, $personalSignatory);
/\*\*填写模板参数\*\*/
$templateParam1 = new TemplateParam();
$templateParam1->setName("参数1");
$templateParam1->setValue("值1");
$templateParams = array();
array_push($templateParams, $templateParam1);
/\*\*合同签署方、文档、文档参数\*\*/
$contract->setSignatories($signatories);
$contract->setTemplateParams($templateParams);
$baseRequest = new ContractDraftRequest($contract);
$result = $sdkClient->service($baseRequest);
print_r($result);
Python示例
# 初始化sdkClient
url = "https://openapi.qiyuesuo.cn"
accessToken = '替换为您申请的开放平台App Token'
accessSecret = '替换为您申请的开放平台App Secret'
sdkClient = SdkClient(url, accessToken, accessSecret)
draft_contract = Contract()
draft_contract.set_subject("合同主题-人事合同")
# 设置签署方 - 对接方公司,tenantName更换为您公司的名称,接收方更正为您公司员工
company_signatory = Signatory()
company_signatory.set_tenantType("COMPANY")
company_signatory.set_tenantName("测试公司")
company_signatory.set_serialNo(1)
company_receiver = User()
company_receiver.set_contact("10100000000")
company_receiver.set_contactType("MOBILE")
company_signatory.set_receiver(company_receiver)
# 设置对接方公司签署流程 - 审批流程,并设置审批人
audit_action = Action()
audit_action.set_type("AUDIT")
audit_action.set_serialNo(1)
audit_operator = User()
audit_operator.set_contact("10100000000")
audit_operator.set_contactType("MOBILE")
audit_action.set_operators([audit_operator])
# 设置对接方公司签署流程 - 公章签署流程,并设置该流程应该签署的公章
seal_action = Action()
seal_action.set_type("COMPANY")
seal_action.set_serialNo(2)
seal_action.set_sealId("2490828768980361630")
# 设置对接方公司签署流程 - 法人章签署流程
lp_action = Action()
lp_action.set_type("LP")
lp_action.set_serialNo(3)
company_signatory.set_actions([audit_action, seal_action, lp_action])
# 设置签署方 - 个人签署方,并设置附件上传要求
personal_signatory = Signatory()
personal_signatory.set_tenantType("PERSONAL")
personal_signatory.set_serialNo(2)
personal_signatory.set_tenantName("个人接收方姓名")
personal_receiver = User()
personal_receiver.set_contact("10100000000")
personal_receiver.set_contactType("MOBILE")
personal_signatory.set_receiver(personal_receiver)
# 生成上传附件要求
personal_attachment = Attachment()
personal_attachment.set_title("附件-身份证正面照")
personal_attachment.set_required(True)
personal_signatory.set_attachments([personal_attachment])
draft_contract.set_signatories([company_signatory, personal_signatory])
# 设置合同截止签署时间
draft_contract.set_expireTime("2019-07-28 23:59:59")
# 不发起合同
draft_contract.set_send(False)
# 请求服务器
draft_response = sdkClient.request(ContractDraftRequest(draft_contract))
# 解析返回数据
draft_mapper = json.loads(draft_response)
if draft_mapper['responseCode'] != '00000000':
raise Exception("创建合同草稿失败,失败原因:", draft_mapper['message'])
draft_result = draft_mapper['result']
draft_contractid = draft_result['id']
print('创建合同草稿成功,合同ID:', draft_contractid)
Go示例
sdkClient := http.NewSdkClient("https://openapi.qiyuesuo.cn", "替换为您申请的开放平台App Token", "替换为您申请的开放平台App Secret")
contract := model.Contract{}
contract.Subject = "go测试合同-08"
user := model.User{}
user.Name = "宋一"
user.Contact = "10000000011"
user.ContactType = "MOBILE"
contract.Creator = &user
category := model.Category{}
category.Name = "平台-个人-预设流程"
contract.Category = &category
signatory1 := model.Signatory{}
signatory1.TenantName = "测试11-8-1"
signatory1.TenantType = "COMPANY"
signatory1.Receiver = &user
signatory1SerialNo := 1
signatory1.SerialNo = &signatory1SerialNo
signatory2 := model.Signatory{}
signatory2.TenantName = "宋一"
signatory2.TenantType = "PERSONAL"
//delaySet := true
//signatory2.DelaySet = &delaySet
receiver := model.User{}
receiver.Name = "宋一"
receiver.Contact = "10000000011"
receiver.ContactType = "MOBILE"
signatory2.Receiver = &receiver
signatory2SerialNo := 2
signatory2.SerialNo = &signatory2SerialNo
var signatories []*model.Signatory
signatories = append(signatories, &signatory1)
signatories = append(signatories, &signatory2)
contract.Signatories = signatories
var templateParams []*model.TemplateParam
param1 := model.TemplateParam{}
param1.Name = "param1"
param1.Value = "v1"
param2 := model.TemplateParam{}
param2.Name = "param2"
param2.Value = "v2"
templateParams = append(templateParams, ¶m1)
templateParams = append(templateParams, ¶m2)
contract.TemplateParams = templateParams
send := false
contract.Send = &send
req := request.ContractDraftRequest{}
req.Contract = &contract
response, err := sdkClient.Service(req)
if err != nil {
fmt.Println("request failed,", err.Error())
return
}
fmt.Println(response)
返回参数
参数 | 类型 | 长度 | 描述 |
---|---|---|---|
responseCode | String | 响应码 | |
message | String | 200 | 响应消息 |
result | Object | 返回数据;格式与请求参数一致 |
响应码
(全局响应码请查看文档末“全局响应码”):
响应码 | 描述 |
---|---|
11011102 | 重复的签署方 |
11990005 | 无效的参数:参数格式错误,必传参数未传,参数超出取值范围,参数类型不正确; |
11041701 | 未找到该员工 |
11041801 | 公司不存在 |
11041702 | 员工已经离职 |
14990002 | 权限不匹配 |
21990001 | 内部错误:如果未找到对应的开放平台错误码,统一以此错误码返回; |
11011151 | 没有该业务分类的发起权限 |
回调
接收回调请求的地址接口需要支持Content-Type: application/x-www-form-urlencoded 的post请求,初次回调失败后,尝试重新回调,尝试7次,直至回调成功,时间间隔分别为5分钟,2小时(重复4次),12小时,24小时。7次回调结束后,将不再回调。
回调参数说明
参数 | 类型 | 描述 |
---|---|---|
contractId | String | 当前回调的合同Id |
callbackType | String | 当前回调的通知类型,具体类型信息见后方列表 |
contractStatus | String | 当前回调的合同状态,具体类型信息见后方列表 |
tenantType | String | 签署方类型: PERSONAL-个人 COMPANY-公司 |
tenantName | String | 签署方名称 |
contact | String | 联系方式 |
tenantId | String | 签署方ID(组织签署方为对应的单位ID,个人签署方为对应的用户ID) |