RouterPay Docs
Dokumentasi API
Alur integrasi RouterPay dibuat 100% mengikuti konsep integrasi Duitku Classic API: ambil metode pembayaran, buat transaksi/inquiry, terima callback, redirect pelanggan, lalu cek status transaksi.
Base URL
https://routerpay.co.id/api
merchantCode dan API Key.
Hosted Payment PageRedirect ke halaman bayar.
Direct APIMerchant tampilkan metode sendiri.
CallbackNotifikasi pembayaran.
Contoh KodePHP, Python, Node.js.
Langkah Awal
Setiap merchant RouterPay memiliki:
- merchantCode: kode merchant RouterPay, contoh
MRC-XXXXXXXX. - apiKey: API Key merchant untuk membuat signature request. API Key ditampilkan satu kali saat generate/regenerate.
2 Mode Integrasi RouterPay
RouterPay mendukung dua pola integrasi. Pilih sesuai kebutuhan checkout merchant.
1. Hosted Payment Page / Payment Link
Merchant cukup membuat payment link, lalu redirect customer ke paymentUrl. Customer memilih semua metode aktif di halaman RouterPay.
- Tidak perlu membuat UI pilihan metode di website merchant.
- Response utama:
paymentUrl. - Cocok untuk integrasi cepat dan mayoritas merchant.
2. Direct API / Embedded Checkout
Merchant mengambil daftar metode, menampilkan checkout sendiri, lalu mengirim kode payment method spesifik ke endpoint inquiry.
- Merchant punya kontrol penuh atas tampilan checkout.
- Response bisa berupa
vaNumber,qrString,AppUrl,paymentUrl, atau kode retail. - Cocok untuk embedded checkout/custom UI.
Mode 1 — Hosted Payment Page / Payment Link
Endpoint ini membuat link pembayaran seperti https://routerpay.co.id/pay/pl_xxx. Merchant redirect customer ke URL tersebut. Customer lalu memilih metode pembayaran di halaman RouterPay.
/merchant/v2/payment-linkstringToSign = merchantCode + merchantOrderId + paymentAmount
signature = HMAC_SHA256(stringToSign, API Key)
curl -X POST https://routerpay.co.id/api/merchant/v2/payment-link -H "Content-Type: application/json" -d '{
"merchantCode": "MRC-XXXXXXXX",
"paymentAmount": 40000,
"merchantOrderId": "ORDER-123",
"productDetails": "Pembayaran invoice ORDER-123",
"customerVaName": "John Doe",
"email": "buyer@example.com",
"phoneNumber": "08123456789",
"callbackUrl": "https://merchant.example.com/callback",
"returnUrl": "https://merchant.example.com/return",
"signature": "hasil_generate_signature",
"expiryPeriod": 60
}'
{
"merchantCode": "MRC-XXXXXXXX",
"merchantOrderId": "ORDER-123",
"paymentUrl": "https://routerpay.co.id/pay/pl_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"amount": "40000",
"statusCode": "00",
"statusMessage": "SUCCESS"
}
Mode 2 — Direct API: Get Payment Method
Digunakan untuk mendapatkan channel pembayaran aktif yang tersedia untuk merchant dan nominal tertentu.
/merchant/paymentmethod/getpaymentmethodstringToSign = merchantcode + amount + datetime
signature = HMAC_SHA256(stringToSign, API Key)
curl -X POST https://routerpay.co.id/api/merchant/paymentmethod/getpaymentmethod \
-H "Content-Type: application/json" \
-d '{
"merchantcode": "MRC-XXXXXXXX",
"amount": 10000,
"datetime": "2026-07-19 15:00:00",
"signature": "hasil_generate_signature"
}'
{
"paymentMethod": [
{
"paymentMethod": "BC",
"paymentName": "BCA Virtual Account",
"paymentImage": ""
}
],
"responseCode": "00",
"responseMessage": "SUCCESS"
}
Mode 2 — Direct API: Permintaan Transaksi / Inquiry
Endpoint Direct API untuk membuat transaksi dengan paymentMethod spesifik dan mendapatkan instruksi pembayaran: paymentUrl, vaNumber, qrString, AppUrl, atau kode retail sesuai channel provider.
/merchant/v2/inquirystringToSign = merchantCode + merchantOrderId + paymentAmount
signature = HMAC_SHA256(stringToSign, API Key)
curl -X POST https://routerpay.co.id/api/merchant/v2/inquiry \
-H "Content-Type: application/json" \
-d '{
"merchantCode": "MRC-XXXXXXXX",
"paymentAmount": 40000,
"paymentMethod": "BC",
"merchantOrderId": "ORDER-123",
"productDetails": "Pembayaran invoice ORDER-123",
"customerVaName": "John Doe",
"email": "buyer@example.com",
"phoneNumber": "08123456789",
"callbackUrl": "https://merchant.example.com/callback",
"returnUrl": "https://merchant.example.com/return",
"signature": "hasil_generate_signature",
"expiryPeriod": 60
}'
{
"merchantCode": "MRC-XXXXXXXX",
"reference": "RPY-20260719-XXXXXXXX",
"paymentUrl": "https://...",
"vaNumber": "7007014001444348",
"qrString": null,
"AppUrl": null,
"amount": "40000",
"statusCode": "00",
"statusMessage": "SUCCESS"
}
Callback Merchant
Saat pembayaran sukses, RouterPay mengirim callback ke callbackUrl yang dikirim pada request inquiry. Format callback mengikuti konsep Duitku dan dikirim sebagai application/x-www-form-urlencoded.
stringToSign = merchantCode + amount + merchantOrderId
signature = HMAC_SHA256(stringToSign, API Key)
merchantCode=MRC-XXXXXXXX
amount=40000
merchantOrderId=ORDER-123
productDetail=Pembayaran invoice ORDER-123
additionalParam=
paymentCode=BC
resultCode=00
merchantUserId=buyer@example.com
reference=RPY-20260719-XXXXXXXX
signature=hasil_generate_signature
publisherOrderId=provider_reference
settlementDate=
customerName=John Doe
Balas HTTP 2xx agar callback dianggap berhasil. Jika non-2xx, RouterPay akan retry melalui queue webhook.
Cek Status Transaksi
/merchant/transactionStatusstringToSign = merchantCode + merchantOrderId
signature = HMAC_SHA256(stringToSign, API Key)
curl -X POST https://routerpay.co.id/api/merchant/transactionStatus \
-H "Content-Type: application/json" \
-d '{
"merchantCode": "MRC-XXXXXXXX",
"merchantOrderId": "ORDER-123",
"signature": "hasil_generate_signature"
}'
Contoh Kode — Buat Payment Link
Contoh implementasi lengkap untuk membuat Hosted Payment Link (POST /merchant/v2/payment-link) di tiga bahasa populer. Setiap contoh menghitung signature, mengirim request, dan mengambil paymentUrl dari response. Ganti MRC-XXXXXXXX dan API_KEY_ANDA dengan kredensial merchant Anda.
# Signature yang dipakai semua contoh
stringToSign = merchantCode + merchantOrderId + paymentAmount
signature = HMAC_SHA256(stringToSign, API Key)
<?php
$merchantCode = 'MRC-XXXXXXXX';
$apiKey = 'API_KEY_ANDA';
$merchantOrderId = 'ORDER-123';
$paymentAmount = 40000;
// 1. Hitung signature (HMAC-SHA256)
$stringToSign = $merchantCode . $merchantOrderId . $paymentAmount;
$signature = hash_hmac('sha256', $stringToSign, $apiKey);
// 2. Susun payload
$payload = [
'merchantCode' => $merchantCode,
'paymentAmount' => $paymentAmount,
'merchantOrderId' => $merchantOrderId,
'productDetails' => 'Pembayaran invoice ORDER-123',
'customerVaName' => 'John Doe',
'email' => 'buyer@example.com',
'phoneNumber' => '08123456789',
'callbackUrl' => 'https://merchant.example.com/callback',
'returnUrl' => 'https://merchant.example.com/return',
'signature' => $signature,
'expiryPeriod' => 60,
];
// 3. Kirim request
$ch = curl_init('https://routerpay.co.id/api/merchant/v2/payment-link');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$response = curl_exec($ch);
curl_close($ch);
// 4. Ambil paymentUrl dari response
$result = json_decode($response, true);
if (($result['statusCode'] ?? '') === '00') {
echo $result['paymentUrl']; // redirect customer ke sini
}
import hashlib
import hmac
import json
import requests
merchant_code = "MRC-XXXXXXXX"
api_key = "API_KEY_ANDA"
merchant_order_id = "ORDER-123"
payment_amount = 40000
# 1. Hitung signature (HMAC-SHA256)
string_to_sign = f"{merchant_code}{merchant_order_id}{payment_amount}"
signature = hmac.new(
api_key.encode(),
string_to_sign.encode(),
hashlib.sha256,
).hexdigest()
# 2. Susun payload
payload = {
"merchantCode": merchant_code,
"paymentAmount": payment_amount,
"merchantOrderId": merchant_order_id,
"productDetails": "Pembayaran invoice ORDER-123",
"customerVaName": "John Doe",
"email": "buyer@example.com",
"phoneNumber": "08123456789",
"callbackUrl": "https://merchant.example.com/callback",
"returnUrl": "https://merchant.example.com/return",
"signature": signature,
"expiryPeriod": 60,
}
# 3. Kirim request
res = requests.post(
"https://routerpay.co.id/api/merchant/v2/payment-link",
json=payload,
timeout=30,
)
# 4. Ambil paymentUrl dari response
result = res.json()
if result.get("statusCode") == "00":
print(result["paymentUrl"]) # redirect customer ke sini
import { createHmac } from 'node:crypto';
const merchantCode = 'MRC-XXXXXXXX';
const apiKey = 'API_KEY_ANDA';
const merchantOrderId = 'ORDER-123';
const paymentAmount = 40000;
// 1. Hitung signature (HMAC-SHA256)
const stringToSign = `${merchantCode}${merchantOrderId}${paymentAmount}`;
const signature = createHmac('sha256', apiKey)
.update(stringToSign)
.digest('hex');
// 2. Susun payload
const payload = {
merchantCode,
paymentAmount,
merchantOrderId,
productDetails: 'Pembayaran invoice ORDER-123',
customerVaName: 'John Doe',
email: 'buyer@example.com',
phoneNumber: '08123456789',
callbackUrl: 'https://merchant.example.com/callback',
returnUrl: 'https://merchant.example.com/return',
signature,
expiryPeriod: 60,
};
// 3. Kirim request + 4. Ambil paymentUrl
const res = await fetch(
'https://routerpay.co.id/api/merchant/v2/payment-link',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
},
);
const result = await res.json();
if (result.statusCode === '00') {
console.log(result.paymentUrl); // redirect customer ke sini
}
apiKey di sisi klien (browser/app). Signature harus selalu dihitung di server merchant. Pastikan merchantOrderId unik per transaksi.
Provider & Channel Aktif
Daftar ini dibaca dari provider/channel aktif di RouterPay. Kode paymentMethod adalah kode yang dikirim ke endpoint inquiry.