ThinkPHP6.x 电子签名:合同签署与PDF文件数字签名验证

夏瑶同学_1965

夏瑶同学_1965

2026-06-04

359人浏览

原创

应采用fpdi-sign库、腾讯电子签、e签宝、tcpdf或本地验签五种合规方案实现合同pdf数字签名与验证,确保满足《电子签名法》第十四条司法采信要求。

thinkphp6.x 电子签名:合同签署与pdf文件数字签名验证

如果您在ThinkPHP6.x项目中需实现合同签署与PDF文件数字签名验证,则可能面临签名不被司法采信、验签失败或无法满足《电子签名法》第十四条可靠性要求等问题。以下是解决此问题的步骤:

一、使用fpdi-sign库自主完成PDF数字签名

该方法适用于数据不能出内网、需私有化部署的场景,可生成符合PAdES-BASELINE-LT标准的签名结构,支持嵌入可信CA证书链与时间戳,满足司法存证要求。需注意PHP版本不低于8.0,且源PDF不可为线性化格式。

1、执行命令安装依赖:composer require setasign/fpdi-sign:^4.0

2、确认原始PDF未被线性化:在服务器执行pdfinfo your.pdf,输出中必须显示Linearized: no

3、将私钥保存为PEM格式文件(如runtime/sign/private.key),并确保Web进程用户(如www-data)具备读取权限,执行chmod 600 runtime/sign/private.key

4、在控制器中编写签名逻辑:先用FPDI导入PDF,调用setSignatureAppearance()设置坐标(单位为1/72英寸,A4左下角为(0,0)),再传入PEM私钥路径与证书路径执行签名

5、签名完成后,使用openssl_verify()或第三方SDK对输出PDF进行本地验签,确认签名状态为有效且文档未被篡改

二、对接腾讯电子签平台完成签署与验签

该方案由具备国密SM2认证与至信链存证资质的平台完成签署,返回PDF自带司法区块链存证编号,签署结果可直连法院系统采信,适合多数业务场景。

1、登录腾讯电子签控制台完成企业实名认证,获取API密钥与应用ID

2、调用/v2/documents/upload接口上传PDF,使用FileBody(base64去data:前缀)或FileUrls方式提交

3、收到file_id后,调用/v2/flows/create发起签署流程,指定签署方顺序、签署位置控件及意愿确认弹窗规则

4、签署完成后,平台回传含SM2签名的PDF文件,同时提供chain_id与timestamp

5、使用腾讯电子签官方PHP SDK调用verifyDocument()方法,传入回传PDF与平台公钥,验证签名有效性及存证上链状态

三、对接e签宝平台实现合同签署与回调验签

e签宝采用RSA-SHA256算法生成签名,回调参数中包含sign字段,需严格按平台文档要求拼接参数、剔除空值、字段名转小写、时间戳取秒级,并对sign做base64_decode后再验签。

1、完成企业实名认证并创建电子印章,获取contract_id(非access_token)用于签署调用

2、调用/v3/contract/sign接口,传入contract_id、签署人手机号、签署位置坐标及意愿确认配置

PHP
PHP

编写健壮的PHP代码,规避类型转换陷阱、数组怪癖及常见安全漏洞。

下载

3、接收平台回调时,从php://input读取原始JSON,提取sign、timestamp、nonce及业务参数

4、按平台要求顺序拼接所有非空参数(字段名小写、键值对无空格、不urlencode),生成待验签字符串

5、执行$sign_decoded = base64_decode($sign),再调用openssl_verify()配合平台提供的PEM格式公钥完成验签

四、使用TCPDF库在生成PDF时嵌入数字签名

TCPDF支持在动态生成PDF过程中直接嵌入PKCS#7签名,适用于合同由模板实时生成的场景,但需提前准备合法CA颁发的X.509证书及对应私钥。

1、通过OpenSSL生成或申请证书:若已有pfx文件,执行openssl pkcs12 -in fullchain.pfx -out tcpdf.crt -nodes导出crt文件

2、将证书文件(如tcpdf.crt)和私钥(如tcpdf.key)置于public/cert/目录,确保Web用户可读

3、在代码中设置证书路径:$certificate = 'file://' . public_path() . '/cert/tcpdf.crt';

4、调用setSignatureAppearance()设置签名外观位置,使用setSignature()传入证书路径、私钥路径、密码(如有)及签名信息数组

5、生成PDF后,用Adobe Acrobat或福昕PDF编辑器右键签名区域选择“验证签名”,确认提示为“签名有效,文档未被更改”

五、本地验证PDF数字签名有效性

无论采用何种签署方式,最终PDF都必须支持第三方工具或代码层面验证其签名状态与完整性,避免因签名结构不合规导致诉讼中不被采信。

1、使用命令行工具pdfsig(poppler-utils提供)执行:pdfsig signed.pdf,检查输出是否含“Signature is VALID”及证书链信息

2、在PHP中调用openssl_pkcs7_verify():将PDF中嵌入的PKCS#7签名段提取为.p7s文件,配合CA证书包执行验证

3、使用福昕PDF编辑器打开PDF,点击签名区域,在弹出面板中查看“签名属性”,确认“签名者身份”“签名时间”“文档完整性”三项均为有效

4、若PDF由第三方平台返回,必须调用其官方SDK中的验签方法(如腾讯电子签VerifyDocument、e签宝verifySign),不可仅依赖本地工具

5、记录每次验签原始输入(含PDF二进制流哈希、签名字段值、公钥指纹),形成可追溯的审计日志

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

9244

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5601

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2035

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3488

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4154

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3251

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

4617

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3622

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11642

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ThinkPHP6.x 微实战--十天技能课堂
ThinkPHP6.x 微实战--十天技能课堂

共26课时 | 2.5万人学习

ThinkPHP6.x API接口--十天技能课堂
ThinkPHP6.x API接口--十天技能课堂

共14课时 | 1.5万人学习