You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中生成解析TLV并对电子发票QR码编码结果进行Base64编码

电子发票QR码TLV编码实现方案

手动实现TLV生成逻辑

你需求的TLV编码规则非常简单,不需要依赖第三方库,直接遍历数组按规则拼接二进制内容即可,PHP实现代码如下:

<?php

/**
 * 生成符合电子发票规则的TLV编码字符串
 * @param array $data 键为Tag值,值为对应字段内容
 * @return string 二进制TLV结果
 * @throws InvalidArgumentException 参数不合法时抛出异常
 */
function generateInvoiceTlv(array $data): string {
    $tlvContent = '';
    foreach ($data as $tag => $value) {
        // Tag占1字节,校验范围0-255
        if ($tag < 0 || $tag > 255) {
            throw new InvalidArgumentException(sprintf('Tag值[%d]非法,需在0-255范围内', $tag));
        }
        // 统一转换为UTF-8编码,保证长度计算准确
        $utf8Value = mb_convert_encoding((string)$value, 'UTF-8');
        $valueLength = strlen($utf8Value);
        // Length占1字节,校验单字段长度不超过255字节
        if ($valueLength > 255) {
            throw new InvalidArgumentException(sprintf('Tag[%d]的内容长度超过255字节限制', $tag));
        }
        // 按顺序拼接Tag、Length、Value三部分
        $tlvContent .= chr($tag) . chr($valueLength) . $utf8Value;
    }
    return $tlvContent;
}

// 测试调用
$arr = [
    1 => 'Company Name',
    2 => '1234567890',
    3 => '2021/10/11 17:20:00',
    4 => '1000',
    5 => '150'
];

$tlvResult = generateInvoiceTlv($arr);
// 如需查看十六进制格式结果可使用 bin2hex($tlvResult)

相关库说明

该TLV规则是国内电子发票的定制化规范,不属于通用标准TLV格式(如BER-TLV),没有专门的公共库可以直接使用。但上述自定义实现逻辑足够简单,无额外依赖,可直接投入生产使用。

注意事项

  • 所有字段内容需确保最终为UTF-8编码,避免中文等多字节字符乱码、长度计算错误
  • 单个字段的字节长度不能超过255,符合电子发票字段的官方长度要求
  • 生成的二进制TLV结果可直接作为内容输入到QR码生成工具中使用

内容的提问来源于stack exchange,提问作者Taha Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 21:45:05