最新消息:纷享销客与E签宝官方已经合作,目前正在进行技术推进,纷享会以系统集成的方式使用E签宝。
一、纷享销客简介
纷享销客是连接型CRM优质服务商。纷享销客连接型CRM以开放的企业级通讯为基础架构,以连接人、连接业务、连接客户为使命,将CRM、PRM及SCRM融为一体,为企业提供销售管理、营销管理及服务管理为一体的移动化客户全生命周期管理。开放的通讯架构与交互的业务逻辑,帮助企业实现外部业务、内部全员以及微信生态的互联互通,为企业构建起连接企业内外的业务价值链。
二、E签宝简介
电子合同是具有法律效力的。电子合同是基于电子签名的,e签宝成立于2002年12月,是中国互联网电子签名行业领跑者,致力于为客户提供具有法律效力的电子合同全生命周期服务。e签宝为用户提供一套完整的全生态电子签名服务,全套产品体系助力用户系统性解决签署难题,降本增效。
三、对接基础条件
-
纷享销客开放平台,开发文档:https://open.fxiaoke.com/wiki.html#artiId=15
-
E签宝开放平台,开发文档:https://qianxiaoxia.yuque.com/books/share/23123f7b-8baa-4376-95d3-c03f22d07c5c/xuanyuanapi
四、技术实现
-
原理:纷享销客有订单数据、合同相关信息,如果能把纷享销客的合同数据传输到E签宝平台,然后调用E签宝平台api接口去生成合同文档,并完成签署,最后把完成签署的合同文件同步到纷享销客,这样就实现了在纷享销客内,全程无感完成电子合同签署,大大提高的合同签署的效率,并且降低了企业运营成本。
-
纷享开放平台使用:要使用纷享销客开放平台需要联系纷享销客开通API接口及频次调用包,纷享销客开放平台的使用介绍在之前文章里详细介绍过,是一套非常标准的API接口,可以实现对CRM对象的增删改查,另外新增了事件回调接口,更加方便数据的实时同步,这里不做过多赘述。
-
E签宝开放平台使用:电子签名服务PaaS
API_2.0是e签宝提供的一种电子签名开放服务能力。企业开发者在自己的业务系统中可以通过调用电子签名服务PaaS
API_2.0所提供的接口实现在电子文件中签名。
五、可能遇到的问题
- E签宝合同模板:E签宝的合同模板目前主要是通过pdf文件添加输入项组件来实现的,可以为合同中变动的地方添加输入项,设置输入项的变量名称,用接口创建合同文件的时候,直接为变量赋值,就能生成合同文件。制作合同模板一是可以通过接口创建(https://qianxiaoxia.yuque.com/books/share/23123f7b-8baa-4376-95d3-c03f22d07c5c/ur4wyu_gpnq35),另外一种方法是通过Adobe
Acrobat Pro
DC(https://qianxiaoxia.yuque.com/docs/share/07e7e541-4751-4de1-82bc-0660c9c10cfb)进行制作。但是不管使用什么方式创建,输入项的长度都是固定的,也就是说一旦内容超出文本框的长度,就会生成合同文件失败。对于合同输入项太多,且长度不固定的或者合同中有表格且表格行数、列宽不固定的情况,E签宝目前是没有特别好的解决方案。后面两点介绍两种替代方案。 - HTML转换PDF文档方案:就是通过编写HTML+CSS的方式,制作出HTML文档,然后通过纷享销客开放平台API接口取出需要填充的数据,生成静态的HTML文档,然后利用一些第三方库,把HTML文档转换成PDF文档,例如:PHP的mpdf、Java的itextpdf等,然后直接把转换完成的PDF文件提交到E签宝平台进行签署。这是因为HTML相对来说比较好处理,通过CSS可以控制合同文件的显示效果。另外纷享的CRM对象打印模板,是通过富文本制作的,在纷享平台可以下载PDF文件,但是我没有实现通过接口直接获取到这个文件,有兴趣的同学,可以进行尝试。这种方法比较复杂,但客户体验相对较好,文档排版也比较可控,下载一些GitHub库的时候,可能会收到墙的限制,composer安装mpdf浪费了我一晚上时间。
- 多模板方案:就是通过多个模板,来实现个性化签署,比如:如果合同中表格行数是1行,那么调用模板1来生成合同;如果表格中行数是2,那么就调用模板2……通过Adobe
Acrobat Pro DC多制作几个模板就可以,某些情况这个方案可以减少编码量,非技术人员也能制作模板。
六、部分核心代码
/整个签署流程:
//第一步:获取报价单信息
$quote = $this->fxiaoke->getDataById($querydata);
//第二步:获取报价单产品信息
$quoteData = $this->getQuoteInfo($quote);
dump($quoteData);
//第三步:获取上传文件
$fileId = $this->quote($quoteData);
//第四步:创建流程
$flowId = $this->signflows($quoteData, "报价单");
//第五步:流程添加文档
$fileId_s = $this->addDocuments($flowId, $fileId);
//第六步:流程添加签署区域
$accountId = $this->platformSign($flowId, $fileId, $quoteData, "报价单");
//第七步:开启流程
$startSign = $this->startSign($flowId);
sleep(5);
//第八步:查看流程
$flowStatus = $this->getSignFlow($flowId);
//第九步:下载合同文件
$docs = $this->getFlowDocuments($flowId);
//处理报价单数据
public function getQuoteInfo($quote) {
dump($quote);
$quoteId = $quote->data->_id;
$querydata = array(
"dataObjectApiName" => "QuoteLinesObj",
"search_query_info" => array(
"limit" => 100,
"offset" => 0,
"filters" => array(
array(
"field_name" => "quote_id",
"field_values" => array(
$quoteId,
),
"operator" => "EQ",
),
),
),
);
$quoteLines = $this->fxiaoke->queryObj($querydata);
$productList = $quoteLines->data->dataList;
//报价单字段
$quoteData = $this->getQuoteData($quote);
//报价单产品
$quoteProduct = $this->getQuoteProduct($productList);
return array("quote" => $quoteData, "product" => $quoteProduct);
}
//E签宝鉴权获取鉴权token
public function getToken() {
$result = Db::name('fxtoken')->where('type', "esignToken")->find();
$token = $result["value"];
$expiresIn = $result["expire"];
if (time() > ($expiresIn + 7000)) {
//$data = json_encode(array("appId" => $this->appid, "secret" => $this->secret, "grantType" => "client_credentials"));
$url = $this->apiurl . "/v1/oauth2/access_token" . "?appId=$this->appid&secret=$this->secret&grantType=client_credentials";
//dump($url);
$res = json_decode($this->curl_get_https($url));
//dump($res);
$acctoken = array();
$acctoken['value'] = $res->data->token;
$acctoken['expire'] = time();
Db::name('fxtoken')->where('type', "esignToken")->update($acctoken);
$token = $acctoken['value'];
}
return $token;
}
交流学习:wangzhifeng@tongdog.com.cn