上次记录了一下后台请求云合同接口,今天接着记录一下后台写给前台的接口,所有的流程是通过后台进行操控的
接口
1.实名认证(此处原本是想通过后台请求,通过一系列问题轰炸,终于轰炸出数据要通过序列化传输,所以直接让前台表单请求接口,方便高效)
2.获取token
3.创建个人和企业用户
4.创建个人和企业印模
5.创建合同
6.创建合同签署者
7.签署合同
8.完成(此处可以添加存证接口,看个人)
接口之间进行调用,控制流程,实名认证(成功之后直接调用创建个人用户)–》获取token–》创建合同(此接口中调用创建合同签署者)–》合同签署(此接口中调用创建个人印模、个人签署合同、企业签署合同(此接口中调用创建企业印模))
此处你会发现少了一个创建企业用户的流程,因为企业用户就是公司本身,不用每次都调用创建,只需要创建一次之后,把数据保存数据库,然后生成的数据可以直接用了,所以我的做法是先调用一遍生成企业用户的接口
实名认证此处就不上代码了,直接前端请求接口即可(一定要和对接人员提前确定开通的是哪个实名认证的接口)
获取token,此处前端也可以直接调用云合同生成token的接口,需要把appid和appkey给前端
所有流程都是需要用户注册登录之后才能进一步操作,所以需要做登录判断,我这边是直接在公共controller里面做了判断,没有用到前端传递的用户id,所以很方便。这里登录判断你可以根据自身的流程选用自己的方式
/*
* 前端调用token
* */
public function gettoken(){
//if($this->usr_id){
$hetongclass=new HetongApi();
//dump($header);die;
$out=$hetongclass->getresult();
//return json($out);
return json(['data'=>$out,'code'=>1,'message'=>'success']);
/*}else{
return json(['data'=>'请先登录','code'=>2,'message'=>'fail']);
}*/
}
创建个人和企业用户
/*
* 创建个人用户接口
*?
* */
public function yonghu(){
//if($this->usr_id){
$hetongclass=new HetongApi();
$phoneNo=Db::name('你存用户的表')->where('用户id',$this->usr_id)->value('tel');
//dump($phoneNo);die;
//$phoneNo='';
$userName=input('userName','');
$certifyNum=input('certifyNum','');
//$phoneNo=input('phoneNo','');
$data=[];
$data['用户名']=$userName;
$data['identityRegion']='0';
$data['身份证']=$certifyNum;
$data['phoneRegion']='0';
$data['电话']=$phoneNo;
$out=$hetongclass->createuser($data);
//dump($out);die;
$data['用户id']=$this->usr_id;
$outarr=json_decode($out,true);
//dump($outarr);die;
$data['个人id']=$outarr['data']['个人id'];
if($out){
$re=Db::name('数据表')->insert($data);
}
//dump($out);die;
return json(['data'=>$out,'code'=>1,'message'=>'success']);
/*}else{
return json(['data'=>'请先登录','code'=>2,'message'=>'fail']);
}*/
}
/*
* 创建企业自身账户
* ?
* */
public function qiye(){
//if($this->usr_id){
$hetongclass=new HetongApi();
$data=[];
$data['userName']='你的公司名称';
$data['certifyType']='证书类型';
$data['certifyNum']='证书号';
$data['caType']='接口文档中已经给出';
$data['phoneNo']='企业法人电话';
$out=$hetongclass->creqiye($data);
//dump($out);die;
//$data['用户id']=$this->usr_id;
//$data['signerId']=$out['signerId'];
$outarr=json_decode($out,true);
//dump($outarr);die;
$data['signerId']=number_format($outarr['data']['signerId'],0,'','');
//dump($data);die;
if($out){
$re=Db::name('存入数据表')->insert($data);
}
return json(['data'=>$out,'code'=>1,'message'=>'success']);
/*}else{
return json(['data'=>'请先登录','code'=>2,'message'=>'fail']);
}*/
}
创建个人和企业印模
/*
* 生成客户个人印模
* f返回参数 moulageId 印模id
* 存数据库
* */
public function peryin(){
//if($this->usr_id){
$signerId=Db::name('数据表')->field('个人id')->where('字段',$this->usr_id)->find();//查询合同id
$signerId=$signerId['signerId'];
//dump($signerId);die;
$hetongclass=new HetongApi();
$data=[];
$data['signerId']=$signerId;
$data['borderType']='根据文档中来';
$data['fontFamily']='根据文档中来';
$data['color']='根据文档中来';
$data['mode']='根据文档中来';
$out=$hetongclass->createuseryingmo($data);
//dump($out);die;
$outarr=json_decode($out,true);
$data['印模id']=number_format($outarr['data']['印模id'],0,'','');
//dump($data);die;
if($out){
$re=Db::name('数据表')->where('用户id字段',$this->usr_id)->update(['印模id字段'=>$data['moulageId']]);
}
return $out;
//return json(['data'=>$out,'code'=>1,'message'=>'success']);
/*}else{
return json(['data'=>'请先登录','code'=>2,'message'=>'fail']);
}*/
}
/*
* 生成企业印模
* 返回参数 moulageId 印模id
* */
public function qiyeyin(){
//if($this->usr_id){
$moulageId=Db::name('存数据的表')->where('signerId','此处就可以根据已经生成的企业用户查询出signerid的具体数值')->value('企业印模的id');//查询企业印模id
//此处判断企业印模是否存在,如果存在就不创建,不存在就创建
if($moulageId && $moulageId!=''){
return true;
//return json(['data'=>$moulageId,'code'=>1,'message'=>'success']);
}
$hetongclass=new HetongApi();
$data=[];
$data['signerId']='查询结果';
$data['styleType']='查询结果';
$data['textContent']='文档';
$data['color']='文档';
$data['mode']='文档';
$out=$hetongclass->createcompanyyingmo($data);
//dump($out);die;
$outarr=json_decode($out,true);
//dump($outarr);die;
//这里会将查询出来的数据进行科学计数法,我们不需要科学计数法,所以我们用函数处理一下
$data['moulageId']=number_format($outarr['data']['moulageId'],0,'','');
//dump($data);die;
if($out){
$re=Db::name('数据表')->where('signerId',查询结果)->update(['印模id字段'=>$data['moulageId']]);
}
return json(['data'=>$out,'code'=>1,'message'=>'success']);
/*}else{
return json(['data'=>'请先登录','code'=>2,'message'=>'fail']);
}*/
}
创建合同
我们公司根据不同需求需要生成2分不同的合同,此处只上一个生成合同的代码,其他有需求可以参考
/*
* 生成普通合同
*
*存数据库
*/
//此处我们选用是根据模板生成合同的方法
public function hetong(){
//if($this->usr_id){
$data=[];
//$numb=time();
//占位符需要在合同模板里面设置,只要填写相同的参数即可,细节请看接口文档
$arr['${numb}']=此处为占位符,可以自己定义;
$arr['${jiatime}']=此处为占位符,可以自己定义;
$arr['${yitime}']=此处为占位符,可以自己定义;
//$arr['${test2}']='7889';
//dump($contractNo);die;
$data['contractTitle']='合同名称';
$data['templateId']='合同模板id';
//$data['contractNo']='';
$data['contractData']=$arr;
$hetongclass=new HetongApi();
//dump($header);die;
$out=$hetongclass->createhetong($data);//
//dump($out);die;
$outarr=json_decode($out,true);
$data['contractId']=number_format($outarr['data']['contractId'],0,'','');
//dump($data);die;
if($out){
$re=Db::name('数据表')->where('用户id',$this->usr_id)->update(['合同id字段'=>$data['contractId']]);
}
//此处调用添加签署者,让签署人具有权限
$this->qianshu();
return json(['data'=>$out,'code'=>1,'message'=>'success']);
/*}else{
return json(['data'=>'请先登录','code'=>2,'message'=>'fail']);
}*/
}
创建合同签署者
/*
* 添加签署者
* */
public function qianshu(){
//if($this->usr_id){
$contract=Db::name('数据表')->field('合同id,个人id,印模id')->where('用户id',$this->usr_id)->find();//查询合同id
$contractId=$contract['合同id'];
$signerId=$contract['个人id'];
//$bian['${kehu}']='客户盖章处';
//$moulageIdd=$contract['印模id'];
$hetongclass=new HetongApi();
//接下来就是非常坑的地方了,我先用data传数据,怎么都是错的,后面换成array传数据就好了,在此处尝试了各种方法,真是山穷水尽
$data = array("idType"=>0,"idContent"=>$contractId,"signers"=>array(
array("signerId"=>$signerId,"signPositionType"=>"0","positionContent"=>"客户盖章处","signValidateType"=>"0"),
array("signerId"=>"查询结果","signPositionType"=>"0","positionContent"=>"企业盖章处","signValidateType"=>"0")
));
$out=$hetongclass->addsigner($data);
return $out;
// dump($out);die;
/*}else{
return json(['data'=>'请先登录','code'=>2,'message'=>'fail']);
}*/
}
个人和企业签署合同
/*
* 客户合同签署
* 直接生成,利用印章
*
* */
public function customersign(){
// if($this->usr_id){
$contract=Db::name('数据表')->field('合同id,个人id,印模id')->where('用户id',$this->usr_id)->find();//查询合同id
$contractId=$contract['合同id'];
$signerId=$contract['个人id'];
$moulageId=$contract['印模id'];
//dump($contractId);die;
$hetongclass=new HetongApi();
$data=[];
$data['idType']='0';
$data['idContent']=$contractId;//传合同id
$data['moulageId']=$moulageId;//印模id
$data['signerId']=$signerId;
//$data['idContent']='0';
//dump($data);die;
$out=$hetongclass->sign($data);
//dump($out);die;
return $out;
// return json(['data'=>$out,'code'=>1,'message'=>'success']);
/*}else{
return json(['data'=>'请先登录','code'=>2,'message'=>'fail']);
}*/
}
* 企业合同签署
* 直接生成,利用印章
*
* */
public function qiyesign(){
//if($this->usr_id){
签署合同之前需要先生成印模
$this->qiyeyin();
$contract=Db::name('数据表')->field('合同id,个人id,印模id')->where('个人id','查询结果')->find();//查询合同id
$contract2=Db::name('数据表')->field('合同id,个人id,印模id')->where('用户id',$this->usr_id)->find();//查询合同id
$contractId=$contract2['合同id'];
$signerId=$contract['个人id'];
$moulageId=$contract['印模id'];
//dump($contractId);die;
$hetongclass=new HetongApi();
$data=[];
$data['idType']='0';
$data['idContent']=$contractId;//传合同id
$data['moulageId']=$moulageId;//印模id
$data['signerId']=$signerId;
//$data['idContent']='0';
//dump($data);die;
$out=$hetongclass->sign($data);
/*dump($out);die;
//return json(['data'=>$out,'code'=>1,'message'=>'success']);
$outarr=json_decode($out,true);
$data['印模id']=number_format($outarr['data']['印模id'],0,'','');
//dump($data);die;
if($out){
$re=Db::name('数据表')->where('个人id',查询结果)->update(['印模id'=>$data['印模id']]);
}*/
return $out;
/*}else{
return json(['data'=>'请先登录','code'=>2,'message'=>'fail']);
}*/
}
签署合同
/*
* 前台调用签署合同
*
* */
public function forwordht(){
//if($this->usr_id){
$re=$this->peryin();//生成个人印章
$re1=$this->customersign();//客户签署合同
$re2=$this->qiyesign();//企业签署合同
return json(['re'=>$re,'re1'=>$re1,'re2'=>$re2]);
/*}else{
return json(['data'=>'请先登录','code'=>2,'message'=>'fail']);
}*/
}
完成
这样生成的就是前端客户只需要点击签署按钮就直接生成个人印章和企业印章,直接签署完成。非常简单,但是走了很多弯路入了很多坑,感觉写接口就从来没有这么恼火过,哎,说多了都是泪。希望能给后面的伙伴有一点点帮助。。