應用接入驗收
帳號模式探針現在取得短期身份斷言。負向 Launch 購買狀態只是購買證據,不證明 Licentivo 運行時拒絕。運行時證明要求官方 SDK 探針;不表示已部署生產環境或發布 SDK。參見帳號職責邊界。
證據分為兩級:受控的本地自動檢查與外部商戶 sandbox 探針。測試替身、成功讀取目錄、生成配置或健康檢查通過,都絕不證明真實付款、許可證簽發或激活。本開發迭代已明確延期配置外部服務。
本地自動檢查
從倉庫根目錄運行:
go test ./...
go vet ./...
node --check internal/httpapi/web/app.js
node --check internal/httpapi/web/integration.js
node --check internal/httpapi/web/integration-prompts.js
node --test scripts/integration-prompts.test.mjs scripts/integration-state.test.mjs
python scripts/test_acceptance.py
./scripts/test-mysql.ps1
MySQL 輔助工具在 .cache 下創建獨立伺服器和資料庫,絕不能指向客戶資料庫。未提供獨立 DSN 時,普通 go test ./... 會跳過資料庫場景。SDK 和分發包測試及構建參見 integration-packages.md。應隨發布記錄保留測試輸出和工具版本。
本地矩陣涵蓋認證、條件郵箱驗證、產品與環境所有權、pending/expired/suspended 狀態、支付事件重放、授權對賬、續費退款、帳號切換、受保護的會話持久化和離線回退決定。生命周期測試使用受控運行時;實際加密運行驗證仍由官方 SDK 負責,并在發布前單獨測試。
For 運營工具 → AI 快速接入, check all nine language choices, platform/project/feature selection, an unconfigured draft, and a prompt generated from validated public configuration. Check copy and download against the visible prompt, and ensure changing the product or environment cannot retain a previous validated configuration. Prompts must exclude sessions, passwords, runtime license/device credentials and management keys; generating or copying a prompt must not call an AI service. The source-bundle Node test command above exercises the pure generator. A generated prompt, or code subsequently produced by an AI tool, still needs the language tests and the external acceptance steps below.
準備外部 sandbox 驗收
- 部署專用 Launch 測試實例,提供可訪問的 HTTPS 來源并配置支付提供方 Webhook。保持正式銷售關閉。
- 配置一個支付提供方的 sandbox 憑據,以及具有讀寫權限的 Licentivo 連接。支付 sandbox 記錄相互隔離,但仍使用已配置的 Licentivo 服務,可能創建真實的測試許可證和設備記錄。必須使用專用測試產品、策略和客戶。
- Publish a sandbox plan and use 程序接入 to export
launch-config.jsonand validatedproduct.jsoninto.local/acceptance/. - 本地只安裝經審核的 Launch Python 包:
python -m pip install ./sdk/python,或安裝其 wheel。包中包含私有 SDK 實現。 - 使用不計次的測試功能,如
export。--activate啟動官方 SDK,同步調用refresh_online(),要求在線有效狀態,并調用受保護操作 API。只有快取離線授權無法通過此探針;該探針不測試計次。
憑據通過不回顯的提示輸入。自動化可在私有進程環境中提供 LAUNCH_ACCEPTANCE_EMAIL 和 LAUNCH_ACCEPTANCE_PASSWORD。不得將密碼放入命令參數、報告、截圖或已提交文件。工具在每次認證探針后撤銷自己的臨時桌面會話,但普通退出不會停用設備。
python scripts/acceptance.py preflight --config .local/acceptance/launch-config.json --report .local/acceptance/01-preflight.json
python scripts/acceptance.py verify --config .local/acceptance/launch-config.json --expect not_purchased --report .local/acceptance/02-no-purchase.json
工具拒絕正式環境配置、非回環 HTTP、攜帶憑據的重定向、不匹配產品,以及包含運行時秘密的公開配置。發請求前會拒絕 verify 之外的激活或訂單斷言,以及 checkout 之外的結賬創建選項。已有報告絕不覆蓋。報告只包含白名單證據,不包含原始響應、訪問令牌或許可證密鑰。缺少服務端或 SDK 會使探針失敗,不會生成虛假成功。
本地商戶探針使用 scope: local_sandbox_probe 和 licensing_scope: not_called。即使商戶運行在 localhost,verify --activate 仍會聯系官方外部授權服務;此組合記錄為 local_merchant_external_licensing_probe,并使用 licensing_scope: official_external_service。
首次付款與激活
在商戶網站創建測試結賬,或使用穩定的操作 UUID 創建:
$operation = [guid]::NewGuid().ToString()
python scripts/acceptance.py checkout --config .local/acceptance/launch-config.json --provider stripe --plan-version-id PLAN_VERSION_UUID --operation-id $operation --report .local/acceptance/03-checkout.json
將提供方和套餐版本替換為你已發布的 sandbox 套餐。結賬創建結果不確定時,重試必須保留并復用同一操作 UUID。工具會輸出訂單 ID。通過商戶帳號中心,使用提供方官方 sandbox 結賬完成此所屬訂單。探針明確不模擬提供方界面交互。
提供方確認付款且 Webhook 已收到后:
python scripts/acceptance.py verify --config .local/acceptance/launch-config.json --order-id ORDER_UUID --expect-order paid --expect active --activate --product-config .local/acceptance/product.json --feature export --report .local/acceptance/04-activation.json
此檢查驗證已認證帳號、所屬 sandbox 訂單、權益、憑據與產品對應關系,以及一次真實的官方 SDK 受保護操作。待處理授權在有界窗口內最多嘗試五次,預設 30 秒、最長 120 秒,并遵循 Retry-After。意外授權失敗會記錄,但不暴露 SDK 原始錯誤文本。
生命周期驗收矩陣
每個已發布的語言與操作系統組合,都應保存帶日期的記錄,包含源碼修訂、Launch/客戶端/SDK 版本、提供方環境、匿名客戶標簽、訂單 ID、預期結果、實際結果和相關報告文件名。未執行行標為未運行。不能僅憑首次付款探針就將整個矩陣標為通過。
| 情境 | 步驟 | 必需證據 |
|---|---|---|
| 注冊 / 驗證 | 不購買直接注冊,分別在啟用和禁用驗證時重復 | 禁用驗證時不阻止;啟用驗證時,在完成前返回 EMAIL_VERIFICATION_REQUIRED |
| 未購買 | 運行 verify --expect not_purchased |
拒絕憑據,不執行受保護操作 |
| 首次購買 | 完成 sandbox 付款,再運行激活探針 | 提供方確認付款;一份已付費權益、一份同步許可證,SDK 操作成功 |
| 重啟 | 關閉已記住登錄的所選語言示例,啟動新進程并恢復 | 不要求輸入密碼;使用同一帳號與產品快取及有效簽名授權 |
| 離線啟動 | 成功激活并記住登錄后,禁用測試進程或機器的網路,再重啟 | 簽名快取授權只允許策略開放的操作;禁止離線或浮動策略拒絕啟動 |
| 離線到期 / 時鐘回退 | 使用短期測試策略和可丟棄的測試機器 | SDK 拒絕已到期或時鐘回退狀態;功能回調不執行 |
| 續費 / 升級 | 通過 sandbox 商店購買續費或已報價升級 | 訂單和覆蓋期正確;同步及 SDK 刷新后可見新的有效期和功能 |
| 退款 | 申請并批準全額 sandbox 退款,等待提供方確認 | 提供方退款與本地覆蓋一致;按情況運行 verify --expect suspended 或 --expect expired;其他付費覆蓋仍可使用 |
| 退出 / 切換帳號 | 退出 A,使用未購買的 B 登錄;重啟并觀察行為 | 清除 A 已保存的會話和快取;B 不能使用 A 的許可證、設備或功能 |
| 產品 / 環境隔離 | 使用另一產品,另行切換 sandbox/live 配置 | 憑據和快取不能跨身份范圍復用;外部探針自身拒絕 live |
| 設備已滿 / 釋放 | 在策略允許的最多不同測試設備上激活,再嘗試增加一個,隨后明確釋放一個 | SDK 拒絕超額設備,確認釋放后允許替換;普通關閉不消耗釋放額度 |
| 處理方式 | 在待簽發期間重啟 Launch,重放已簽名 sandbox Webhook | 只有一份訂單覆蓋與許可證,最終完成核對;無重復結賬或扣款 |
退款或暫停對已簽發離線授權的影響,仍受官方 SDK 簽名離線策略約束。不保證斷網時即時撤銷。合約到期時,長時間 Launch 故障可能延遲上游暫停;參見合約限制。
完成與保留證據
每份探針報告明確設置 acceptance_complete: false,只記錄該次調用實際執行的檢查。接受發行版前,應審核矩陣和提供方記錄。之后配置外部服務,再繼續上述命令;不得用通過標志替代缺失結果,也不能僅因本地測試通過就啟用正式銷售。