- 一、流程
- 二、我们再熟悉下接口中这几个字段的意思
-
- 1、accountId
- 2、orgId
- 3、fileId
- 4、templateId
- 5、flowId
- 6、回调通知接收说明
- 三、Demo文档
-
- 1、官网提供的官网文档
- 2、Demo下载
- 3、Demo中的调用Demo
- 4、根据Demo自己封装签署方法
- 5、sdk使用
- 四、最简单的接口调用顺序
- 五、需要注意的点
-
- 1、创建个人签署账号接口,证件包含小写的 x
- 2、文件上传接口,文件名格式
- 3、业务码字段并不都是 code,也可能是 errCode
- 4、方法不存在
- 5、签署章子位置的设置
- 6、接口请求统一处理,封装一个方法统一请求
- 六、写在最后
一、流程
写在前面:
希望大家通过这篇文章,对e签宝电子签名有一个比较全面的认识,不至于拿到API文档就蒙圈了
,开发语言这里以 PHP为例,其他语言的可以在 Demo 链接中去下载。接口封装没问题,官方已经给了sdk,就是需要捋一下流程。
大致的流程:把合同上传到e签宝,e签宝会返回给我们
fileId
,用户或者企业签名或者盖章(签名盖章的位置可以设置:页码;x轴坐标,左下角为原点;y轴坐标,左下角为原点),会生成一个签名的地址,用户/企业打开就能够签名,里面有拒签操作。用户触发了不同的状态就会有不同的回调action
。
- 开发前必读
环境 | 域名 | 公网IP | 端口 |
---|---|---|---|
正式生产环境 | https://openapi.esign.cn | 118.31.181.75 | 443 |
沙箱模拟环境 | https://smlopenapi.esign.cn | 114.55.17.44 | 443 |
二、我们再熟悉下接口中这几个字段的意思
1、accountId
- 个人账号id,合同签署的时候可以选择你的名字的这个签名或者自己手动写。
2、orgId
- 机构账号id,合同签署的时候签名要用到。
3、fileId
- 文件ID,用于签署的PDF文件
- 来源:可以自己直接上传,根据文件的后缀判断是否需要转pdf文件,再上传,注意接口的这2个参数:
contentType
,convert2Pdf
。e签宝.文档中心-公有云文档-电子签名SaaS API标准版-API文档-文件上传 - 也可以自己生成模板文件之后再上传。PDF模板文件3种制作说明文档
- 查询文件上传状态:查看所上传文件的当前状态,本接口支持轮询。当接口返回的 文件状态 status 值为 2 或 5 时,此文件才可以被正常添加到签署流程中。
- 查询PDF文件详情:查看所上传文件的当前状态、文件名称、文件大小和下载链接,本接口不支持轮询。当接口返回的 文件状态 status 值为 2 或 5 时,此文件才可以被正常添加到签署流程中或下载PDF文件。
4、templateId
- 模板ID,可执行 添加控件、删除控件 操作,模板内容确定后可调 填充内容生成PDF 接口 生成合同文件。
5、flowId
- 流程id,发起一个签署流程生成的id
- 可根据该id 查询流程的进度 签署流程查询,查询 流程签署人列表
- 流程结束后执行 流程文档下载,生成了最终的流程数据。
6、回调通知接收说明
- 还有我们最关心的,流程回调 回调通知接收说明, 回调地址在 一步发起签署 接口中的 flowConfigInfo[‘noticeDeveloperUrl’]
- 响应e签宝回调通知:当收到e签宝的回调通知后,开发者返回介于200~299的HTTP状态码给e签宝,e签宝均认为推送成功。建议返回给e签宝的响应Body数据格式如下:
{"code":"200","msg":"success"}
- 我们根据回调路径中的
action
参数来判断事件类型,如下:
Action事件类型 | Action事件名称(点击查看具体描述)对应的业务操作(点击查看具体描述) |
---|---|
SIGN_FLOW_UPDATE | 签署人签署完成 |
SIGN_FLOW_FINISH | 流程结束 |
SIGN_DOC_EXPIRE_REMIND | 流程文件过期前提醒 |
SIGN_DOC_EXPIRE | 流程文件过期 |
BATCH _ ADD _ WATERMARK _ REMIND | 文件添加数字水印完成 |
FEEDBACK_SIGNERINFO | 签署人申请修改身份信息 |
PROCESS_HANDOVER | 经办人转交签署任务 |
WILL_FINISH | 意愿认证完成 |
PARTICIPANT_MARKREAD | 签署人已读 |
FILE_ABNORMAL_REMIND | 文件已加密/已损坏通知 |
- php回调中接收参数并响应Demo
//数据回调业务处理public function callback() {
// $data = '{"action":"SIGN_FLOW_UPDATE","flowId":"11111113a466442abbce094c9368ac7c","accountId":"22XXXe2a","authorizedAccountId":"33XXXe3a","signTime":"2019-07-24 19:33:06","order":1,"signResult":2,"thirdOrderNo":"cust0001","resultDescription":"签署完成","timestamp":1563967986960,"thirdPartyUserId":"A34006"}';$data = file_get_contents('php://input'); // php://input 是个可以访问请求的原始数据的只读流。当请求方式是post,并且Content-Type不等于”multipart/form-data”时,可以使用php://input来获取原始请求的数据。return self::callbackService($data);}/*** 务处理:实际使用中把该函数放到service中* @param $data* @return array 结果数组*/public function callbackService($data){$result = false;$data = json_decode($data, true);$action = isset($data['action']) ? $data['action'] : ''; //标记该通知的业务类型if ($action) {switch ($action) {case 'SIGN_DOC_EXPIRE': //流程文件过期 回调通知$flowId = $data['flowId']; //流程id$fileId = $data['fileId']; //文件ID,多文档已逗号分隔$timestamp = $data['timestamp']; //时间戳/*** TODO 在这里处理我们的业务,操作我们的数据表,视情况是否加上数据表回滚操作*/$result = true;break;case 'SIGN_FLOW_UPDATE': //签署人签署完成回调通知$result = true;break;case "SIGN_FLOW_FINISH": //签署流程结束 回调通知$flowId = $data['flowId']; //流程ID$flowStatus = $data['flowStatus']; //流程状态: 2 - 已完成: 所有签署人完成签署;3 - 已撤销: 发起方撤销签署任务;5 - 已过期: 签署截止日到期后触发;7 - 已拒签。/*** 在我们的数据表处理该逻辑,改变我们数据表的状态,备注,更新时间 等字段~* TODO 业务... 在这里处理我们的业务,操作我们的数据表,视情况是否加上数据表回滚操作*/$result = true;break;}}//开发者返回介于200~299的HTTP状态码给e签宝,e签宝均认为推送成功。//建议返回给e签宝的响应Body数据格式如下:{"code":"200","msg":"success"}if ($result) {$ret = ['code' => '200', 'msg' => 'success'];} else {$ret = ['code' => '0', 'msg' => 'error'];}return json_encode($ret, JSON_UNESCAPED_UNICODE); //数组转json字符串}
三、Demo文档
1、官网提供的官网文档
- Demo下载
- Demo下载-请点击进入此链接后按需下载。
2、Demo下载
- 我选择 PHP语言DEMO – 请求签名鉴权方式
81KB
下载 - 我下载后放到了百度网盘,有需要的可前往下载 链接:https://pan.baidu.com/s/1i42ruPO4wR9MJmf7DUrV2g 提取码:ty79
3、Demo中的调用Demo
- b2cDemo.php 文件详情
<?phpuse factory\base\Account;
use factory\base\FileTemplate;
use factory\base\Seals;
use factory\base\SignFile;
use factory\bean\Doc;
use factory\bean\FlowInfo;
use factory\bean\PosBean;
use factory\bean\Signer;
use factory\bean\SignerAccount;
use factory\bean\Signfield;
use factory\Factory;header("Content-type:text/html;charset=utf-8");
include("../eSignOpenAPI.php");
//此示例为企业和个人场景的签署示例代码,签署方式为一步发起签署,如果需要分步签署,签署部分代码示例可参考b2bDemo
var_dump("--------------------------初始化 start----------------------------");
$host="https://smlopenapi.esign.cn";//请求网关host
$project_id="";//应用id
$project_scert="";//密钥
Factory::init($host,$project_id,$project_scert);
Factory::setDebug(true);//是否开启日志记录,传true或false,日志存放在根目录的phplog.txt文件
//-----------------基础信息初始化 end--------------------------
var_dump("--------------------------初始化 end----------------------------");$filePath="D:\\IDEAproject\\PdfFile\\dstPdf\\qianshu.pdf";//文件地址if(!is_file($filePath)){echo '文件不存在';exit;}//-----------------------个人账号信息用于创建个人账号接口传入-----------------------------$thirdPartyUserIdPsn="1232133232";//thirdPartyUserId参数,用户唯一标识,自定义保持唯一即可$namePsn="";//name参数,姓名$idTypePsn="CRED_PSN_CH_IDCARD";//idType参数,证件类型$idNumberPsn="";//idNumber参数,证件号$mobilePsn="";//mobile参数,手机号//------------------------企业账号信息用于创建机构账号接口传入----------------$thirdPartyUserIdOrg="1212312312312";//thirdPartyUserId参数,用户唯一标识,自定义保持唯一即可$nameOrg="杭州天谷";//name参数,机构名称$idTypeOrg="CRED_ORG_USCC";//idType参数,证件类型$idNumberOrg="";//idNumber参数,机构证件号var_dump("------------------ 创建个人账号 start -----------------");
$createPsn = Account::createPersonByThirdPartyUserId($thirdPartyUserIdPsn,$namePsn,$idTypePsn,$idNumberPsn);
$createPsn->setMobile($mobilePsn);
$createPsnResp = $createPsn->execute();//execute方法发起请求
$createPsnJson = json_decode($createPsnResp->getBody());
$accountId = $createPsnJson->data->accountId;//生成的个人账号保存好,后续接口调用需要使用
var_dump("------------------ 创建个人账号 end ---------------");var_dump("------------------ 创建企业账号 start ---------------");
$createOrg = Account::createOrganizationsByThirdPartyUserId($thirdPartyUserIdOrg,$accountId,$nameOrg,$idTypeOrg,$idNumberOrg
);
$createOrgResp = $createOrg->execute();
$createOrgJson=json_decode($createOrgResp->getBody());
$orgId=$createOrgJson->data->orgId;
var_dump("------------------ 创建企业账号 end ---------------");var_dump("------------------ 通过上传方式创建文件 start -----------------");
$contentBase64Md5 = UtilHelper::getContentBase64Md5($filePath);
$filesize = filesize($filePath);
$fileContent = file_get_contents($filePath);
$getFileUploadUrl = FileTemplate::getFileUploadUrl($contentBase64Md5, "application/pdf", false, "测试合同.pdf", $filesize);
$getFileUploadUrlResp = $getFileUploadUrl->execute();
$getFileUploadUrlJson = json_decode($getFileUploadUrlResp->getBody());
$fileId = $getFileUploadUrlJson->data->fileId;//文件id保存好,后续使用
$uploadUrl = $getFileUploadUrlJson->data->uploadUrl;//上传url保存好,后续使用
var_dump("------------------ 通过上传方式创建文件 end -----------------");var_dump("------------------ 文件流上传方法 start -----------------");
$uploadFile = FileTemplate::uploadFile($filePath, "application/pdf", $uploadUrl);
$uploadFileResp = $uploadFile->execute();
var_dump($uploadFileResp->getBody());
var_dump("------------------ 文件流上传方法 end -----------------");var_dump("------------------ 一步发起签署 start -----------------");
$doc = new Doc();
$doc->setFileId($fileId);
$docs = array($doc);
$flowInfo = new FlowInfo();
$flowInfo->setBusinessScene("b2c合同签署测试")->setAutoArchive(true)//自动归档->setAutoInitiate(true);//自动开启流程
$psnSignfield = new Signfield();
$posBean = new PosBean();
$psnSignfield->setFileId($fileId)->setPosBean($posBean->setPosPage(1)->setPosX(113)->setPosY(225));
$psnSignfields = array($psnSignfield);//构造个人signfields参数对象$orgSignfield = new Signfield();
$posBean = new PosBean();
$orgSignfield->setFileId($fileId)->setPosBean($posBean->setPosPage(1)->setPosX(224)->setPosY(334))->setActorIndentityType(2);//机构签署必传
$orgSignfields = array($orgSignfield);//构造个人signfields参数对象$signerpsn = new Signer();
$signerAccount1 = new SignerAccount();
$signerAccount1->setSignerAccountId($accountId);
$signerpsn->setSignerAccount($signerAccount1)->setSignfields($psnSignfields);;//传入个人signer信息$signerorg = new Signer();
$signerA1ccount2 = new SignerAccount();
$signerA1ccount2->setSignerAccountId($accountId)->setAuthorizedAccountId($orgId);
$signerorg->setSignerAccount($signerA1ccount2)->setSignfields($orgSignfields);//传入企业signer信息$signers = array($signerpsn, $signerorg);//$createFlowOneStep = SignFile::createFlowOneStep($docs, $flowInfo, $signers);
$flowOneStepResp = $createFlowOneStep->execute();
$flowOneStepJson = json_decode($flowOneStepResp->getBody());
$flowId = $flowOneStepJson->data->flowId;//流程id保存好
var_dump("------------------ 一步发起签署 end -----------------");var_dump("------------------ 获取签署地址 start -----------------");
$getFileSignUrl = SignFile::getFileSignUrl($flowId, $accountId);
$getFileSignUrl->setOrganizeId($orgId);
$getFileSignUrlResp = $getFileSignUrl->execute();
$getFileSignUrlJson = json_decode($getFileSignUrlResp->getBody());
$shortUrl = $getFileSignUrlJson->data -> shortUrl;
var_dump("签署短连接,复制到浏览器打开\n".$shortUrl);
var_dump("------------------ 获取签署地址 end -----------------");
4、根据Demo自己封装签署方法
- 流程发起签署API:$flowInfo配置参数如下:一步发起签署
//签署:企业对个人public function oneStepB2C($data){$accountId = $data['account_id']; //个人账号id$orgId = $data['org_id']; //企业账号id$fileId = $data['file_id']; //文件id$businessScene = $data['business_scene']; //任务主题//查询模板文件详情$fileInfo = self::filePDFDetail($data);$pdfTotalPages = $fileInfo['pdfTotalPages']; //给最后一页设置个人或者公司的盖章区域//设置签署区域的坐标 x轴坐标,左下角为原点;y轴坐标,左下角为原点$posPersonX = 470;$posOrganizeX = 130;$posY = 150;$doc = new Doc();$doc->setFileId($fileId);$docs = array($doc);//流程配置$flowConfigInfo = ['noticeDeveloperUrl' => $this->callbackUrl, //回调地址:https://www.xxxxapi.com/esaas/businessCallback];$flowInfo = new FlowInfo();$flowInfo->setBusinessScene($businessScene)->setAutoArchive(true)//自动归档->setAutoInitiate(true)//自动开启流程->setFlowConfigInfo($flowConfigInfo);$signValidity = 0; //签署有效截止日期,毫秒,默认不失效;注:超过签署有效截止时间,则无法继续签署。若该参数设置的时间到期,则会触发【流程结束回调通知】if ($signValidity > 0) {$flowInfo->setSignValidity($signValidity);}$psnSignfield = new Signfield();$posBean = new PosBean();$psnSignfield->setFileId($fileId)->setPosBean($posBean->setPosPage($pdfTotalPages)->setPosX($posPersonX)->setPosY($posY)); //设置盖章区域:页码;x轴坐标,左下角为原点;y轴坐标,左下角为原点$psnSignfields = array($psnSignfield); //构造个人signfields参数对象$signerpsn = new Signer();$signerAccount1 = new SignerAccount();$signerAccount1->setSignerAccountId($accountId);$signerpsn->setSignerAccount($signerAccount1)->setSignfields($psnSignfields); //传入个人signer信息$orgSignfield = new Signfield();$posBean = new PosBean();$orgSignfield->setFileId($fileId)->setPosBean($posBean->setPosPage($pdfTotalPages)->setPosX($posOrganizeX)->setPosY($posY)) //设置盖章区域:页码;x轴坐标,左下角为原点;y轴坐标,左下角为原点->setActorIndentityType(2); //机构签署必传$orgSignfields = array($orgSignfield);//构造机构signfields参数对象$signerorg = new Signer();$signerA1ccount2 = new SignerAccount();$signerA1ccount2->setSignerAccountId($accountId)->setAuthorizedAccountId($orgId);$signerorg->setSignerAccount($signerA1ccount2)->setSignfields($orgSignfields); //传入企业signer信息$signers = array($signerpsn, $signerorg);//$createFlowOneStep = SignFile::createFlowOneStep($docs, $flowInfo, $signers);$flowResult = self::execResponse($createFlowOneStep);$flowId = $flowResult['flowId']; //流程id保存好$getFileSignUrl = SignFile::getFileSignUrl($flowId, $accountId);$getFileSignUrl->setOrganizeId($orgId);$result = self::execResponse($getFileSignUrl);/*** TODO 加入自己的逻辑操作:保存到自己的数据库*/return [$flowResult, $result];}//签署:个人public function oneStepC($data){$accountId = $data['account_id']; //个人账号id$fileId = $data['file_id']; //文件id$businessScene = $data['business_scene']; //任务主题//查询模板文件详情$fileInfo = self::filePDFDetail($data);$pdfTotalPages = $fileInfo['pdfTotalPages']; //给最后一页设置个人或者公司的盖章区域//设置签署区域的坐标 x轴坐标,左下角为原点;y轴坐标,左下角为原点$posPersonX = 470;$posY = 150;$doc = new Doc();$doc->setFileId($fileId);$docs = array($doc);//流程配置$flowConfigInfo = ['noticeDeveloperUrl' => $this->callbackUrl, //回调地址:https://www.xxxxapi.com/esaas/businessCallback];$flowInfo = new FlowInfo();$flowInfo->setBusinessScene($businessScene)->setAutoArchive(true)//自动归档->setAutoInitiate(true)//自动开启流程->setFlowConfigInfo($flowConfigInfo);$signValidity = 0; //签署有效截止日期,毫秒,默认不失效;注:超过签署有效截止时间,则无法继续签署。若该参数设置的时间到期,则会触发【流程结束回调通知】if ($signValidity > 0) {$flowInfo->setSignValidity($signValidity);}$psnSignfield = new Signfield();$posBean = new PosBean();$psnSignfield->setFileId($fileId)->setPosBean($posBean->setPosPage($pdfTotalPages)->setPosX($posPersonX)->setPosY($posY)); //设置盖章区域:页码;x轴坐标,左下角为原点;y轴坐标,左下角为原点$psnSignfields = array($psnSignfield); //构造个人signfields参数对象$signerpsn = new Signer();$signerAccount1 = new SignerAccount();$signerAccount1->setSignerAccountId($accountId);$signerpsn->setSignerAccount($signerAccount1)->setSignfields($psnSignfields); //传入个人signer信息$signers = array($signerpsn);//$createFlowOneStep = SignFile::createFlowOneStep($docs, $flowInfo, $signers);$flowResult = self::execResponse($createFlowOneStep);$flowId = $flowResult['flowId']; //流程id保存好$getFileSignUrl = SignFile::getFileSignUrl($flowId, $accountId);$result = self::execResponse($getFileSignUrl);/*** TODO 加入自己的逻辑操作:保存到自己的数据库*/return [$flowResult, $result];}/*** 统一执行接口数据* @param mixed $requestObject 对象 use Identity\factory\request\EsignRequest;* @param mixed $codeName 业务码字段名* @return array*/public function execResponse(EsignRequest $requestObject, $codeName = 'code'){$executeObject = $requestObject->execute();//execute方法发起请求$resultJson = $executeObject->getBody(); //获取结果json数据//记录日志$log = json_encode($_REQUEST, JSON_UNESCAPED_UNICODE) . PHP_EOL . $resultJson; //记录REQUEST数据,换行,并记录 响应数据Log::write($log); //日志记入 use think\facade\Log;$result = json_decode($resultJson, true); //json转arrayif ($result[$codeName] != $this->successCode) { //根据状态码判断结果throw new BaseException($result['message']);}//返回data数据$data = isset($result['data']) ? $result['data'] : []; //删除等操作时,data为nullreturn $data;}
5、sdk使用
- sdk使用的话,根据自己的目录存放位置,来选择是否需要添加命名空间
四、最简单的接口调用顺序
我这里说的最简单是指,我们不通过调用模板接口操作模板文件数据(模板接口里的参数太复杂了)
咱们这里就用一个只需要签署用户姓名,企业姓名 的合同,则接口的调用顺序如下:
- 1、创建个人签署账号 对应的
修改
查询
注销
接口也可以封装一下(accountId, thirdPartyUserId 二选一) - 2、创建机构签署账号 对应的
修改
查询
注销
接口也可以封装一下(orgId, thirdPartyUserId 二选一) - 3、文件上传 对应的
查询文件上传状态(当接口返回的 文件状态 status 值为 2 或 5 时,此文件才可以被正常添加到签署流程中。)
、查询PDF文件详情(当接口返回的 文件状态 status 值为 2 或 5 时,此文件才可以被正常添加到签署流程中或下载PDF文件)
也可以封装一下 - 4、针对模板的操作,跳过
- 5、选择一步发起签署,这个接口里可以配置回调:具体的代码请参考 Demo文件中的 b2cDemo.php
- 6、回调操作:通过
action
判断回调的类型,具体请参考我上面的:回调通知接收说明 - 7、PDF文件验签:
这一步看情况
- 8、回调如果签署成功,则 流程文档下载 归档,会返回文档地址字段 fileUrl, 有效时间1小时;该链接建议只用于下载,不要直接预览;可以给用户查看签署后的文件。
- 说明:这里面的步骤我们需要设计数据表存储e签宝数据,需要有我们的数据交互,请根据接口的 请求、返回数据 自行设计数据表。
五、需要注意的点
1、创建个人签署账号接口,证件包含小写的 x
- 1、thirdPartyUserId 创建个人账号的唯一标识:我们需要保证参数的唯一性,并且能关联上用户,否则一个用户会一直创建账户~
- 2、idNumber 证件号:身份证中有X字母的,需要传入大写的X。需要代码处理一下:
strtoupper($data['id_number']);
2、文件上传接口,文件名格式
- fileName 文件名称:格式问题 文件名称不支持以下9个字符:
文件名称(必须带上文件扩展名,不然会导致后续发起流程校验过不去 示例:合同.pdf );
注意:
(1)该字段的文件后缀名称和真实的文件后缀需要一致。比如上传的文件类型是word文件,那该参数需要传“xxx.docx”,不能是“xxx.pdf”
(2)该字段建议直接传入pdf文件,其他类型文件建议本地自行转换成pdf,避免通过接口格式转换引起的格式错误、耗时久等问题。
(3)文件名称不支持以下9个字符:/ \ : * " < > | ?
3、业务码字段并不都是 code,也可能是 errCode
- 文件上传 步骤二 文件流上传,返回的 是 errCode 不是 code,这个需要注意一下
4、方法不存在
- 如果有缺失的方法,自己可以按照官方的sdk自行增加php文件,他这里一个PHP文件是对应一个接口,然后在一个php文件中调用这些php文件。SDK封装方式和京东一样,很灵活。
- 注意:我们自定义的文件最好取一个不会重复的文件名,加上你的笔名后缀啥的(比如
QryPdfDetailZSF.php
),如果更新官方文档,被覆盖了就很尴尬了。
5、签署章子位置的设置
- 通过
setPosPage()
,setPosX()
,setPosY()
设置://设置盖章区域:页码;x轴坐标,左下角为原点;y轴坐标,左下角为原点 - demo 如下
$orgSignfield = new Signfield();
$posBean = new PosBean();
$orgSignfield->setFileId($fileId)->setPosBean($posBean->setPosPage(1)->setPosX(224)->setPosY(334))->setActorIndentityType(2);//机构签署必传
$orgSignfields = array($orgSignfield);//构造个人signfields参数对象
6、接口请求统一处理,封装一个方法统一请求
- 接口请求都是执行execute(),getBody()方法,我们不需要每次都调用。结合第三个问题,封装一个方法。
/*** 通过accountId查询个人签署账号* @return array*/public function qryPersonByaccountId(){$account = Account::qryPersonByaccountId($_REQUEST['account_id']); //use Identity\factory\base\Account;$result = self::execResponse($account);/*** TODO 与自己的数据库交互*/return $result;}/*** 统一执行接口数据* @param mixed $requestObject 对象 use Identity\factory\request\EsignRequest;* @param mixed $codeName 业务码字段名* @return array*/public function execResponse(EsignRequest $requestObject, $codeName = 'code'){$executeObject = $requestObject->execute();//execute方法发起请求$resultJson = $executeObject->getBody(); //获取结果json数据//记录日志$log = json_encode($_REQUEST, JSON_UNESCAPED_UNICODE) . PHP_EOL . $resultJson; //记录REQUEST数据,换行,并记录 响应数据Log::write($log); //日志记入 use think\facade\Log;$result = json_decode($resultJson, true); //json转arrayif ($result[$codeName] != $this->successCode) { //根据状态码判断结果die($result['message']); //根据你的实际情况写}//返回data数据$data = isset($result['data']) ? $result['data'] : []; //删除等操作时,data为nullreturn $data;}
六、写在最后
- 这篇文章仅供大家参考,欢迎各位大佬指出问题~