電子發票自動開立:作廢、重開、統編場景一次講清楚
很多電商團隊以為電子發票就是「訂單成立時呼叫一次開立 API」,做完打勾收工。我們的自營電商跑了自動開立之後才知道,開立只是這條生命週期最簡單的第一步。真正花時間的是後面:金額變了要作廢重開、客人補統編、退款要處理折讓、開立失敗要能補開——每一個場景都會在真實營運裡出現,而且通常挑你最忙的時候出現。
這篇把電子發票的完整生命週期講透,全部是我們每天在跑的流程。
自動開立:時機與冪等是兩個地雷
開立時機要綁「付款完成」,不是「訂單成立」。超商代碼的訂單,消費者可能拿了代碼三天後才繳,也可能永遠不繳;貨到付款則是出貨後才真正收到錢。發票跟著訂單成立開,就會開出一堆沒有交易事實的發票,月底對帳對到懷疑人生。
開立動作必須冪等。金流的付款通知會重送(這在綠界串接的十個坑詳細講過),如果你的發票開立掛在付款通知後面又沒做防重,同一筆訂單就會開出兩張發票。我們的做法是開立前先檢查該訂單是否已有有效發票,有就直接跳過,並把發票號碼與訂單綁定存檔。
統編與載具:B2C 和 B2B 是兩條路
個人消費者走載具(手機條碼、自然人憑證)或會員載具,中獎由平台通知,流程單純——但手機條碼要做格式驗證,一個打錯的條碼會讓發票歸戶失敗,客訴照樣找上你。真正麻煩的是統編:
- 打統編的發票需要完整的買受人資訊。不只統編八碼,公司抬頭、地址等欄位缺了,開立 API 會直接吐錯。結帳流程要在消費者勾選「需要統編」的當下就把欄位收齊,不要事後用客服訊息追。
- 「開完才說要統編」是日常。個人發票改公司統編,不是修改,是作廢原發票、重新開立一張 B2B 發票。這個流程要嘛做進後台讓客服一鍵處理,要嘛你就會看到工程師每個月手動處理好幾次。
作廢、重開、折讓:發票的下半場
金額變更 = 作廢重開。消費者改口味、改數量、改配送方式導致金額變動,發票金額不能改,只能作廢重開。我們把它做成後台一鍵操作:一個按鈕完成作廢舊發票、依新金額重開、記錄兩張發票的關聯,客服自己就能處理,不用開工單。
退款走折讓或作廢,看時間點。當期全額退款可以直接作廢;跨期或部分退款則要開折讓單。這是最容易被漏掉的一段——系統退款退得很順,發票卻沒動,帳務上就出現「錢退了、發票還在」的缺口,等會計月底發現,你要回頭補一堆單。
開立失敗要有 retry 與人工補開的路。發票服務偶爾會有瞬斷,失敗的開立要進重試佇列;重試仍失敗的,要有清單讓人工補開,而不是靜靜地消失在 log 裡。
環境設定的一個細節
發票的測試/正式環境切換,務必跟金流的模式綁在同一個開關上。我們踩過的教訓:金流切了正式、發票還指著測試環境,真實訂單的發票全開進測試區——那種當下的心情,不建議體驗。上線前用真單走一次完整流程有多重要,我們在上線前的端對端測試這篇有完整 checklist。
發票系統做得好不好,不是看開得出來,是看改得動、退得掉、補得回來。
如果你的電商還在手動開發票,或自動開立老是出狀況,可以看看我們的電商系統建置服務——發票自動化含作廢重開與統編場景,是我們的標準交付範圍,因為我們自己每天都在用。
這類問題,我們每天都在自己的產品上解
免費 30 分鐘線上諮詢・先釐清方向,不推銷・一個工作天內回覆