PHP生成电子发票版式

wen PHP项目 1

本文目录导读:

PHP生成电子发票版式

  1. 方案一:使用第三方API(最推荐,合规且省力)
  2. 方案二:使用开源PHP库生成PDF发票
  3. 方案三:生成OFD格式(更专业,符合国标)
  4. 关键核心步骤总结
  5. 性能建议
  6. 推荐的最佳实践组合

在PHP中生成电子发票版式(通常指OFD或PDF格式),最主流的方案是使用第三方云服务专业的PHP库,下面介绍几种常用的实现方式,从简易到专业:

使用第三方API(最推荐,合规且省力)

国内主流的电子发票服务商(如百望云、航天信息、诺诺网)都提供了PHP SDK,他们负责处理版式文件的生成、签章和上传税局,你只需要调用接口传入开票数据。

流程:

  1. 注册服务商账号,获取 AppKeyAppSecret
  2. 使用SDK或 cURL 提交开票数据(JSON格式)。
  3. 服务商返回发票号码和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发票

如果你需要自己控制版式(不依赖外部服务),可以使用 DompdfTCPDF 配合 Twig 模板引擎,注意:这种方式生成的PDF不是标准OFD,通常用于企业内部收据或小规模自用,无法直接用于税局报税。

步骤:

  1. 安装依赖 (Composer)

    composer require dompdf/dompdf
  2. 编写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>
  3. 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

性能建议

  1. 不要用PHP原生实现OFD:OFD格式规范和国密算法很复杂,容易出错。
  2. 异步队列处理:开票是一个耗时操作(尤其是批量),建议使用 Redis + BeanstalkdRabbitMQ 做异步任务。
  3. 使用云存储:生成的大量发票文件建议存到阿里云OSS或腾讯云COS,而不要放本地。

推荐的最佳实践组合

最稳妥的方案阿里云电子发票API / 百望云 + Guzzle HTTP + MySQL存储元数据 + OSS存储PDF/OFD文件

这种组合既保证了合规性,又让PHP代码极其简洁(业务逻辑只需要拼数据、调接口、存数据库)。

如果你有更具体的场景(比如批量开票、特定服务商),欢迎告诉我,我可以给你针对性的代码示例。

抱歉,评论功能暂时关闭!