ThinkPHP如何做电子签章_合同签署与PDF盖章存证【教程】
在ThinkPHP中实现电子签章需基于数字证书的密码学签名,包含PKCS#7签名、时间戳和CA证书链,形成PAdES-BASELINE-LT等级,符合《电子签名法》。可选自主集成fpdi-sign私有化部署或对接e签宝、腾讯电子签等第三方平台,均需验签。Word转PDF可用phpword与libreoffice,注意文件格式兼容。
先说一个核心判断:在PHP生态下,尤其是ThinkPHP框架里做电子签章,绝不是简单地把一张印章图片贴到PDF上就能完事的。“盖章”这个动作,在电子世界里本质上是基于数字证书的密码学签名。
电子签章合法有效的底层逻辑
根据《电子签名法》第十四条,要具备与手写签名或盖章同等的法律效力,必须实现“可靠电子签名”。这意味着什么?需要你的签名体系包含数字证书、身份认证、防篡改机制以及时间戳。图片盖章为什么无效?因为你贴上去的图片,文件本身的哈希值并没有变,别人没法验证这份文件是不是你签的、有没有被篡改过。
要实现真正的电子签章,技术路径通常包含三个环节:首先,用私钥对PDF内容做PKCS#7签名;其次,把时间戳和可信CA证书链嵌入进去;最后,生成一个符合PAdES-BASELINE-LT等级的签名结构。这三个东西缺一个,法律效力就要打个问号。

自主集成还是对接第三方?两条路径,各有利弊
在实际项目中,通常有两种选择:一是自己搭一套签名体系,二是接入像法大大、e签宝、腾讯电子签这种已经通过国密SM2和司法区块链存证认证的第三方平台。
自主集成fpdi-sign(适合私有化部署)
如果你的数据完全不能出内网,适合走私有化部署的路子。推荐用 setasign/fpdi-sign(注意版本要求:v4.x,PHP ≥ 8.0)。这里有几点容易踩坑:
- 私钥必须是PEM格式文件路径,不能直接把字符串传进去。同时,Web进程用户(比如www-data)得有读权限。
- 源PDF不能是线性化(Linearized)格式。保险起见,用
pdfinfo your.pdf命令确认一下。 - 坐标单位的换算要留意。坐标单位是1/72英寸,A4纸左下角是(0,0),右上角大约是(595,842)。别按像素思维写(100,100),位置会差很多。
- 签名前必须用FPDI导入原始PDF,再调用
setSignatureAppearance()设置位置。这个顺序不能乱。
对接第三方平台(推荐多数业务场景)
大多数业务场景下,我更推荐直接对接合规的第三方平台。这几个平台已经跑通了司法存证的闭环,省心不少。不过对接时各有各的细节:
- e签宝:调用签署接口参数是
contract_id,不是access_token。签署完成后,返回的是带国密签名的PDF。 - 腾讯电子签:上传PDF时,通过
FileUrls或FileBody(base64去头)上传,然后获取FlowId才能发起流程。 - 法大大:先要完成企业实名认证,拿到电子印章ID,再调API绑定签署位置控件。
- 关键提醒:所有平台都要求做验签逻辑。回传PDF到手后,必须用它们提供的SDK验证签名有效性和存证状态。这一步不能省。
Word转PDF再签章的常见路径
很多合同是由Word模板生成的。这个场景下,可以分两步走:先用 phpoffice/phpword 加载.docx文件,把 ${name} 这些占位符替换掉;然后调用Linux服务器上的 libreoffice --headless --convert-to pdf 命令转换成PDF。接着,把生成的PDF传入fpdi-sign或第三方平台签署。
需要注意一点:LibreOffice转换后的PDF,有时会是线性化格式。如果直接用fpdi-sign处理,会报 Unable to find startxref 的错误。所以转换完成后,最好检查一下。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















