SDK resmi
SDK PHP, Node.js, dan Go untuk API Paymenku — instalasi, contoh, dan verifikasi webhook.
Tiga SDK resmi tersedia. Semuanya mencakup seluruh endpoint publik, menangani
envelope status/success, menyediakan tipe galat, dan memverifikasi tanda
tangan webhook.
PHP
paymenku/sdk-php — PHP 8.1+, tanpa dependensi runtime.
Node.js
@paymenku/sdk-nodejs — Node 18+, ESM dan CommonJS.
Go
github.com/paymenku/sdk-go — Go 1.22+, tanpa dependensi.
Instalasi
composer require paymenku/sdk-phpMembuat transaksi
use Paymenku\Client;
$client = new Client(getenv('PAYMENKU_API_KEY'));
$trx = $client->transactions->create([
'channel_code' => 'qris',
'amount' => 15000,
'reference_id' => 'INV-20261027-001',
'customer_name' => 'Budi Santoso',
'customer_email' => 'budi@example.com',
'return_url' => 'https://tokoanda.com/selesai',
], ['idempotencyKey' => 'INV-20261027-001']);
echo $trx['trx_id'];
echo $trx['payment_info']['qr_url'];Peta metode
| Aksi | PHP | Node.js | Go |
|---|---|---|---|
| Buat transaksi | transactions->create() | transactions.create() | Transactions.Create() |
| Cek status | transactions->get() | transactions.get() | Transactions.Get() |
| Daftar transaksi | transactions->list() | transactions.list() | Transactions.List() |
| Batalkan | transactions->cancel() | transactions.cancel() | Transactions.Cancel() |
| Refund | transactions->refund() | transactions.refund() | Transactions.Refund() |
| Kanal aktif | paymentChannels->list() | paymentChannels.list() | PaymentChannels.List() |
| Hitung fee | fees->calculate() | fees.calculate() | Fees.Calculate() |
| Panduan bayar | paymentInstructions->get() | paymentInstructions.get() | PaymentInstructions.Get() |
| Payment link | paymentLinks->create() / ->get() | paymentLinks.create() / .get() | PaymentLinks.Create() / .Get() |
| Wallet | wallet->balance() / ->pendingBalance() | wallet.balance() / .pendingBalance() | Wallet.Balance() / .PendingBalance() |
| Verifikasi webhook | Webhook::verify() | verifyWebhookSignature() | VerifyWebhook() |
Menangani galat
use Paymenku\Exception\ApiException;
use Paymenku\Exception\NetworkException;
try {
$client->transactions->create($input);
} catch (ApiException $e) {
$e->statusCode(); // 422
$e->getMessage(); // Validation failed
$e->errors(); // ['amount' => ['validation.min']]
$e->errorCode();
} catch (NetworkException $e) {
// timeout atau koneksi gagal
}Semua SDK memperlakukan envelope status: "error" atau success: false
sebagai galat, meskipun HTTP-nya 200.
Verifikasi webhook
use Paymenku\Webhook;
$raw = file_get_contents('php://input');
$valid = Webhook::verify(
$raw,
$_SERVER['HTTP_X_PAYMENKU_TIMESTAMP'] ?? '',
$_SERVER['HTTP_X_PAYMENKU_SIGNATURE'] ?? '',
getenv('PAYMENKU_WEBHOOK_SECRET'),
);Verifikasi memakai body mentah. Jangan parse JSON lalu marshal ulang — urutan kunci dan spasi berubah dan tanda tangan tidak cocok.
Catatan
- Kunci
sk_test_...untuk sandbox,sk_live_...untuk produksi (butuh KYC). - Nominal pada respons berupa string desimal; jangan dihitung sebagai float.
payment_infoberbeda per kanal;transaction_idtidak selalu ada.- SDK tidak melakukan retry otomatis. Hormati
Retry-Afterpada429dan gunakanIdempotency-Keysaat mengulang. - Status resmi tetap datang dari webhook, bukan polling.