跳到正文
返回 Launch 文件

下載 MarkdownGitHub 原始文件

應用接入驗收

帳號模式探針現在取得短期身份斷言。負向 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 驗收

  1. 部署專用 Launch 測試實例,提供可訪問的 HTTPS 來源并配置支付提供方 Webhook。保持正式銷售關閉。
  2. 配置一個支付提供方的 sandbox 憑據,以及具有讀寫權限的 Licentivo 連接。支付 sandbox 記錄相互隔離,但仍使用已配置的 Licentivo 服務,可能創建真實的測試許可證和設備記錄。必須使用專用測試產品、策略和客戶。
  3. Publish a sandbox plan and use 程序接入 to export launch-config.json and validated product.json into .local/acceptance/.
  4. 本地只安裝經審核的 Launch Python 包:python -m pip install ./sdk/python,或安裝其 wheel。包中包含私有 SDK 實現。
  5. 使用不計次的測試功能,如 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,只記錄該次調用實際執行的檢查。接受發行版前,應審核矩陣和提供方記錄。之后配置外部服務,再繼續上述命令;不得用通過標志替代缺失結果,也不能僅因本地測試通過就啟用正式銷售。