根据e签宝官方文档开发的一个 PHP 扩展包, 悟空 API V2 SDK
https://packagist.org/packages/achais/esign
此包对接的是【SaaS API 标准版】,注意分辨。其他版本需要自行调整
【SaaS API 标准版】接口文档地址
【常用地址】
··········开放平台:地址
··········开放平台文档中心:地址
··········错误码查询:地址
··········API在线调试工具:地址
··········沙箱地址:地址
··········合同模板:地址
【体验地址】体验整体流程
先去创建沙箱应用,以下操作全在沙箱中进行,配置成功之后进行切换环境。我使用的是tp5
$ composer require achais/esign:dev-master -vvv
config/config.php
//e签宝
'esign_info' => [
'debug' => false, // 是否开启调试
'app_id' => "********", // 替换成自己的 AppId
'secret' => '********', // 替换成自己的 Secret
'production' => false, // 是否正式环境
'log' => [
'level' => 'debug',
'permission' => 0777,
'file' => '/tmp/esign.log', // 开启调试时有效, 可指定日志文件地址
],
]
namespace app\api\controller;
use think\facade\Config;
class Refuel extends Base
{
//E签宝->去签名
public function toSign(){
$config = Config::get('app.esign_info');
$eSign = new \Achais\ESign\Application($config);
$thirdPartyUserId = '1'.time(); // 用户唯一标识,可传入第三方平台的个人用户id、证件号、手机号、邮箱等,如果设置则作为账号唯一性字段,相同信息不可重复创建。
$name = '真实姓名'; // 姓名
$idType = 'CRED_PSN_CH_IDCARD'; // 证件类型
$idNumber = '真实身份证号'; // 证件号
$mobile = '真实手机号'; // 手机号, 签署流程开始时对应的签署人会收到短信通知
$email = '真实邮箱'; // 邮箱地址, 签署流程开始时对应的签署人会收到邮件通知
// 个人账户创建, 有唯一标志, 需要记录返回的 accountId
$accountInfo = $eSign->account->createPersonAccount($thirdPartyUserId, $name, $idType, $idNumber, $mobile, $email);
$accountId = $accountInfo['accountId'];
// 测试合同模板ID---在上面合同模板地址维护一条信息
$templateId = '模板id';//下面有图片介绍
// 测试合同模板填充变量
$simpleFormFields = [
'id' => '测试名称',//通过下面signOther方法获取id,
'id' => '测试甲方',
'id' => date('Y-m-d'),
];
// 根据模板创建文档
$fileInfo = $eSign->file->createByTemplateId($templateId, '租赁合同', $simpleFormFields);
$fileId = $fileInfo['fileId'];
// 创建一个签署流程
$flowInfo = $eSign->signflow->createSignFlow("租赁合同");
$flowId = $flowInfo['flowId'];
// 把文档加入签署流程中
$addDocRet = $eSign->signflow->addDocuments($flowId, $fileId);
// 在签署流程中添加一个手动签署区域, 前提是流程已经添加文档, 同时指定签署人 accountId
$handSignData = $eSign->signflow->addHandSign($flowId, $fileId, $accountId, 1, 100, 100);
// 签署流程开始, 签署人会收到通知 (前提有 mobile/email)
$startSignFlowRet = $eSign->signflow->startSignFlow($flowId);
print_r($startSignFlowRet);
}
//e签宝composer扩展功能
public function signOther(){
$config = Config::get('app.esign_info');
$eSign = new \Achais\ESign\Application($config);
//查询个人信息
//$usInfo = $eSign->account->queryPersonByAccountId('99363813dc44463a982ca6d5c');
//halt($usInfo);
//通过模板id查询模板相关信息
$templateId = '模板id';
$url = '/v1/docTemplates/'.$templateId;
$fileInfo = $eSign->file->parseJSON('get', [$url]);
//合同实时下载地址
//$fileDown = $fileInfo['downloadUrl'];
halt($fileInfo);
}
}
\Achais\ESign\Application 提供了几个服务列在了 $providers 属性里面,
查看方法和参数, 快速跳转链接
Account:验证签名、用户/企业创建相关
File:模板文件创建
SignFlow:签名流程
可以详细研究下从Application.php开始。
具体扩展流程可以根据我的signOther方法写法进行
public function toSign($data)
{
$config = Config::get('app.esign_info');
$eSign = new \Achais\ESign\Application($config);
if ($data['accountId'] == 0) {
$thirdPartyUserId = date('YmdHis') . rand(1, 9);
$name = $data['username'];
$idType = 'CRED_PSN_CH_IDCARD';
$idNumber = $data['idcard'];
$mobile = $data['mobile'];
$email = $data['mail'];
// 个人账户创建
$accountInfo = $eSign->account->createPersonAccount($thirdPartyUserId, $name, $idType, $idNumber, $mobile, $email);
$accountId = $accountInfo['accountId'];
//记录创建的accountId
UserModel::where('mobile', $data['mobile'])->update(['accountId' => $accountId]);
} else {
$accountId = $data['accountId'];
}
// 测试合同模板ID
$templateId = 'd19de0fd8e7f462fbd568984b2c5e51b';
// 测试合同模板填充变量
$simpleFormFields = [
'jiafang' => $data['gs_name'],
'jiafang1' => $data['gs_name'],
'yifang' => $data['drive_name'],//司机名字乙方
'yifang1' => $data['drive_name'],//司机名字乙方
'bingfang' => $data['username'],//丙方
];
// 根据模板创建文档
$fileInfo = $eSign->file->createByTemplateId($templateId, '测试签署', $simpleFormFields);
$fileId = $fileInfo['fileId'];
//回调地址
$notice = '域名/api/notify/esign_notify';
// 创建一个签署流程
$flowInfo = $eSign->signflow->createSignFlow("测试签署", $notice);
$flowId = $flowInfo['flowId'];
// 把文档加入签署流程中
$addDocRet = $eSign->signflow->addDocuments($flowId, $fileId);
// 在签署流程中添加一个手动签署区域, 前提是流程已经添加文档, 同时指定签署人 accountId
$handSignData = $eSign->signflow->addHandSign($flowId, $fileId, $accountId, 1, 100, 100);
// 签署流程开始, 签署人会收到通知 (前提有 mobile/email)
$startSignFlowRet = $eSign->signflow->startSignFlow($flowId);
//获取预览地址
$fileInfo = $eSign->signflow->getExecuteUrl($flowId, $accountId, null, 1);
$babiq = [
'flowId' => $flowId,
'esign_url' => $fileInfo['url'],
];
return $babiq;
}
回调演示–文档
public function esign_notify()
{
$data = input();
// Cache::set('esign',$data);
switch ($data['action']) {
case 'SIGN_FLOW_UPDATE':
//签署人签署完成回调
//trace($data,'info');
$us_oil = new UseroilModel();
$info = $us_oil->where('flowId', $data['flowId'])->find();
if (empty($info)) {
return json(['code' => 200, 'msg' => 'success']);
}
if ($info['is_qian']==1){
return json(['code' => 200, 'msg' => 'success']);
}
//修改签署状态
$info->save([
'is_qian' => 1,
'qian_time' => time(),
]);
//给用户余量加值
UserModel::where('uid', $info['uid'])->setInc('have_oil', $info['need_many']);
return json(['code' => 200, 'msg' => 'success']);
break;
case 'SIGN_FLOW_FINISH':
//流程结束逻辑处理
return json(['code' => 200, 'msg' => 'success']);
break;
}
}