Mulai

SDK resmi

Library PHP dan JavaScript/TypeScript untuk membuat permintaan pembayaran dan memverifikasi webhook.

SDK ini membungkus API HTTP yang sama dengan yang didokumentasikan di sini: membuat, mengambil, dan menampilkan daftar permintaan pembayaran, membaca metode pembayaran akun Anda, mengirim Idempotency-Key kalau Anda memberikannya, mengubah response error jadi exception, dan memverifikasi signature webhook jadi Anda tidak perlu menulis HMAC sendiri. Response-nya persis JSON dari API. Keduanya tanpa dependency dan ada di satu repository open source di GitHub.

PHP

PHP 8.1+ dengan ekstensi curl, jalan di PHP biasa, Laravel, maupun WordPress. Tersedia di Packagist.

composer require kasera/kasera-pay

Buat permintaan pembayaran

use Kasera\Pay\ApiException;
use Kasera\Pay\Client;

$kasera = new Client(getenv('KASERA_API_KEY')); // kp_test_... or kp_live_...

try {
    $tx = $kasera->createTransaction([
        'amount'      => 150000,         // whole rupiah
        'external_id' => 'order-1001',
        'checkout'    => new stdClass(), // hosted Kasera Pay Checkout
    ], 'order-1001');                    // Idempotency-Key
} catch (ApiException $e) {
    // $e->status, $e->errorCode (e.g. validation_failed), $e->fields, $e->requestId
    throw $e;
}

header('Location: ' . $tx['checkout_url']);

Verifikasi webhook

use Kasera\Pay\SignatureException;
use Kasera\Pay\Webhook;

try {
    $event = Webhook::constructEvent(
        file_get_contents('php://input'),            // the raw body
        $_SERVER['HTTP_KASERA_SIGNATURE_V1'] ?? '',
        getenv('KASERA_WEBHOOK_SECRET'),
    );
} catch (SignatureException) {
    http_response_code(400);
    exit;
}

if ($event['type'] === 'payment.paid') {
    // mark $event['data']['external_id'] paid; dedupe on $event['id']
}

JavaScript / TypeScript

Node 20.19+, Deno, Bun, dan edge runtime, dengan type TypeScript yang di-generate dari spec API. Tersedia di npm.

npm install kasera-pay

Buat permintaan pembayaran

import { KaseraPay, KaseraPayError } from "kasera-pay";

const kasera = new KaseraPay(process.env.KASERA_API_KEY!); // kp_test_... or kp_live_...

try {
  const tx = await kasera.createTransaction(
    { amount: 150000, external_id: "order-1001", checkout: {} },
    { idempotencyKey: "order-1001" },
  );
  // redirect the buyer to tx.checkout_url
} catch (e) {
  if (e instanceof KaseraPayError) {
    // e.status, e.code (e.g. validation_failed), e.fields, e.requestId
  }
  throw e;
}

Verifikasi webhook

import { constructWebhookEvent, SignatureError } from "kasera-pay";

// e.g. a Next.js route handler
export async function POST(req: Request) {
  try {
    const event = await constructWebhookEvent(
      await req.text(), // the raw body
      req.headers.get("kasera-signature-v1") ?? "",
      process.env.KASERA_WEBHOOK_SECRET!,
    );
    if (event.type === "payment.paid") {
      // mark event.data.external_id paid; dedupe on event.id
    }
    return new Response("ok");
  } catch (e) {
    if (e instanceof SignatureError) return new Response("bad signature", { status: 400 });
    throw e;
  }
}

Selalu kirim idempotency key

Nomor pesanan Anda sudah cukup jadi key. Hanya key ini yang mencegah create yang di-retry — klik dua kali, timeout, antrean yang mengirim ulang — jadi permintaan pembayaran kedua: key yang sama dengan body yang sama mengembalikan yang asli, dan key yang sama dengan body berbeda ditolak 409 idempotency_conflict. external_id saja tidak mencegah duplikat.

Test dulu

Dengan key kp_test_ semua panggilan jalan dari awal sampai akhir dan tidak ada uang sungguhan yang berpindah; bayar permintaan test dengan tombol simulasi di halaman checkout. Lihat Test mode. Go live cukup dengan mengganti key-nya.

Pakai bahasa lain? API-nya HTTPS dan JSON biasa, dan spec OpenAPI-nya tersedia di /v1/openapi.json untuk men-generate client.