一張簽名圖片無法單獨說明使用者接受了哪份文件,也無法交代請求如何完成。我實作的簽署流程會記錄文件版本、驗證填寫欄位,並產出包含相關事件紀錄的完成版 PDF。
以下說明工程設計,省略客戶文件、實際欄位與身分資訊。
將請求綁定到文件
簽署請求參照範本版本及原始文件雜湊。接受簽名前,伺服器載入文件,將雜湊與當時紀錄比對;不一致就停止操作。
這將編輯範本與變更待簽文件分開。每次簽署對應一份明確文件,不依賴相同檔名目前指向什麼內容。
把簽署連結當作憑證
應用產生帶有期限的隨機連結,資料庫保存簽署 token 的雜湊。接受欄位內容或簽名圖片前,伺服器會檢查請求目前的有效狀態及簽署人狀態。
欄位驗證限制每位簽署人能填寫的內容,拒絕未知的簽名欄位、不合法格式與缺少的必填值。介面協助使用者填寫,伺服器決定哪些輸入可以被接受。
將競爭操作序列化
簽署、拒簽與作廢可能同時發生。實作以一致順序鎖定請求及簽署人紀錄,再改變狀態。
每次操作因此能讀到目前狀態,避免兩個呼叫各自完成已被處理的步驟。收齊所需簽署後,再產生最終文件。
串連事件紀錄
同意、簽署與完成等事件以雜湊鏈保留順序。每個事件的雜湊包含前一筆雜湊,以及目前事件的標準化內容。
測試會修改事件或移除中間事件,再驗證檢查能找出斷點。文件雜湊則分別將原始檔與完成檔連到各自保存的指紋。
這些機制支援流程內的完整性檢查,與獨立身分驗證或憑證式數位簽章是不同能力。清楚界定證據能證明什麼,後續查核才有可靠的基礎。
最後留下的是可供檢視的內容、完成版 PDF,以及產生它的事件紀錄。