0

我正在为我的公司构建内部发票解决方案。政府要求我们创建以标签长度值 (TLV) 格式编码的二维码字段。

TLV 编码应如下:

标签:上面提到的标签值存储在一个字节中

长度:字段值的UTF8编码产生的字节数组的长度。长度应存储在一个字节中。

值:由字段值的 UTF8 编码产生的字节数组。

在示例中,他们提供了这个 Base64 输出

AQkxMjM0NTY3ODkCCjEyLzEyLzIwMjADBDEwMDADAzE1MPaIn2Z2jg6VqWvWV6IrZZNzLF7xvZrWXW5xRV5yFY2xFu0ycXOiyqV0k7Wsh6b1IcE2Tfzap1AQAQVsktmsv1FFQ1MxIAAAAGKblFMh9nFRSn8tvftXqo9zRSz2VEAPITSZ3W7UDHKhUx+7yXGijLtJSZGXMOc+jpKwARzDl68GmmRd75NWdOs=

当我使用解码时

$base64 = "AQkxMjM0NTY3ODkCCjEyLzEyLzIwMjADBDEwMDADAzE1MPaIn2Z2jg6VqWvWV6IrZZNzLF7xvZrWXW5xRV5yFY2xFu0ycXOiyqV0k7Wsh6b1IcE2Tfzap1AQAQVsktmsv1FFQ1MxIAAAAGKblFMh9nFRSn8tvftXqo9zRSz2VEAPITSZ3W7UDHKhUx+7yXGijLtJSZGXMOc+jpKwARzDl68GmmRd75NWdOs=";
echo base64_decode($base64); 

我得到的回应是:

    123456789
12/12/20201000150���fv���k�W�+e�s,^��]nqE^r���2qs�ʥt������!�6M�ڧPl�٬�QECS1 b��S!�qQJ-��W��sE,�T@!4��n�r�S��q���II��0�>���×��d]�Vt�

标签 1:卖家名称

标签 2:增值税注册号

标签 3:发票的时间戳

标签 4:发票总额

标签 5:税收总额

标记 6:XML 发票的哈希

标签 7:ECDSA 签名

标签 8:ECDSA 公钥

标签 9:加密邮票公钥的 ECDSA 签名

我在这里做错了什么以及纠正它的正确语法是什么?

4

3 回答 3

4

知道它是二进制数据,我们可以用 回显它bin2hex(base64_decode($base64)),然后看到:

0109313233343536373839020a31322f31322f323032300304313030300303313530f6889f66768e0e95a96bd657a22b6593732c5ef1bd9ad65d6e71455e72158db116ed327173a2caa57493b5ac87a6f521c1364dfcdaa7501001056c92d9acbf514543533120000000629b945321f671514a7f2dbdfb57aa8f73452cf654400f213499dd6ed40c72a1531fbbc971a28cbb4949919730e73e8e92b0011cc397af069a645def935674eb

为了便于查看,我使用了命令行工具base64 -dxxd获得了这个视图:

00000000: 0109 3132 3334 3536 3738 3902 0a31 322f  ..123456789..12/
00000010: 3132 2f32 3032 3003 0431 3030 3003 0331  12/2020..1000..1
00000020: 3530 f688 9f66 768e 0e95 a96b d657 a22b  50...fv....k.W.+
00000030: 6593 732c 5ef1 bd9a d65d 6e71 455e 7215  e.s,^....]nqE^r.
00000040: 8db1 16ed 3271 73a2 caa5 7493 b5ac 87a6  ....2qs...t.....
00000050: f521 c136 4dfc daa7 5010 0105 6c92 d9ac  .!.6M...P...l...
00000060: bf51 4543 5331 2000 0000 629b 9453 21f6  .QECS1 ...b..S!.
00000070: 7151 4a7f 2dbd fb57 aa8f 7345 2cf6 5440  qQJ.-..W..sE,.T@
00000080: 0f21 3499 dd6e d40c 72a1 531f bbc9 71a2  .!4..n..r.S...q.
00000090: 8cbb 4949 9197 30e7 3e8e 92b0 011c c397  ..II..0.>.......
000000a0: af06 9a64 5def 9356 74eb                 ...d]..Vt.

您还没有解释可能的“标签”值是什么,但我可以看到该字符串的开头有一个标签0x01,长度为0x09,接下来的 9 个字节是 ASCII/UTF-8 的123456789; 然后它的标签为0x02,长度为0x0a,接下来的 10 个字符是 ASCII/UTF-8 12/12/2020;等等。

后来,有f6一个长度为 的标签88和一些二进制数据,但在不知道标签f6的含义的情况下,我没有理由认为这是一个问题 - 也许它嵌入了图像或压缩数据流。

于 2021-10-11T16:16:02.123 回答
1

用于在 PHP 中解码 QR 码 (Zatca)

  1. 阅读 QR 码 - 示例 base64 代码。
  2. 解码 base64 代码。
  3. 使用 preg_replace 从字符串中删除 unicode 值
  4. 并爆炸得到数组

示例代码

$base64 = "AQZSYWZlZXECDTEyMzQ1Njc4OVQxMjUDFDIwMjEtMDctMTJUMTQ6MjU6MDlaBAM3ODYFAjI1";

$decoded = base64_decode($base64);

//print_r($decoded)
//raw data
//\u0001\u0006Rafeeq\u0002\t123456789\u0003\u00142021-07-12T14:25:09Z\u0004\u0003786\u0005\u000225

$result_data = preg_replace('/[\x00-\x1F\x80-\xFF]/', ',', $decoded);

$actula_data = explode(',,', $result_data);

print_r($actula_data);

输出 :

["","Rafeeq","123456789T125","2021-07-12T14:25:09Z","786","25"]
于 2022-01-06T09:07:32.243 回答
0

编辑:

安全规范中它说:

4.2 应用在二维码上的加密印章的结构 二维码 所需的加密印章的以下规范基于《电子发票条例规定的实施控制、要求、技术规范和程序规则》附件(2) . 二维码密码印章应使用与电子发票盖章相同的数字证书生成。用于在电子发票上加盖加盖印章的数字证书的管理和使用要求请参见第 3 节。Cryptographic Stamp 应应用于 QR 码字段(从标签 1 到标签 6)的整个 TLV 编码,然后将其附加到 TLV 结构中。Cryptographic Stamp由下表所示的两个字段组成:

我假设这部分数据是密码图章的一部分

于 2021-10-11T16:20:14.173 回答