KiPaydocs
Dokumentasi/Panduan

PANDUAN

Tampilkan QR yang tepat untuk setiap transaksi

Gunakan endpoint PNG untuk checkout sederhana, atau gunakan qr_payload jika aplikasi Anda mengelola renderer QR sendiri.

DATA MENJADI QRBedakan payload, renderer, file gambar, dan masa berlaku.
Transformasi QR payload menjadi gambar checkoutKiPay menyimpan QR payload pada resource transaksi. Backend meminta qr.png untuk trx_id yang sama. Renderer mengubah data menjadi PNG. Checkout menampilkan gambar sampai expires_at.bedakan data dari piksel01 DATA TRANSAKSIqr_payload00020101021226...expires_at14:50 waktu checkouttrx_idRENDERER SERVERGET /qr.pngimage/png03 GAMBAR CHECKOUT500 x 500 pikselAturan expires_atexpires_atSetelah expired, buat transaksi baru.
01

Endpoint gambar

GET/api/pay/{apiKey}/transactions/{trxId}/qr.png

Response yang berhasil menggunakan Content-Type image/png dan berukuran 500 x 500 piksel. Endpoint hanya mengembalikan QR milik project yang sesuai dengan API key.

02

Cara tercepat: pakai field dari response create

Setiap Transaction (dari create, get, atau simulate) sudah menyertakan qr_url — link siap pakai ke endpoint gambar di atas, jadi tidak perlu menyusun URL sendiri. Kalau aplikasi Anda punya renderer QR sendiri (mis. di app mobile), pakai qr_payload — string QRIS mentah yang sama yang dipakai untuk membuat gambar PNG-nya.

render-shortcut.ts
TypeScript
const trx = await kipay.createTransaction({ amount: 285000 });

// Opsi 1 — langsung pakai sebagai src gambar
imgElement.src = trx.qr_url;

// Opsi 2 — render sendiri pakai library QR pilihan Anda
renderQrCode(trx.qr_payload);
03

Teruskan gambar melalui backend

Route internal menerima trx_id, mengambil PNG dari KiPay secara server-to-server, lalu meneruskan Content-Type dan status HTTP yang sama ke checkout.

app/api/checkout/qr/[transactionId]/route.ts
TypeScript
export async function GET(
  _request: Request,
  context: { params: Promise<{ transactionId: string }> }
) {
  const { transactionId } = await context.params;
  const apiKey = process.env.KIPAY_API_KEY;
  if (!apiKey) return new Response('KiPay is not configured', { status: 500 });

  const source =
    `https://api.kipay.biz.id/api/pay/${apiKey}/transactions/${encodeURIComponent(transactionId)}/qr.png`;
  const response = await fetch(source, { cache: 'no-store' });

  return new Response(response.body, {
    status: response.status,
    headers: { 'Content-Type': response.headers.get('Content-Type') ?? 'image/png' },
  });
}
Browser hanya melihat route internal

Render <img src="/api/checkout/qr/{transactionId}">. API key tetap berada di environment variable backend dan tidak masuk ke bundle, browser history, atau analytics.

04

Berikan instruksi yang mudah dipahami

  • Tampilkan amount final, bukan requested_amount
  • Tampilkan expires_at dalam zona waktu yang jelas
  • Sediakan tombol untuk mengecek status tanpa mewajibkan refresh halaman
  • Bedakan status paid dan expired secara visual
  • Jangan menjadikan bukti transfer dari pelanggan sebagai sumber status
05

Jika gambar tidak tersedia

Response 404 dapat berarti API key atau trx_id salah, atau transaksi belum memiliki qr_payload. Jangan menampilkan placeholder QR. Tampilkan pesan error pada checkout, lalu minta backend membaca transaksi untuk diagnosis.