台北的工程師怡君在員工領禮通知排程前,收到今天必須換發 LINE Channel Secret 的維運單。人資希望中午照常開放領取,她卻得先決定:換發後尚未驗證的請求,能不能進入派禮流程?她把下游派送停在審批佇列,要求新密鑰驗簽與既有紀錄對帳都通過,才重新放行。

這份操作方法要解決的,是更換驗證設定時仍保留同一筆業務決定。LINE 訊息、已驗證事件、員工領禮資格與實際禮品訂單是不同紀錄。收到兩次相同事件不應多送一份禮;驗簽失敗的內容,也不能因為看起來像熟悉員工就成為可信的重播資料。
先確認換發規則,不借用別的平台時間窗
LINE 官方驗簽說明要求以未變更的請求內容檢查簽章,並說明換發 Channel Secret 後,原密鑰會失效。這是維運順序的重要限制。不要套用其他服務可同時保留兩把有效密鑰的操作習慣,也不要自行在應用程式保留舊密鑰,宣稱那就是官方允許的過渡期。
先在變更單寫清楚實際頻道、正式或測試環境、端點與設定版本。公司可能有多個官方帳號,各自服務員工、客戶或活動。名稱相近不代表同一頻道,測試成功也不代表正式環境已正確更新。紀錄可使用不含機密的版本代號,真正的密鑰只放在核准的機密管理位置,避免出現在截圖、聊天訊息或交接表。
怡君的第一項決策不是按下換發,而是確認誰能換發、誰能更新執行環境,以及誰有權重開派禮。技術人員負責驗簽,人資負責領取資格與預算,出貨窗口負責對帳已送出的指令。若同一人兼任多項工作,仍應保留各自的判斷紀錄,不能用一次部署成功替代全部審批。
若變更原因是疑似外洩,應依公司的事件處理程序決定隔離及停用。不要為了通知準時寄出,就繼續信任可能已外洩的資料。若只是例行換發,也必須事先測試停止下游、更新設定、驗證新請求與恢復處理的路徑。本文的流程建議需要由實際系統負責人落實,並不是 LINE 自動提供的禮品審批功能。
先驗簽,再把可信事件接到自己的審批表
接收端應先取得原始請求內容與簽章標頭,完成驗簽後才處理事件物件。不要先把 JSON 讀進物件、排序欄位或調整跳脫字元,再重組一份字串送去驗證。可見內容相同,不代表位元組相同。若中介軟體改動內容,應修正接收路徑,而不是略過驗簽讓測試變綠。
內部可以分成四層:接收嘗試、已驗證事件、業務審批、派禮指令。接收嘗試記錄驗證是否成功;已驗證事件保留來源身分;業務審批記錄員工、活動、資格期間與當前決定;派禮指令則綁定那筆核准的領取機會。實際供應商或配送端的結果,再另外對回原指令,不能把 HTTP 成功當成已寄出。
LINE 接收與重送文件指出,可用 webhookEventId 辨識重複事件;啟用重送與實際條件也有自己的設定及限制。這個事件識別碼有助於避免同一來源事件被重複受理,卻不會替公司決定「同一個人能領幾次」。因此還需要一把內部審批鍵,描述真正獲准的活動與資格範圍。
例如,人資核准的是某位員工在本次入職活動的一次領取資格,就應以公司、活動、員工的穩定內部識別及資格期間建立業務範圍。不要只用顯示名稱或手機號碼判斷,也不要把同一員工一輩子所有活動都壓成一筆。活動改期、不同獎勵與補寄,可能有不同授權,必須由業務規則說明。
| 紀錄層次 | 要回答的問題 | 應保存的證據 |
|---|---|---|
| 接收嘗試 | 這次請求是否通過目前驗簽? | 時間、設定版本、結果 |
| 來源事件 | 是否已受理同一個事件? | 可信的事件識別與處理狀態 |
| 領禮審批 | 這個活動機會是否仍獲准? | 審批鍵、規則版本、決定 |
| 派禮指令 | 同一機會是否已進入履約? | 唯一指令、外部參考與結果 |
這些紀錄可互相引用,但不要互相覆寫。驗簽失敗不等於員工沒有資格,已驗簽也不等於人資已批准。資料不足時保留明確的待確認狀態,比把每筆失敗都改成成功更容易復原。例行交接只需不含機密的識別與結果;若調查必須暫存原始內容,應有受限存取與保存期限,不要複製整份員工資料到公開問題單。
演算一:換發前後的四十八次接收,應留下幾筆指令?
怡君先做一組明示假設的演練:共四十八次 HTTP 接收,其中三十六次是不同事件的有效首次送達,八次是其中部分事件的有效重複送達,四次故意使用錯誤簽章。三十六個可信事件中,二十七個對應目前核准的領取機會,九個仍缺人資確認。這些數字是測試資料,不是實際企業成效。
第一步先看接收層。四十四次驗簽成功的接收,對應三十六個不同來源事件;另外四次驗簽失敗,不應進入可信事件佇列。可留下受限的錯誤診斷,但不能將那些內容改標為「待重送」後直接派禮。否則驗簽失敗反而成了繞過驗簽的入口,整個換發程序就失去意義。
第二步看業務層。二十七個已核准機會應產生二十七筆唯一派禮指令,九個保留待確認。八次有效重複送達只補上接收證據,不增加指令。這裡的四十八、四十四、三十六、二十七與九,分別代表嘗試、驗證成功嘗試、不同事件、核准指令及業務待確認,不能加在一起當作「總共處理了多少份禮」。
第三步驗證換發邊界。先把下游派送停住,確認接收與審批狀態已保存,再由授權人完成實際換發與執行環境更新。用目前有效設定產生的受控測試請求驗證新路徑,並確認錯誤簽章仍被拒絕。舊密鑰失效後,不能為了讓舊測試樣本成功,就自行恢復對舊密鑰的信任。
若某筆原始請求在換發前已通過驗簽並可靠保存,後續內部續作可引用那筆已受理紀錄。若它從未通過驗簽,就沒有同等的可信地位。維運人員不能因為知道事件內容或員工姓名,就手動把它放進正式派送佇列。需要補救時,應取得可驗證的來源與新的明確業務授權,保留兩者的不同身分。
第四步觀察履約。假設二十七筆指令中,二十六筆已取得確定外部結果,另一筆在呼叫後逾時。此時是二十六筆已確認、一筆結果未知,仍只有二十七筆指令。不能再建立第二十八筆來「補送」。先以原指令的外部參考查核,若找到已成立的訂單,就對回原紀錄;若證明未成立且允許重試,也應沿用原指令的受控處理流程。
如果外部系統沒有足夠的查詢或防重保證,應把這一筆留在結果未知,由指定窗口追查。其他證據完整的指令可依規則繼續,不必把整個活動永久卡住。恢復速度不是用猜測換來的;清楚區分已完成與待查,才能避免員工收到兩份禮,或人資誤以為所有人都已寄出。
演算二:高雄同仁的兩次操作,是否代表兩次領取?
第二組情境換到高雄。員工承翰點擊領取後沒有看到預期畫面,又操作了一次。系統收到兩個不同但有效的來源事件,兩者都能對到同一個活動與同一筆核准資格。來源事件去重不會把它們合併,因為它們確實有不同識別;防止重複派禮的責任,落在業務審批鍵。
假設這次演練只有兩個可信事件、一筆核准資格。第一個工作程序嘗試建立指令,第二個幾乎同時抵達。若程式只是先查詢「沒有指令」,再各自新增,兩邊都可能在對方寫入前查到空白。因此應用實際資料庫的交易或等效原子控制,讓相同審批鍵只能有一筆有效指令,並測試競爭時的結果。
驗收預期是兩個來源事件均可追溯,一筆審批、一筆指令、一個已確認的履約結果。後到的程序應找到既有指令,回到已處理或待查狀態,而不是重新扣預算。不要刪掉第二個事件來讓報表看起來整齊;保留它與同一審批的關係,才說得清楚為何使用者操作兩次,卻只領一次。
接著改一個條件:承翰另有不同活動的正式核准資格。若公司規則允許,那可能是第二筆合法領取,不應被「相同員工只能一次」的粗糙鍵值擋住。測試要同時證明重複機會被攔下、真正不同的授權沒有被誤刪。鍵值範圍是業務決策,不是工程師為了省欄位任意選的字串。
再測試資格撤回。若第二個事件較晚抵達時,人資已取消尚未履約的資格,驗簽成功仍不會重新批准它。程序應讀取目前的權威審批狀態,依既有取消或人工確認規則處理。已寄出的禮品不能靠修改事件狀態假裝收回;補寄、退回或替代品也應另有清楚授權及對帳。
這個案例要驗證的是換發後的接收仍遵守原本決定,不是重新設計所有活動資格。若需要理解來源事件如何與業務批准分開,可參考相鄰的續約事件與企業贈禮流程。該文以另一種來源事件說明審批邏輯,實作時仍須使用本頻道的 LINE 驗簽及重送規則。
把失敗路徑寫成下一個人能接手的工作
驗簽失敗時,先檢查頻道、環境、密鑰版本與原始請求是否被改動。不要把所有錯誤都歸因於 LINE 延遲,也不要臨時關掉驗簽。若更新漏了一台執行個體,應修復部署一致性,並確認所有會接收流量的個體都在正確版本。只有單台測試通過,不能證明整條正式路徑已恢復。
若資料庫在可靠保存之前失敗,不能宣稱已受理。依實際接收契約及已測試的錯誤回應處理,讓維運看到真正的狀態。若可信事件已保存、只是業務審批尚未完成,則保留待處理狀態並續作,不要清空紀錄要求來源重新送一次。兩個失敗點需要不同補救,混成一個「重新執行」按鈕會掩蓋責任。
LINE 的重送功能必須確認實際是否啟用;官方文件也提醒重送次數與間隔未公開,送達並非保證。因此不要對人資承諾「系統一定會自動補回每一筆」,也不要靠固定等待幾分鐘推論所有事件已到齊。應用目前來源紀錄、內部受理表與活動核准名單做差異核對,將缺口逐筆標明。
手動補作應有明確邊界。操作介面可以要求選取既有可信事件、原審批與補作原因,並沿用同一防重控制;不應允許貼入任意 JSON 就變成正式來源。能查看錯誤的人不必同時擁有換發密鑰、修改預算及放行訂單的權限。這些是公司應設計的控制,不可寫成驗簽函式庫已替公司完成。
回復舊程式也要重新驗證。舊版可能只知道已失效的密鑰,回滾部署不等於恢復可信接收。若回滾會移除新設定,就應先維持受影響路徑的派送暫停,直到修正版或可用版本通過驗證。交接單要寫出哪個設定仍有效、哪筆操作尚未完成,不能只留一句「已回復」就結案。
用驗收表證明守住了什麼
怡君交付的驗收資料應包含實際頻道與環境的非機密識別、設定版本、換發與部署時間、測試樣本參考、各層計數及未知結果的負責人。預期值只是事先定義的標準,執行後必須填入觀察結果。若兩者不同,先記錄差異,再決定修復,不要把預期數字複製成執行證據。
| 驗收問題 | 第一組演練的預期 | 未通過時的下一步 |
|---|---|---|
| 新設定是否接受目前有效請求? | 有效樣本通過且保存 | 修復受影響接收路徑 |
| 錯誤簽章是否仍被拒絕? | 四次不進可信佇列 | 維持派送暫停並調查 |
| 重複送達是否增加指令? | 八次重複不增加 | 查核事件與業務雙層防重 |
| 審批是否保留原決定? | 二十七核准、九待確認 | 逐筆核對規則及資格 |
| 外部逾時是否被誤當失敗? | 一筆未知,沒有補建訂單 | 先查原外部結果 |
| 不同活動是否仍可合法領取? | 依各自授權獨立判斷 | 修正過度寬泛的鍵值 |
另一位未參與撰寫程式的同事,應檢查實際版本與測試結果。除了看新密鑰能通過,也要看錯誤樣本確實失敗、兩個同時程序只建立一筆,以及結果未知的外部指令沒有被盲目重送。若審查者只能看到一張綠燈截圖,就還無法確認這些不同風險已處理。
告警也應分層:驗簽錯誤增加、受理保存失敗、業務待確認累積,以及外部結果未知,分別需要不同窗口。不要把人資尚未批准當成接收故障,也不要把所有有效接收都標成禮品已送達。報表保留各層數字,才能在活動結束後說明真正完成多少、仍欠哪些證據。
驗收可以證明測過的情境,不能推論所有外部系統都有恰好一次的履約保證。內部唯一指令是一道控制,實際供應商的重試與查詢能力是另一道。若外部能力未確認,應把限制寫清楚,並選擇可人工對帳的程序,而不是對使用者承諾不可能出錯。
交班演練:把「已收到」拆成可確認的狀態
正式換發前,可以讓值班同事接手一次沒有口頭提示的演練。給他變更單、受理表、審批表與外部結果索引,請他回答哪一筆能繼續、哪一筆必須等待,以及下一個動作會改變哪個系統。若只有原作者知道怎麼處理,程序還不足以支援實際交班。交接文件應讓接手者沿著同一識別查到同一個決定,而不是另做一張名單。
先放入一個沒有可信簽章、卻帶有真實員工識別的樣本。預期接手者只能把它列入受限調查,不能因為名單對得上就批准。再放入一個可信事件但沒有有效活動審批的樣本,預期它進入業務待確認,不會跳過預算及資格。最後放入一個已有外部訂單、但內部回應遺失的樣本,要求他先查原外部結果,不能重新建立指令。
這三個樣本分別測試來源可信度、業務授權與外部結果,每個都可能讓使用者看到相似的「尚未完成」畫面。客服需要不同的回應措辭。對來源調查,不應透露驗簽細節或密鑰;對資格待確認,可說明由活動窗口處理;對外部結果待查,則保留原案件編號與預計更新方式。避免用一句「請再點一次」讓使用者製造更多事件。
內部狀態名稱也要固定。可以定義已驗證待評估、業務暫停、已建立指令、外部結果未知與已確認等狀態,並明確列出允許的轉移。名稱不是重點,重點是不能讓結果未知直接轉成新指令,也不能讓未驗證直接轉成已批准。若操作人需要例外,必須有實際授權與可追溯原因,而不是直接修改資料庫抹掉原始失敗。
對同時處理的測試,應讓兩個工作程序在接近的時間對同一審批鍵動作,檢查最後確實只有一筆指令。除了數量,還要查後到程序是否正確回讀既有狀態。若資料庫擋住重複新增,但應用程式將錯誤當成整筆失敗,客服可能仍被引導去補送。防重控制需要連接到可理解的操作結果,才能避免人在系統外再建立第二筆。
對取消與補寄,則準備另一組獨立授權。假設員工的原禮品確定遺失,活動窗口批准補寄;這不是重播舊事件就能成立的新需求。補寄應有自己的批准參考,並連回原指令與事故紀錄。如此既能避免重複領取,也不會因為「同一員工已領過」而阻止真正獲准的補救。審批鍵應反映政策,不能把所有例外都塞進同一個重試欄位。
留下足夠的證據,同時縮小資料暴露
驗收報告可以使用經過遮蔽的員工內部參考、事件參考與指令參考,讓審查者在有權限的系統內查核。不要為了讓報告看起來完整,就把姓名、地址、電話、訊息全文與密鑰一起複製到附件。每一項資料都應能回答具體問題;如果只需要證明同一審批未重複建立指令,就不必展示完整收件資訊。
錯誤紀錄應區分安全診斷與業務追蹤。前者可能需要短期保存請求特徵以找出驗簽問題,後者只需要穩定參考及處理狀態。兩者的可見對象與保存期限可以不同,應由公司既有政策決定。當調查結束,移除不再需要的原始資料,同時保留足以說明決定的最小稽核線索,避免每次換發都永久增加一批敏感副本。
記錄時間時,應標示時區與實際觀察點。換發按鈕的時間、執行環境更新時間、第一個新設定驗簽成功的時間,以及恢復派送的時間,可能並不相同。只寫「上午完成」無法判斷某個請求在哪一個設定下被受理。若系統時鐘不一致,先查核時間來源,不要用錯誤的先後關係判定某筆請求可信或不可信。
活動窗口的驗收也需要自己的證據。請人資確認二十七筆核准機會仍是目前名單,九筆待確認沒有被默默刪除,且未知外部結果有明確負責人。工程測試通過不會自動修正名單錯誤;人資核對完成也不能替代驗簽。兩個窗口各自簽認實際看過的範圍,才是可追溯的分工,而不是所有人對同一張總表按同意。
最後,保存一次失敗後如何恢復的紀錄。例如修正中介軟體後,使用目前有效樣本重新驗證,確認原始內容不再被改寫,再以既有可信事件續作內部工作。報告要連到修正版本與測試結果,說明哪些舊紀錄被續作、哪些未驗證內容仍未受理。這讓下一次換發可以沿用經過證明的路徑,而不用重猜前次究竟怎麼恢復。
明確定義停止與恢復的範圍
停止派送不等於停止所有接收,也不等於刪除佇列。系統設計若允許安全地保存已驗證事件,就可保留受理,再把有疑問的業務動作暫停。若連驗簽或可靠保存都無法確認,則應依真正的錯誤契約回應,不能假裝已接受。這個界線應在演練前說清楚,避免值班者以為「暫停」就是把所有資料清空。
恢復時也不要一次放開全部歷史資料。先確認目前設定與少量已核准、結果明確的指令,再核對待處理數量是否符合預期。每筆未知結果維持原狀,不因其他測試成功而自動變成可重送。若恢復過程出現新增差異,記錄確切指令與設定版本,暫停受影響範圍並追查。這樣既能保留活動連續性,也不會把一個局部問題擴大成整批重複派禮。
把換發窗口收好,再恢復領禮通知
通知重新開放之前,怡君與人資一起確認三件事:新設定已在實際接收路徑驗證、既有審批沒有因重播改變、未知的履約結果已另列追查。若只有一筆仍待查,就保留那筆明確的暫停原因及負責人;其他已核准且沒有不確定性的工作,依公司規則繼續,不必用全面停擺掩飾單筆缺口。
收尾時整理仍有效的設定參考,依公司的機密管理流程移除不再使用的引用,並保留不含機密的變更證據。不要將密鑰內容當成檔案附件保存。觀察期間依實際活動與來源重送狀況安排,交班者要看得到尚未完成的查核、下一個可重試條件,以及哪個人有權重開受影響的指令。
交班時應指定一位恢復負責人,依已保存的驗收結果決定何時重開受影響指令,並通知人資實際可領取範圍。若負責人不在,沿用既有代理安排,不以聊天中的模糊同意代替正式放行。
這也解決了開場的選擇:中午準時開放不是唯一驗收標準。若驗簽與審批證據完整,怡君能有依據地恢復通知;若仍有不可信請求,就保留受影響路徑的暫停,而不把它轉成一筆新的禮品支出。一次換發不應改寫一次領取資格,兩次通知也不應自動代表兩份禮。
帶著核准的活動需求與 Giftpack 討論履約
內部審批與指令對帳清楚後,活動窗口可以整理受眾、國家、預算、時程、品項限制與審核人,再討論實際選品及履約安排。Giftpack 的企業贈禮說明介紹活動輸入與選擇、人工檢視等方式;客製生產、庫存與配送仍需依方案確認,不能由 webhook 的回應速度推論到貨承諾。
給合作窗口的資料應是穩定、已批准且可追溯的需求,不含 Channel Secret,也不假設存在未核實的原生串接。怡君把驗簽留在接收端,把資格留在人資審批,把外部結果留在履約對帳,讓 Giftpack 的討論聚焦在適合受贈者的方案。這樣恢復的,是有證據支持的活動,而不是一串看似成功卻可能重複花費的通知。

