今天25號,又是統一發票開獎的日子,幾家歡樂幾家愁,社群網站上想必會看到有人 PO 這種圖片。

也會有人 PO 這個,一篇好幾年前(2020)年的討論串


討論串1討論串2

這是不是在危言聳聽呢? 讓我來驗證一下,如果有人把發票照片給一間民間商業公司,或是把手機條碼載具編號&密碼給一間民間商業公司,就可以做出類似怎樣的線上應用。

註:本文是討論電子發票的「查詢」API,如果要找「開立」的,請找電子發票加值服務中心 內的訊航科技鯨躍科技之類的,有的在年費、發票管理的軟體介面、一些雜項費用、是否有實體店面方案都不同,要自己查一下。

先從一個活動網站需求說起

有一次接到一個行銷活動網站製作需求,消費者在特定通路買了特定商品,可以上活動網站登錄發票號碼、個資聯絡資訊…等等,我會公正的定期抽出中獎者並通知。
窗口給了一個範例網站,範例網站是台灣的廠商在舉辦類似的活動,裡面有2個神奇的功能:
1.輸入手機條碼載具編號和密碼,然後自動讀取載具內的電子發票是否有符合參加資格,也就是消費者不用一筆一筆去登錄發票號碼、購買日期…什麼的,只要輸入載具資訊,就可以參加抽獎。本來發票都習慣存載具的人,也不用為了參加抽獎活動特別去印出來。
2.把電子發票的正面拍照上傳,系統會檢查電子發票是否有符合參加資格,而且實測功能應該是能用的,拿加油站的發票拍照上傳果然判定不符合參加活動,但是還可以申請人工審查。

功能看似非常先進,但獎品很空虛,搞不好網站開發預算比獎品費用還高,但是網站開發一次,日後換個視覺樣式還有機會繼續用,獎品之類的都是消耗性預算。但總之先評估看看能不能製作。

仔細想想,覺得這種判斷方式好像很雷?
1.有些店的電子發票不一定在購買消費當下立刻開立並上傳到財政部,消費者買完東西出來要登錄發票,阿怎麼登錄不進去? 發票無效? 明明是店家還沒上傳電子發票,又是活動網站的客服或工程師要背鍋了。
2.承上,例如有人趕在活動期間最後一天晚上才去買,而店家的發票時間就是已經過了活動期間才開立,程式要怎麼驗證他消費時是在活動期間內? 傳統抽獎登錄作法很單純,資料要儲存時若超過活動登錄時間,就是不給你 SQL INSERT,那現在改成判斷不知道何時會變動的 API 資料來源?
3.發票明細的品名仰賴店家自由心證,還有各種系統限制,要是店家品名亂打,程式要怎麼確定這張發票有買某某特定口味/規格? 又要再印一堆刮刮卡或是特殊包裝的商品嗎?
4.有些連鎖商店,開發票的店家名字是一些奇奇怪怪的名字,例如一般人認知的麥當勞、肯德基那個叫品牌名稱,或是有申請商標,但這些品牌名稱背後負責營運、登記稅籍資料的公司名稱,或是加盟分店的營業登記公司名稱,一般人可能沒聽過,那程式要怎麼確定這發票是在指定通路買的?
5.拍照辨識發票,碰到 QR Code 有印刷不好、折到…各種無法正常辨識影像的,還不是又要請使用者手工輸入發票號碼、購買日期?
可能就跟參考網站的人工審查一樣,還是要花費許多人力和客服待命。

但既然已經有人實做出來,就分析看看是怎麼做的?
一個最簡單的問題,可以從英文兩位數+8位數字發票號碼,就知道這張電子發票買了什麼東西嗎? 不行,還要再搭配發票的其他資訊(發票號碼+發票期別+開立日期+檢驗碼+店家統編+4位數隨機碼),所以表單欄位不會減少,只會更多。
Google 查到財政部的「查詢電子發票」 API 可以做到輸入載具資訊,查詢載具裡面存的發票 ,API 還有提供其他功能,例如程式自動查詢某期發票中獎號碼、列出所有愛心碼的機構的清冊,透過使用者提供的發票號碼等基本資訊查詢明細、用消費者提供的載具編號和密碼,查詢那個月的電子發票是誰開立的、開立的電子發票明細…之類的。


電子發票應用API規格

就算發票不是我開立的,發票也不是歸戶在我的載具內,只要帶上對應的請求參數就可以查,而且個人或公司行號都可以申請。

用發票資料當行銷數據庫可能不是新鮮事

電子發票應用程式介面使用規範都有明文寫到

六、 開發者應遵守注意事項
(一) 開發者利用或使用 API ,不得有違背法令或公序良俗、誤導社會大眾、妨礙或干擾第三人、侵害本中心利益或其他不當之行為。
(二) 開發者非依法令,不得於軟體產品及加值衍生著作下載、安裝及執行過程中,蒐集、儲存使用者之任何電子發票資料、使用紀錄及其他個人與營業資訊,並應避免前開資訊遭第三人使用、存取、發布或分享。
(三) 開發者應確保其提供與資訊平台之資訊,或其代替使用者執行軟體產品及加值衍生著作功能時,均已取得或已擁有使用者之同意或利用該資訊之必要權利。
(四) 開發者公開發行、展示或利用本中心 API 產生之軟體產品及加值衍生著作時,應以適當方式註明係由本中心授權。
(五) 開發者利用軟體產品或加值衍生著作應自行採取必要防護措施,且必須定期更新,以修復或防範安全性漏洞,並應以適當方式聲明本中心不擔保 API 使用之合適性、可依賴性、即時性、有效性及完整性。
(六) 開發者承諾,就 API 使用所為之相關研究或統計成果,無償提供本中心參考。
(七) 開發者承諾,如 有軟體產品使用目的或版本之變更,應通知本中心。開發者對於本中心提供之 API 如有其他建議,亦得一併提供。

也會不定期收到提醒,雖然我什麼壞事都沒有做

那回到一開頭的那則危言聳聽,一些民間的發票 app 其實都有拍照存發票,也可以輸入手機號碼載具資訊然後查詢發票,理論上確實可以順便統計一下大家的發票裡面都買什麼東西,最後再統計出一些分析報告。

以下列舉幾個知名的發票 APP 跟所屬公司的「消費交易資料庫」行銷大數據相關商品介紹

1.引客數據 invos Data即時市場趨勢追蹤系統
粉專簡介開宗明義就寫說是用發票資料做數據分析,那麼發票是從哪裡來的? 他們公司還有另外兩個有名的產品,發票存摺和 Moneybook麻布記帳,背後都是同一間公司,叫麻布數據。


(各位的發票都拿去當給人當素材了)

2.發票+的公司和角度數據

3.發票特務的公司樂飛科技的AI行銷解決方案

這些只是做發票 APP 商品的民間公司,剛好也有提供一些行銷數據相關服務而已,兩者的資料有沒有關聯、是否去識別化…等等就不得而知。

4.雲端發票與雲端行動科技股份有限公司的行銷科技服務 (ps.這家公司也是台灣100多家發票加值中心之一)
5.發票怪獸的企業合作方案
6.波波送點
7.發票集點王
這幾個比較接近,是在自己的發票 APP 裡面提供廣告版位曝光、行銷規劃、點數積分商城之類的,白話點就是常常會跳廣告推播通知,APP 裡面卡一堆廣告,被人嫌又醜又難用,所謂觀感或 UX 很差、被社會唾棄的 APP,但是使用者個資看起來比較沒有被拿去其他地方賣錢。
反觀有些免費的發票 APP 裡面幾乎沒廣告,還會有每日簽到、一些回饋活動什麼的,但是消費數據可能都拿去變成他們家其他商品的研究資料來源之一,供我們這行用於規劃行銷活動、廣告投放、系統開發之類的做各種行銷決策用途,大家還覺得這種沒廣告的 APP 很棒很好用? 資本主義真是太邪惡了。

還有兩個看起來比較新創、功能看似比較乾淨的
8.水滴發票 現階段看起來功能相對單純,真的只有存發票而已,這樣公司要怎麼賺錢哩?
9.aifian 享擁有 一樣是拍照發票上傳賺積分,不過他還有「資產庫」這個酷功能,能藉由平台媒合,進行物件的管理、租賃、購買、轉讓及回收

10.財政部電子發票 智慧好生活 服務平台
這個是政府自己的電子發票資料分析成果展示,有各種不同主題讓人公開瀏覽。

11.鷹眼數據有個 GUI發票數據系統臉書貼文寫說「資料匯聚多個第三方雲端發票App」,號稱有四億筆以上的發票資料,但沒寫說是哪些發票 APP 出賣資料的。

商品如果是免費的,果然使用者就是商品…

用電子發票資料來做消費數據分析有參考性嗎?

生活中還有一堆免開發票的店家,更別提還有一堆電子發票為了保險起見,品名一律都用「XXX商品」的電商,怎麼想都覺得不靠譜,上網查一下可能還有哪些誤差跟偏差

玩發票似乎是不少統計學科的碩論題目,不過國發會有一篇幾年前的期刊文章可以直接公開瀏覽: 由電子發票資料分析臺灣消費初探 – 黃鈺茹有提到幾點,摘錄如下:

– 發現以電子發票計算之各縣市平均消費傾向,均明顯低於主計總處公布之數據,且由於各縣市所能取得之樣本數多寡,及電子發票普及程度不同,所呈現之邊際消費傾向也有相當大的差異。
– 零售業電子發票開立比重較高,2017 年達36.9%,餐飲業較低,為 28.9%。(各縣市又有2~4成不同的零售業電子發票開立比,詳見期刊內文)
– 每年導入電子發票之商家逐漸增加,電子發票張數、總金額持續上升,但並不代表消費持續增加,應排除廠商加入之效果,才能正確解讀民間消費的變化。
– 稅籍登記之行業別可能與實際營業項目不同,造成統計誤差。
– 發票品名不一致—不同商家的相同產品列示於電子發票之名稱可能不盡相同。

以下實測用 財政部的查詢電子發票 API 做一些查詢發票資訊的實驗,看看拿使用者的發票當統計數據是否可行

用財政部的「查詢電子發票 API」從發票照片得到商品明細

API 也就是 Application Programming Interface 的縮寫,在應用程式和應用程式之間的溝通的手段,先來看一下要如何透過一張發票照片知道一個人買了什麼

從文件的「三、查詢發票明細」可以看到

喔,如果只有英文兩位數+8位數字發票號碼,而沒有發票開立日期、發票檢驗碼、商家統編、發票隨機碼,是壓根兒無法查詢別人的發票明細的。

但是如果我得到使用者上傳的電子發票照片,就有機會可以得到上面那些東西,看是要人工一張張辨識還是用公有雲的影像辨識,又去查了一下看有沒有其他專門搞影像辨識發票的,輸入發票照片,不只能辨識,還要把「發票號碼、發票開立日期、商家統編、發票隨機碼」格式自動整理好,例如把「2 0 2 2 – 0 4 – 1 9 1 7 : 3 4 : 2 7」變成API指定的格式「2022/04/19」

這種非常在地化、市場又小的東西,台灣竟然也有不少廠商在競爭了,像是力新號稱能處理台灣發票格式21-28,韜睿也有類似的 API 或本地部屬服務,不過台灣的 SaaS 服務比起國外的還是差一大截,什麼東西都沒有價錢,沒有試用,沒有立即可以看的公開 API 文件,什麼東西都要留資料洽詢,等留了資料又會看我的聯絡資訊是免費 email 或不是百大,當成我九成九只是來隨便問問,通常洽詢之後都沒人理。

從文件知道要查商品明細有快10個參數,少一個都不行,其中有一個「發票檢驗碼 encrypt」,當 Type 為 QRCode 時為必填,這又是什麼? 還半個範例都沒有? 查了一下才知道是電子發票底下有兩顆 QRCode,左邊那顆解析出來的字串,取第一個冒號前面的24個字,就是發票檢驗碼 encrypt。這又是一個眉角,寫在 電子發票證明聯一維及二維條碼規格說明 跟民間資料電子發票 API (三) 查詢發票表頭與明細 | brenthsieh.

以 HTTPS 協定對財政部電子發票整合服務平台網址:https://api.einvoice.nat.gov.tw/ 配上 3.查詢發票明細寫的要求路徑 /PB2CAPIVAN/invapp/InvApp,需求參數以 POST 傳送,回應以 JSON 方式傳送。
湊齊11個參數,簡單的透過一次呼叫,就成功得到一張發票的商品明細資料。

嗯…原來超商的兩件優惠,是用一個負數的商品品項來扣…

用財政部的「查詢電子發票 API」得到載具內發票的商品明細

有了載具編號和密碼,真的能得到一個人所有的發票,與每一張發票的購買明細嗎? 例如幾月幾月買了什麼尺寸的保險套。幾月幾號有旅館的發票?
使用各種民間公司開發出來的存電子發票的 app(如發票存摺、發票怪獸…),還有一開頭的範例活動網站開發評估,都有一個功能:輸入載具編號和密碼,如下圖:

在財政部電子發票整合服務平台,一般消費者用的是「手機號碼」和密碼,而這類服務都只有跟使用者要「載具編號」和密碼,雖然兩者的密碼是同一組東西,但「手機號碼」跟「載具編號」不一樣,應該沒差吧?

嗯,的確是沒差,反正一樣都可以取得我的載具裡的發票跟商品明細。 用載具編號可以透過 API 全自動化撈,還比較方便!
有的發票 app 還要輸入手機號碼註冊,搞不好手機號碼就跟財政部電子發票整合服務平台的手機號碼是同一組呢。

各家使用者條款都有類似需要存入使用者密碼的文字,如下圖

為什麼要輸入密碼,跟假如消費者不上傳照片,有什麼辦法知道使用者都買了些什麼?
這兩個其實是同一個問題,首先查閱財政部電子發票查詢 API 文件中的「六、載具發票明細查詢」

需要手機條碼/卡片(載具)隱碼、發票號碼、發票日期、手機條碼驗證碼/卡片(載具)驗證碼…等11項參數,才能一窺一張發票裡面買了什麼東西,但程式壓根沒有發票號碼、日期之類的,要怎麼查?

所以要回到文件「五、載具發票表頭查詢」

看到 cardNo 跟 cardEncrypt、cardType,現在就知道為什麼每個發票 APP 都會需要輸入載具編號和密碼,因為給出載具編號和密碼之後,程式就能透過 API 取得我這個月有幾張發票,還有要查詢每一張發票明細所需的必要資訊呀!
endDate 還要判斷這個月有幾號,不過用還沒到來的未來日期,也不會出錯,湊齊12項參數,之後初步拿到我這個月所有發票的表頭資訊。

資料湊齊了,接下來一樣是要取得發票明細,但是在這邊不像本文的上一大段,我們沒有每張發票的24個字那個檢驗碼,也沒有4個字的發票隨機碼,所以沒辦法沿用上一段的程式,要再透過「六、載具發票明細,得到發票明細」的參數說明,另外重寫一段…

成功取得發票明細和品名,嗯,金額還會有小數點,看來資料庫欄位不能開只能存整數的…

其他財政部電子發票查詢 API 的使用眉角

查詢發票明細需要使用者的密碼,這不是各家發票 APP 工程師的問題,而是 API 要求的必填資料就是這樣子,不然每個發票 APP 都會武功全廢,那財政部為什麼要這樣設計?
是怕例如有人拿到別人的手機條碼載具編號,就可以偷查到那個人的消費資訊,所以要拿使用者密碼當做多一道保護?
但這樣也導致使用者只要改個密碼,程式就無法透過 API 拿到新的發票資料了,我實在不太喜歡這種密碼當必要參數的 API 設計,一些郵件、簡訊的 API 也有這種情況,但凡使用者只要改個密碼,透過 API 運作的功能就整組壞了,

還有一個奇怪的開發雷點,例如有一張發票是存在信用卡的悠遊卡載具內,然後悠遊卡載具歸戶到手機條碼載具,所以用「五、載具發票表頭查詢」可以查得到這張發票。
但是在「五、載具發票表頭查詢」得到的資料,可以看到這張發票的 cardType 是 1K0001,cardNo 有一組沒看過的數字,但是在「六、載具發票明細查詢」步驟時,用這個參數是拿不到資料的,API 會回傳 {"v":"0.5","code":903,"msg":"參數錯誤"},cardType 仍然要用 3J0002 跟手機條碼載具,才能得到發票商品明細資訊。

除了上述提到的,24個字那個檢驗碼要去另一份文件看才知道是什麼東西,存在悠遊卡載具的發票要用手機條碼載具當參數才能查,還有其他的特點:
申請時沒有任何域名限制,不用登記域名、呼叫 API 時也沒有限制域名、卡主機IP、卡接收回傳資料的網址,就算程式網址是 localhost 也可以正常取得資料。
每次要求只要一次往返就好,非常方便,沒有什麼 access_token 跟 refresh_token 之類的麻煩機制。
日期區間問題1,在「五、載具發票表頭查詢」的文件上說「限制開始及結束查詢時間為相同月份」,實測 startDate 跟 endDate 設超過一個月的 2022/01/01 跟 2022/02/28,不會得到任何錯誤訊息,但拿到的資料只會有1月份的,故一次只能取一個月的敘述為真。
日期區間問題2,在「五、載具發票表頭查詢」的文件上有寫說最久可以查到查詢當日前 6 個月 1 日起(例如 9 月 5 日時,最早查詢起始時間為 3 月 1 日起)的發票,用 API 硬查超過半年的,實測會得到 {"v":"0.5","code":903,"msg":"參數錯誤"} 的訊息,但包含財政部自己的統一發票兌獎 APP ,基本上都可以看到載具裡超過半年前的發票,就不曉得大家是怎麼設計的。
不知道最遠可以查多久前的發票,現在是2022/5,找出一張2018年的發票,用「三、查詢發票明細」還是查得到商品明細。
API 不知道有沒有 limit rate,我不敢亂試,怕被鎖帳號。
– 使用者要授權給發票 app 或外部服務,沒有 token/過期時間之類的設計機制,所以每次發票 app 要查使用者有沒有新發票進來、消費分析,程式大概基本上就是讓使用者的密碼直接傳來傳去的,使用者能做的頂多就是改密碼,這樣發票 APP 就無法再透過 API 拿到之類的發票資料。話說好像很難理解讓非軟工的人理解,使用者同樣在一個線上介面輸入帳號密碼,程式實際儲存跟拿來使用的,究竟是一組無法反解的特殊編碼字串、可以透過金鑰反解的加密字串、還是 token 或 access_key,還是原始的字串…這幾者的區別。
– 沒辦法從發票資料反查載具資訊,例如某發票開立時就屬於某組手機條碼載具,但即使有發票正面完整照片,也無法反查出所屬載具的資訊。
財政部 E-Invoice Platform電子發票整合服務平台 的個資有夠少,例如有人剛好知道我手機號碼,再配上密碼,去登入財政部 E-Invoice Platform電子發票整合服務平台,領獎設定裡面有銀行帳戶資訊,但是要先輸入身分證字號才能看,其他也沒有直接顯示會員個人的姓名、地址、身份證字號的地方。整個網頁裡面能拿到的資料跟從 API 能拿到的差不多,就是發票明細&歸戶的載具資訊。
以上方法只適用於查電子發票,不知道怎麼查那種很長一條的傳統紙本發票,所以不想消費資料被拿去分析的,就多多到只有傳統紙本發票的店去消費? 不過發票 APP 也都很聰明,會要使用者輸入備註、金額,那輸入的備註會不會給數據分析人員看到? 就不得而知了。

結論

申請 API 只是用來自動判斷電子發票有沒有符合抽獎資格? 看來應該有不少更有趣的應用呢。
例如我腦洞大開,做一個說輸入電子發票資訊可以推測今日運勢的,或是叫男女朋友兩個人都來輸入姓名、生日、拍一張臉的照片、手機條碼載具編號和密碼,然後診斷感情 match 程度的,這個診斷過程要跑三天三夜,需要留下手機或 email 等候通知,還可以留地址參加抽獎,這樣一整套下來,豈不是又來輕鬆收割一波個資?

發票明細只是消費資料而已,那行銷數據裡的年齡、消費者地址、性別是哪來的? 發票存摺的 app 裡面有輸入聯絡地址、性別、生日的欄位啊,真的有什麼隱私問題,還不就是使用者自己提供的嗎?
用發票APP會導致密碼外洩? 密碼不也是使用者自己心甘情願輸入的嗎?
消費地點是哪來的? 發票明細的資料有賣方營業人地址(sellerAddress)呀,雖然有時候企業登記的地址跟商店地址可能有點差異,或是有的地址是「桃園市中壢區中美路二段157號及中豐路225號」,或是有的時候地址是空值(例如主機商或是 Apple iCloud+ 的發票),這就屬於數據分析的偏差之一,不曉得統計時有沒有排除這些資料就是了。
消費商品類別是哪來的? 品名有滴雞精,這總該不會是寵物用品吧? 這應該算資料科學中的常講的資料前處理/資料清理,就雇個工讀生和實習生來弄就好了,剩下能用的,把規則理出來之後再用程式去分類或貼標就可以完成大半的工作。


(春樹科技是發票怪獸的開發公司)

回到最初那篇推特文章的問題點,這種民間公司的發票 APP 或是財政部的 API 功能可能有什麼問題?
1.使用者以為只是一個更方便的存發票、對獎的APP,沒仔細看條款、沒搞懂背後的軟體系統機制,結果把個人消費資料送給人家做 martech。
2.擔心民間發票 APP 公司內部監管不力,有人可以:
-輕易調閱會員資料
-根據會員資料,調閱所屬載具內的所有發票,進而知道特定某人哪一天、去哪邊、買了什麼東西
-依據載具號碼調閱該載具內的所有發票,進而知道特定某人哪一天、去哪邊、買了什麼東西
-檢視該人在發票上額外輸入的任何備註資料
-根據某商店開出的發票,反查出發票所屬會員的個人資料,及上傳的其他發票。
3.承上一點,當我的其他網路服務用的密碼,如果剛好跟電子發票載具密碼一樣(就是用來登入電子發票平台的密碼),理論上有人可以拿那組密碼來登入其他服務。
4.我把信用卡載具、一些網路購物的會員載具歸戶在手機條碼裡,這些也是可以透過 API 的「八、手機條碼歸戶載具查詢」查詢到的,我愛用的卡、網路購物會員都被看光光,再透過發票 APP 裡面的會員卡條碼、記帳等功能,就有機會貢獻更精準的行銷受眾輪廓,發票 APP 可能是世界上最了解我的人了。
5.發票資料配上手機 APP 要求的權限,還能組合出怎樣的有效行銷數據? 我沒在開發 APP,這部分就不清楚了。
6.有那套 API 使用權限的人,可能拿到別人的載具編號(應該有些人貼在手機背後,或是放在手機桌面吧?),再猜到密碼,然後就可以看到別人每天的發票,例如監視情侶、小孩等各種不當用途。

發票存摺 APP 免費給大家使用,
是方便使用者使用各種理財小幫手服務、更快秀出載具條碼、更方便對獎?
還是使用者被拿來作為公司行銷數據平台的人柱力?
這就是話術跟包裝方式不同而已。