1 頁 (共 1 頁)

電子發票紙本-QRCode

發表於 : 2016-04-29 20:23:42
yehlu
https://wwwtest.einvoice.nat.gov.tw/hom ... 7550540158

https://www.einvoice.nat.gov.tw/home/Do ... 6458324260

http://carlleesnote.blogspot.tw/2014/04/qrcode.html

電子發票紙本-QRCode
之前任職公司導入電子發票,過程中遇到的問題,主要是電子發票紙本輸出格式中QRCode的規格要求,在實作的過程有遇到下述兩個問題。

1. 需加密驗證資訊(24位):將發票字軌十碼及隨機碼四碼以字串方式合併後使用 AES 加密並採用 Base64 編碼

2. 二維條碼記載完整品目筆數:記錄左右兩個二維條碼記載消費品目筆數,以十進位方式記載




首先,先處理第一個問題,過去並沒有實作過AES相關加密,所以上網找了一下資料,實作方式如下:

public function getEncrypt($sStr, $sKey) {
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
return base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
$sKey,
$sStr,
MCRYPT_MODE_ECB,
$iv
)
);
}

public function getDecrypt($sStr, $sKey) {
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
return mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
$sKey,
base64_decode($sStr),
MCRYPT_MODE_ECB,
$iv
);
}

以規格要求,用PHP內建函數以24元位加密後,再採用 Base64 編碼,分別實作加密與解密兩個method,不過其實解密目前用不著,只是先寫出來備著(笑)。


至於,為什麼會有第二個問題呢?

因為過去在分割字串上,主要是使用php內建的substr,大部份的需求來說沒有問題,但如果要處理中、英、數或特殊字元混雜時,使用substr就會出現問題,因為中文字以及英數的字元長度,substr的判斷上會隨著文件的編碼格式不同而有所差異,因此substr是不適用的,所以找到了一個新方法。

iconv_substr

iconv_substr一樣是php內建函數,使用方法大致上說明一下。

iconv_substr (str, offset(int), length(int), charset);

str: 想要進行分割的字串
offset: 分割起始字元
length: 截取的字元長度
charset: 設定字元的編碼

以我中、英、數及特殊字元混雜的字串進行分割為例:

$leftWord = iconv_substr($codeString, 0, 87, 'utf-8');

使用這樣的參數設定就可以達到我要的目地。





ps:
在實作的過程其實不免產生一些謬思,比如說....
1. QRCode裡的字串已經有包含發票號碼及相關資訊的明碼,但在拼混字串的過程,卻是要求你把明碼資訊加密後串在外面,用意為何?

2. 兩個QRCode主要是怕一個QRCode塞不進完整字串,主要是先塞左邊再塞右邊,但卻也沒有明文規範,究竟左邊最大塞幾個,右邊先塞幾個,而QRCode其實是有限制最大可容許字元,萬一兩個都超過的時候,要怎麼塞?


想歸想,但政府的東西就是這樣,沒討論的空間,怎麼吩咐怎麼辦。