平台简介
新手指南
API协议
API文档
单点登录集成
小程序插件
常见问题
开放平台API接口调用常见报错以及解决方法汇总
帮助中心 / 开放平台帮助文档 / 创建合同草稿
创建合同草稿
根据业务分类的预设配置或者接口的传参,创建相应的合同草稿,业务分类在契约锁云平台中配置。若合同文件已提前在云平台业务分类中维护,可通过send参数设置创建并直接发起合同。创建合同草稿后,支持传入合同id或bizId,进行草稿合同信息的覆盖修改。

创建合同草稿

描述

根据业务分类的预设配置或者接口的传参,创建相应的合同草稿,业务分类在契约锁云平台中配置。若合同文件已提前在云平台业务分类中维护,可通过send参数设置创建并直接发起合同。创建合同草稿后,支持传入合同id或bizId,进行草稿合同信息的覆盖修改。草稿文件超1年不发起,将自动删除。

业务分类配置介绍:

签署方:

(1)签署方预设时,用户传入的签署方与业务分类配置的签署方必须完全一致(数量、类型、顺序均匹配),此时会使用业务分类配置的签署流程、签署位置、印章等(发起方除外,发起方的签署流程下面介绍)。

(2)签署方非预设时,以参数中传入的签署方为准(发起方除外)。

发起方签署流程:

(1)发起方流程预设时,发起方使用预设的签署流程、签署位置、印章等。

(2)发起方流程非预设时,创建合同时, 需要主动传入签署动作。

文件模板:

发起合同时,必须保证合文件模板中发起方的必填参数均已填写完成。

请求地址

/v2/contract/draft

请求方法

POST

请求格式

application/json;charset=UTF-8

请求参数

Y:必填 N:非必填 CY:条件必填,即其他参数的输入情况会影响当前参数是否必填(具体逻辑参照各参数的描述)

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> tableVal = new ArrayList<>();
//Map row1 = new HashMap<>();
//row1.put("column1", "v11");
//row1.put("column2", "v12");
//row1.put("column3", "v13");
//Map row2 = new HashMap<>();
//row2.put("column1", "v21");
//row2.put("column2", "v22");
//row2.put("column3", "v23");
//tableVal.add(row1);
//tableVal.add(row2);
//contract.addTemplateParam(new TemplateParam("表格", JSONUtils.toJson(tableVal)));
// 创建合同
ContractDraftRequest request = new ContractDraftRequest(contract);
String response = sdkClient.service(request);
SdkResponse<Contract> responseObj = JSONUtils.toQysResponse(response, Contract.class);
// 返回结果
if(responseObj.getResponseCode().equals("00000000")) {
    Contract result = responseObj.getResult();
    logger.info("创建合同成功,合同ID:{}", result.getId());
} else {
    logger.info("请求失败,错误码:{},错误信息:{}", responseObj.getCode(), responseObj.getMessage());
}
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)