營利事業統一編號怎麼會驗證錯誤!?

更新於 發佈於 閱讀時間約 5 分鐘

故事要從上禮拜說起。原本我們在趕一個重要專案,也因為這個專案讓我好幾個禮拜沒辦法抽空寫文章(抱怨一下),結果我接到一位同事的詢問。他說供應商使用我們的API時出現了統一編號驗證錯誤。


這位同事James,他一臉困惑地走進來,手裡拿著一疊文件。他說:「R,你能幫我看看這個嗎?我們的供應商在使用API時,系統一直顯示統一編號驗證錯誤。」我放下手中的工作,仔細查看問題。James接著說:「我們的有問題的系統是Laravel框架。

我查了幾遍程式碼,邏輯看起來沒問題啊,為什麼會驗證失敗?」一開始,我也感到一頭霧水。這個檢查程式我們已經用了很久,之前從來沒有出過這種問題。我決定跟James一起深入調查,找出問題的根源。


首先,我們重新跑過一遍相關的單元測試。然後,我們回顧了檢查邏輯,確定Git的主分支沒有相關的改動過。然而,所有的檢查都顯示程式碼應該是正確的,但為什麼會出現錯誤呢?

private function isValidChecksum(int $sum): bool
{
return ($sum - round($sum / 10) * 10) == 0;
}

我們把目光轉向了最近的公告。沒錯,就是那則財政部關於統一編號檢查程式邏輯更改的公告。新的規則要求統一編號從「可被10整除」改為「可被5整除」。我恍然大悟,這應該就是問題的癥結點!


「James,我們的檢查邏輯需要更新了!」我說。「根據財政部的公告,現在的統一編號檢查邏輯改成可被5整除,我們的程式還在用舊的檢查規則。」


我們馬上開始修改程式碼,將檢查邏輯從「可被10整除」改為「可被5整除」。更新後,並且把供應商提供的統一編號加入單元測試的檢查點,我們重新測試了系統,這次供應商的統一編號終於通過了驗證。

private function isValidChecksum(int $sum): bool
{
return ($sum - round($sum / 5) * 5) == 0;
}

這個小插曲提醒我們,即使是看似不起眼的規則變更,也會對系統造成重大影響。幸好我們及時發現並修正了錯誤,讓專案得以順利進行。在解開這個謎團後,我不禁感嘆,技術的世界總是充滿挑戰,但這正是讓我們成長和進步的動力。現在,我終於可以安心地繼續趕專案,期待下次再跟大家分享更多的故事。


後記:這次把驗證段特別提取出來,在單元測試的驗證上再補上不足的地方,以下為完整的程式碼。

<?php

class InvoiceValidator
{
/**
* 檢查發票號碼是否合法
*
* @param string $invoiceId 發票號碼
* @return bool
*/
public function chkInvoiceId(string $invoiceId): bool
{
$checkKey = [1, 2, 1, 2, 1, 2, 4, 1];
$isum = 0;

// 計算加權和
for ($i = 0; $i < 8; $i++) {
$currentDigit = (int)substr($invoiceId, $i, 1);
$product = $checkKey[$i] * $currentDigit;
$a = (int)substr($product, 0, 1);
$b = (int)substr($product, 1, 1) ?: 0;

if ($i == 6 && substr($invoiceId, -2, 1) == '7') {
$isum1 = $isum + 1;
$isum2 = $isum;
} else {
$isum += $a + $b;
}
}

// 處理發票號碼倒數第二位為7的情況
if (substr($invoiceId, -2, 1) == '7') {
$isum1 += $a + $b;
$isum2 += $a + $b;
return $this->isValidChecksum($isum1) || $this->isValidChecksum($isum2);
}

// 檢查加權和的驗證碼
return $this->isValidChecksum($isum);
}

/**
* 檢查加權和的驗證碼
*
* @param int $sum 加權和
* @return bool
*/
private function isValidChecksum(int $sum): bool
{
return ($sum - round($sum / 5) * 5) == 0;
}
}


參考來源:

(營利事業統一編號檢查碼邏輯修正說明) https://www.fia.gov.tw/singlehtml/3?cntId=c4d9cff38c8642ef8872774ee9987283

這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
討論系統架構時,我們常忽略低流量時期的準備,但真正的挑戰在於怎樣在突發高流量時保持穩定。我們深入探討了如何透過水平擴展、負載均衡、快取策略等多維度規劃,來強化系統對高流量的承受力,確保系統的靈活擴展與高可用性。
在連假期間,我探索了「知識詛咒」這個話題,揭露了專家在分享知識時常見的盲點。提出了三大觀點來應對:情境導入,讓知識有著落;探討不同情境下可能的結果,展現靈活思考;並且至少提供兩種例證,增強說服力。這篇分享不僅是自我反思的成果,也希望能給大家在溝通和知識分享上一些新的啟示。
放鬆的週末,我與幾位同事決定提升我們的後端開發技巧,選擇了「日期範圍生成器」作為我們的小型實作。作為團隊中較有經驗的PHP工程師,我引領著團隊從基礎程式碼的撰寫開始,進而深入到物件導向的結構調整,最後提高程式可擴充性的挑戰。雖然過程中遇到不少困難,但我們通過不斷的討論和優化,最終成功克服了所有挑戰。
在程式世界裡,if 條件句是我們的好朋友,幫我們做各種決策。如果不注意可能會讓我們掉進小陷阱。文中透過幾個例子,在使用 if 時可能會遇到的一些常見問題,像是不必要的 if、過於複雜的條件、忘了用嚴格比較,還有嵌套太深的 if。透過這篇文章,你將學到如何避免這些小錯誤,寫出更乾淨、更有效率的程式碼。
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
討論系統架構時,我們常忽略低流量時期的準備,但真正的挑戰在於怎樣在突發高流量時保持穩定。我們深入探討了如何透過水平擴展、負載均衡、快取策略等多維度規劃,來強化系統對高流量的承受力,確保系統的靈活擴展與高可用性。
在連假期間,我探索了「知識詛咒」這個話題,揭露了專家在分享知識時常見的盲點。提出了三大觀點來應對:情境導入,讓知識有著落;探討不同情境下可能的結果,展現靈活思考;並且至少提供兩種例證,增強說服力。這篇分享不僅是自我反思的成果,也希望能給大家在溝通和知識分享上一些新的啟示。
放鬆的週末,我與幾位同事決定提升我們的後端開發技巧,選擇了「日期範圍生成器」作為我們的小型實作。作為團隊中較有經驗的PHP工程師,我引領著團隊從基礎程式碼的撰寫開始,進而深入到物件導向的結構調整,最後提高程式可擴充性的挑戰。雖然過程中遇到不少困難,但我們通過不斷的討論和優化,最終成功克服了所有挑戰。
在程式世界裡,if 條件句是我們的好朋友,幫我們做各種決策。如果不注意可能會讓我們掉進小陷阱。文中透過幾個例子,在使用 if 時可能會遇到的一些常見問題,像是不必要的 if、過於複雜的條件、忘了用嚴格比較,還有嵌套太深的 if。透過這篇文章,你將學到如何避免這些小錯誤,寫出更乾淨、更有效率的程式碼。
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
1.國稅局問題: 創業初期不賺錢被質疑開人頭公司 網站有刷卡功能被誤認為有實體門市 公司投資獲利被要求新增營業項目 2.政府單位的挑戰: 經發局質疑沒有店面如何零售 勞保局對登記地址和實際辦公地點不同提出疑問 3.通路問題: 通路商態度難捉摸 一些通路堅持只賣有名商品 要求價格一致而被通路認為搞怪
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
我接到財務部門的電話,某項費用的預估與實際支出對不上,而且落差頗大。 怎麼會?我心裡很驚訝,那個項目事關重大,離手之前,還經過再三檢查。 懷抱著不祥預感,把申請單找出來一看,天啊,我是豬嗎?真是羞愧得想一頭撞死,居然沒注意到單位的欄目錯誤,才硬生生搞出這麼大的落差。
Thumbnail
一、112年稅務行業標準分類代號有修正,若是一對一的變更,只要改成新的代號申報即可,若是一對多的變更,例如:舊代號4871-13經營網路購物,折成4871-14經營網路購物-食品、飲料類及4871-15經營網路購物-服飾類商品及4871-99其他電子購物及郵購,就要手動去修正。 二、6811-12
Thumbnail
在專案中與廠商測試API回傳的json字串出現無法解析的狀況,記錄發現過程與解決的紀錄,提供程式面和檔案面的解決方法。
Thumbnail
辦理銀行開戶作業時,發現公司章程與變更登記表上記載的修訂日期不一樣?! 原來是公司章程版本錯誤,但最新版已經找不到,準備下載申請表重新申請一份時, 發現公司登記表、公司章程可以線上申請囉!!
Thumbnail
在API介接中使用x-www-form-urlencoded格式時,可能會遇到一些踩坑的情況,本文分享了作者在這方面遇到的問題和解決方法。
服務建議書的格式和排版瑕疵, 在評審委員觀點或許不是重大缺失, 但在非專業人士的觀感上, 卻容易變成嚴重的放大缺失   服務建議書雖然不是正式報告或出版品, 仍需接受評審委員審視, 除了盡量避免低級錯誤外, 在排版上,也應追求整齊及美觀   為何會有低級錯誤及排版缺陷?  
Thumbnail
連續兩周,同一個工程案被查核,一次是市府工程施工查核小組,一次是申請補助的客家委員會。先不論為何同一案可以在當月密集的實施查核,而是僅僅相差8天進度的工程,市府查核結果為0扣點、83分甲等;而客委會查核結果竟被扣6點(監造3點、承商3點,監造1點500元、承商1點2000元,合計7500元)
Thumbnail
金融業需遵守金檢規則,建立API分級協助和管理程序確保API合規,使用OAuth 2.0和API KEY授權功能降低風險,實行API認證和金鑰機制保障資料安全。監控API使用,建立控制機制,選擇優良的APIM,提供全面的API管理和安全。
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
1.國稅局問題: 創業初期不賺錢被質疑開人頭公司 網站有刷卡功能被誤認為有實體門市 公司投資獲利被要求新增營業項目 2.政府單位的挑戰: 經發局質疑沒有店面如何零售 勞保局對登記地址和實際辦公地點不同提出疑問 3.通路問題: 通路商態度難捉摸 一些通路堅持只賣有名商品 要求價格一致而被通路認為搞怪
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
我接到財務部門的電話,某項費用的預估與實際支出對不上,而且落差頗大。 怎麼會?我心裡很驚訝,那個項目事關重大,離手之前,還經過再三檢查。 懷抱著不祥預感,把申請單找出來一看,天啊,我是豬嗎?真是羞愧得想一頭撞死,居然沒注意到單位的欄目錯誤,才硬生生搞出這麼大的落差。
Thumbnail
一、112年稅務行業標準分類代號有修正,若是一對一的變更,只要改成新的代號申報即可,若是一對多的變更,例如:舊代號4871-13經營網路購物,折成4871-14經營網路購物-食品、飲料類及4871-15經營網路購物-服飾類商品及4871-99其他電子購物及郵購,就要手動去修正。 二、6811-12
Thumbnail
在專案中與廠商測試API回傳的json字串出現無法解析的狀況,記錄發現過程與解決的紀錄,提供程式面和檔案面的解決方法。
Thumbnail
辦理銀行開戶作業時,發現公司章程與變更登記表上記載的修訂日期不一樣?! 原來是公司章程版本錯誤,但最新版已經找不到,準備下載申請表重新申請一份時, 發現公司登記表、公司章程可以線上申請囉!!
Thumbnail
在API介接中使用x-www-form-urlencoded格式時,可能會遇到一些踩坑的情況,本文分享了作者在這方面遇到的問題和解決方法。
服務建議書的格式和排版瑕疵, 在評審委員觀點或許不是重大缺失, 但在非專業人士的觀感上, 卻容易變成嚴重的放大缺失   服務建議書雖然不是正式報告或出版品, 仍需接受評審委員審視, 除了盡量避免低級錯誤外, 在排版上,也應追求整齊及美觀   為何會有低級錯誤及排版缺陷?  
Thumbnail
連續兩周,同一個工程案被查核,一次是市府工程施工查核小組,一次是申請補助的客家委員會。先不論為何同一案可以在當月密集的實施查核,而是僅僅相差8天進度的工程,市府查核結果為0扣點、83分甲等;而客委會查核結果竟被扣6點(監造3點、承商3點,監造1點500元、承商1點2000元,合計7500元)
Thumbnail
金融業需遵守金檢規則,建立API分級協助和管理程序確保API合規,使用OAuth 2.0和API KEY授權功能降低風險,實行API認證和金鑰機制保障資料安全。監控API使用,建立控制機制,選擇優良的APIM,提供全面的API管理和安全。