# Penerimaan integrasi aplikasi

> Probe mode akun kini memperoleh assertion identitas berumur pendek. Status pembelian Launch negatif hanya merupakan bukti pembelian, bukan bukti penolakan runtime Licentivo. Bukti runtime memerlukan probe SDK resmi; tidak menyiratkan deployment produksi atau publikasi SDK. Lihat [batas akun](/id/launch-documents/account-purchase-boundary/).

Ada dua tingkat bukti yang terpisah: pemeriksaan otomatis lokal terkontrol dan probe sandbox pedagang eksternal. Test double, pembacaan katalog yang berhasil, konfigurasi yang dihasilkan, atau health check yang lulus tidak pernah membuktikan pembayaran nyata, penerbitan lisensi, atau aktivasi. Konfigurasi layanan eksternal secara eksplisit ditangguhkan untuk iterasi pengembangan ini.

## Pemeriksaan otomatis lokal

Jalankan dari akar repositori:

```powershell
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
```

Helper MySQL membuat server dan basis data terisolasi baru di bawah `.cache`; jangan arahkan ke basis data pelanggan. `go test ./...` biasa melewati skenario basis data kecuali DSN terisolasi disediakan. Pengujian dan build SDK/paket dijelaskan dalam [integration-packages.md](/id/launch-documents/integration-packages/). Simpan output pengujian dan versi alat bersama catatan rilis.

Matriks lokal mencakup autentikasi, verifikasi email bersyarat, kepemilikan produk/lingkungan, status tertunda/kedaluwarsa/ditangguhkan, replay peristiwa pembayaran, rekonsiliasi lisensi, perpanjangan/pengembalian dana, pergantian akun, persistensi sesi terlindungi, dan keputusan fallback offline. Pengujian siklus hidup menggunakan runtime terkontrol; verifikasi runtime kriptografis sebenarnya tetap menjadi tanggung jawab SDK resmi dan diuji secara terpisah sebelum rilis.

Untuk **Alat operasional → Integrasi cepat AI**, periksa semua sembilan pilihan bahasa, pemilihan platform/proyek/fitur, draf yang belum dikonfigurasi, dan prompt yang dibuat dari konfigurasi publik tervalidasi. Periksa penyalinan dan pengunduhan terhadap prompt yang terlihat, dan pastikan perubahan produk atau lingkungan tidak dapat mempertahankan konfigurasi tervalidasi sebelumnya. Prompt harus mengecualikan sesi, kata sandi, kredensial lisensi/perangkat runtime, dan kunci manajemen; membuat atau menyalin prompt tidak boleh memanggil layanan AI. Perintah pengujian Node bundel sumber di atas menguji generator murni. Prompt yang dihasilkan, atau kode yang kemudian dihasilkan alat AI, tetap memerlukan pengujian bahasa dan langkah penerimaan eksternal di bawah.

## Siapkan penerimaan sandbox eksternal

1. Deploy instance uji Launch khusus dengan origin HTTPS yang dapat dijangkau dan webhook penyedia. Biarkan penjualan live dinonaktifkan.
2. Konfigurasikan kredensial sandbox **satu** penyedia pembayaran dan koneksi baca/tulis Licentivo. Catatan sandbox pembayaran terisolasi, tetapi tetap menggunakan layanan Licentivo yang dikonfigurasi dan dapat membuat lisensi uji/catatan perangkat nyata. Gunakan produk/kebijakan uji khusus dan pelanggan uji.
3. Terbitkan paket sandbox dan gunakan **Integrasi aplikasi** untuk mengekspor `launch-config.json` dan `product.json` tervalidasi ke `.local/acceptance/`.
4. Instal hanya paket Python Launch yang ditinjau secara lokal: `python -m pip install ./sdk/python`, atau instal wheel-nya. Implementasi SDK privat disertakan.
5. Gunakan fitur uji yang tidak terukur seperti `export`. `--activate` memulai SDK resmi, memanggil `refresh_online()` secara sinkron, mewajibkan status online aktif, dan memanggil API operasi yang dilindungi. Grant offline dalam cache saja tidak dapat meluluskan probe ini; probe ini tidak menguji pengukuran.

Kredensial diminta tanpa echo. Otomasi dapat menyediakan `LAUNCH_ACCEPTANCE_EMAIL` dan `LAUNCH_ACCEPTANCE_PASSWORD` dalam lingkungan proses privatnya. Jangan masukkan kata sandi ke argumen perintah, laporan, tangkapan layar, atau file yang dikomit. Alat mencabut sesi desktop sementaranya setelah setiap probe terautentikasi, tetapi tidak menonaktifkan perangkat saat keluar normal.

```powershell
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
```

Alat menolak konfigurasi lingkungan live, HTTP non-loopback, redirect yang membawa kredensial, produk yang tidak cocok, dan konfigurasi publik yang berisi rahasia runtime. Alat menolak assertion aktivasi/pesanan di luar `verify` dan opsi pembuatan checkout di luar `checkout` sebelum membuat permintaan. Laporan yang ada tidak pernah ditimpa. Laporan berisi bukti yang diizinkan, bukan respons mentah, token akses, atau kunci lisensi. Server atau SDK yang hilang menghasilkan probe gagal, bukan keberhasilan sintetis.

Probe pedagang lokal menggunakan `scope: local_sandbox_probe` dan `licensing_scope: not_called`. `verify --activate` menghubungi layanan lisensi eksternal resmi meskipun pedagang berjalan di localhost; kombinasi tersebut dicatat sebagai `local_merchant_external_licensing_probe` dengan `licensing_scope: official_external_service`.

## Pembayaran dan aktivasi pertama

Buat checkout uji di situs pedagang, atau buat dengan UUID operasi yang stabil:

```powershell
$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
```

Ganti penyedia dan versi paket dengan paket sandbox Anda yang diterbitkan. Simpan dan gunakan kembali UUID operasi yang sama ketika mencoba ulang pembuatan checkout yang tidak pasti. Alat mencetak ID pesanan. Selesaikan pesanan milik sendiri tersebut melalui pusat akun pedagang menggunakan checkout sandbox resmi penyedia. Interaksi UI penyedia sengaja tidak disimulasikan oleh probe.

Setelah penyedia mengonfirmasi pembayaran dan webhook diterima:

```powershell
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
```

Ini memeriksa akun terautentikasi, pesanan sandbox milik sendiri, hak, kecocokan kredensial/produk, dan operasi terlindungi SDK resmi yang nyata. Otorisasi tertunda dicoba paling banyak lima kali dalam jendela terbatas (default 30 detik, maksimum 120), dengan mematuhi `Retry-After`. Kegagalan otorisasi yang tidak diharapkan dicatat tanpa mengungkap teks kesalahan mentah SDK.

## Matriks penerimaan siklus hidup

Untuk setiap pasangan bahasa/OS yang dirilis, simpan catatan bertanggal dengan revisi sumber, versi Launch/klien/SDK, lingkungan penyedia, label pelanggan anonim, ID pesanan, hasil yang diharapkan, hasil yang diamati, dan nama file laporan terkait. Tandai baris yang tidak dijalankan sebagai **not run**. Jangan tandai seluruh matriks lulus berdasarkan probe pembayaran pertama.

| Skenario | Prosedur | Bukti yang diperlukan |
| --- | --- | --- |
| Pendaftaran / verifikasi | Daftar tanpa pembelian; ulangi dengan verifikasi diaktifkan dan dinonaktifkan | Verifikasi yang dinonaktifkan tidak memblokir; verifikasi yang diaktifkan menghasilkan `EMAIL_VERIFICATION_REQUIRED` hingga selesai |
| Tanpa pembelian | Jalankan `verify --expect not_purchased` | Kredensial ditolak; tidak ada operasi terlindungi yang berjalan |
| Pembelian pertama | Selesaikan pembayaran sandbox, lalu jalankan probe aktivasi | Penyedia mengonfirmasi pembayaran; satu hak berbayar, satu lisensi tersinkronisasi, operasi SDK berhasil |
| Mulai ulang | Tutup contoh bahasa yang dipilih dengan login yang diingat, jalankan proses baru dan pulihkan | Tidak ada permintaan kata sandi; cache akun/produk yang sama dan grant bertanda tangan valid |
| Startup offline | Setelah aktivasi dengan login diingat berhasil, nonaktifkan jaringan untuk proses/mesin uji tersebut dan mulai ulang | Grant bertanda tangan dalam cache hanya mengizinkan operasi yang diizinkan kebijakan; kebijakan tanpa offline/floating menolak startup |
| Kedaluwarsa offline / rollback jam | Gunakan kebijakan uji berumur pendek dan mesin uji sekali pakai | SDK menolak status kedaluwarsa/rollback; callback fitur tidak dijalankan |
| Perpanjangan / peningkatan | Beli perpanjangan atau peningkatan yang ditawarkan melalui storefront sandbox | Pesanan/cakupan benar; masa berlaku/fitur baru terlihat setelah sinkronisasi dan refresh SDK |
| Pengembalian dana | Minta/setujui pengembalian dana sandbox penuh; tunggu konfirmasi penyedia | Pengembalian penyedia dan cakupan lokal sesuai; `verify --expect suspended` atau `--expect expired` sesuai keadaan; cakupan berbayar lain tetap dapat digunakan |
| Logout / pergantian akun | Logout A, masuk sebagai B tanpa pembelian; mulai ulang dan periksa perilaku | Sesi/cache tersimpan A dihapus; B tidak dapat menggunakan lisensi, perangkat, atau fitur A |
| Isolasi produk / lingkungan | Gunakan produk lain dan secara terpisah ganti konfigurasi sandbox/live | Kredensial dan cache tidak dapat melintasi cakupan identitas; probe eksternal sendiri menolak live |
| Perangkat penuh / pelepasan | Aktifkan pada jumlah maksimum perangkat uji berbeda menurut kebijakan; coba satu lagi, lalu lepaskan satu secara eksplisit | SDK menolak perangkat berlebih dan mengizinkan penggantian setelah pelepasan dikonfirmasi; penutupan biasa tidak mengonsumsi kuota pelepasan |
| Pemulihan | Mulai ulang Launch selama penerbitan tertunda, putar ulang webhook sandbox bertanda tangan | Satu cakupan/lisensi pesanan, rekonsiliasi pada akhirnya; tidak ada checkout atau penagihan duplikat |

Dampak pengembalian dana/penangguhan terhadap grant offline yang telah diterbitkan tetap dibatasi oleh kebijakan offline bertanda tangan SDK resmi. Pencabutan segera saat terputus tidak diklaim. Gangguan Launch yang panjang saat kontrak kedaluwarsa dapat menunda penangguhan upstream; lihat [batasan kontrak](/id/launch-documents/licentivo-contract/).

## Penyelesaian dan bukti yang dipertahankan

Setiap laporan probe sengaja menetapkan `acceptance_complete: false`: laporan hanya mencatat pemeriksaan yang benar-benar dijalankan dalam pemanggilan tersebut. Tinjau matriks dan catatan penyedia sebelum menerima rilis. Konfigurasikan layanan eksternal kemudian dan lanjutkan perintah di atas; jangan ganti hasil yang hilang dengan flag lulus atau aktifkan penjualan live hanya karena pengujian lokal lulus.
