Dokumentasi Js Pay

Panduan lengkap pakai Js Pay dari daftar sampai integrasi bot — cocok buat semua pengguna, baik developer maupun pemilik toko.

Mulai cepat

  1. Daftar akun gratis pakai email atau Google.
  2. Masuk ke dashboard, klik Buat Proyek dan isi nama serta slug unik.
  3. Salin API Key dan Link Checkout dari halaman proyek.
  4. Pakai API key untuk bikin transaksi dari bot/aplikasimu, atau bagikan link checkout langsung ke customer.
  5. Customer scan QRIS ShopeePay yang muncul, bayar persis sesuai nominal unik, lalu klik "Saya sudah bayar".
  6. Kamu cek mutasi ShopeePay, lalu tandai transaksi Paid di dashboard — webhook otomatis terkirim ke server kamu.

Bikin & atur proyek

Tiap proyek punya API key, slug checkout, dan webhook sendiri. Cocok kalau kamu jalanin beberapa bot atau aplikasi terpisah.

  • Nama: nama internal proyek (mis. "Bot Top Up ML").
  • Slug: jadi URL checkout publik /pay/<slug>. Hanya huruf kecil, angka, dan dash.
  • Deskripsi: opsional, tampil di halaman checkout.
  • Callback URL: endpoint server kamu untuk terima webhook.
  • Aktif/nonaktif: matikan proyek tanpa hapus datanya.

Link checkout (no-code)

Cara paling gampang — tanpa coding. Kirim link ini ke customer:

https://jspay.app/pay/<slug>?amount=10000&order_id=INV-001

Parameter:

  • amount — nominal dasar dalam rupiah (wajib).
  • order_id — ID transaksi dari sistemmu (opsional, auto-generate kalau kosong).
  • customer_ref — referensi customer (opsional, mis. username/email).

Sistem otomatis menambahkan kode unik 1-99 ke nominal supaya tiap pembayaran punya angka berbeda dan gampang direkonsiliasi dari mutasi ShopeePay.

Integrasi API

Semua request butuh header Authorization: Bearer <API_KEY>.

1. Buat transaksi

POST https://jspay.app/api/v1/transactions
Authorization: Bearer pk_live_xxx
Content-Type: application/json

{
  "amount": 10000,
  "order_id": "INV-001",
  "customer_ref": "user123"
}

Response:

{
  "id": "uuid",
  "order_id": "INV-001",
  "amount": 10000,
  "unique_amount": 10042,
  "status": "pending",
  "checkout_url": "https://jspay.app/pay/tokoku?tx=uuid",
  "expires_at": "2026-06-02T08:30:00Z"
}

2. Cek status transaksi

GET https://jspay.app/api/v1/transactions/<id>
Authorization: Bearer pk_live_xxx

Status yang mungkin: pending, pending_confirmation, paid, expired, refunded.

Webhook callback

Ketika transaksi ditandai paid, kami POST ke callback_url proyekmu:

POST <callback_url>
Content-Type: application/json
X-Webhook-Signature: <hmac_sha256_hex>

{
  "event": "transaction.paid",
  "id": "uuid",
  "order_id": "INV-001",
  "amount": 10000,
  "unique_amount": 10042,
  "status": "paid",
  "paid_at": "2026-06-02T08:20:11Z",
  "customer_ref": "user123"
}

Verifikasi signature di server kamu pakai webhook secret proyek (lihat tab Settings):

// Node.js
import crypto from "crypto";

const sig = req.headers["x-webhook-signature"];
const expected = crypto.createHmac("sha256", WEBHOOK_SECRET)
  .update(JSON.stringify(req.body))
  .digest("hex");

if (sig !== expected) return res.status(401).send("invalid signature");

Balas HTTP 2xx dalam 10 detik. Kalau gagal, kami retry beberapa kali.

Contoh integrasi bot

Pseudo-code bot auto order (Telegram, WhatsApp, Discord, dll):

// 1. User pesan produk → bot bikin transaksi
const res = await fetch("https://jspay.app/api/v1/transactions", {
  method: "POST",
  headers: {
    Authorization: "Bearer " + process.env.Js Pay_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    amount: produk.harga,
    order_id: "ORD-" + Date.now(),
    customer_ref: user.id,
  }),
});
const tx = await res.json();

// 2. Kirim link checkout ke user
bot.sendMessage(user.id,
  "Silakan bayar Rp " + tx.unique_amount + "\n" + tx.checkout_url
);

// 3. Server kamu dengar webhook → kirim produk
app.post("/webhook/jspay", (req, res) => {
  if (req.body.event === "transaction.paid") {
    kirimProduk(req.body.customer_ref, req.body.order_id);
  }
  res.send("ok");
});

Konfirmasi pembayaran

QRIS ShopeePay yang dipakai adalah static QR merchant. Itu berarti nominal tidak otomatis terverifikasi oleh sistem — kamu yang konfirmasi.

  1. Customer scan, bayar persis sesuai nominal unik (mis. Rp 10.042).
  2. Customer klik "Saya sudah bayar" → status jadi pending_confirmation.
  3. Kamu cek mutasi ShopeePay Seller. Cocokkan nominal unik dengan transaksi.
  4. Di dashboard, klik Tandai Paid → webhook terkirim, customer dapat produknya.

Mau full otomatis? Bikin script yang baca mutasi ShopeePay lalu panggil endpoint mark-paid internal — di luar lingkup v1.

FAQ

Apakah Js Pay butuh biaya?

Tidak, platformnya gratis. Kamu cuma bayar fee QRIS ShopeePay langsung ke ShopeePay (sesuai MDR mereka).

Kenapa nominalnya jadi aneh (10.042 dll)?

Itu kode unik supaya tiap pembayaran punya nominal berbeda — gampang dicocokkan dari mutasi.

Bisa pakai QRIS bank lain?

Versi sekarang pakai QRIS ShopeePay yang sudah disediakan platform. Semua pembayaran masuk ke akun ShopeePay platform — cocok untuk testing/bot kecil.

Bagaimana kalau customer salah nominal?

Status tetap pending_confirmation. Kamu bisa hubungi customer atau tandai expired/refund manual.

Berapa lama transaksi expired?

Default 15 menit dari saat dibuat.

Siap mulai?

Daftar gratis, bikin proyek pertama, dan integrasikan dalam 5 menit.