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

更新於 發佈於 閱讀時間約 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

留言
avatar-img
留言分享你的想法!
avatar-img
詹姆士的軟體易開罐
27會員
87內容數
這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
2025/01/14
「如果資料庫出問題,能不能快速恢復?」 這或許是許多工程師在面對資料庫維運時心中的疑問。就我而言,遇到伺服器故障或有人誤刪資料表時,最慶幸的就是事先做好備份。這次要分享的是 MySQL 中常用的備份指令 mysqldump,讓大家能在需要時把握關鍵的「救命繩」。 為什麼需要備份? 在商業專案
Thumbnail
2025/01/14
「如果資料庫出問題,能不能快速恢復?」 這或許是許多工程師在面對資料庫維運時心中的疑問。就我而言,遇到伺服器故障或有人誤刪資料表時,最慶幸的就是事先做好備份。這次要分享的是 MySQL 中常用的備份指令 mysqldump,讓大家能在需要時把握關鍵的「救命繩」。 為什麼需要備份? 在商業專案
Thumbnail
2024/08/25
這篇文章反映了平台改版後使用者面臨的多項問題,包括文章編輯功能異常、分類顯示異常及最新內容資料呈現問題。本人從個人經驗出發,詳細描述了這些問題的具體情況,期望官方重視使用者反饋,以改善平台使用體驗。
2024/08/25
這篇文章反映了平台改版後使用者面臨的多項問題,包括文章編輯功能異常、分類顯示異常及最新內容資料呈現問題。本人從個人經驗出發,詳細描述了這些問題的具體情況,期望官方重視使用者反饋,以改善平台使用體驗。
2024/07/20
2024年7月19日…,一場前所未有的全球性大事件悄然降臨。這次事件波及了機場、車站,以及無數依賴關鍵系統的商店與公司。聽起來像是科幻小說中的場景,然而,這真真切切地發生在昨天。世界各地的運營陷入混亂,人們的生活被突如其來的技術故障打亂。 這一切都要從一間公司開始說起——CrowdStrike
Thumbnail
2024/07/20
2024年7月19日…,一場前所未有的全球性大事件悄然降臨。這次事件波及了機場、車站,以及無數依賴關鍵系統的商店與公司。聽起來像是科幻小說中的場景,然而,這真真切切地發生在昨天。世界各地的運營陷入混亂,人們的生活被突如其來的技術故障打亂。 這一切都要從一間公司開始說起——CrowdStrike
Thumbnail
看更多
你可能也想看
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
想發簡訊給自己經營的電商會員時,可以直接用大量簡訊平台一次發送。 但目前因為詐騙簡訊"盛行"的關係,申請這類平台的規則也變嚴格了,連自己的個資也要上繳給這些平台做身份驗證,所以還是找一些安全、有信譽的廠商,免得把自己的個資賣掉外,自己會員的個資也賣了。
Thumbnail
想發簡訊給自己經營的電商會員時,可以直接用大量簡訊平台一次發送。 但目前因為詐騙簡訊"盛行"的關係,申請這類平台的規則也變嚴格了,連自己的個資也要上繳給這些平台做身份驗證,所以還是找一些安全、有信譽的廠商,免得把自己的個資賣掉外,自己會員的個資也賣了。
Thumbnail
本文介紹如何對 Telegram 憑證監控機器人的代碼進行優化,包括新增指令、讀取變數、提高可讀性和可維護性。
Thumbnail
本文介紹如何對 Telegram 憑證監控機器人的代碼進行優化,包括新增指令、讀取變數、提高可讀性和可維護性。
Thumbnail
為什麼供應商在使用我們的API時,統一編號驗證會出錯?這個看似簡單的錯誤,竟然牽涉到財政部的新規則。我們如何發現並解決這個問題?新的檢查邏輯是如何影響我們的系統?本文將揭示背後的原因和解決過程。
Thumbnail
為什麼供應商在使用我們的API時,統一編號驗證會出錯?這個看似簡單的錯誤,竟然牽涉到財政部的新規則。我們如何發現並解決這個問題?新的檢查邏輯是如何影響我們的系統?本文將揭示背後的原因和解決過程。
Thumbnail
【駭入別人銷售漏斗,模仿驗證有效流程】
Thumbnail
【駭入別人銷售漏斗,模仿驗證有效流程】
Thumbnail
這篇文章探討了在軟體開發中的技術債可能來自哪些原因,以及如何自動化偵測與修復技術債。作者透過分享不同情境下的技術債選擇,提供了對於技術債的思考與建議,針對開發人員在需要做出無奈的技術決策時,提供了一些建議。此外,還提供了一些在做出技術決策時的方法,如保留抽象層和避免vendor lock-in。
Thumbnail
這篇文章探討了在軟體開發中的技術債可能來自哪些原因,以及如何自動化偵測與修復技術債。作者透過分享不同情境下的技術債選擇,提供了對於技術債的思考與建議,針對開發人員在需要做出無奈的技術決策時,提供了一些建議。此外,還提供了一些在做出技術決策時的方法,如保留抽象層和避免vendor lock-in。
Thumbnail
每日自動檢查資料庫運作所產生的訊息,若發現有錯誤,自動寄出警告信給擔當人員
Thumbnail
每日自動檢查資料庫運作所產生的訊息,若發現有錯誤,自動寄出警告信給擔當人員
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News