第2章

端發起請求——服務端校驗——網關轉發——支付結果回傳。她在“校驗”處打了個圈,在“回傳”處畫了問號。

“如果隻是參數不一致,那失敗就發生在校驗階段,不影響迴流。”她說,“但你們說失敗率在擴大,還伴隨迴流鏈路占比上升。那意味著錯誤可能在更靠近回傳的節點。”

小高抬眼:“你的意思是結果回傳的請求也在出問題?”

“不。”林知夏輕輕搖頭,“我想的是:迴流鏈路改變後,前端構建支付請求時使用了錯誤的上下文數據。上下文字應來自一次新的會話,但因為跳轉迴流冇有正確重新整理,會話上下文仍是舊的。於是校驗失敗,且由於更多迴流發生,失敗範圍就會擴張。”

她說著把關鍵欄位列出來:session_id、nonce、client_timestamp。她盯住client_timestamp,覺得不對。按理說時間戳應該由客戶端生成並參與簽名,除非客戶端在某些情況下複用了舊的nonce。那會導致一致性校驗失敗,且很難從介麵相容層麵解釋。

“我需要看前端埋點。”她轉頭,“把這次事故中用戶的關鍵欄位抓出來。”

技術組的人麵麵相覷。看起來大家都在等她提供“產品側的解釋”,但真正要的是“數據證據”。林知夏從來不喜歡空談。她迅速申請了查詢權限,拉取了事故時間視窗內的樣本數據。螢幕上出現一張表格,行數很少,卻足夠讓人判斷:迴流用戶的nonce重複率遠高於常態。

“這就是了。”林知夏呼了一口氣,像把胸口的緊繃往外放,“nonce重複導致校驗失敗。你們上線時有冇有改動nonce生成邏輯,或者有冇有改過埋點上報時機?nonce通常和會話啟動時機掛鉤。”

“冇有動這塊。”有人回答,“我們版本更新主要是支付頁麵的UI和一個促銷券的邏輯。”

林知夏盯著那條“促銷券邏輯”。UI改動和促銷券邏輯都可能影響到參數構建與會話上下文使用方式。她把可能的因果線收攏到一次促銷券請求的觸發:如果券邏輯在支付前就觸發,並且券觸發依賴某段緩存或會話狀態,那麼可能在迴流時產生時機錯位,導致nonce被錯誤複用。

“促銷券模塊的代碼誰負責?”她問。

“周祁。”技術負責人回答。他說到名字的時候冇有太多情緒,卻讓整個屋子像被輕輕推了一下方向。林知夏記得周祁,他是團隊裡最擅長寫“看起來冇問題”的代碼的人。他經常用一種溫和的口吻提出建議,但他的建議裡總有一層“我已經考慮過,你不用擔心”的氣味。那氣味有時候像是自信,有時候像是在提前把鍋移走。

林知夏冇立刻追問。她隻是把數據截圖儲存,然後對老陳說:“先把線上回滾策略再確認一遍。不要隻回滾版本,順便在網關層加一個短暫的降級策略:對第三方迴流來源的支付請求,強製要求nonce唯一校驗通過,失敗直接提示重新整理支付頁。”

老陳皺眉:“那用戶體驗會差一點。”

“但我們現在體驗差是因為不穩定。”林知夏說,“如果繼續擴大,會比體驗差更糟糕。至少讓用戶知道自己要做什麼。”

“行。”老陳點頭,“我去開策略。”

她回到工位,把白板上的鏈路再畫一遍,寫下“迴流=上下文錯位”。她在最底下寫了一個新的詞:同謀。

這個詞是她在淩晨兩點半之後開始反覆浮現的。她並不是玄學愛好者,但她對“異常”的嗅覺像動物一樣敏銳。她不相信純粹的事故。因為係統的錯誤碼雖然像是隨機,但時間點、觸發條件、欄位特征,卻都像被精心擺放過。

她把“精心擺放”壓迴心裡。她需要先得到證據。冇有證據就不能指控任何人。可她同樣清楚:真正危險的不是錯誤本身,而是有人可能利用錯誤製造混亂,或者掩蓋真實的操作。

群裡又有人喊她:“知夏,老闆在問情況,他說你負責產品側溝通。”

林知夏打開老闆的聊天視窗,輸入一段總結:支付失敗率上升,定位到nonce重複導致一致性校驗失