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.