Launch 套餐產品映射并發修復
已修復授權審查中的 AUTH-03。僅修改 Launch 服務端與對應回歸測試,未部署、未發布 SDK;Licentivo 和 SDK 的授權決定邊界不變。
修改
- 保存映射時,在事務內先鎖定共同的 Launch 產品記錄,再鎖套餐版本。不同套餐或不同進程的保存請求因此遵守同一產品鎖;沖突請求返回 HTTP 409
PRODUCT_MAPPING_CONFLICT。 products.licentivo_product_id保存穩定的公開產品路由。首次成功保存映射后,同一 Launch 產品的其他套餐只能選擇這個 Licentivo 產品;允許選擇其不同策略。該字段不保存功能權限、設備額度或客戶授權狀態。- 客戶身份讀取穩定路由,不再根據所有套餐的最大版本選擇產品。發布套餐及生成 SDK 接入配置時也核對同一綁定。
- 舊庫自動增加可空字段。尚無穩定字段的資料依次參考已付款等購買歷史、歷史發布記錄和其余映射;同一優先級存在多個產品時明確提示沖突,不猜測。唯一的已購產品優先于無關草稿,之后保存兼容映射可固化綁定。產品內容編輯保留綁定。
已經售往多個 Licentivo 產品的歷史錯誤資料仍需人工核對,本次不會改寫購買記錄或遠端許可證。需要改用另一個 Licentivo 產品時,應建立新的 Launch 產品,不能借新套餐改寫原產品路由。
實現見 映射保存、產品路由、身份簽發、發布校驗、接入檢查、資料模型。
本地驗證
| 檢查 | 結果 |
|---|---|
| 修復前實現對照 | 同一回歸測試穩定捕獲兩個沖突保存同時成功,按預期失敗 |
| 修復后的映射專項回歸 | 沖突請求一個成功、一個 409;兩個兼容保存均成功;付款同步后身份不受錯誤草稿影響;SDK 接入層接受正確產品上下文 |
| 歷史資料保護 | 已購路由優先、歧義報錯、錯誤草稿禁止發布、錯誤歷史發布無法生成 SDK 配置、內容編輯保留綁定,均通過 |
| Go 全部源碼包及 MySQL 回歸 | 192 條測試通過記錄,含子用例;無失敗。TestProductUploadRoundTrip 跳過,未計作通過 |
| 舊庫結構升級 | 缺少路由列的結構經初始化后補齊可空字段;重復初始化通過 |
| 真實 Launch、Licentivo 與 Go SDK 聯調 | 13 個業務階段通過,涵蓋購買、真實簽名功能執行、普通關閉恢復、退出、遠程解綁、舊代次、續費退款、帳號撤銷及退款/拒付后的拒絕運行 |
| 最終補測 | 在新的空庫通過映射專項回歸,補含歷史發布的接入配置檢查;go vet 通過 |
完整回歸及真實服務聯調完成后,最后增加了 SDK 接入檢查的一致性校驗,并單獨重新運行包含此場景的專項回歸和 go vet。舊實現的預期失敗用于證明測試能抓到原競態,不是未解決的回歸失敗。
聯調使用本機獨立 MySQL 8.0.32、當前 Licentivo 服務與實際 Go SDK;支付渠道和 DeepL 使用隔離模擬服務,沒有實際扣款或付費翻譯。并發與歷史錯誤映射專項測試使用實際 Launch 業務、MySQL 和協議模擬器;不聲稱九種 SDK 均完成本輪真實服務聯調。
本輪未訪問 192.168.2.177。本次啟動的 MySQL、Licentivo 臨時進程已停止,原有服務保留。原始材料留在忽略目錄 .local/mapping-fix-20261024/,可分享摘要見 驗證證據。