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

How to create and parse Tag, Length, Value (TLV) in PHP and encode it in Base64

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

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

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

是的,需要的二维码不是带link的普通二维码。它应该是 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();
function einv_generate_tlv_qr_code($array_tag=array()){
    $index=1;
    foreach($array_tag as $tag_val){
        $tlv_string.=pack("H*", sprintf("%02X",(string) "$index")).
                     pack("H*", sprintf("%02X",strlen((string) "$tag_val"))).
                     (string) "$tag_val";
        $index++;                              
    }      
    return base64_encode($tlv_string);
}

只需将数组中的标签值发送给函数,它就会return给你QRcode的TLV内容

$data_tlv=einv_generate_tlv_qr_code(array($company_name,$vat_reference,$timestamp,$total,$vat);

我在 SA 的客户已经解决了这个 ZATCA TLV Base64 QR 码 P2C 问题。 好吧,我做了这个功能并验证了它的结果。

function zatca_base64_tlv_encode($seller_name, $vat_registration_number, $invoice_datetimez, $invoice_amount, $invoice_tax_amount)
{
    $result = chr(1) . chr( strlen($seller_name) ) . $seller_name;
    $result.= chr(2) . chr( strlen($vat_registration_number) ) . $vat_registration_number;
    $result.= chr(3) . chr( strlen($invoice_datetimez) ) . $invoice_datetimez;
    $result.= chr(4) . chr( strlen($invoice_amount) ) . $invoice_amount;
    $result.= chr(5) . chr( strlen($invoice_tax_amount) ) . $invoice_tax_amount;
    return base64_encode($result);
}

基于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
 */

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

2 -- fatoorah validateqr -qr "$__QR"