如何在 PHP 中创建和解析标签、长度、值 (TLV) 并将其编码为 Base64

Tah*_*han 5 php qr-code tlv

政府出台了一项新规定,要求所有增值税注册公司在新电子发票中使用二维码。

\n
    \n
  • QR 码字段应以标签长度值 (TLV) 格式进行编码,并使用相邻表的 \xe2\x80\x9cTag\xe2\x80\x9d 列中指定的标签值。

    \n
  • \n
  • TLV编码应如下:

    \n
      \n
    • Tag:前面提到的以一个字节存储的标签值。
    • \n
    • 长度:字段值进行UTF8编码后得到的字节数组的长度。长度应以一个字节存储。
    • \n
    • 值:由字段值的 UTF8 编码生成的字节数组。
    • \n
    \n
  • \n
\n

如何从信息数组创建 TLV?有我可以使用的图书馆吗?

\n
$arr = [\n    1 => \'Company Name\',\n    2 => \'1234567890\',\n    3 => \'2021/10/11 17:20:00\',\n    4 => \'1000\',\n    5 => \'150\'\n];\n
Run Code Online (Sandbox Code Playgroud)\n

小智 13

是的,所需的二维码不是带有链接的普通二维码。它应该是 TLV base64 编码的。这可以很容易地完成。这些值需要十六进制然后组合,其中将包含 ASCII 控制字符。

如果您仍然不明白,幸运的是,您可以使用 Salla 提供的以下包从数组生成二维码。

https://github.com/SallaApp/ZATCA

确保遵循 ZATCA(以前的 GAZT)提供的标签结构。该包的示例具有正确的数组:

$generatedString = GenerateQrCode::fromArray([
    new Seller('Salla'), // seller name
    new TaxNumber('1234567891'), // seller tax number
    new InvoiceDate('2021-07-12T14:25:09Z'), // invoice date as Zulu ISO8601 @see https://en.wikipedia.org/wiki/ISO_8601
    new InvoiceTotalAmount('100.00'), // invoice total amount
    new InvoiceTaxAmount('15.00') // invoice tax amount
    // TODO :: Support others tags
])->toTLV();
Run Code Online (Sandbox Code Playgroud)


Zee*_*bas 6

对于那些仍在使用基于 https://github.com/SallaApp/ZATCA的 php5 的人

/*
 * QR Encoding Functions
 */

function __getLength($value) {
    return strlen($value);
}

function __toHex($value) {
    return pack("H*", sprintf("%02X", $value));
}

function __toString($__tag, $__value, $__length) {
    $value = (string) $__value;
    return __toHex($__tag) . __toHex($__length) . $value;
}

function __getTLV($dataToEncode) {
    $__TLVS = '';
    for ($i = 0; $i < count($dataToEncode); $i++) {
        $__tag = $dataToEncode[$i][0];
        $__value = $dataToEncode[$i][1];
        $__length = __getLength($__value);
        $__TLVS .= __toString($__tag, $__value, $__length);
    }

    return $__TLVS;
}

/*
 * QR Encoding Functions
 */


/*
 * QR Code
 */
$dataToEncode = [
    [1, 'SellerName'],
    [2, 'VATNumber'],
    [3, 'invoiceDatetime'],
    [4, 'AmtwithVAT'],
    [5, 'VATamt']
];

$__TLV = __getTLV($dataToEncode);
$__QR = base64_encode($__TLV);

echo  $__QR;


/*
 * QR Code
 */
Run Code Online (Sandbox Code Playgroud)

1--安装 ZATCA SDK https://zatca.gov.sa/en/E-Invoicing/SystemsDevelopers/ComplianceEnablementToolbox/Pages/DownloadSDK.aspx

2 -- fatoorah validateqr -qr "$__QR"