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其實是有限制最大可容許字元,萬一兩個都超過的時候,要怎麼塞?
想歸想,但政府的東西就是這樣,沒討論的空間,怎麼吩咐怎麼辦。
電子發票紙本-QRCode
前往
- Software
- ↳ CodeCharge Studio
- ↳ CodeCharge
- ↳ DemoCharge
- ↳ SuperPDF
- ↳ 551einv
- ↳ E3進銷存
- 程式語言
- ↳ PHP
- ↳ CodeLobster PHP Edition
- ↳ Yii
- ↳ CodeIgniter
- ↳ Phalcon
- ↳ Symfony
- ↳ FuelPHP
- ↳ Zend Framework 2
- ↳ laravel
- ↳ WordPress
- ↳ ASP.NET/C#
- ↳ ASP/VBScript
- ↳ JSP
- ↳ Java Servlets
- ↳ ColdFusion
- ↳ Perl
- ↳ Java Script
- ↳ jQuery
- ↳ HTML + CSS
- ↳ jQuery
- ↳ nodejs
- ↳ VB6
- ↳ Git
- ↳ App Inventor 2
- ↳ bash
- ↳ C++/ VC/ OpenCV
- ↳ OpenCV
- ↳ go
- ↳ cordova
- ↳ python
- ↳ Xamarin
- ↳ Assembly
- 資料庫
- ↳ MySQL
- ↳ PostgreSQL
- ↳ ORACLE
- ↳ Access
- ↳ SQL Server
- ↳ SQLite
- ↳ MariaDB
- ↳ Mongodb
- 作業系統
- ↳ Linux
- ↳ Ubuntu
- ↳ CentOS
- ↳ Mint
- ↳ Mandriva
- ↳ Debian
- ↳ Red Hat Enterprise Linux
- ↳ Oracle Linux
- ↳ Fedora
- ↳ Kali Linux
- ↳ OpenSUSE
- ↳ Elementary OS
- ↳ Microsoft
- ↳ Server 2008 R2
- ↳ Server 2012 R2
- ↳ Server 2012
- ↳ 8
- ↳ 10
- ↳ System Center 2016
- ↳ NOVELL
- ↳ FreeBSD
- ↳ VMware
- ↳ VirtualBox
- ↳ Mac OS X
- ↳ Solaris
- ↳ iOS
- ↳ Android
- ↳ Cloud
- ↳ OpenStack
- ↳ Docker
- ↳ Proxmox VE
- ↳ CloudReady
- ↳ chrome
- 網頁伺服器
- ↳ apache
- ↳ tomcat
- ↳ nginx
- ↳ IIS
- ↳ JBoss
- ↳ weblogic
- ↳ WebHosting
- 硬體
- ↳ 硬體及週邊
- ↳ RouterOS
- ↳ LEGO NXT
- ↳ Arduino
- ↳ MSP430
- ↳ Raspberry Pi
- ↳ OpenERP
- ↳ Storage
- ↳ Server
- ↳ Brocade
- ↳ MODELS
- ↳ FortiGate
- 軟體
- ↳ sublime
- ↳ LibreNMS