Publik

Dokumentasi API Integrasi Lisensi

Dokumentasi ini terbuka untuk developer yang memasang proteksi lisensi ke script. Kontrak endpoint validate / check-update / download-update tidak berubah meski toko menambah hosting, domain, dan tagihan. Kunci lisensi diterbitkan admin atau otomatis setelah checkout.

Endpoint
POST https://diginusaberkah.com.laku.co.id/api/v1/license/validate

Header
Content-Type: application/json
X-License-Secret: YOUR_API_SECRET

Secret diperoleh dari admin (menu Proteksi SaaS), bukan dari halaman ini.

Body

{
  "license_key": "JC-XXXXXXXXXXXX",
  "domain": "domain-klien.com",
  "product_id": "SKU-ATAU-ID-PRODUK"
}

Field product_id opsional, tapi disarankan diisi (boleh ID numerik atau SKU produk) agar lisensi hanya berlaku untuk produk yang benar — mencegah 1 kunci lisensi dipakai di produk lain.

Respon sukses

{
  "valid": true,
  "status": "active",
  "product_id": 12,
  "domain": "domain-klien.com",
  "registered_domains": ["domain-klien.com"],
  "multi_domain": false,
  "expires_at": "2027-01-01T00:00:00+00:00",
  "heartbeat_hours": 24,
  "message": "Lisensi valid. Aplikasi boleh berjalan."
}

Default 1 lisensi = 1 domain. Kalau lisensi didaftarkan di lebih dari 1 domain (fitur tambah domain saat pembelian/oleh admin), registered_domains berisi semua domain yang diizinkan dan multi_domain jadi true — kirim domain yang sedang berjalan seperti biasa, sistem otomatis cocokkan ke salah satu domain terdaftar.

Lisensi yang diterbitkan lewat Program Reseller (dibeli klien dari toko reseller resmi) memakai endpoint dan format respons yang sama persis — tidak ada perbedaan integrasi di sisi produk digital Anda.

Respon gagal (termasuk saat kedaluwarsa)

{
  "valid": false,
  "status": "expired",
  "message": "Lisensi kedaluwarsa. Silakan perpanjang lisensi.",
  "renewal_url": "https://diginusaberkah.com.laku.co.id/perpanjangan-lisensi?license_key=JC-XXXXXXXXXXXX&domain=domain-klien.com"
}

Field renewal_url selalu dikirim saat valid: false. Arahkan (redirect) pengguna produk digital ke URL ini agar mereka dapat mengecek status dan menghubungi admin untuk perpanjangan.

Cakupan API vs layanan toko

API ini hanya mengurus status lisensi script: kunci valid, domain cocok, produk cocok, belum kedaluwarsa. Layanan toko berikut tidak dipanggil dari script dan tidak mengubah kontrak HTTP di atas:

  • Sub-variasi Dengan Hosting / Tanpa Hosting — hosting cPanel di-provision WHM saat checkout; kunci lisensi tetap sama.
  • Registrasi domain RDash, perpanjang domain, Semua Tagihan — portal user, bukan endpoint script.
  • SSO cPanel, refresh status hosting — menu Layanan Hosting user.

Integrasikan script cukup ke /api/v1/license/*. Jangan kirim token WHM atau API RDash dari aplikasi klien.

Masa aktif & cron

Field expires_at (ISO-8601) ada di respon sukses jika lisensi berbatas waktu. Setelah lewat, validate mengembalikan valid: false, status: "expired", plus renewal_url. Pembelian Tanpa Hosting memakai aturan expiry yang sama (dari durasi varian/produk).

Cron toko (license:expire-check tiap jam, license:expiry-reminder H-3 jam 08:00) hanya mengubah status di database dan mengirim notifikasi. Script tidak perlu hit cron — andalkan hasil validate setiap heartbeat. Interval heartbeat disarankan mengikuti heartbeat_hours di respon (default mengikuti Proteksi SaaS admin).

Alur Perpanjangan Otomatis

Saat lisensi berstatus kedaluwarsa (atau tidak valid), respon API akan menyertakan renewal_url. Produk digital yang terpasang di sisi klien sebaiknya langsung mengarahkan (redirect) pengunjung ke URL tersebut, sehingga mereka bisa mengecek status lisensi dan menghubungi admin melalui WhatsApp untuk memperpanjang.

Jika pengguna sudah login dan lisensi tersebut miliknya, halaman ini menampilkan tombol "Perpanjang Lisensi Sekarang" yang membawa mereka ke halaman pembayaran perpanjangan — pengguna dapat memilih Saldo Akun, Transfer Manual, atau Payment Gateway (jika aktif di pengaturan admin). Perpanjangan via saldo langsung aktif; via transfer manual/gateway menunggu verifikasi admin.

Cek & Unduh Update Produk

Produk yang sudah terpasang bisa tanya langsung apakah ada versi baru lewat POST /api/v1/license/check-update (kirim license_key, domain, current_version), lalu unduh filenya lewat POST /api/v1/license/download-update. Kedua endpoint ini memvalidasi lisensi persis seperti endpoint validasi biasa — kalau lisensi tidak aktif/kedaluwarsa/domain tidak cocok, update juga ditolak.

Respons cek-update menyertakan auto_update (true/false, diatur admin per-produk). Kalau true, produk boleh mengunduh & memasang update secara otomatis; kalau false, cukup tampilkan notifikasi dan link unduh ke pemilik aplikasi, pemasangan tetap manual. Contoh kode ada di bagian "Contoh PHP" di bawah.

Contoh PHP

$payload = json_encode([
    'license_key' => 'JC-XXXXXXXXXXXX',
    'domain' => $_SERVER['HTTP_HOST'] ?? '',
    'product_id' => 'SKU-ATAU-ID-PRODUK',
]);
$ch = curl_init('https://diginusaberkah.com.laku.co.id/api/v1/license/validate');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'X-License-Secret: YOUR_API_SECRET',
    ],
    CURLOPT_POSTFIELDS => $payload,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 8,
]);
$res = json_decode(curl_exec($ch), true);
if (empty($res['valid'])) {
    // Lisensi tidak valid / kedaluwarsa -> arahkan ke halaman perpanjangan
    $renewalUrl = $res['renewal_url'] ?? 'https://diginusaberkah.com.laku.co.id/perpanjangan-lisensi';
    header('Location: '.$renewalUrl);
    exit;
}

Cek update & auto-update (opsional)

$payload = json_encode([
    'license_key' => 'JC-XXXXXXXXXXXX',
    'domain' => $_SERVER['HTTP_HOST'] ?? '',
    'current_version' => '2.0.0', // versi yang terpasang saat ini
]);
$ch = curl_init('https://diginusaberkah.com.laku.co.id/api/v1/license/check-update');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'X-License-Secret: YOUR_API_SECRET'],
    CURLOPT_POSTFIELDS => $payload,
    CURLOPT_RETURNTRANSFER => true,
]);
$res = json_decode(curl_exec($ch), true);

if (!empty($res['update_available'])) {
    if (!empty($res['auto_update'])) {
        // Diizinkan admin -> unduh & pasang otomatis. WAJIB cek checksum sebelum menimpa file lama.
        $zip = file_get_contents($res['download_url'], false, stream_context_create(['http' => [
            'method' => 'POST',
            'header' => "Content-Type: application/json\r\n",
            'content' => json_encode(['license_key' => 'JC-XXXXXXXXXXXX', 'domain' => $_SERVER['HTTP_HOST'] ?? '']),
        ]]));
        if (hash('sha256', $zip) === $res['checksum_sha256']) {
            file_put_contents(__DIR__.'/update-'.$res['latest_version'].'.zip', $zip);
            // ... lanjutkan proses extract & timpa file lama ...
        }
    } else {
        // Auto update tidak diizinkan -> cukup beri tahu pemilik aplikasi
        echo 'Update tersedia: v'.$res['latest_version'].'. Unduh manual di panel admin Anda.';
    }
}

EULA · Beranda