導入財政部電子發票服務之文件集¶
備註
本文件集中所提及、引用、截取的文句、畫面多來自 財政部電子發票整合服務平台(https://www.einvoice.nat.gov.tw/)、財政部北區國稅局(https://www.ntbna.gov.tw/)。其著作權之合理使用,請詳見其平台之「著作權保護政策」及「政府網站資料開放宣告」網頁。
警告
本文件集乃基於忠實、客觀、利己且利他等原則寫作,難免還是有錯字、過版、語意模糊、誤用等情事發生。請利用人就自身風險擔負能力來利用本文件集,本文件集作者不擔保任何責任。
若對本文件集有任何意見、建議或改正,歡迎寄信到 hoamon@ho600.com 。
本文件集之著作權公開授權模式¶
本文件集之目標¶
(完成)協助消費者在整合平台設定發票載具
(撰寫中)協助營業人在整合服務平台上,開立、作廢、開立折讓、作廢折讓、退回 B2B 電子發票
- (撰寫中)協助營業人透過 Linux 版的 Turnkey-3+ 系統存證開立、作廢、註銷、開立折讓、作廢折讓 B2C 電子發票。所使用版本:
Turnkey 軟體版本: 3.0.2
電子發票資料交換標準訊息建置指引(Message Implementation Guideline)版本: 3.2.1
(撰寫中)協助營業人利用 Django-taiwan-einvoice app 為 Turnkey 系統提供 Web API 服務
(待續)協助營業人透過加值服務中心完成電子發票相關服務
(待續)「查詢電子發票API」教學
備註
名詞釋疑
所謂 B2B 、 B2C ,並不完全套用以字面上的 Business 及 Customer 。因為 B2B 發票可以開給機關、組織,而 B2C 發票也可以開給一般營利公司。
我這邊提供比較適當的解釋, B 是法人、準法人(商業行號), C 則是除自然人外,也包含法人、準法人。所以 B2B 一定是買賣雙方都有統編方可使用的服務,而 B2C 則是買方可以是自然人(無統編)也可以是法人、準法人。
名詞定義¶
EI: 財政部電子發票整合服務平台,也稱「大平台」
EPW: 使用 Django-based escpos_web App 建構的發票列印管理系統。 EPW 系統加上感熱式印表機可簡稱「發票機」
TKW: 使用 Django-based turnkey_web 程式來擴充 Turnkey 系統,使其提供 Web Api 功能的電子發票管理系統
CEC: 叫用 EPW 及 TKW 系統的自架電子商務銷售系統(Customize E-Commercial system),也可稱「小平台」
TEA: 提供 CEC 系統叫用的 Django-based taiwan_einvoice App 。 如果說 CEC 是 CPython 撰寫的,那 CEC 就直接利用 TEA 函式庫去跟 EPW/TKW 互動,若 CEC 是 PHP/.Net/Java/… 撰寫的, 那就先叫用導入(import) TEA 的 Web Api Service (TEAWEB 或 taiwan_einvoice_web),間接與 EPW/TKW 互動
使用 EI 大平台開立 B2B 電子發票的事前準備說明¶
測試用 財政部電子發票整合服務平台: 營業人身份(https://wwwtest.einvoice.nat.gov.tw/index!changeFocusType?newFocus=F1348636625449) 頁面
正式用 財政部電子發票整合服務平台: 營業人身份(https://www.einvoice.nat.gov.tw/index!changeFocusType?newFocus=F1348636625449) 頁面
使用實體憑證前,可至 經濟部工商憑證管理中心的瀏覽器檢測 頁面驗證相關元件
電子發票字軌號碼申請書(含電子發票開立系統自行檢測表) - 位於 EI 大平台/營業人文件下載頁面
使用電子發票承諾書 - 此文件與「電子發票字軌號碼申請書(含電子發票開立系統自行檢測表)」是放在同一個壓縮檔中
自建 Turnkey-3+ 來開立 B2C 電子發票的事前準備說明¶
實體憑證註冊 EI 大平台帳號
線上申請 Turnkey 正式區及驗證區: 申請網頁在 EI 大平台/Turnkey傳輸作業/Turnkey傳輸申請
申辦軟體憑證。雖然 Turnkey 也接受以實體憑證來傳輸發票檔,但實體憑證插讀卡機在上容易衍生資安疑慮
營業人應用 API 申請(捐贈碼、手機條 碼檢核及信用卡載具 等 API)
電子發票Turnkey上線前自行檢測作業 - 須於測試環境完成Turnkey上線前自行檢測作業,確保發票傳輸的正確性
參考資料¶
- 財政部電子發票整合服務平台
- 營業人
- 財政部傳輸軟體(Turnkey)
線上申請說明下載
- 各項手冊與相關文件:
Turnkey-使用手冊_v3.2
Turnkey-3.0.2-linux
- 文件下載
- 營業人常用文件
電子發票整合服務平台營業人導入與操作說明
電子發票整合服務平台服務申請表
電子發票營業人應用API(V1.7)
軟體憑證製作手冊
電子發票資料交換標準文件與範例(V3.2.1)
電子發票Turnkey上線前自行檢測作業(V4.6)
營業人比對上傳發票結果流程說明
電子發票證明聯一維及二維條碼規格說明(V1.8)
加解密API使用說明書(V1.12)
電子發票QRCode加解密工具/營業人啟用第2層資訊防偽機制流程說明文件v20160817
電子發票字軌號碼申請書(含電子發票開立系統自行檢測表)
消費者在整合平台設定電子發票載具¶
消費者在購買交易中,只要向有支援電子發票的賣家廠商出示「自己的載具條碼」,賣家即可將該次交易所產生的電子發票歸入到該載具中。
備註
目前僅有「手機條碼」及「自然人憑證條碼」須在交易前出示,其他載具可由賣方公司提供會員載具或是已被整合進付款工具當中,利用該付款工具支付時,電子發票即自動歸戶。
載具是用來存放電子發票的工具,每一載具會對應一獨特編號,以手機號碼為載具者,其對應載具條碼,形式如下:

291 為手機號碼後 3 碼, /4WDMPUZ 為載具條碼,又稱載具隱碼¶
使用載具儲存電子發票並完成歸戶作業的好處,在於「財政部電子發票整合服務平台」會自動幫發票對獎,並將獎金自動匯至所設定的個人銀行帳戶。
另外,所有交易所產生的電子發票全歸戶到一個帳戶中,也方便消費者事後檢視歷史交易明細:

2019 年 10 月 28 日,有 2 張電子發票¶
點選發票號碼後,可見明細:

UG41271456 發票明細有發票號碼、開立時間、賣方統編、購買品名、金額、數量、…等¶
目前支援的發票載具類別有:
手機條碼
自然人憑證條碼
悠遊卡
icash
一卡通
信用卡/簽帳金融卡
跨境電商電子郵件載具
各賣家自定的會員載具
本文僅就「手機條碼」、「信用卡/簽帳金融卡」、「跨境電商電子郵件載具」說明。
利用手機註冊帳戶¶
請至 https://www.einvoice.nat.gov.tw/ 頁面,點選「申請手機條碼」,或是按下「登入」鈕,在登入表單中,選擇「申請手機條碼」。註冊帳戶除使用「手機號碼」外,也可使用「自然人憑證」,但後者需要效期內的自然人憑證及讀卡機,且系統需安裝相關函式庫、驅動程式,在本文就不敘述了,建議有興趣的讀者自行前往消費者的文件下載區塊,找尋「自然人憑證條碼操作教學(V1.0) PDF 」文件來了解。

申請手機條碼需:
提供「手機號碼」及「電子郵件信箱地址」
輸入「圖形驗證碼」
閱讀並勾選《 服務條款及隱私權宣告 》
按下「同意並申請手機條碼」按鈕後,系統會寄發「登入密碼」簡訊到手機門號,帳號即是你的手機號碼。另外,也會寄發信箱確認信,請點選信中之確認連結以完成電子信箱地址驗證程序。
完成電子信箱地址驗證後,方可 修改 「登入密碼」,且未來發生「忘記登入密碼」時,才能要求系統寄發「重設密碼信」。 建議 電子信箱地址驗證程序要即早完成。
登入帳戶¶

登入時,請選擇「消費者身份」,輸入「手機號碼」、「驗證碼(密碼)」、「圖形驗證碼」後按下「登入」鈕。
列印手機條碼¶
登入後,到「手機條碼專區」>「手機條碼列印」頁面。
有 2 種下載格式,「多張手機條碼」專供 A4 文件列印,而「條碼印製機專用版本」則是給條碼機印列,兩種的下載格式都是 PDF 。

單張 A4 最多可容納 30 張標籤¶
標籤可剪下並貼到會帶出門的物品上,如: 手機殼、悠遊卡。交易時,出示此組條碼給賣家刷,則該交易的電子發票就會被歸到這組條碼所對應的帳戶內。最遲在 48 小時之後,你就可以在個人帳戶中,見到此張發票。
新增「信用卡/簽帳金融卡」為載具¶
請到「歸戶設定」頁,點選「新增載具」按鈕,如下圖:

「手機條碼專區」=>「歸戶設定」=>「新增載具」¶
在彈出視窗,依欄位填寫如下:

載具類型,請選「信用卡/簽帳金融卡」
銀行別,請選擇該信用卡的「發卡銀行」
卡號,目前有支援的卡別有 VISA/Master/JCB ,所以卡號必然為 16 碼數字,尚不支援 Amex 及銀聯卡
身份證末 4 碼,請輸入 4 位數的身份證號後 4 碼
生日 4 碼,格式是 MMDD ,也就是 1 月 5 日生,則填 0105
載具自訂名稱,以個人好記的名稱來說定
圖形驗證碼,若右方圖檔內數字看不清楚,可選擇圖形的「重整按鈕」來更新圖形內數字
以上資料填妥後,按下「送出」鈕,若資訊無誤,則載具即新增完畢。
「載具設定」頁會列出你所建立的載具,如下圖:

為方便比對交易是用那一張信用卡支付的,我會以卡號後 4 碼來訂定載具名稱¶
在「信用卡/簽帳金融卡」的載具中,其載具隱碼不像「手機條碼」一樣要列印出來。但凡在交易過程中,只要是使用該信用卡付款,且賣家 POS 系統有支援信用卡載具功能,那麼所產生的電子發票會直接被歸戶到該張信用卡載具內。
注意的是,在某些「商家 APP」中,也可設定「會員載具」,而且在該 APP 中,也可以設定信用卡付款,例如: 全聯行動會員 APP,在此類 APP 中完成的交易,其電子發票通常預設被歸戶到「會員載具」,而不是「信用卡/簽帳金融卡」載具中。關於「會員載具」的部份,我們會在「商家設定 B2C 電子發票教學」再來說明。
要知道該「信用卡/簽帳金融卡」載具所歸戶的電子發票,只要到「發票查詢及捐贈」頁面查詢即可,查詢結果如下圖:

若你想要將「電子發票」捐贈給非營利團體,也可在此查詢頁面操作。
新增「跨境電商電子郵件」為載具¶
敝司在境外電商申請服務時,會使用 hoamon@ho600.com 來開立帳號,對境外電商而言,如果它有支援本國的電子發票服務,那它可將交易所產生的電子發票歸戶到 hoamon@ho600.com 這個信箱中。
惟須我們先在「財政部電子發票整合服務平台」中,把 hoamon@ho600.com 設定為「跨境電商電子郵件」載具。一樣是到「載具設定」頁,去點選「新增載具」按鈕,彈出視窗如下圖:

填妥資料後,按下「送出」按鈕,資料無誤則新增完畢。即可在「歸戶設定」頁中見到如下圖列表:

在「發票查詢及捐贈」頁中,可見其載具所對應之電子發票,列表如下:

此為跨境交易,所以「發票金額」所記載的幣別不一定是「新台幣」,本例為「美元」。交易幣別會明確在「發票明細」中登載。
目前,敝司所接觸的跨境電商有支援本國電子發票服務的廠商:
Google Cloud(Google Asia Pacific Pte Ltd,統編為 42523557 )
Amazon Web Services(Amazon Web Services Inc.,統編為 42527272 )
營業人利用「電子發票整合服務平台」開立 B2B 電子發票¶
本文閱讀對象雖然是「營業人」,但若是代換成一般組織、團體、政府機關的角色,一般來說,也只須在操作步驟上,把「工商憑證」換成相對應的「XCA 憑證」或「GCA 憑證」即可類推操作。
使用本文的基本前提條件:
擁有「以營業人身份登入電子發票整合服務平台的管理員權限」
擁有「效期內的負責人之自然人憑證或工商憑證」
必須使用憑證的理由¶
電子發票與傳統紙本發票相比,可以將電子發票簡化成一堆文字、數字的訊息而己,不須要列印成紙本,單用 PDF 、圖檔或是媒體申報電子檔足以擔任「電子發票」讓買受人核銷、向稅務機關申報營業稅。
那麼,我們這些有「數位專長」的人,是不是可以「破解電子發票格式」,然後就任意「代表台積電開一張發票給聯電」呢?
當然不行!
這「憑證」的目的,就是在確保「電子發票」不會「被偽造」且「無法被否認」。
在建立一份合乎電子發票規範(MIG)的數位訊息後,非得用憑證為這串數位訊息作一個簽章,而憑證是「通往現實世界的標誌」,自然人向戶政機關、營利單位/非營利組織/政府機關向所屬管理機關申請憑證,在申請的當下,由「管理機關」認證「什麼人或什麼法人」可使用憑證,身份無誤後才授權「他/她/它」可使用該專屬憑證。
這樣該憑證在那張電子發票上所簽署的簽章,即可代表是「什麼人或什麼法人」所開出的,於此確保了「電子發票的開立人」是對的人,其「發票內容」也被開立人自證之。
所以要開立合法、有效的「電子發票」,其必要條件就是得使用一張憑證,而申辦自然人憑證的工本費目前是 250 元,工商憑證的工本費為 420 元,其他憑證的申請費用請自行詢問所屬管理機關。
如何開立 B2B 交換/存證電子發票¶
本節說明的電子發票開立工作,限定是商家對商家(B2B)的這一種,也可把商家換成組織、團體或政府機關,發票上的交易對象必須是有「統編」的買家對上有「統編」的賣家。
利用財政部自己所推出的「整合服務平台」,賣家無須開發自己的「開發票系統」,即可直接用「整合服務平台」就能開發票給買受人(買家)了。
在「整合服務平台」開立發票的原則:
可提前新增「發票日期」大於「開立日」的發票
只允許寄送未來三日內的發票,如: 在 6 月 4 日時,僅可寄送最晚 6 月 7 日的發票
同本電子發票須順時順號,如: 在 6 月 4 日時,發立號碼尾碼 55 的 6 月 6 日發票,那之後,就不能再開立尾碼 56 、 6 月 5 日的發票,必須在 6 月 6 日(含)之後
只能開立當期發票,如: 7 月 30 日時,只能開立最晚 7 月 31 日的發票,不能開 8 月 1 日發票
本節主要目標,僅在教學如何使用「電子發票整合服務平台」中的「線上銷項發票作業」及「多元發票交付」功能,如下圖紅框處:

在「線上銷項發票作業」中的「 開立發票 」作業(B2B 交換)中,其發票買受人須在它的「電子發票整合平台」上設定「發票接受方式」,而在「多元發票交付」的「 開立存證發票 」作業(B2B 存證)上,其發票買受人可為任何擁有統編的公司、非營利組織、政府單位。
雖然,我們可用「工商憑證」直接在「整合服務平台」創建一個具管理者權限的營業人身份帳號,但仍須以「紙本文件」向稅務機關申請啟用電子發票開立資格。
所謂「電子發票開立資格」,就如同現今使用的「統一發票購票證」,商號、組織得有這一張「購票證」,才能向代售點購買「統一發票」。在電子發票作業上,無需「購買發票」這個作業項目,改為「字軌取號」的作業,也就是每期在開立發票前,營業人在平台上先要求「配發發票字軌及號碼區間」,有了「專屬字軌及發票號碼區間」,營業人才能開出一張擁有獨一無二發票號碼的「電子發票」。
其所須準備的申請文件:
電子發票字軌申請書
使用電子發票承諾書

受理機關: 請填寫貴司所屬之分局、稽徵所或服務處,敝司屬「財政部中區國稅局埔里稽徵所」管轄
一般稅額計算/首次申請 1 組: 1 組會有 50 個發票號碼,此數值請按貴司慣例自行評斷
配號方式: 期配。 1 期為 2 個月,也是目前敝司購買紙本發票的習慣
申請整合服務平台帳號、密碼: 因為敝司採用「工商憑證」自行到「整合服務平台」開立帳號了,所以此部份設定未勾選
委任加值服務中心下載…: 本節教學乃以營業人本身為操作主體並在大平台操作 B2B 交換/存證相關作業,所以無須委任加值服務中心
本節操作乃營業人用最精簡方式(單純使用大平台)開立 B2B 電子發票,所以在檢具文件方面,只須要提供「使用電子發票承諾書」


申請人、聯絡方式、事務所、申請日期,請依貴司本身資料填寫,並蓋大章、小章。


再附上「使用電子發票承諾書」,內容主要是提醒每期未開立之空白發票,記得 在次期 10 日內傳輸至整合服務平台 。還有不要亂開發票,遵守相關法律,財政部是不會幫忙負責的…。這份承諾書 強烈建議 要全部瀏覽一遍,再蓋上貴司之大、小章。
以上兩份文件,可親送或郵寄到所屬營業稅管理單位。接下來,便坐等「電子發票字軌號碼」申請通過。
實際開立發票操作流程(基本篇)¶
營業人在開立 B2B 電子發票上的主要操作,所關係的頁面如下:
- 營業人功能選單
- 系統設定
- 多元發票交付
- 查詢與下載
- 線上銷項發票作業
- 電子發票專用字軌號碼取號
- 電子發票專用字軌號碼取號
- 電子發票上傳作業
在營業人管理者登入後,先到「 公司基本資料 」頁去填寫聯絡電話、電子信箱、地址等資訊,再到「 主憑證資料登錄作業 」登錄「工商憑證或負責人的自然人憑證」,每一張開立的電子發票都須被主憑證簽章,才能算是一張合格的電子發票。若公司組織較大,能開立電子發票的員工比較多,也可以讓這些員工各自使用自身的自然人憑證或工商憑證附卡做電子發票簽章。這部份請參考「 附屬憑證資料登錄作業 」。
再來是到「 交易對象資料維護 」去登記「發票的買受人資料」,若是該買受人也會銷售商品給我們,那它的交易對象類別就選「買賣方」。
再來到「 產品單位設定 」去定義商品所用的單位名稱,如: 式、組、包、盒、…等。
再到「 產品資料維護 」去定義商品,敝司主要是銷售軟體業務,所以商品只有 2 種: 系統開發費、系統維護費。
做到這裡為止的設定,我們總算可以開立發票了。
首先是先到「 電子發票專用字軌號碼取號(營業人) 」頁面,領取當期可使用的電子發票字軌及號碼。
有可使用的字軌、號碼後,才能開立發票,開立方式分兩種。
第一種是使用多元發票交付,進入「 開立存證發票 」的頁面,去存檔發票,存檔後再到「 發票自行交付存證上傳 」頁面,依「存檔日期」查詢發票,選擇發票後,再「寄送」該張發票,此處的「寄送」實指「用主憑證或附屬憑證為它簽章」,待簽章完成後,會立即存證上傳至財政部。
因為這種「自行交付存證上傳」的動作,僅僅只是「賣家自行為電子發票簽章」,買受人並沒有自動接送該張電子發票的管道,所以賣家得在平台上把該張發票的 PDF 檔下載下來,再自行轉交給買受人。PDF 檔的下載位置是在「 發票查詢/列印/下載 」的頁面內。
第二種開立方式則有賴買受人啟用電子發票接受的設定。買受人有啟用就能使用「線上銷項發票作業 > 開立發票 」頁面來開立電子發票給該名買受人。如果不確定買受人有沒有啟用電子發票接受設定的話,可到「 營業人電子發票資格查詢 」頁面,以它的統編來查詢。
以上是簡要說明「開立電子發票」的基本觀念,可直接點選其「頁面」連結,每一個頁面的操作流程,都有以截圖方式詳加說明。
關於電子發票作業的次要操作所關係的頁面如下:
在進項電子發票上,若是供應商開立發票給我們,則需要我們在「 營業人接收方式設定 」頁面中設定一個「自動接受」的管道,可以是在「Web(整合服務平台)」 、「透過加值服務中心」或是「電子信箱」來接受「進項電子發票」。
在「 待辦事項 」頁面中,會列出與買受人或是自身為買受人的待確認發票張數,什麼是「待確認發票」? 像是開出電子發票給某個客戶,但他卻不接受該張發票,而被他退回。或是有某個供應商開出電子發票給我們,而需要我們確認接受。
實際開立發票操作流程(進階篇)¶
Todo
批次開立發票
整合服務平台頁面總覽(營業人身份)¶
Todo
標題號稱「總覽」,然實際上,部份頁面還未撰寫到。
請耐心等候~
營業人功能選單¶
待辦事項¶
待辦事項¶
路徑位置: 營業人功能選單 > 待辦事項 > 待辦事項 。

本頁面會列出「待你確認的發票、折讓單」。
Todo
列出各項作業名稱的實質定義
系統設定¶
基本資料¶
營業人電子發票資格查詢¶
路徑位置: 營業人功能選單 > 基本資料 > 營業人電子發票資格查詢 。
要使用「線上銷售發票作業」方式來「 開立發票 」,買受人一定得先設定好「接收方式」,我們可以在這個頁面,輸入統一編號來查詢它的設定狀態。

請輸入要查詢對象的統一編號¶

查詢結果,向右拉可見到「接收方式」¶
何六百有限公司的電子發票接收方式目前是「已設定」。
產品單位設定¶
路徑位置: 營業人功能選單 > 基本資料 > 產品單位設定 。
在開立發票時,需填寫銷售品項明細,而明細中需包含「品項單位」,如: 式、組、盒、包、…等。

點選「新增」按鈕。

填入「單位名稱」,如: 式。再按下「存檔」即可。

也可查詢已建立的「單位名稱」。

單位名稱列表¶
可見到 1 筆單位名稱紀錄。
產品資料維護¶
路徑位置: 營業人功能選單 > 基本資料 > 產品資料維護 。
在開立發票時,需填寫銷售品項明細,而品項名稱可以事前先定義好,或是也可以在開立發票時才撰寫名稱。
敝司的業務內容比較單純,除了少部份有配售到硬體外,名稱主要就是 2 種: 系統開發費、系統維護費。事先定義好,開發票比較省事。

按下「新增」按鈕。

有綠勾部份的欄位為必填,編號可自定格式,像是: P001, S02, MAINTAIN01, …等。單位則是點選「…」按鈕後,跳出小視窗來選擇。最後按下「存檔」,並顯示「存檔完畢」訊息,即代表成功新增。

也可以查詢目前所自定的產品資料。

上圖是目前所自定的產品資料列表。
交易對象資料維護¶
路徑位置: 營業人功能選單 > 基本資料 > 交易對象資料維護 。
要開電子發票給客戶前,必須將它的統一編號登記到「交易對象資料」中。這樣在開立發票時,才能在買受人輸入框中選取對象紀錄。

先點選「新增」按鈕。

新增交易對象資料¶
再依序填入交易對象資料:
輸入統編
點選右方「…」按鈕
在跳出的小視窗中,點選相符合的統一編號,其詳細資料會自動代表表單輸入框中
按下「存檔」按鈕
完成後,會出現「新增成功」的訊息。

查詢交易對象資料¶
要查詢已存檔的交易對象紀錄,只要在「交易對象統一編號」輸入框中輸入它的 8 碼統一編號,再按下「查詢」按鈕。若是「交易對象統一編號」輸入框留空,則會秀出全部的交易對象。

列表交易對象資料¶
營業人接收方式設定¶
路徑位置: 營業人功能選單 > 基本資料 > 營業人接收方式設定 。
電子發票(包含折讓單)的接收方式主要是用在「買受人退回電子發票」、「供應商開立電子發票給我們」、…時,須有一管道將該電子發票接收進來,接收後再由我們「確認」,也就是認知到「該電子發票傳給我們」了。
用現在的紙本發票使用流程來舉例,當賣家開出一張發票準備交給你時,你得決定用左手還是右手接收這張發票;或是當你開出一張發票給客戶,但客戶拿到發票後,看了兩眼告知: 『品項不對、金額不對』,或反悔要取消交易,在他退還該張發票時,你也得決定用左手還是右手接收這張發票。
決定用左手接收或是右手接收可類推此頁面中的「Web接收」及「Email接收」,「Web接收」方式是你回到整合服務平台中,使用憑證作逐筆或是批次確認接收電子發票;而「Email接收」是由整合服務平台自動幫你確認接收後,再寄送通知信給你,而通知信中會附上該張電子發票的 PDF ,且該 PDF 會以你所設定的「密碼(PDF附件加密)」作加密。
Todo
這裡所謂「Email接受」是由整合服務平台自動幫你確認接收的說法, 單純是從網頁文字說明判斷而來,實務上,尚未看到任何教學影片或投影片明確提及。 待確認這個說法。

Web 接收¶
選擇 Web 接收後,按下「提交申請」。

跳出的新視窗會要求提供當前用戶的登入密碼,輸入後按下「確認授權」。完成後,會跳出「設定成功」的提醒視窗。即完成「營業人接收方式」的設定。
又或者選擇「Email接收」。此時,請輸入要收通知信的電子信箱,及未來通知信中的 PDF 附件加密密碼。請注意,這裡的「PDF 附件加密密碼」是不會有機會再顯示給你看的,所以如果你忘了這個密碼,那過去使用這組密碼去加密的 PDF ,你就沒機會打開看了。但開不了,也沒什麼關係,因為你還是可以回到整合服務平台查詢電子發票。

輸入「營業人信箱」、「密碼」後接下「提交申請」,新視窗會要求使用憑證做「確認授權」。這部份是與「Web接受」用「登入密碼」做「確認授權」是不一樣的。

因為在確認接受發票及折讓單的這作業上,就必須使用憑證做確認,差別是「Web接受」在每一次確認時用憑證授權,而「Email接受」在一開始選擇套用時授權。
主憑證資料登錄作業¶
路徑位置: 營業人功能選單 > 基本資料 > 主憑證資料登錄作業 。

這裡的主憑證是用來簽章電子發票所用的主要憑證,如果公司比較大,負責開發票的人比較多,其他人也可以使用「工商憑證附卡」或是個人的「自然人憑證」來做簽章,請至「 附屬憑證資料登錄作業 」頁面去登錄。
在主憑證的種類選擇上,可以是「工商憑證正卡」、「工商憑證附卡」或是「負責人的自然人憑證」。若為一般組織、政府機關,則是使用 XCA 或 GCA 憑證。
在輸入憑證密碼後,請先把憑證插進讀卡機中,才按下「登錄主憑證」。

憑證讀取中…¶
倘若這裡有讀取不成功的情形發生,請到 經濟部工商憑證管理中心的瀏覽器檢測 頁面尋找協助。該中心並有提供諮詢服務電話由專人服務。

憑證讀取成功後,會先顯示它的資訊供你確認,尤其是「憑證到期日」不要過期了。確認資訊沒問題的話,就按下「確認登錄」,系統顯示「憑證登錄成功」就完成了。
主憑證僅能登錄一張,若已存在,系統會提醒「請先操作主憑證刪除」。
備註
這裡有一個 macbook os 上的 bug ,在主憑證登錄上,我無法成功登錄「工商憑證」, 只有「自然人憑證」是可以的。而在 Windows os 上,則兩種都行。
附屬憑證資料登錄作業¶
路徑位置: 營業人功能選單 > 基本資料 > 附屬憑證資料登錄作業 。
附屬憑證可以是「自然人憑證」、「工商憑證附卡」、「GCA憑證附卡」或「XCA憑證附卡」。
在登錄「附屬憑證」時,也必須使用「主憑證」做簽章授權。所以一定是先完成「主憑證登錄」後,才能登錄「附屬憑證」,而「附屬憑證」可多登錄多張,這樣如果公司內部有多個人要開電子發票時,都是拿「個人的自然人憑證」作簽章,這樣才不會有資安疑慮,又若是員工不願意拿個人的自然人憑證運用在公事上,那也可以由公司去申請工商憑證附卡,附卡申請數量無上限,每張工本費 420 元。

選擇使用個人的「自然人憑證」¶
輸入憑證密碼後,讀取該卡資料:

讀出的憑證資料如下:

按下「確認登錄」後,會再出現「要求插入主憑證」的小視窗,再輸入主憑證密碼後,接下確認,即完成「附屬憑證」登錄。
線上銷項發票作業¶
開立發票¶
路徑位置: 營業人功能選單 > 線上銷項發票作業 > 開立發票 。
Todo
待續中。
多元發票交付¶
發票自行交付存證上傳¶
路徑位置: 營業人功能選單 > 多元發票交付 > 發票自行交付存證上傳 。
在「 開立存證發票 」後,其實尚未完成「開立發票」作業,需要再使用主憑證或附屬憑證為該張電子發票做一個簽章,並上傳到整合服務平台,才算完成「開立電子發票」作業。

這裡的上傳日期指的是「開立存證發票」時的日期,不是「發票日期」¶
先依上傳日期查詢紀錄。

再點選「上傳檔案」名稱的連結。如果「存證發票」內容有誤的話,也可以勾選後,按下「刪除」鈕刪除紀錄。

勾選「要寄送的發票」,再按下「寄送」鈕。會跳出「確認寄送 1 筆資料?」視窗,確定後會出現「產生簽章」頁面,選擇你要完成簽章的工商憑證或是自然人憑證,並插入憑證至讀卡機,輸入卡片密碼,勾選「我已詳閱XML資料內容並且同意傳送」,再按下「產生簽章」連結。

會再跳出「確認寄送 1 筆資料?」視窗,確定後讀卡機會讀取憑證。

簽章製作完成並上傳。

上傳完成後,跳出「已處理 1 筆資料」視窗。

確定上傳後回到該電子發票列表頁面,此張電子發票會先處於「寄送中」的狀態,因為它還需要送到「存證中心」處理。

待「存證中心」處理完此張電子發票後,狀態會改成「開立已確認」。
到這裡,我們就完成「開立一張電子發票」了。因為「自行交付存證的電子發票」並無通知買受人的機制,所以必須由賣家自行下載該電子發票的 PDF ,傳給買受人,讓買受人可以做帳。
要下載電子發票的 PDF ,請至「 發票查詢/列印/下載 」處理。
開立存證發票¶
路徑位置: 營業人功能選單 > 多元發票交付 > 開立存證發票 。
只要是有統一編號的買受人,都可以使用本節方式開立電子發票給它的客戶。

如上圖,填寫發票主檔步驟如下:
選取發票日期。請注意! 發票日期與發票號碼要順時順號開立。
填寫發票號碼。請注意! 這裡的發票號碼並不會有驗證機制,所以請自行將已開立過的發票號碼另外紀錄下來,避免重覆開立。
設定買方統編。務必要先完成「 交易對象資料維護 」的設定,才能在這裡選取它的公司名稱。
決定是否勾選「內含營業稅」。有勾選,則發票明細的金額直接累加起來,就是「總計」的金額,其營業稅額為秀 0 元,這是買受人為政府機關、學校時所用的; 若買受人為一般商家,請不要勾選,並自行計算出品項發票單價的未稅價,當發票明細中所填的都是未稅價時,發票主檔表格中的營業稅額會自動代出。
設定品項。須在「 產品資料維護 」中有設定的,才可以在這裡選取。若要增刪品項,可使用 + 或 - 的按鈕操作。
勾選產品。在跳出的新視窗中,可多值勾選「產品」。
新增產品明細。按下「新增產品明細」的連結,會將所勾選的「產品」帶回原來的主檔頁面。
存檔。確認無誤後,即可存檔。

發票存檔後,會直接轉到「 發票自行交付存證上傳 」的頁面。要繼續完成交付存證上傳的動作,請點選上傳檔名的連結。若發票內容有誤,可勾選後,按下「刪除」按鈕刪除發票。

錯誤原因: 『注意:發票資料含有相同買賣方統一編號。』¶
若發票內容有誤不刪除,執意點入「上傳檔名的連結」後,會看到系統提示的錯誤原因,如上圖。那這張有誤的發票可不可做「交付存證上傳」呢? 我猜想,系統應該不會阻止,但因為我只敢操作到「憑證簽章」之前的動作,怕真的「上傳」了,稅務單位會來找我聊聊,為什麼要犯這種錯呢!
那如何對「正確的發票」做「交付存證上傳」的作業,請見「發票自行交付存證上傳 」頁的說明。
作廢存證發票¶
路徑位置: 營業人功能選單 > 多元發票交付 > 作廢存證發票 。
若是發票已自行交付存證上傳並寄送存證中心,則無法刪除該電子發票,必須採用「作廢存證發票」來沖回營業額。

輸入欲作廢之發票號碼。並注意,之後再開立的發票切勿重覆使用相同發票號碼。
選取該張發票的發票日期。並注意,這不是「上傳日期」。
點選「…」按鈕
點選買受人統編的連結
系統會自動代入買方公司名稱及地址
填寫作廢原因
確認資料無誤,則按下「存檔」
存檔成功後,會看到下列列表,這是「 發票自行交付存證上傳 」的頁面。如同「先前開立的電子發票」要憑證簽章、存證上傳才會生效,所「作廢的電子發票」也需經過相同的流程。

點入該「存證作廢發票」的檔名連結。

勾選欲「存證寄送」的「作廢發票」,並按下「寄送」按鈕。

插入要作簽章的憑證。請注意,這裡的憑證必須是登錄成「主憑證」或「附屬憑證」的憑證。輸入憑證卡片密碼,並勾選「我已詳閱XML資料內容並且同意傳送」。再按下「產生簽章」,頁面會跳出讀取憑證的小視窗,在跑一段時間後,會出現「確定送出 1 筆資料嗎?」,確定後立即送出。
此時會回到「上傳列表」。

再次點入「上傳檔名」的連結中。

發票狀態: 寄送中¶
可見到該「作廢發票」的狀態變成「寄送中」。再過一段時間,回來檢查,若發票狀態改為「作廢已確認」,即代表成功作廢發票。

發票狀態: 作廢已確認¶
查詢與下載¶
發票查詢/列印/下載¶
路徑位置: 營業人功能選單 > 查詢與下載 > 發票查詢/列印/下載 。
已發立完成的電子發票,包含「多元發票」或「線上銷售發票」都可以在這裡查詢到。若是別的賣家開給你的進項發票,在這裡也可以查詢到。

點選「線上查詢」¶
查詢分兩種:
線上查詢
非即時查詢
前者的查詢結果會立即顯示在網頁上,而第 2 種方法,則是先下條件後,待一段時間再回來看查詢結果,通常是在巨量紀錄上使用的。

發票日期為必要查詢條件¶
選擇「發票日期」區間後,按下「查詢」按鈕。

發票列表¶
在電子發票列表上,勾選目標紀錄,可對該目標進行「下載PDF檔」、「下載PDF檔(A5)」、「下載電子發票證明聯(5.7)」或是「下載Excel檔」。不同格式範例如下:

PDF 檔¶

PDF 檔(A5)¶

電子發票證明聯(5.7)¶

Excel¶
可自行寄送「PDF 檔」、「PDF(A5) 檔」或「電子發票證明聯(5.7)」格式的電子檔給買受人。
備註
請注意 ,開立「自行交付存證」的電子發票後,一定要另外寄電子檔通知買受人, 不然買受人是不會知曉有這一筆交易。就像開立三聯式發票後, 把扣抵聯、收執聯放進自己的抽屜中,這樣只有天知、地知、你知及稅務單位知。
電子發票專用字軌號碼取號¶
電子發票專用字軌號碼取號¶
電子發票專用字軌號碼取號(營業人)¶
路徑位置: 電子發票專用字軌號碼取號 > 電子發票專用字軌號碼取號 > 電子發票專用字軌號碼取號(營業人) 。
01.png)
請直接點選「取號」按鈕。
02.png)
選擇當下的「發票期別」及「發票類別」,並決定要取用的本數。以敝司為例,營業項目多為 B2B 類型,所以每個月開不到 10 張發票,所以當初在「申請電子發票字軌號碼」時,只設定每期(2個月) 1 本。
確認「取用本數」後,即可按下「提交取號」按鈕。成功的話,即看到頁面出現「已啟用本數: x」的資訊。
若考量每期本數將不敷使用,可在當期雙數月的 20 號之前,提出「增加本數」的申請。
電子發票上傳作業¶
上傳未使用空白發票號碼¶
路徑位置: 電子發票專用字軌號碼取號 > 電子發票上傳作業 > 上傳未使用空白發票號碼 。
Todo
待續中。
簡述 B2C 存證發票¶
自動配發字軌、自動配號、手動取號
傳統發票:
手開二聯
手開三聯
收銀機二聯
收銀機三聯
電子計算機。在 2021 年 1 月 1 日正式停用
發票狀態:
開立
作廢
折讓
退回
註銷(僅供存證發票使用,且註銷後必然跟著開立)
何時作廢、何時折讓:當期發票用作廢,跨期用折讓
非加值型營業稅法: 農產品經銷、證券業
申請及製作軟體憑證供 Turnkey 正式區、測試區使用¶
電子發票使用 Turnkey 上傳時,需使用憑證加簽,若 Turnkey 系統是安裝在個人電腦上,則發票在上傳 EI (大平台)前,可透過讀卡機插入「各式實體憑證: 工商憑證、自然人憑證、…」來加簽電子發票 XML 檔。
若不希望長時間將實體憑證插在讀卡機上,又或是 Turnkey 系統是安裝在遠端伺服器上,那就建議使用軟體憑證來完成發票加簽作業。
申請「有效」的軟體憑證,請到「非IC申請網址: https://moeacaweb.nat.gov.tw/MoeaeeWeb/apply/apply_3.aspx 」,每張有效軟體憑證的效期為 5 年。此有效軟體憑證可同時用在大平台的正式區及測試區。
首先確認已有使用 Turnkey 系統生成 XXX.csr 請求檔(可參考「軟體憑證製作手冊」來製作 XXX.csr),以及手邊有工商憑證正卡或附卡。

點擊「線上填寫申請資料」¶

點擊「我同意條款內容」¶

選擇「非IC卡申請」,類別則依實際情況來選擇。點擊「下一頁」後會讀取所插入工商憑證中的統一編號資訊¶

確認統一編號¶

確認公司相關資訊¶

填寫聯絡人各項資料¶

自定用戶代碼,並選擇 XXX.csr 檔¶

備份「用戶代碼」¶

確認資料後,前往付費系統¶

輸入「用戶代碼」¶

選擇付費方式¶

填寫此筆繳費發票的買受人資訊¶

再次確認付費方式¶

此為信用卡繳費的頁面¶

信用卡繳費成功¶

點擊「列印申請書及郵寄信封地址條」連結¶

再次輸入「用戶代碼」¶

直接列印或先下載 PDF 再列印¶
最後,將此紙本申請書蓋上公司大、小章後,即可掛號郵寄到經濟部中部辦公室。
大約 1 星期後,程序無誤即會發出軟體憑證(yyy.cer),再自行到 經濟部工商憑證管理中心/下載專區(https://moeaca.nat.gov.tw/download/download_4.html) 的「憑證查詢及下載」頁面下載軟體憑證。再將此軟體憑證上傳至大平台。

先到「營業人功能選單」/「基本資料」/「軟體憑證資料登錄作業」頁面,選擇剛剛下載的軟體憑證(yyy.cer),按下「登錄軟體憑證」¶

確認「憑證內容」無誤後,按下「確認登錄」¶
登錄成功後, Turnkey 方能上傳發票 MIG XML,若是未完成這個「軟體憑證登錄作業」,則上傳發票 MIG XML 後,會拿到 E0310(66803) 錯誤。
EPW / TKW / TEA 架構¶
本專案 Django-Taiwan-EInvoice (DTEI) 是由 3 部份: EPW / TKW / TEA 所組成。
TEA 是一個 Django-based 的 Python app ,可直接以 Web Api Service 方式執行,或是導入至其他 Django-based 的專案中。 TEA 支援 WebSocket 協定,當 EPW 系統開機後, EPW 會連線至 TEA WebSocket Api 或 CEC WebSocket Api(以導入 TEA)。
當 TEA 有列印電子發票證明聯的需求,可送出其發票資料(JSON),發票 JSON 透過 WebSocket Channel 傳至 EPW , EPW 再將發票 JSON 轉譯為 ESC/POS 指令,再送至系統 OS 所控管的 Thermal ESC/POS Printer ,由 Printer 印出發票證明聯。
當 TEA 要上傳發票至 EI 大平台時,會使用 HTTP POST 傳送批次編號資料至 TKW 的 Api Endpoint ,成功後,再以 HTTP POST 傳送批次編號相關所有發票的 JSON ,該批次編號發票傳送完畢後, TKW 會將發票 JSON 轉成 MIG 標準的 xml ,存入本地端的 Turnkey 系統所控資料夾,再由 Turnkey 系統(Java Application)處理與 EI 大平台的發票上傳作業。
TEA 資料設定¶
創建「統編(legalentity)」紀錄
創建「賣家(seller)」紀錄
- 創建「Turnkey 服務(turnkeyservice)」紀錄:
name
note
seller
transport_id: EI 提供
party_id: EI 提供
routing_id: EI 提供
hash_key: 可自動隨機產生
qrcode_seed: 須透過 Turnkey 程式>工具>守門員>QRCode驗證 來產生
turnkey_seed: 須透過 Turnkey 程式>工具>守門員>QRCode驗證 來產生
download_seed: 須透過 Turnkey 程式>工具>守門員>QRCode驗證 來產生
epl_base_set: 預設值是 GHIJKLMNOPQRSTUVWXYZ ,用來驗證「電子發票證明聯列印序號」用的字元集合,建議使用「大寫英文、符號」並打亂順序
auto_upload_c0401_einvoice: True/False ; if True, then it upload B2C certificate invoices at upload_cronjob_format time
upload_cronjob_format: 5, 10, 15, 20, 30, 60; 5 => 「*/5 * * * *」(cron format)
- 創建「發票機(escposweb)」紀錄:
name: 建議包含發票機外形、地點、特徵
slug: 可自動隨機產生
hash_key: 可自動隨機產生
EPW 資料設定¶
備註
安裝 EPW 的步驟,請見: 在 Pi 或其他 Linux Distro 安裝設定 EPW 伺服器 。
- 套用 TEA 的 escposweb 紀錄來新增 EPW 中的 TEAWeb 紀錄,需要資料有:
escpos_web uri ,如: wss://<CEC or TEA url>/ws/taiwan_einvoice/escpos_web/<turnkeyservice id>/
slug ,如: BB737
hash_key ,如: 5817f0172c9482605d16386a263a7296de8b22f8
- 更新 EPW 中的 Printer 紀錄,當 USB printer 開機並連線到 EPW 後,系統就會自動抓取 serial_number, type, vendor_number, product_name, profile ,後 3 者是在 python-escpos 函式庫有支援下,才能正確讀取。需要手動更新的,只有 3 個欄位:
nickname: 建議在列表機外殼,標記代號,並將此代號紀錄至本欄位
receipt_type: 選項有 0, 5, 6, 8 。意義分別是 0 表不能使用、 5 表 58mm 收據、 6 表 58mm 電子發票、 8 表 80mm 收據
default_encoding: 選項有 B, G 。為印表機內置的編碼表設定,其中 B 表 CP950 、 G 表 GB18030 編碼表
若 TEAWeb 紀錄設定超過 1 個,那建議額外 設定 EPW Portal(非必要)
TKW 資料設定¶
備註
TKW 安裝部份,請見: 在 Linux 安裝 Turnkey 及 TKW 伺服器 。
- 將 TKW 中的 EITurnkey Api Endpoint 登記到 CEC 中,類似 SNS subscribe 模式,先瀏覽 https://<tkw url>/turnkey_wrapper/api/v1/eiturnkey/ ,再使用 HTTP POST 新增 EITurnkey 紀錄,輸入欄位有:
execute_abspath: 以 / 開頭的本地端路徑來指出 EINVTurnkey 程式的 einvTurnkey.sct 的資料夾所在
data_abspath: 放置 Data 的資料夾所在
transport_id: 對應 turnkeyservice 紀錄
party_id: 對應 turnkeyservice 紀錄
routing_id: 對應 turnkeyservice 紀錄
hash_key: 對應 turnkeyservice 紀錄
tea_turnkey_service_endpoint ,如: https://<CEC or TEA url>/taiwan_einvoice/api/v1/turnkeyservice/<turnkeyservice id>/
endpoint: 無需填寫, POST 後由 TKW 自動計算
allow_ips: 若要使用 TKW Portal 功能,才需填寫
TEA supports ASGI with daphne, supervisor and nginx¶
$ sudo apt install nginx supervisor
$ sudo mkdir /run/daphne/
$ sudo chown jenkins:jenkins /run/daphne/ # I use jenkins user to execute app
$ cat << 'EOF' > /usr/lib/tmpfiles.d/daphne.conf
d /run/daphne 0755 jenkins jenkins
EOF
#/etc/supervisor/conf.d/my-site.com.conf
[fcgi-program:my_site]
# TCP socket used by Nginx backend upstream
socket=tcp://localhost:8001
# Directory where your site's project files are located
directory=/var/www/my-site.com
# Each process needs to have a separate socket file, so we use process_num
# Make sure to update "mysite.asgi" to match your project name
command=/var/www/my-site.com-py3-env/bin/daphne -u /run/daphne/daphne%(process_num)d.sock --fd 0 --access-log - --proxy-headers my_site.asgi:application
# Number of processes to startup, roughly the number of CPUs you have
numprocs=4
# Give each process a unique name so they can be told apart
process_name=asgi%(process_num)d
# Automatically start and recover processes
autostart=true
autorestart=true
# Choose where you want your log to go
stdout_logfile=/var/www/my-site.com.asgi.log
redirect_stderr=true
$ sudo supervisorctl reread
$ sudo supervisorctl update
#/etc/nginx/site-enabled/my-site.conf
server {
server_name www.my-site.com;
access_log /var/log/nginx/my-site.log;
error_log /var/log/nginx/my-site_error.log;
listen 443 ssl; # Listen on port 80 for IPv4 requests
include /native-nginx/conf.d/ssl.conf;
ssl_certificate /native-nginx/certs/my-site.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /native-nginx/certs/my-site.com/privkey.pem; # managed by Certbot
add_header Content-Security-Policy "frame-ancestors 'self' hwww.my-site.com hwww.bio-pipe.com";
location / {
proxy_pass http://127.0.0.1:8001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 631;
proxy_send_timeout 631;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header HTTP_HOST $host;
}
}
$ sudo nginx -t
$ sudo systemctl restart nginx
在 Pi 或其他 Linux Distro 安裝設定 EPW 伺服器¶
考慮長期運作的高可用性,建議使用 Raspberry Pi + Linux OS 為 EPW 的伺服器。
EPW 是由 Django-based 程式碼及相關 Python3 函式庫所組成的應用程式,要在其他 x86, x86_64 硬體上執行也是可以運作的。作業系統使用 Linux-based OS 即可直接套用,目前實機使用過的 Linux Distro:
Ubuntu-20.04
Ubuntu-22.04
Raspberry Pi OS(32-bit) Version 10(buster)
Raspberry Pi OS(32-bit) Version 11(bullseye)
EPW 目前僅支援 USB 介面的 ESC/POS 印表機,詳細請參考 python-escpos 的支援清單,而有實機測試過的機型有:
TM-T82III
TM-T88IV
TM-T88V
TP805L
XP-Q90EC
ZJ-5890
只有 TM-T82III 、 TM-T88IV 、 TM-T88V 、 TP805L 可以列印符合規範的電子發票證明聯,而 TM-T88IV 只能設定 80mm 紙寬,要透過 EPW 處理後,方可列印電子發票證明聯於 57mm 紙捲上,但格式會被強制靠左。
Linux Distro 安裝注意事項¶
時區須設為 Asia/Taipei
ESC/POS 印表機設定¶
- 將執行 EPW 的用戶帳號加入到 lp, lpadmin 群組
$ sudo adduser <EPW_account> lp $ sudo adduser <EPW_account> lpadmin
- 自動讓 ESC/POS 印表機在插入 USB 後,權限分享至 lp 群組
# in /etc/udev/rules.d/50-usb_escpos_printer.rules # 04b8, 0202 是 Epson TM-T88IV 及 TM-T88V 的裝置參數,其他型請參照原廠文件 # 04b8, 0e28 是 Epson TM-T82III 的裝置參數,其他型請參照原廠文件 # 0483, 070b 是 Xprinter Q90EC 的裝置參數,其他型請參照原廠文件 # 0493, 8760 是 ZJiang ZJ-5890 的裝置參數,其他型請參照原廠文件 # 20d1, 7007 是 HPRT TP805L 的裝置參數,其他型請參照原廠文件 SUBSYSTEMS=="usb", ATTRS{idVendor}=="04b8", ATTRS{idProduct}=="0202", GROUP="lp", MODE="0666" SUBSYSTEMS=="usb", ATTRS{idVendor}=="04b8", ATTRS{idProduct}=="0e28", GROUP="lp", MODE="0666" SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="070b", GROUP="lp", MODE="0666" SUBSYSTEMS=="usb", ATTRS{idVendor}=="0493", ATTRS{idProduct}=="8760", GROUP="lp", MODE="0666" SUBSYSTEMS=="usb", ATTRS{idVendor}=="20d1", ATTRS{idProduct}=="7007", GROUP="lp", MODE="0666"
- 重啟 udev 服務,以套用新 50-usb_escpos_printer.rules 設定:
sudo service udev restart
安裝基本函式庫¶
以 Python 3.X 為預設直譯器,本例使用 python3.9 :
$ sudo update-alternatives --install /usr/bin/python python $(readlink -f $(which python3.9)) 3 # set python3 as default
安裝工具程式、編譯程式、相依函式庫:
$ sudo apt install vim build-essential libssl-dev libffi-dev python3-dev cargo aptitude python3-virtualenv sqlite3 ttf-wqy-zenhei mlocate
更換比較方便使用的 shell(Optional):
$ sudo apt install zsh
安裝 zsh 後,設定請參照 zsh with oh-my-zsh: https://gist.github.com/aaabramov/0f1d963d788bf411c0629a6bcf20114d
驗證 ESC/POS 印表機功能¶
無須安裝任何原廠的 driver, tool, libary, …,有完整支援 ESC/POS 指令集的印表機,就可直接使用 python-escpos (pure python codes)操作。
安裝 python-escpos==3.0a8 :
$ virtualenv -p python3 TEST.py3env
$ source TEST.py3env/bin/activate
(TEST.py3env) $ pip install "python-escpos==3.0a8"
將 ESC/POS 印表機的 USB 線接入電腦,再執行 python shell 來測試,本例使用 HPRT TP805L:
(TEST.py3env) $ cat << 'EOF' > libs.py
import qrcode
from escpos.printer import Usb
from PIL import Image
class UsbWithBarcodeQRCodePair(Usb):
def barcode(self, code, bc, height=64, width=1, pos="OFF", font="A", align_ct=True, function_type='A', check=True):
from escpos.escpos import (six, BARCODE_TYPES, NUL,
BarcodeTypeError, BarcodeCodeError, BarcodeSizeError,
BARCODE_WIDTH, BARCODE_HEIGHT,
BARCODE_FONT_A, BARCODE_FONT_B,
TXT_STYLE,
BARCODE_TXT_OFF, BARCODE_TXT_BTH, BARCODE_TXT_ABV, BARCODE_TXT_BLW,)
bc_types = BARCODE_TYPES[function_type.upper()]
# Align Bar Code()
if align_ct:
self._raw(TXT_STYLE['align']['center'])
# Height
if 1 <= height <= 255:
self._raw(BARCODE_HEIGHT + six.int2byte(height))
else:
raise BarcodeSizeError("height = {height}".format(height=height))
# Width
if 1 <= width <= 6:
self._raw(BARCODE_WIDTH + six.int2byte(width))
else:
raise BarcodeSizeError("width = {width}".format(width=width))
# Font
if font.upper() == "B":
self._raw(BARCODE_FONT_B)
else: # DEFAULT FONT: A
self._raw(BARCODE_FONT_A)
# Position
if pos.upper() == "OFF":
self._raw(BARCODE_TXT_OFF)
elif pos.upper() == "BOTH":
self._raw(BARCODE_TXT_BTH)
elif pos.upper() == "ABOVE":
self._raw(BARCODE_TXT_ABV)
else: # DEFAULT POSITION: BELOW
self._raw(BARCODE_TXT_BLW)
self._raw(bc_types[bc.upper()])
if function_type.upper() == "B":
self._raw(six.int2byte(len(code)))
# Print Code
if code:
self._raw(code.encode())
else:
raise BarcodeCodeError()
if function_type.upper() == "A":
self._raw(NUL)
def qrcode_pair(self, line):
images = []
for s in [line['qr1_str'], line['qr2_str']]:
qr = qrcode.QRCode(version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=5,
border=0)
qr.add_data(s)
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img = img.resize((154, 154))
images.append(img)
qr_image = Image.new("RGB", (347, 180), color='white')
qr_image.paste(images[0], (13, 13))
qr_image.paste(images[1], (193, 13))
self.image(qr_image)
EOF
(TEST.py3env) $ python3
Python 3.10.6 (main, Mar 10 2023, 10:55:28) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
from libs import UsbWithBarcodeQRCodePair
import re, usb.core, usb.util
devs = {}
for dev in usb.core.find(find_all=True):
try:
iProduct = usb.util.get_string(dev, dev.iProduct)
except:
continue
if iProduct and iProduct.strip() in ["TM-T82III",
"TM-T88V",
"TM-T88IV",
"TP805L",
"USB Printing Support",
"POS58 Printer USB",
]:
devs[iProduct.strip()] = dev
product = "TP805L"
x, y = devs[product][0].interfaces()[0].endpoints()
if re.search('bEndpointAddress .* IN', str(x)):
in_ep = x.bEndpointAddress
out_ep = y.bEndpointAddress
else:
out_ep = x.bEndpointAddress
in_ep = y.bEndpointAddress
pd = UsbWithBarcodeQRCodePair(devs[product].idVendor, devs[product].idProduct, in_ep=in_ep, out_ep=out_ep,
usb_args={"address": devs[product].address, "bus": devs[product].bus},
profile='default')
pd.set(align='left')
if "printer supports CP950":
#INFO: 印表機使用 Big5 字集
pd.charcode(code='CP1252')
pd.textln('電子發票證明聯\n測試補印\n年月隨機碼總計\n列印序號\n賣方\n買方\n9876543210\n\n'.encode('cp950').decode('latin1'))
elif "printer supports GB18030":
#INFO: 印表機使用 GB18030 字集
pd.charcode(code='ISO_8859-2')
pd.textln('電子發票證明聯\n測試補印\n年月隨機碼總計\n列印序號\n賣方\n買方\n9876543210\n\n'.encode('gb18030').decode('latin2'))
pd.barcode('99912HO987654321111', 'CODE39')
pd.qrcode_pair({"qr1_str": "FN350996001111031458100000258000002580000000024634102jbdmlVBHXApivmgZzzzzzz==:e378123456:1:1:1:", "qr2_str": "**何六百文件:1:600"})
pd.cut()

列印成果¶
設定 EPW 基本服務¶
服務有:
列印發票/收據
檢查感熱式印表機狀態
$ git clone git@github.com:ho600-ltd/Django-taiwan-einvoice.git
$ virtualenv -p python3 Django-taiwan-einvoice.py3env
$ source Django-taiwan-einvoice.py3env/bin/activate
$ pip install -r Django-taiwan-einvoice/escpos_web/requirements.txt
$ cp -rf Django-taiwan-einvoice/escpos_web/capabilities.json Django-taiwan-einvoice.py3env/lib/python3.9/site-packages/escpos/
$ pip install ipython
$ cd Django-taiwan-einvoice/escpos_web/
$ ./manage.py migrate
$ ./manage.py shell # create "te_web object". The url, slug, hash_key should be getting from TEA service; update "Printer object"
$ cp -rf Django-taiwan-einvoice/escpos_web/check_printer_status.conf Django-taiwan-einvoice/escpos_web/print_receipt.conf /etc/supervisor/conf.d/ # then update some settings
$ sudo apt install supervisor
$ sudo systemctl enable supervisor
$ sudo supervisorctl reread
$ sudo supervisorctl update
TEA 以 WebSocket 連線 EPW 時的驗證碼¶
在 TEA 上設定預設發票機時,必須填寫驗證碼,此驗證碼是登記在 EPW 的 /var/run/boot_random_seed 檔案。
要讓 EPW 在每次開機時,隨機產製出驗證碼供 TEA 驗證用,可透過 /etc/rc.local:
$ sudo su -
$ cat << 'EOF' > /etc/rc.local
#!/bin/sh -e
date "+%Y%m%d%H%M%S.%N Whatever words" | md5sum > /var/run/boot_random_seed
exit 0
EOF
$ exit
$ chmod a+x /etc/rc.local
生成 /var/run/boot_random_seed 後,可在 Waveshare LCD 來觀看驗證碼,但若未使用 Waveshare LCD ,則建議寫入固定值到 /var/run/boot_random_seed ,如:
echo "31a36a1b579fc1f1349183390d5b0a46 -" > /var/run/boot_random_seed
這樣驗證碼會保持在 31A ,在 TEA 上就是固定填寫 31A 驗證碼。
設定 EPW Portal(非必要)¶
若發票機上設定的 TEAWeb 紀錄超過 1 個時,就可以使用 Portal 服務來調整現時要連線的是那一個 tea_web 。當然也可以直接 ssh 連入發票機中,使用 django shell 手動設定某個 tea_web.now_use = True 。
設定 Portal 步驟:
$ virtualenv -p python3 Django-taiwan-einvoice.py3env
$ source Django-taiwan-einvoice.py3env/bin/activate
$ pip install -r Django-taiwan-einvoice/escpos_web/requirements.txt
$ pip install ipython
$ cd Django-taiwan-einvoice/escpos_web/
$ ./manage.py migrate
$ ./manage.py createsuperuser
Username (leave blank to use 'XXX'):
Email address: XXX@ho600.com
Password:
Password (again):
Superuser created successfully.
$ cp -rf Django-taiwan-einvoice/escpos_web/epw.conf /etc/supervisor/conf.d/ # then update some settings
$ sudo supervisorctl reread
$ sudo supervisorctl update
EPW Portal 預設是使用 8443 port,主要是 pi user 權限無法設定在 443 上,如希望以 https://xxx.yyy.zzz/ 而不是 https://xxx.yyy.zzz:8443/ 來瀏覽 Portal 網站,則再利用 iptables 作轉埠:
$ sudo apt-get install iptables-persistent
$ sudo iptables -A PREROUTING -t nat -p tcp --dport 443 -j REDIRECT --to-port 8443
$ sudo sh -c "iptables-save > /etc/iptables/rules.v4"
假使 EPW 拿到的內部 IP 是 192.168.7.88 ,則使用與 EPW 同一區網的電腦,在其瀏覽器上瀏覽 https://192.168.7.88/ ,輸入 superuser 帳密,再進入「臺灣電子發票管理網站」頁面:

顯示連線網站列表¶
點擊「設定」按鈕後,跳出視窗:

選擇要更改連線的網站,點擊「設定」按鈕¶
輸入「驗證碼」後按下「設定」即可更新「所連線的臺灣電子發票管理系統」。
發票機(EPW 伺服器)使用手冊¶
備註
若無使用 Waveshare LCD ,則 EPW 相關的操作資訊(Pass Key 及 IP 地址)就須向系統安裝人員詢問。
若只使用單一個「臺灣電子發票管理系統」,則系統安裝人員可寫死連線資訊,也就不用使用 EPW 後台網站來改變所連線的「臺灣電子發票管理系統」。
要操控 EPW 的資訊如下圖:

LCD 可顯示 EPW 的 IP 地址、 Pass Key 及目前所連的發票管理系統名稱¶
從 IP 地址可知,要連線至 EPW 後台的網址為 https://192.168.6.84/ 或 https://192.168.6.85/ 。在瀏覽器上輸入後,可見下圖:

請按「進階」¶
會再顯示「繼續前往…」的連結:

請點選連結¶
輸入帳號、密碼:

須洽系統管理員¶
登入成功後,點擊右上方的「選單鈕」:

選單連結有「感熱式列表機」、「管理網站」、「聯外IP」、「登入者」¶
先到「感熱式列表機」頁面:

序號是自動抓取的,也會是惟一值¶
若要更改連線的「電子發票管理系統」,請到「臺灣電子發票管理網站」頁面:

紀錄都是系統管理員事先設定¶
選定要更改的網站,點擊它的「設定鈕」:

會再出現小視窗¶
輸入「通行碼」,按下「設定」鈕:

按下「設定」後,會花 10 秒鐘左右更改連線位置¶
成功更改後,「勾選圖示」即會顯示在現在使用的網站紀錄上:

同時只會有一筆「網站紀錄」可顯示「勾選圖示」,若有多值,請再重新設定¶
如下圖 LCD 面板所示,原先是連線至「測試網站」:

測試網站¶
在成功更改後,就會顯示「正式網站」的名稱:

正式網站¶
若是要確認 EPW 是否有正常網路連線,可至「聯外IP」頁面確認:

無網路時會顯示 ?.?.?.?¶
在 Linux 安裝 Turnkey 及 TKW 伺服器¶
Turnkey 下載點: https://www.einvoice.nat.gov.tw/EINSM/ein_upload/html/ENV/1536133205094.html
TKW 最低需求:
支援 Ubuntu 18.4 以上,Redhat ES 7 以上,可支援 64 位元版本
建議搭配 XWindow 及中文字集包,以顯示中文
請確認 OpenJDK 版本為 11
資料庫 MySQL 5.7 或以上、MariaDB 10.9.3 或以上
安裝建議:
EI 平台有限制 Turnkey 系統的來源 IP ,所以建議到雲端平台去建立 TKW 伺服器,本文中範例是運作在 AWS
安裝 Turnkey 的系統,建議使用 OpenVPN 連線或是部置在 NAT 的後面,讓 Turnkey 可以 OpenVPN Server 或 NAT Server 的 IP 去跟 EI 連線
Turnkey 最好搭配 XWindow ,所以建議使用「Ubuntu 22.04 Server(x86-64)」AMI + xfce4 + xrdp 套件
若需創建多台 Turnkey 系統(如: 不同分店各自擁有 Turnkey 系統),可多個 Turnkey 系統置於同一 Linux 的不同資料夾中,也可各自裝在獨立的 Linux OS
TKW 是以檔案系統與 Turnkey 系統互動,所以多個 Turnkey 系統置於一 Linux 中,可只安裝一個 TKW ,若裝在不同 Linux ,則每個 Linux 至少都裝一個 TKW
設定台北時區:
$ sudo timedatectl set-timezone Asia/Taipei
基本函式庫安裝:
$ sudo apt update
$ sudo apt install aptitude
$ sudo aptitude upgrade -y && sudo reboot
$ sudo apt install unzip net-tools collectd
$ curl https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb -o amazon-cloudwatch-agent.deb
$ sudo dpkg -i ./amazon-cloudwatch-agent.deb
$ sudo adduser eit-user
$ sudo cp -rf .ssh/authorized_keys ~eit-user/.ssh/
$ sudo chown -R eit-user:eit-user ~eit-user/.ssh
$ sudo chmod -R 400 ~eit-user/.ssh/
$ sudo vi /opt/aws/amazon-cloudwatch-agent/bin/config.json # or sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
$ cat /opt/aws/amazon-cloudwatch-agent/bin/config.json
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/home/eit-user/Django-taiwan-einvoice/turnkey_web.asgi.log",
"log_group_name": "WHAT_NAME_ALL_YOU_WANT",
"log_stream_name": "turnkey_web.asgi.log",
"retention_in_days": 7
},
{
"file_path": "/home/eit-user/EINVTurnkey3.0.2-24634102/linux/log/Turnkey.log",
"log_group_name": "WHAT_NAME_ALL_YOU_WANT",
"log_stream_name": "Turnkey.log",
"retention_in_days": 7
},
{
"file_path": "/home/eit-user/EINVTurnkey3.0.2-24634102/linux/log/Turnkey_mail.log",
"log_group_name": "WHAT_NAME_ALL_YOU_WANT",
"log_stream_name": "Turnkey_mail.log",
"retention_in_days": 7
}
]
}
}
},
"metrics": {
"aggregation_dimensions": [
[
"InstanceId"
]
],
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"collectd": {
"metrics_aggregation_interval": 60
},
"disk": {
"measurement": [
"used_percent"
],
"metrics_collection_interval": 60,
"resources": [
"*"
]
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
},
"statsd": {
"metrics_aggregation_interval": 60,
"metrics_collection_interval": 60,
"service_address": ":8125"
}
}
}
}
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
{
"status": "running",
"starttime": "2022-09-07T06:08:59+0000",
"configstatus": "configured",
"cwoc_status": "stopped",
"cwoc_starttime": "",
"cwoc_configstatus": "not configured",
"version": "1.247352.0"
}
$ sudo apt install xfce4 xrdp
$ sudo apt install language-pack-zh-hant fonts-arphic-ukai fonts-arphic-uming fonts-ipafont-mincho fonts-ipafont-gothic fonts-unfonts-core
創建 MariaDB 資料庫:
MariaDB> CREATE DATABASE tkw CHARACTER SET = 'utf8' COLLATE = 'utf8_unicode_ci';
MariaDB> CREATE USER tkw@'%' identified by 'tkw';
MariaDB> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER on tkw.* to tkw@'%' identified by 'tkw';
執行 Turnkey 前所需的 jdk 函式庫:
$ wget https://builds.openlogic.com/downloadJDK/openlogic-openjdk/11.0.19+7/openlogic-openjdk-11.0.19+7-linux-x64.tar.gz
啟動 Turnkey GUI 工具:
$ cd ${SOME_WHERE}/EINVTurnkey3.0.2/linux
$ ./run_ui.sh

確定 Turnkey 的「系統設定」、「工作目錄」¶

設定資料庫¶
來自「財政部電子發票整合服務平台客服中心」的建議,在初始設定 Turnkey 時,就要做好「檔案收送」中的 5 種「目錄設定」,就算你的需求只有 B2C ,也請一併完成 B2B 交換/存證的目錄設定。不然可能會有 C 狀態拿不到的問題 。
5 種目錄的設定,分別在「B2B交換目錄設定」、「存證目錄設定: B2B/B2C 存證」、「下載流程目錄設定」、「發票配號訊息目錄設定」。
以上 5 種目錄設定都要作到:
確認訊息版本,此版本要與你所生成的 XML MIG 版本相符
按下「確定」
看到「儲存成功」訊息
皆完成後,就能在檔案總管中,看到如下的資料夾:

有設定過「下載流程目錄」後,才會出現 ReceiveFile 資料夾¶

B2B交換目錄設定¶

存證目錄設定¶

下載流程目錄設定¶

發票配號訊息目錄設定¶
設定傳送帳號、軟體憑證、送方管理: 請先準備好「軟體憑證.pfx」及大平台所開立的「傳送帳號、密碼、繞送代碼」。
在選單上,依序執行「1 傳送帳號管理」、「2 憑證管理」、「3 送方管理」

傳送帳號管理: 填入大平台開立的傳送帳號、密碼¶

憑證管理: 自定憑證代碼,填先前設定的憑證密碼、選擇軟體憑證¶

送方管理: 選擇「憑證、帳號」,填入統編及大平台開立的繞送代碼¶
備註
軟體憑證.pfx 相對應的 .cer 檔務必先上傳至大平台。

環境檢測¶

設定排程: 最基本的方式就是單純設定發票上傳、發票下載的執行間隔時間¶
如果要在開機時,就直接啟用 Turnkey 排程程式,請建立 /etc/rc.local 執行檔:
$ sudo vi /etc/rc.local
$ cat /etc/rc.local
#!/bin/bash
su - eit-user -c "cd /home/eit-user/EINVTurnkey3.0.2-24634102/linux/ && ./run_start.sh &"
$ sudo chmod a+x /etc/rc.local
安裝 TKW 伺服器¶
以 Python 3.X 為預設直譯器,本例使用 python3.10 :
$ sudo update-alternatives --install /usr/bin/python python $(readlink -f $(which python3.10)) 3 # set python3 as default
安裝工具程式、編譯程式、相依函式庫:
$ sudo apt install vim build-essential python3-dev python3-virtualenv mlocate jq mariadb-client libmariadb-dev
更換比較方便使用的 shell(Optional):
$ sudo apt install zsh
安裝 zsh 後,設定請參照 zsh with oh-my-zsh: https://gist.github.com/aaabramov/0f1d963d788bf411c0629a6bcf20114d
$ sudo apt install gettext
$ git clone git@github.com:ho600-ltd/Django-taiwan-einvoice.git
$ virtualenv -p python3 Django-taiwan-einvoice.py3env
$ source Django-taiwan-einvoice.py3env/bin/activate
$ pip install --upgrade pip
$ pip install -r Django-taiwan-einvoice/turnkey_web/requirements.txt
$ pip install ipython
$ cd Django-taiwan-einvoice/turnkey_web/
$ ./manage.py migrate
$ ./manage.py createsuperuser
Username (leave blank to use 'XXX'):
Email address: XXX@ho600.com
Password:
Password (again):
Superuser created successfully.
$ ./manage.py shell # create "eiturnkey object". The url, slug, hash_key should be set from TEA service
$ sudo apt install supervisor
$ cp -rf Django-taiwan-einvoice/turnkey_web/tkw.ini /etc/supervisor/conf.d/ # then update the wss url
$ sudo systemctl enable supervisor.service
$ sudo systemctl start supervisor.service
$ sudo supervisorctl reread
$ sudo supervisorctl start all
最後再設定 /etc/crontab 即可:
*/5 * * * * eit-user wget --no-check-certificate "https://localhost:8443/crontab_monitor/single_entry_point_of_view/?me=cron" -O /dev/null
17 2 * * * root su - eit-user -c "cd /home/eit-user/EINVTurnkey3.0.2-24634102/linux/ && ./run_stop.sh" && reboot
執行 /crontab_monitor/single_entry_point_of_view/ 的目的,是將 TEA 所傳入的發票檔轉換成 Turnkey-3 可執行的格式,也同時把 Turnkey-3 執行結果更新至 TEA 可讀取的紀錄。
執行 ./run_stop.sh 則是定時關閉 Turnkey-3 程式並重開機。
營業人利用「Turnkey系統」開立 B2C 存證電子發票¶
本文閱讀對象只針對「營業人」,其他的一般組織、團體、政府機關的角色並不適用。
線上申請 TURNKEY 傳輸¶
提供 2 個固定 IP , 1 個供正式環境,另 1 個供測試環境
通過後,即可到 https://wwwtest.einvoice.nat.gov.tw/ 使用工商憑證開通「營業人」用之 admin 帳號
將相關帳密填入 Turnkey 系統,並完成相關設定(軟體憑證、傳送帳號、送方管理、目錄設定、…)
開放「電子發票專用字軌號碼取號/電子發票專用字軌號碼取號(營業人)」權限給 developer
- 以 admin 帳號登入 https://wwwtest.einvoice.nat.gov.tw/ ,上傳軟體憑證(.cer),而軟體憑證私錀+cer檔(.pfx)置入 Turnkey 系統。
軟體憑證製作方式請參考「財政部電子發票整合服務平台的申請軟體憑證使用手冊」
- 設定三種密碼種子: QRcode, turnkey, 下載清冊。先參照「加解密API使用說明書」來製作密碼種子 Hex (ex: 密碼種子是 24634102 ,則密碼種子 Hex 是 FE05F029154F6AA67A78B338ED2F6601 ):
- 密碼種子 Hex 的製作:
$ ./genKey.sh ===Enter [q] to exit program=== Enter passphrase: 24634102 [2021/08/26 16:33:26][INFO][][] - begin gen key... [2021/08/26 16:33:26][INFO][][] - end gen key...(OK) [2021/08/26 16:33:26][INFO][][] - com.tradevan.geinv.kms.dist.DistKMSService begin init... [2021/08/26 16:33:26][INFO][][] - com.tradevan.geinv.kms.dist.DistKMSService begin init...(OK) Result(Hex)==>FE05F029154F6AA67A78B338ED2F6601
- 使用密碼種子 Hex 作 AES 加密:
$ python3 assets/qrcode_aes_encrypt.py FE05F029154F6AA67A78B338ED2F6601 XF000012349876 CamotDNRUN8bVyY5S1BhFQ==
到「營業人功能選單」/「人員帳號及權限管理」的各項密碼種子管理頁面登錄該相應密碼種子
從大平台取得當期字軌號碼區間
備註
在使用 Turnkey 傳輸時,因為有綁定 IP ,原本有測試看能不能用 HTTPS, SSL Proxy 方式來讓 Turnkey 裝在公司內部網路,但使用 AWS 上的 HTTPS, SSL Proxies 作轉換。其中測試 ssh 部份的參數如下:
# ~/.ssh/config
Host tsftp.einvoice.nat.gov.tw
Ciphers 3des-cbc
KexAlgorithms diffie-hellman-group1-sha1
$ sftp -P 2222 -o 「ProxyCommand /usr/bin/nc -X connect -x $ProxyHost:$ProxyPort %h %p」 $account@tsftp.einvoice.nat.gov.tw
但 Turnkey 的 Java 程式並未特別作使用 Proxy 設定,且有些動作可能不只使用了 tsftp.einvoice.nat.gov.tw, tgw.einvoice.nat.gov.tw 網址,結果並不成功。
最終方案是將 Turnkey 裝在 AWS 中,並為它套上 Web API ,這樣電商系統可利用 Web API 去通知 Turnkey 上傳發票資訊,無須與 Turnkey 系統安裝在同一台伺服器中。
手動製作電子發票 MIG XML¶
從當期字軌號碼區間挑一字軌號碼: FN53067850
確定發票明細
確定買受人、載具、是否捐贈
依 MIG-3.2 版編寫 C0401 XML 檔,也可拿「電子發票資料交換標準文件與範例」中的範例來修改使用
XML 範例如下:
<Invoice xmlns="urn:GEINV:eInvoiceMessage:C0401:3.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:GEINV:eInvoiceMessage:C0401:3.2 C0401.xsd">
<Main>
<InvoiceNumber>FN53067850</InvoiceNumber>
<InvoiceDate>20220915</InvoiceDate>
<InvoiceTime>11:40:14</InvoiceTime>
<Seller>
<Identifier>89858673</Identifier>
<Name>昶茂微生物開發股份有限公司</Name>
<Address>臺中市大里區仁德里仁禮街33號</Address>
<PersonInCharge>郭基發</PersonInCharge>
<TelephoneNumber>0424950542</TelephoneNumber>
<FacsimileNumber>0424758696</FacsimileNumber>
<EmailAddress>service@bio-enzyme.com</EmailAddress>
<CustomerNumber>綠大地</CustomerNumber>
<RoleRemark>總公司</RoleRemark>
</Seller>
<Buyer>
<Identifier>24634102</Identifier>
<Name>何六百有限公司</Name>
<Address>南投縣埔里鎮東潤路42-7號</Address>
<PersonInCharge>何岳峰</PersonInCharge>
<TelephoneNumber>0492927456</TelephoneNumber>
<FacsimileNumber>0492927576</FacsimileNumber>
<EmailAddress>service@ho600.com</EmailAddress>
<CustomerNumber>何六百</CustomerNumber>
<RoleRemark>總公司</RoleRemark>
</Buyer>
<InvoiceType>07</InvoiceType>
<DonateMark>0</DonateMark>
<PrintMark>Y</PrintMark>
<RandomNumber>7213</RandomNumber>
<CarrierType>3J0002</CarrierType>
<CarrierId1>/4WDMPUZ</CarrierId1>
<CarrierId2>/4WDMPUZ</CarrierId2>
</Main>
<Details>
<ProductItem>
<Description>【綠大地油酵清】水管除油酵素錠三罐</Description>
<Quantity>1</Quantity>
<UnitPrice>1380</UnitPrice>
<Amount>1380</Amount>
<SequenceNumber>001</SequenceNumber>
</ProductItem>
</Details>
<Amount>
<TaxType>1</TaxType>
<TaxRate>0.05</TaxRate>
<TaxAmount>66</TaxAmount>
<SalesAmount>1314</SalesAmount>
<TotalAmount>1380</TotalAmount>
<FreeTaxSalesAmount>0</FreeTaxSalesAmount>
<ZeroTaxSalesAmount>0</ZeroTaxSalesAmount>
</Amount>
手動上傳發票至大平台¶
將手動製作的發票 MIG XML 檔放到「TK 所在目錄/Data/UpCast/B2CSTORAGE/C0401/SRC」資料夾中,再啟用 Turnkey 程式,到「檔案收送」/「排程設定」頁面上點擊「立即上傳」。
成功上傳後,即可看見 TURNKEY_MESSAGE_LOG 多一筆紀錄:

成功上傳的狀態是顯示 G¶
過數分鐘後,可再點擊「立即下載」,大平台若是已處理完該張發票且無問題,就會將 G 改為 C 狀態。
確認上傳紀錄為 C 狀態後,在大平台就會查詢得到該張 B2C 銷項發票紀錄。
電子發票Turnkey上線前自行檢測作業¶



Todo
有撰寫書面文件,待整理。
申請電子發票字軌號碼前的電子發票開立系統自行檢測作業¶
在填寫「電子發票字軌號碼申請書」時,須附上「電子發票開立系統自行檢測表」,自行檢測表全文如下:

第 1 頁¶

第 2 頁¶

第 3 頁¶

第 4 頁¶
要確實完成自行檢測作業,表中紀錄的檢測人員須對 4 頁的檢測內容全部了解並確認檢測成功。其他工作人員則是依作業方式而須了解自身相關的檢測項目,如客服人員、出貨人員、會計人員、…等不同角色會涵蓋不同的電子發票相關作業,作業大致可分成 3 部份:
字軌號碼設定: 一般是會計人員的工作
開立電子發票: 可能是客服人員或是出貨人員
列印電子發票證明聯: 可能是客服人員或是出貨人員
不同作業所相關的檢測項目列表如下,只要是有「經手該項作業,就須了解相對應的檢測項目」:
檢測項目\作業 |
字軌號碼設定 |
開立電子發票 |
列印電子發票證明聯 |
---|---|---|---|
壹 |
○ |
○ |
○ |
貳之一 |
○ |
||
貳之二 |
○ |
||
貳之三 |
○ |
||
貳之四 |
○ |
○ |
檢測項目: 壹¶
須先確實閱讀「自行檢測重要說明」,了解「電子發票作業是於法有據」的,作業有缺失即有違法之虞:
一、字軌號碼為統一發票應行記載事項之一,營業人如未依規定記載或所載不實,
依加值型及非加值型營業稅法第48條規定,除通知限期改正或補辦外,
並按統一發票所載銷售額,處1%罰鍰,其金額不得少於新臺幣1,500元,
不得超過新臺幣15,000元。
若是誤用錯誤字軌來開立電子發票,如: 字軌號碼非當期或已配發給其他營業人,最高罰新臺幣 15,000 元。
第二條:
二、依統一發票給獎辦法第15條之1規定,營業人開立統一發票錯誤或
未依規定將統一發票資訊傳輸至財政部電子發票整合服務平台存證,
致發生代發獎金單位溢付獎金者,該溢付獎金由該營業人賠付。
小平台(電商系統)開立電子發票並交給顧客後,卻未上傳該張發票資料至大平台(財政部系統),最終到了統一發票開獎日,該發票又中獎,因為對顧客(善意第三人)而言,她/他拿到的發票是有效、合法格式的發票,財政部是會同意讓她/他領獎的,但事後因該發票資料未存在於大平台上,就換財政部向貴司請求賠償,顧客中 1000 萬,那貴司就要賠付 1000 萬。
本系統雖然有設定自動排程: 將開立後超過 1 小時未同步的發票設定警示。還是建議開立電子發票的人員,應在「完成開立」後的若干時間(約 1~2 小時)後,再次回到小平台檢查「是否有同步成功」,若還是處於未同步狀態,就要通知系統管理人員即早介入除錯。
另一種可能的錯誤,則是存在多張證明聯正本,除顧客正常持有外,還流出給其他人。若其他人先兌獎,致使顧客無法兌獎,該顧客獎金也是得由貴司賠付,貴司再於事後持證據向其他人索賠。要避免此種缺失,作業人員在「再列印正本」前,先確實在舊的正本證明聯蓋上「作廢章」並交由會計保管,方可「再列印正本」。本系統也會登記每一份正本的列印者為誰,便利事後究責。
警告
另外要注意的是,若有顧客因手上的證明聯正本汙損無法兌獎而要求貴司再次列印電子發票證明聯正本,於法貴司必須拒絕,僅能提供副本(證明聯上文句會顯示「補印」2字)。顧客可同時持汙損正本加清晰副本兌獎。

除紀錄正本列印者外,也會紀錄副本列印者¶
第三條:
三、為避免貴公司(行號)因操作錯誤或系統故障等因素開立錯誤之電子發票誤觸罰則,
請就下列經常錯誤態樣自行檢視相關內控機制,以降低開立錯誤電子發票之風險。
倘有更換開立發票設備或系統程式增修涉及檢測項目等情事時,亦應重新自行檢視。
這是提醒: 小平台的功能是會增加的,程式若有改版、更新,就應該再確認「本表所有的檢測項目」。
額外補充說明:
電子發票與現行二聯、三聯、收銀機式發票、…是並存的,代表適用現行發票的法律,
大部份也適用於電子發票上,而發票就是一種會計憑證,所以在「二聯、三聯、收銀機式發票、…」
犯的錯,發生在「電子發票」上,那罰則也會差不多。
電子發票開立內容可能會出的錯是「金額錯誤」及「品項錯誤」,賣 1,000 元的商品,結果電子發票金額記載的是 10,000 元;又或是實際銷售 920 元的商品加 80 元的運費,發票內容明細卻變成 920 元的明細加 80 元的商品。所以「開立人」或是「列印人」都該檢查經手的每一張電子發票內容,有錯就必須作廢重開,如果是系統錯誤導致作廢重開還是錯的,那就考慮改以手開二聯或是三聯發票。
檢測項目: 貳之一¶
- 配號設定:
[具備] 以平台產出的 CSV 配號檔進行匯入。
[具備] 開立發票設備之字軌號碼取得係由系統自動取號或給號,非以人工輸入字軌號碼。
[否] 前述(1)、(2)若採人工輸入,已設計多次多人確認機制,以降低人工輸入產生錯誤。
本系統僅提供「上傳 .csv」功能來匯入字軌號碼,並不提供人工手動輸入的作業方式:

上傳字軌號碼檔頁面有強調警語: 「下載 .csv 後不要編輯該檔」¶
開立電子發票的頁面,也僅提供「當期空白號碼餘…張」的選項,開立人無須也不能手動輸入「字軌號碼」:

開立人無須也不能手動輸入「字軌號碼」¶
- 配號範圍檢核:
[具備] 其開立之發票為可用配號設定範圍內。
[具備] 依交易時間其發票號碼是否為當期所屬字軌號碼。
配號是由系統自動選擇的,所選擇的號碼一定會介於起號與迄號之間。而挑選當期字軌號碼時,僅有一個時機可能會出現「非當期字軌號碼」的錯誤訊息提示如下:

非當期字軌號碼的錯誤提示¶
若在雙數月最後 1 天接近單數月 1 日 0 時作「開立電子發票」,可能先抓取雙數月用字軌的選項,待真正開立時,系統時間已進入單數月 1 日 0 時之後,所以系統會跳出錯誤提示。此時,只要再點一次「開立電子發票」視窗,讓它重抓最新的「單數月字軌號碼」即可完成「開立發票」。
警告
本系統有特定限制「奇數月 1 日的 0 點 0 分到 0 點 3 分之間不能開立發票」,在此期間開立發票時,會顯示「非當期字軌號碼」的錯誤訊息。
檢測項目: 貳之二¶
- 開機檢核:
[具備] 開立發票設備及系統初次設定時,已具有對時、確認賣方統編、發票字軌號碼檢核機制。
[具備] 開立發票設備及系統開啟後,已具有對時、確認賣方統編、發票字軌及前次開立發票號碼等相關資訊檢核功能。
系統開立發票的作業是在「電商銷售系統」而不是在「發票機」上,所以只有 1 台伺服器作這個「開立發票作業」,伺服器也有做「自動校時同步」設定,賣方統編是在伺服器上完成初始設定即可,之後無須更改。發票字軌號碼檢核都是在伺服器上完成匯入作業的,不須把字軌號碼移到發票機上。
發票機是單純列印「電商銷售系統」傳來的「發票資訊」,發票資訊內容都是在小平台的單一伺服器上處理的。
- 發票號碼檢核:
[具備] 檢核發票總長度為 10 碼。(前 2 碼英文、後 8 碼數字)
[具備] 檢核發票須在配號設定範圍區間內。
在小平台伺服器上選擇發票字軌號碼時,都有特定做「前 2 碼英文、後 8 碼數字」及「有無在配號設定範圍區間內」的檢查。
[具備] 字軌年期別顯示
字軌年期別是由字軌號碼起迄時間自動計算出來,不須人工輸入。
隨機碼產製
使用亂數函式製作,並會檢查該隨機碼是否與近 1000 張發票隨機碼重覆,有重覆會再取新的亂數隨機碼。
- 共通性載具檢核
[具備] 手機條碼
[具備] 自然人憑證條碼
手機條碼除驗證格式外,也使用「電子發票營業人應用API」驗證是否有註冊。自然人憑證條碼則單純檢查是否由「前 2 碼英文,後 14 碼數字」所組成。
檢測項目: 貳之三¶
- 證明聯列印
[具備] 年期別依發票字軌期別已正確設定列印。
[具備] 發票字軌號碼格式與長度已正確設定列印。
[具備] 隨機碼(4 碼數字)已正確設定列印。
[具備] 賣方統編(營業人統編)已正確設定列印。
[具備] 輸入買方統編,則已設定列印營業稅申報格式代碼。
[具備] 所產生列印的一維條碼內容與上傳平台之資訊相符。
[具備] 列印的 QRCode 內容與上傳平台之資訊相符。(請參照電子發票證明聯一維及二維條碼規格說明)
[具備] 列印的 QRCode 內容包含正確加密驗證資訊。(請參照電子發票證明聯一維及二維條碼規格說明)
[具備] 列印之電子發票證明聯內容與上傳平台之資訊相符。
1~5 請自行列印電子發票證明聯後比對,「電子發票實施作業要點」中的發票格式範例如下:

右邊為買受人為營業人的格式¶
6~9 則須登入「大平台」後,進入「B2G功能選單 >電子發票證明聯條碼檢測」頁面,將「電子發票」上的一維條碼、左QRCode、右QRCode資訊輸入後查詢,可得:

都得到「正確」、「相同」即可¶
檢測項目: 貳之四¶
- 重號檢核:
[具備] 單一設備系統需有檢核功能,不可開立同年期別發票字軌號碼重覆之發票。
[具備] 營業人各分店各設備系統機應有檢核功能,不可開立同年期別發票字軌號碼重覆之發票。
[否] 有分支機構之營業人系統應有檢核或配號功能,不可誤用其他分支機構之發票字軌號碼,造成不同店重號之狀況。
[具備] 系統異常中斷時,須確保不可開立同年期別發票字軌號碼重覆之發票。
系統是在單一伺服器上開立發票,其發票號碼存入資料庫時,會有 unique (惟一值)檢查,保證不會與舊紀錄重覆。本系統給公司中各部門使用時,也都是連上同一台伺服器。
當系統異常中斷時,若已開立電子發票,則會接受 unique 檢查,若未開立完成電子發票,則新開立電子發票也會拿先前的空白號碼來使用,不會有跳號情形。
[具備] 漏傳自動上傳機制
系統是「自動上傳已開立之電子發票」,預設是每 15 分鐘上傳 1 次,有設定載具、統編、捐贈的電子發票會自動上傳,而「索取紙本的電子發票」則是待「完成列印」後才會上傳。
系統在發票開立後,若超過 1 小時還未取得「已同步」的資訊,會自動產生警示通知使用者,如下:

「索取紙本」的電子發票,若無完成列印,就不會上傳至大平台¶
[具備] 備份機制
系統在 AWS 雲端機房,所使用的資料庫系統位於 Multi-Zone ,同時有 2 台資料庫在運作,彼此之間有即時備份,且 2 台資料庫是處於不同物理位置的機房。
導入 Django-Taiwan-EInvoice(DTEI)¶
Todo
撰寫中
電子發票相關的檢查表及標準作業流程(SOP)¶
執行檢查表時,項目有確認請打「勾/✔️」,不確認就打「叉/❌」。
備註
SOP 在執行時,因本身設計就有問題的話,請提出討論。 SOP 不是定死的。
匯入字軌號碼¶
執行時機應在雙數月 20 日至該月月底之間。
確認 |
檢查項目 |
---|---|
□ |
直接從大平台下載的 .csv ,且未經人工編輯 |
□ |
比對 .csv 中的營業人統編、期別格式(年3碼/月2碼)、字軌(2位英文字)、起號(8位數)、迄號(8位數) |
□ |
匯入成功後,只保留給「臺灣電子發票管理系統」使用的字軌號碼,其餘則刪除 |
以上項目若有「叉」出現,且無法調整得到「勾」,請執行「 檢核不通過 SOP 」:
創建「字軌號碼」任務的 ticket ,說明「何項檢查項目」無法通過並附上 .csv 檔,再交由「資訊人員」接手處理
列印 B2C 發票證明聯¶
執行時機應在開立電子發票後。
確認 |
檢查項目 |
---|---|
□ |
無載具、無捐贈、無統編的電子發票一定要列印後,才會啟動上傳大平台程序 |
□ |
檔頭只顯示「電子發票證明聯」而無「補印」字樣,即為正本 |
□ |
只能保留一份「電子發票證明聯正本」,如有多張正本,只留一份,其餘皆須在檔頭證明聯處蓋上「作廢」 |
□ |
期別、字軌號碼、開立時間、隨機碼、總計、賣方統編、一維條碼、左/右QRCode皆符合格式範例 |
□ |
使用符合財政部規範是「57mm電子發票紙捲」 |
□ |
發票總計金額同訂單金額 |
□ |
若有買方統編,則須同訂單內的買方統一編號 |
以上項目若有「叉」出現,且無法調整得到「勾」,請執行「 檢核不通過 SOP 」:
作廢該電子發票,且在證明聯檔頭處蓋上「作廢」
將電子發票所屬訂單改為「手開發票」
創建「發票字軌號碼」任務的 ticket ,說明「何項檢查項目」無法通過,再交由「資訊人員」接手處理
每日檢核前一日發票數¶
當日最終的「檢查點」應定在下午 13 點 30 分前。例如: 12 月 1 日有開立的發票的話, 應在 12 月 2 日下午 13 點 30 分 前 檢核, 若能在上午時段就通過「檢查表的 2 項目」,那該日的檢核作業就完成, 又如果上午檢核結果是「不通過」的,那也應等到下午 1 點半左右再檢核一次。
確認 |
檢查項目 |
---|---|
□ |
X: 開立發票(C0401)、作廢發票(C0501)及註銷發票(C0701)的同步至 EI 大平台作業是否 完成 |
□ |
Y1: C0401/C0501/C0701的數量是否等於「EI 日報表」的統計筆數, 或是 Y2: 三者總和數等於歷史檢核表-存證統計工作表的「中心已存證數」 |
檢查表執行時,都必須得到 2 個「勾」, 2 個「勾」代表當日檢核通過,但只要有 1 個「叉」就要執行下列「 檢核不通過 SOP 」:
創建 YYYY-MM-DD 檢核任務的 ticket ,並註明是 X, Y1, Y2 中那一個項目不通過
請會計(或有大平台權限的人)到大平台的「發票查詢/列印/下載」頁面(如下圖: 大平台搜尋發票.png),查詢該日的 B2C 銷項發票,並將結果頁面截圖(如下圖: 截圖範例.png)保存
若結果頁面的數據不符合,再使用「發票查詢/列印/下載」頁面中的「非即時查詢」方式下載該日的發票 xlsx 檔
將「結果頁面截圖」及「發票 xlsx 檔(視問題狀況)」上傳至該 ticket ,交由「資訊人員」接手處理

大平台搜尋發票.png¶

截圖範例.png¶
專業代理人¶
Todo
待續
查詢電子發票API¶
Todo
待續
0.X 版本修訂紀錄¶
0.1: 完成「營業人利用電子發票整合服務平台開立 B2B 電子發票」的最精簡流程說明
0.0: 初始化、宣告著作權、完成「消費者設定電子發票載具」說明
文件撰寫中之待辦事項¶
Todo
待續
(原始記錄 見 /home/docs/checkouts/readthedocs.org/user_builds/django-taiwan-einvoice/checkouts/stable/docs/agent.rst ,第 4 行)
Todo
撰寫中
(原始記錄 見 /home/docs/checkouts/readthedocs.org/user_builds/django-taiwan-einvoice/checkouts/stable/docs/import_django_taiwan_einvoice.rst ,第 4 行)
Todo
待續
(原始記錄 見 /home/docs/checkouts/readthedocs.org/user_builds/django-taiwan-einvoice/checkouts/stable/docs/inquire_api.rst ,第 4 行)
Todo
批次開立發票
(原始記錄 見 /home/docs/checkouts/readthedocs.org/user_builds/django-taiwan-einvoice/checkouts/stable/docs/merchant_create_b2b_invoice.rst ,第 209 行)
Todo
標題號稱「總覽」,然實際上,部份頁面還未撰寫到。
請耐心等候~
(原始記錄 見 /home/docs/checkouts/readthedocs.org/user_builds/django-taiwan-einvoice/checkouts/stable/docs/merchant_operations.rst ,第 4 行)
Todo
這裡所謂「Email接受」是由整合服務平台自動幫你確認接收的說法, 單純是從網頁文字說明判斷而來,實務上,尚未看到任何教學影片或投影片明確提及。 待確認這個說法。
(原始記錄 見 /home/docs/checkouts/readthedocs.org/user_builds/django-taiwan-einvoice/checkouts/stable/docs/merchant_operations/營業人功能選單/基本資料/營業人接收方式設定.rst ,第 20 行)
Todo
列出各項作業名稱的實質定義
(原始記錄 見 /home/docs/checkouts/readthedocs.org/user_builds/django-taiwan-einvoice/checkouts/stable/docs/merchant_operations/營業人功能選單/待辦事項/待辦事項.rst ,第 14 行)
Todo
待續中。
(原始記錄 見 /home/docs/checkouts/readthedocs.org/user_builds/django-taiwan-einvoice/checkouts/stable/docs/merchant_operations/營業人功能選單/線上銷項發票作業/開立發票.rst ,第 8 行)
Todo
待續中。
(原始記錄 見 /home/docs/checkouts/readthedocs.org/user_builds/django-taiwan-einvoice/checkouts/stable/docs/merchant_operations/電子發票專用字軌號碼取號/電子發票上傳作業/上傳未使用空白發票號碼.rst ,第 8 行)
Todo
有撰寫書面文件,待整理。
(原始記錄 見 /home/docs/checkouts/readthedocs.org/user_builds/django-taiwan-einvoice/checkouts/stable/docs/self_checklist_before_turnkey_online.rst ,第 10 行)