Appearance color
This choice is saved in your browser and stays the same when Light/Dark mode changes.
Rainbow speed50
QR Studio · Guest

Atur styling QR-nya, ambil link API-nya.

Semua setelan di bawah langsung dipakai untuk membentuk URL /qr-studio/api/qris-generate yang bisa kamu tempel ke aplikasi manapun.

01Baca / decode QR
URL gambar QR harus dapat diakses publik. Sistem akan mencoba membaca QR dari gambar tersebut.
PNG/JPEG/GIF/WebP · maksimal 1 MB.
Belum ada hasil decode.
02Konten
03Style bentuk
Style dots
04Warna
Preset warna cepat
05Logo di tengah
PNG/JPEG/GIF/WebP · maksimal 2 MB.
Tips: bila menggunakan logo, error correction otomatis dipakai H agar QR lebih aman dipindai. Finder tetap solid saat gradasi aktif.
Live preview
— scan me —
URL API (siap dipakai)
memuat…
08PHP Native untuk domain anda (siap pakai)
<?php
/**
 * QR Studio External - Native PHP URL-only consumer
 *
 * Salin URL yang dihasilkan pada QR Studio nomor 7 ke $api_url.
 * URL tersebut sudah membawa payload QRIS dan seluruh styling nomor 1-6.
 * Website external hanya perlu mengirim nominal (amount).
 *
 * Tidak membutuhkan CodeIgniter, database, Composer.
 * PHP cURL tidak wajib karena browser dapat langsung memuat URL PNG internal.
 */
$api_url = 'https://ugi.my.id/panel/qr-studio/api/qris-generate?payload=...';

function h($value): string
{
    return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8');
}

function endpointWithAmount(string $endpoint, int $amount): string
{
    $parts = parse_url($endpoint);
    if ($parts === false || empty($parts['scheme']) || empty($parts['host'])) {
        throw new RuntimeException('URL endpoint No. 7 tidak valid.');
    }

    $query = [];
    if (!empty($parts['query'])) parse_str($parts['query'], $query);
    $query['amount'] = $amount;

    $url = ($parts['scheme'] ?? 'https') . '://' . ($parts['host'] ?? '');
    if (!empty($parts['port'])) $url .= ':' . $parts['port'];
    $url .= $parts['path'] ?? '/';
    $url .= '?' . http_build_query($query, '', '&', PHP_QUERY_RFC3986);
    if (!empty($parts['fragment'])) $url .= '#' . $parts['fragment'];
    return $url;
}

session_start();

$amount = '';
$error = '';
$imageUrl = '';

/*
 * Gunakan pola Post/Redirect/Get + session flash:
 * - Setelah Generate, hasil tetap ditampilkan.
 * - Saat halaman di-reload, state flash sudah dikonsumsi sehingga
 *   nominal dan gambar QRIS kembali kosong.
 */
$flash = $_SESSION['qris_external_flash'] ?? null;
unset($_SESSION['qris_external_flash']);

if (is_array($flash)) {
    $amount = isset($flash['amount']) ? (int) $flash['amount'] : '';
    $imageUrl = isset($flash['imageUrl']) ? (string) $flash['imageUrl'] : '';
    $error = isset($flash['error']) ? (string) $flash['error'] : '';
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $amount = '';
    $imageUrl = '';
    $error = '';

    $amountInput = trim((string) ($_POST['amount'] ?? ''));
    $amountInt = filter_var($amountInput, FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);

    if ($amountInt === null || $amountInt < 1 || $amountInt > 10000000) {
        $error = 'Nominal harus berupa angka bulat 1 sampai 10.000.000.';
    } else {
        try {
            $imageUrl = endpointWithAmount($api_url, $amountInt);
            $amount = $amountInt;
        } catch (Throwable $e) {
            $error = $e->getMessage();
        }
    }

    $_SESSION['qris_external_flash'] = [
        'amount' => $amount,
        'imageUrl' => $imageUrl,
        'error' => $error,
    ];

    header('Location: ' . ($_SERVER['PHP_SELF'] ?? ''));
    exit;
}
?>
<!doctype html>
<html lang="id">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>QRIS External</title>
<style>
*{box-sizing:border-box}body{margin:0;padding:24px;font-family:Arial,Helvetica,sans-serif;background:#f5f7fb;color:#172033}.wrap{max-width:560px;margin:auto}.card{background:#fff;border:1px solid #dfe5ef;border-radius:16px;padding:20px;box-shadow:0 8px 28px rgba(20,32,55,.06)}label{display:block;font-weight:700;margin-bottom:7px}input{width:100%;padding:11px 12px;border:1px solid #ccd5e3;border-radius:10px;font:inherit}.btn{margin-top:12px;border:0;border-radius:10px;padding:12px 16px;background:#172033;color:#fff;font-weight:700;cursor:pointer;width:100%}.help{font-size:13px;color:#657189;margin-top:8px}.err{background:#fff0f0;border:1px solid #ffc9c9;color:#a11a1a;padding:12px;border-radius:10px;margin-bottom:16px}.qr{text-align:center;margin-top:18px}.qr img{display:block;max-width:100%;height:auto;margin:auto;border:1px solid #e4e8ef;border-radius:10px}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;word-break:break-all;background:#0b1020;color:#e9efff;padding:10px;border-radius:99px;font-size:12px}
</style>
</head>
<body>
<div class="wrap">
  <div class="card">
    <h2 style="margin-top:0">QRIS External Generator</h2>
    <p class="help">Endpoint No. 7 sudah membawa payload QRIS, warna, bentuk, ukuran, margin, ECC, gradasi, dan logo. Domain external hanya menentukan nominal.</p>

    <?php if ($error !== ''): ?>
      <div class="err"><?= h($error) ?></div>
    <?php endif; ?>

    <form method="post" autocomplete="off">
      <label for="amount">Nominal</label>
      <input id="amount" name="amount" type="number" min="1" max="10000000" value="<?= h($amount) ?>" autocomplete="off" required>
      <div class="help">Batas request endpoint: Rp1–Rp10.000.000.</div>
      <button class="btn" type="submit">Generate QRIS</button>
    </form>

    <?php if ($imageUrl !== ''): ?>
      <div class="qr"><img src="<?= h($imageUrl) ?>" alt="QRIS <?= h(number_format($amount, 0, ',', '.')) ?>"></div>
    <?php endif; ?>
  </div>
</div>
</body>
</html>
09Generate QRIS dengan angka
Penting: upload QRIS merchant milik Anda sendiri. Sistem mengambil payload merchant tersebut lalu menambahkan nominal dan menghitung ulang CRC. Ini bukan penerbitan merchant QRIS baru. Nominal QRIS yang sesuai ketentuan BI saat ini maksimal Rp10.000.000 per transaksi.
Belum ada QRIS sumber. Pilih file QRIS merchant untuk dibaca.
Hasil QRIS
— QRIS hasil akan muncul di sini —
Payload hasil
Belum dibuat.
Global Music

Music player A–Z

Temukan lagu dan artis dari berbagai negara, pilih huruf A–Z, lalu putar preview langsung di halaman guest.

Pilih huruf A–Z atau cari musik.
Preview audio mengikuti hak akses dan ketersediaan layanan musik di masing-masing negara.