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

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.

Rekomendasi

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.

POST/merchant/v2/payment-link
stringToSign = 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.

POST/merchant/paymentmethod/getpaymentmethod
stringToSign = 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.

POST/merchant/v2/inquiry
stringToSign = 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

POST/merchant/transactionStatus
stringToSign = 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 PHP (cURL)
<?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
}
PY Python (requests)
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
JS Node.js (fetch)
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
}
Catatan keamanan: Jangan pernah menaruh 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.

Duitkuduitku
Sandbox
Akulaku AK ? Indodana ID ? Kredivo KR ? Kartu Kredit (Duitku) VC Card DANA (Duitku) DA E-Wallet GoPay (Duitku) GP E-Wallet LinkAja (Duitku) LQ E-Wallet OVO (Duitku) OV E-Wallet ShopeePay (Duitku) SP E-Wallet QRIS (Duitku) DQ QRIS BCA Virtual Account (Duitku) BC VA BNI Virtual Account (Duitku) I1 VA BRI Virtual Account (Duitku) BR VA Mandiri Virtual Account (Duitku) M2 VA Permata Virtual Account (Duitku) BT VA
Konterkukonterku
Production
QRIS (Konterku) QRIS QRIS
LinkQulinkqu
Production
DANA (LinkQu) PAYDANA E-Wallet LinkAja (LinkQu) PAYLINKAJA E-Wallet OVO (LinkQu) PAYOVO E-Wallet ShopeePay (LinkQu) PAYSHOPEE E-Wallet QRIS (LinkQu) QRIS QRIS Alfamart (LinkQu) ALFAMART Retail Indomaret (LinkQu) INDOMARET Retail BCA Virtual Account (LinkQu) 014 VA BNI Virtual Account (LinkQu) 009 VA BRI Virtual Account (LinkQu) 002 VA BSI Virtual Account (LinkQu) 451 VA CIMB Niaga Virtual Account (LinkQu) 022 VA Danamon Virtual Account (LinkQu) 011 VA Mandiri Virtual Account (LinkQu) 008 VA Maybank Virtual Account (LinkQu) 016 VA Muamalat Virtual Account (LinkQu) 147 VA OCBC NISP Virtual Account (LinkQu) 028 VA Permata Virtual Account (LinkQu) 013 VA Sinarmas Virtual Account (LinkQu) 153 VA
Midtransmidtrans
Production
Akulaku AK ? Kredivo KR ? Kartu Kredit MIDTRANS_CREDIT_CARD Card GoPay MIDTRANS_GOPAY E-Wallet ShopeePay MIDTRANS_SHOPEEPAY E-Wallet QRIS GoPay MIDTRANS_QRIS QRIS BCA Virtual Account BCA VA BNI Virtual Account BNI VA Mandiri Bill Payment MANDIRI VA
Xenditxendit
Sandbox
Belum ada channel aktif