应采用fpdi-sign库、腾讯电子签、e签宝、tcpdf或本地验签五种合规方案实现合同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、签署人手机号、签署位置坐标及意愿确认配置
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免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











