如何在 PHP 中创建和解析标签、长度、值 (TLV) 并在 Base64 中对其进行编码
How to create and parse Tag, Length, Value (TLV) in PHP and encode it in Base64
政府出台了一项新规定,要求所有增值税注册公司在新电子发票中使用二维码。
QR码字段应以标签长度值(TLV)格式编码,标签值在相邻table的“标签”列中指定。
TLV编码如下:
- tag:一个字节中存储的上面提到的tag值
- 长度:字段值UTF8编码后字节数组的长度。长度应存储在一个字节中。
- 值:由字段值的 UTF8 编码生成的字节数组。
如何从一系列信息创建 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"
政府出台了一项新规定,要求所有增值税注册公司在新电子发票中使用二维码。
QR码字段应以标签长度值(TLV)格式编码,标签值在相邻table的“标签”列中指定。
TLV编码如下:
- tag:一个字节中存储的上面提到的tag值
- 长度:字段值UTF8编码后字节数组的长度。长度应存储在一个字节中。
- 值:由字段值的 UTF8 编码生成的字节数组。
如何从一系列信息创建 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"