本文目录导读:

在PHP中生成电子发票版式(通常指OFD或PDF格式),最主流的方案是使用第三方云服务或专业的PHP库,下面介绍几种常用的实现方式,从简易到专业:
使用第三方API(最推荐,合规且省力)
国内主流的电子发票服务商(如百望云、航天信息、诺诺网)都提供了PHP SDK,他们负责处理版式文件的生成、签章和上传税局,你只需要调用接口传入开票数据。
流程:
- 注册服务商账号,获取
AppKey和AppSecret。 - 使用SDK或
cURL提交开票数据(JSON格式)。 - 服务商返回发票号码和OFD/PDF下载链接。
示例代码(伪代码,以某服务商为例):
<?php
// 引入SDK或使用Guzzle HTTP客户端
$client = new \GuzzleHttp\Client();
$response = $client->post('https://api.fapiao.com/invoice/create', [
'headers' => [
'AppKey' => '你的APP_KEY',
'Content-Type' => 'application/json'
],
'json' => [
'buyer_name' => '某某公司',
'buyer_tax_no' => '91510000...',
'amount' => 100.00,
'tax_rate' => 0.13,
'items' => [
['name' => '技术服务费', 'price' => 88.50, 'qty' => 1]
]
]
]);
$data = json_decode($response->getBody(), true);
// 返回结果中包含 PDF/OFD 的下载URL
echo $data['invoice_url'];
?>
使用开源PHP库生成PDF发票
如果你需要自己控制版式(不依赖外部服务),可以使用 Dompdf 或 TCPDF 配合 Twig 模板引擎,注意:这种方式生成的PDF不是标准OFD,通常用于企业内部收据或小规模自用,无法直接用于税局报税。
步骤:
-
安装依赖 (Composer)
composer require dompdf/dompdf
-
编写HTML模板(设计发票样式)
<!DOCTYPE html> <html> <head> <style> .invoice-box { max-width: 700px; margin: auto; padding: 30px; border: 1px solid #eee; box-shadow: 0 0 10px rgba(0,0,0,0.15); font-size: 14px; } .header { text-align: center; font-size: 24px; font-weight: bold; border-bottom: 2px solid #333; padding-bottom: 10px; } .company { margin: 20px 0; } .items-table { width: 100%; border-collapse: collapse; } .items-table th, .items-table td { border: 1px solid #ddd; padding: 8px; } </style> </head> <body> <div class="invoice-box"> <div class="header">电子发票</div> <!-- 更多字段:发票抬头、税号、金额 --> </div> </body> </html> -
PHP生成PDF
<?php require 'vendor/autoload.php'; use Dompdf\Dompdf; $dompdf = new Dompdf(); // 1. 准备数据(从数据库获取) $invoiceData = [ 'invoice_no' => '12345678', 'date' => date('Y-m-d'), 'amount' => 1999.00 ]; // 2. 加载HTML模板并替换变量(使用str_replace或Twig) $html = file_get_contents('invoice_template.html'); foreach ($invoiceData as $key => $value) { $html = str_replace("{{ $key }}", $value, $html); } // 3. 渲染PDF $dompdf->loadHtml($html); $dompdf->setPaper('A4', 'portrait'); $dompdf->render(); $dompdf->stream("invoice_{$invoiceData['invoice_no']}.pdf"); ?>
生成OFD格式(更专业,符合国标)
OFD是中国国家标准电子发票格式,直接在PHP中生成OFD非常复杂(涉及XML打包和国密算法签名),不建议手动实现。
可行的替代方案:
- 转换法:先用PHP生成PDF或图片,然后用Java工具(如
OfdConverter)或Python脚本批量转换为OFD。 - 调用中台服务:使用像
电子发票云这样的中间件服务,它们将XML数据转换为OFD。
关键核心步骤总结
无论选择哪种方案,生成电子发票版式都包含以下核心步骤:
| 步骤 | 说明 | 技术要点 |
|---|---|---|
| 开具数据准备 | 购买方信息、商品明细、金额、税率 | 数据结构JSON/XML |
| 调用开具接口 | 提交到税局或服务商 | HTTPS + 签名 |
| 生成版式文件 | 生成OFD/PDF | 模板引擎或SDK |
| 电子签章 | 加载税局ukey证书 | 服务商处理 |
| 存储与交付 | 保存文件,提供下载 | 文件服务器/OSS |
性能建议
- 不要用PHP原生实现OFD:OFD格式规范和国密算法很复杂,容易出错。
- 异步队列处理:开票是一个耗时操作(尤其是批量),建议使用
Redis+Beanstalkd或RabbitMQ做异步任务。 - 使用云存储:生成的大量发票文件建议存到阿里云OSS或腾讯云COS,而不要放本地。
推荐的最佳实践组合
最稳妥的方案:
阿里云电子发票API/百望云+Guzzle HTTP+MySQL存储元数据+OSS存储PDF/OFD文件
这种组合既保证了合规性,又让PHP代码极其简洁(业务逻辑只需要拼数据、调接口、存数据库)。
如果你有更具体的场景(比如批量开票、特定服务商),欢迎告诉我,我可以给你针对性的代码示例。