如何在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
相关产品推荐
相关产品推荐

