API Developer Guide

Selamat datang di halaman Dokumentasi API. Disini telah disediakan penjelasan lengkap mengenai daftar API yang tersedia dan cara akses/penggunaan dari masing-masing API

Channel pembayaran kami terbagi menjadi 2 jenis yaitu Open Payment & Closed Payment.

Open Payment :

  • Nominal pembayaran tidak ditentukan oleh merchant, pelanggan dapat memasukkan nominal berapapun
  • 1 Kode Bayar/Nomor Virtual Account dapat digunakan berkali-kali
  • Biaya transaksi hanya dapat dibebankan ke merchant

Closed Payment :

  • Nominal pembayaran ditentukan oleh merchant
  • 1 Kode Bayar/Nomor Virtual Account hanya dapat digunakan sekali
  • Biaya transaksi dapat dibebankan ke merchant atau ke pelanggan

Pada bagian ini kami akan menjelaskan alur proses yang akan berjalan saat menggunakan layanan kami mulai dari proses pelanggan melakukan checkout hingga pembayaran masuk ke akun Anda.

Pada layanan kami, channel pembayaran terbagi menjadi 2 jenis yakni tipe DIRECT dan REDIRECT. Pada tipe Direct, semua proses transaksi dapat dilakukan di situs Anda sendiri tanpa perlu dialihkan ke situs lain sehingga Anda dapat dengan leluasa mendesain halaman pembayaran Anda sendiri. Sedangkan pada tipe Redirect, Anda perlu mengalihkan pelanggan menuju ke URL pembayaran yang kami sediakan untuk dapat menyelesaikan proses pembayaran.

DIRECT

  1. Pelanggan melakukan checkout di situs Anda dan memilih metode pembayaran dari channel yang kami sediakan
  2. Sistem Anda melakukan request transaksi ke API kami
  3. Sistem kami memberikan kode bayar/nomor VA
  4. Sistem Anda menginformasikan kode bayar/nomor VA ke pelanggan dan menginstruksikan pelanggan untuk membayar
  5. Pelanggan melakukan pembayaran
  6. Sistem kami menerima status penyelesaian pembayaran pelanggan Anda
  7. Dana masuk ke akun Anda dan sistem kami mengirimkan notifikasi ke sistem Anda
  8. Sistem Anda memproses notifikasi yang dikirim dan melakukan validasi pembayaran
  9. Pembayaran tervalidasi, sistem Anda memproses pesanan ke pelanggan

REDIRECT

  1. Pelanggan melakukan checkout di situs Anda dan memilih metode pembayaran dari channel yang kami sediakan
  2. Sistem Anda melakukan request transaksi ke API kami
  3. Sistem kami memberikan URL pembayaran
  4. Sistem Anda mengalihkan pelanggan menuju ke URL pembayaran
  5. Pelanggan menyelesaikan proses pembayaran
  6. Sistem kami menerima status penyelesaian pembayaran pelanggan Anda
  7. Dana masuk ke akun Anda dan sistem kami mengirimkan notifikasi ke sistem Anda
  8. Sistem Anda memproses notifikasi yang dikirim dan melakukan validasi pembayaran
  9. Pembayaran tervalidasi, sistem Anda memproses pesanan ke pelanggan

Mode Transaksi

Pada sistem kami terdapat 2 mode transaksi, mode sanbox dan mode production. Apabila anda ingin melakukan testing silahkan gunakan mode sanbox, apabila anda ingin live transaksi maka silahkan gunakan mode production

Credential API

pada sistem kami terdapat 2 Credential API, Credential API sandbox dan Credential API production

  1. Apabila anda ingin menggunakan mode sandbox silahkan gunakan Credential API sandbox, untuk bisa mendapatkan credential API sandbox, pada halaman member pilih menu API & Integrasi > Simulator > Merchant > Detail
  2. Apabila anda ingin menggunakan mode production silahkan gunakan credential API production , untuk bisa mendapatkan credential API production pada halaman member pilih menu Merchant > Opsi > Edit
    *catatan: apabila anda belum mempunyai merchant silahkan tambah merchant dengan mengklik tombol tambah merchant pada halaman daftar merchant

setelah mendapatkan credential api pastikan channel pembayaran yang anda gunakan sudah aktif. Untuk mengaktikan channel pembayaran :

  1. Apabila anda menggunakan mode sandbox maka pada halaman member silahkan pilih menu API & Integrasi > Simulator > Merchant > Channel Pembayaran
  2. Apabila anda menggunakan mode production maka pada halaman member silahkan pilih menu API & Integrasi > Merchant > Opsi > Atur Channel Pembayaran

Daftar Channel Pembayaran

Kode Nama Channel Tipe Biaya Admin *
MYBVA Maybank Virtual Account
Min : Rp 5.000
Max : Rp 1.000.000.000
DIRECT Rp 4.250
PERMATAVA Permata Virtual Account
Min : Rp 10.000
Max : Rp 1.000.000.000
DIRECT Rp 4.250
BNIVA BNI Virtual Account
Min : Rp 10.000
Max : Rp 100.000.000
DIRECT Rp 4.250
BRIVA BRI Virtual Account
Min : Rp 10.000
Max : Rp 100.000.000
DIRECT Rp 4.250
MANDIRIVA Mandiri Virtual Account
Min : Rp 5.000
Max : Rp 1.000.000.000
DIRECT Rp 4.250
BCAVA BCA Virtual Account
Min : Rp 10.000
Max : Rp 100.000.000
DIRECT Rp 4.250
SMSVA Sinarmas Virtual Account
Min : Rp 5.000
Max : Rp 1.000.000.000
DIRECT Rp 4.250
MUAMALATVA Muamalat Virtual Account
Min : Rp 10.000
Max : Rp 50.000.000
DIRECT Rp 4.250
CIMBVA CIMB Virtual Account
Min : Rp 10.000
Max : Rp 100.000.000
DIRECT Rp 4.250
SAMPOERNAVA Sahabat Sampoerna Virtual Account
Min : Rp 10.000
Max : Rp 100.000.000
DIRECT Rp 4.250
BRIVAOP BRI Virtual Account (Open Payment)
Min : Rp 10.000
Max : Rp 100.000.000
DIRECT Rp 4.250
CIMBVAOP CIMB Niaga Virtual Account (Open Payment)
Min : Rp 10.000
Max : Rp 100.000.000
DIRECT Rp 4.250
DANAMONOP Danamon Virtual Account (Open Payment)
Min : Rp 10.000
Max : Rp 100.000.000
DIRECT Rp 4.250
BCAVAOP BCA Virtual Account (Open Payment)
Min : Rp 10.000
Max : Rp 100.000.000
DIRECT Rp 4.250
BNIVAOP BNI Virtual Account (Open Payment)
Min : Rp 10.000
Max : Rp 100.000.000
DIRECT Rp 4.250
HANAVAOP Hana Bank Virtual Account (Open Payment)
Min : Rp 10.000
Max : Rp 100.000.000
DIRECT Rp 4.250
ALFAMART Alfamart
Min : Rp 5.000
Max : Rp 2.500.000
DIRECT Rp 2.500
ALFAMIDI Alfamidi
Min : Rp 5.000
Max : Rp 2.500.000
DIRECT Rp 2.500
QRIS QRIS
Min : Rp 1.000
Max : Rp 5.000.000
DIRECT Rp 750 + 0,70%
QRISC QRIS (Customizable)
Min : Rp 1.000
Max : Rp 5.000.000
DIRECT Rp 750 + 0,70%
QRISOP QRIS (Open Payment)
Min : Rp 1.000
Max : Rp 5.000.000
DIRECT Rp 750 + 0,70%
QRISCOP QRIS (Open Payment - Customizable)
Min : Rp 1.000
Max : Rp 5.000.000
DIRECT Rp 750 + 0,70%

* Biaya admin standar, merchant Anda mungkin memiliki biaya yang berbeda dari biaya standar

API ini digunakan untuk mengambil instruksi pembayaran dari masing-masing channel

Request

Method GET
Sandbox URL https://tripay.co.id/api-sandbox/payment/instruction
Production URL https://tripay.co.id/api/payment/instruction
Key Value Keterangan
Authorization Bearer {api_key} Ganti {api_key} dengan API Key merchant Anda
Parameter Contoh Nilai Tipe Wajib Keterangan
code BRIVA
Lihat lainnya
String YA Kode channel pembayaran
pay_code 1234567890 String TIDAK Untuk memasukkan kode bayar/nomor VA ke dalam respon instruksi
amount 10000 Integer TIDAK Untuk memasukkan nominal ke dalam respon instruksi
allow_html 1 Integer TIDAK Untuk mengizinkan tag html pada instruksi
0 = Tidak diizinkan
1 = Diizinkan
default = 1
<?php

$apiKey = 'api_key_anda';

$payload = [
	'code'	=> 'BRIVA'
];

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_FRESH_CONNECT     => true,
  CURLOPT_URL               => "https://tripay.co.id/api/payment/instruction?".http_build_query($payload),
  CURLOPT_RETURNTRANSFER    => true,
  CURLOPT_HEADER            => false,
  CURLOPT_HTTPHEADER        => array(
    "Authorization: Bearer ".$apiKey
  ),
  CURLOPT_FAILONERROR       => false,
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

echo !empty($err) ? $err : $response;

?>
import requests

apiKey = "api_key_anda"

try:
  payload = {
    "code": "BRIVA"
  }

  headers = {
    "Authorization": "Bearer " + apiKey
  }

  result = requests.get(url="https://tripay.co.id/api/payment/instruction", params=payload, headers=headers)
  response = result.text
  print(response)
except Exception as e:
  print("Request Error: " + str(e))
const axios = require('axios'); // using Axios library

var apiKey = "api_key_anda";

axios.get('https://tripay.co.id/api/payment/instruction?code=BRIVA', {
  headers: {
    'Authorization': 'Bearer ' + apiKey
  }
})
.then((res) => {
  console.log(res)
})
.catch((error) => {
  console.error(error)
});

Response

{
  "success": true,
  "message": "",
  "data": [
      {
        "title": "Internet Banking",
        "steps": [
          "Login ke internet banking Bank BRI Anda",
          "Pilih menu <b>Pembayaran</b> lalu klik menu <b>BRIVA</b>",
          "Pilih rekening sumber dan masukkan Kode Bayar (<b>{{pay_code}}</b>) lalu klik <b>Kirim</b>",
          "Detail transaksi akan ditampilkan, pastikan data sudah sesuai",
          "Masukkan kata sandi ibanking lalu klik <b>Request</b> untuk mengirim m-PIN ke nomor HP Anda",
          "Periksa HP Anda dan masukkan m-PIN yang diterima lalu klik <b>Kirim</b>",
          "Transaksi sukses, simpan bukti transaksi Anda"
        ]
      },
      {
        "title": "Aplikasi BRImo",
        "steps": [
          "Login ke aplikasi BRImo Anda",
          "Pilih menu <b>BRIVA</b>",
          "Pilih sumber dana dan masukkan Nomor Pembayaran (<b>{{pay_code}}</b>) lalu klik <b>Lanjut</b>",
          "Klik <b>Lanjut</b>",
          "Detail transaksi akan ditampilkan, pastikan data sudah sesuai",
          "Klik <b>Konfirmasi</b>",
          "Klik <b>Lanjut</b>",
          "Masukkan kata sandi ibanking Anda",
          "Klik <b>Lanjut</b>",
          "Transaksi sukses, simpan bukti transaksi Anda"
        ]
      }
    ]
}
{
  "success": false,
  "message": "Invalid API Key"
}

API ini digunakan untuk mendapatkan daftar channel pembayaran yang aktif pada akun Merchant Anda beserta informasi lengkap termasuk biaya transaksi dari masing-masing channel

Request

Method GET
Sandbox URL https://tripay.co.id/api-sandbox/merchant/payment-channel
Production URL https://tripay.co.id/api/merchant/payment-channel
Key Value Keterangan
Authorization Bearer {api_key} Ganti {api_key} dengan API Key merchant Anda
Parameter Tipe Contoh Nilai Wajib Keterangan
code String BRIVA TIDAK Kode channel pembayaran. Jika parameter ini kosong maka result yang dihasilkan adalah daftar semua channel pembayaran yang tersedia
<?php

$apiKey = 'api_key_anda';

$payload = [
  'code'	=> 'BRIVA'
];

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_FRESH_CONNECT     => true,
  CURLOPT_URL               => "https://tripay.co.id/api/merchant/payment-channel?".http_build_query($payload),
  CURLOPT_RETURNTRANSFER    => true,
  CURLOPT_HEADER            => false,
  CURLOPT_HTTPHEADER        => array(
    "Authorization: Bearer ".$apiKey
  ),
  CURLOPT_FAILONERROR       => false
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

echo !empty($err) ? $err : $response;

?>
import requests

apiKey = "api_key_anda"

try:
  payload = {
    "code": "BRIVA"
  }

  headers = {
    "Authorization": "Bearer " + apiKey
  }

  result = requests.get(url="https://tripay.co.id/api/merchant/payment-channel", params=payload, headers=headers)
  response = result.text
  print(response)
except Exception as e:
  print("Request Error: " + str(e))
const axios = require('axios') // using Axios library

var apiKey = "api_key_anda";

axios.get('https://tripay.co.id/api/merchant/payment-channel?code=BRIVA', {
  headers: {
    'Authorization': 'Bearer ' + apiKey
  }
})
.then((res) => {
  console.log(res)
})
.catch((error) => {
  console.error(error)
});

Response

{
    "success": true,
    "message": "",
    "data": [
        {
            "group": "Virtual Account",
            "code": "BRIVA",
            "name": "BRI Virtual Account",
            "type": "direct",
            "fee_merchant": {
                "flat": 1500,
                "percent": "0.00"
            },
            "fee_customer": {
                "flat": 0,
                "percent": "0.00"
            },
            "total_fee": {
                "flat": 1500,
                "percent": "0.00"
            },
            "icon_url": "https://tripay.co.id/xxxxxxxxx.png",
            "active": true
        }
    ]
}
{
  "success": false,
  "message": "Invalid API Key"
}

API ini digunakan untuk mendapatkan rincian perhitungan biaya transaksi untuk masing-masing channel berdasarkan nominal yang ditentukan

Request

Method GET
Sandbox URL https://tripay.co.id/api-sandbox/merchant/fee-calculator
Production URL https://tripay.co.id/api/merchant/fee-calculator
Key Value Keterangan
Authorization Bearer {api_key} Ganti {api_key} dengan API Key merchant Anda
Parameter Tipe Contoh Nilai Wajib Keterangan
amount Integer 100000 YA Nominal transaksi
code String BRIVA
Lihat lainnya
TIDAK Kode channel pembayaran. Jika parameter ini kosong maka result yang dihasilkan adalah daftar semua channel pembayaran yang tersedia
<?php

$apiKey = 'api_key_anda';

$payload = [
  'code'	=> 'QRIS',
  'amount'	=> 100000
];

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_FRESH_CONNECT     => true,
  CURLOPT_URL               => "https://tripay.co.id/api/merchant/fee-calculator?".http_build_query($payload),
  CURLOPT_RETURNTRANSFER    => true,
  CURLOPT_HEADER            => false,
  CURLOPT_HTTPHEADER        => array(
    "Authorization: Bearer ".$apiKey
  ),
  CURLOPT_FAILONERROR       => false
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

echo !empty($err) ? $err : $response;

?>
import requests

apiKey = "api_key_anda"

try:
  payload = {
    "code": "QRIS",
    "amount": 100000
  }

  headers = {
    "Authorization": "Bearer " + apiKey
  }

  result = requests.get(url="https://tripay.co.id/api/merchant/fee-calculator", params=payload, headers=headers)
  response = result.text
  print(response)
except Exception as e:
  print("Request Error: " + str(e))
const axios = require('axios') // using Axios library

var apiKey = "api_key_anda";

axios.get('https://tripay.co.id/api/merchant/fee-calculator?code=QRIS&amount=100000', {
  headers: {
    'Authorization': 'Bearer ' + apiKey
  }
})
.then((res) => {
  console.log(res)
})
.catch((error) => {
  console.error(error)
});

Response

{
  "success": true,
  "message": "",
  "data": [
    {
      "code": "QRIS",
      "name": "QRIS",
      "fee": {
          "flat": 750,
          "percent": "0.70",
          "min": null,
          "max": null
      },
      "total_fee": {
          "merchant": 1450,
          "customer": 0
      }
    }
  ]
}
{
  "success": false,
  "message": "Invalid API Key"
}

API ini digunakan untuk mendapatkan daftar transaksi merchant

Request

Method GET
Sandbox URL https://tripay.co.id/api-sandbox/merchant/transactions
Production URL https://tripay.co.id/api/merchant/transactions
Key Value Keterangan
Authorization Bearer {api_key} Ganti {api_key} dengan API Key Anda
Parameter Tipe Contoh Nilai Wajib Keterangan
page Integer 1 TIDAK Nomor halaman
per_page Integer 50 TIDAK Jumlah data per halaman. Maks: 50
sort String desc TIDAK Sorting data.
asc : Terlama ke Terbaru
desc : Terbaru ke Terlama
reference String T0001000000455HFGRY TIDAK Untuk melakukan filter berdasarkan nomor referensi transaksi
merchant_ref String INV57564 TIDAK Untuk melakukan filter berdasarkan nomor referensi/invoice merchant
method String BRIVA
Lihat lainnya
TIDAK Untuk melakukan filter berdasarkan kode channel pembayaran
status String PAID TIDAK Untuk melakukan filter berdasarkan status pembayaran
<?php

$apiKey = 'api_key_anda';

$payload = [
  'page'    => 1,
  'per_page'    => 25
];

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_FRESH_CONNECT     => true,
  CURLOPT_URL               => "https://tripay.co.id/api/merchant/transactions?".http_build_query($payload),
  CURLOPT_RETURNTRANSFER    => true,
  CURLOPT_HEADER            => false,
  CURLOPT_HTTPHEADER        => array(
    "Authorization: Bearer ".$apiKey
  ),
  CURLOPT_FAILONERROR       => false
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

echo !empty($err) ? $err : $response;

?>
import requests

apiKey = "api_key_anda"

try:
  payload = {
    "page": 1,
    "per_page": 25
  }

  headers = {
    "Authorization": "Bearer " + apiKey
  }

  result = requests.get(url="https://tripay.co.id/api/merchant/transactions", params=payload, headers=headers)
  response = result.text
  print(response)
except Exception as e:
  print("Request Error: " + str(e))
const axios = require('axios') // using Axios library

var apiKey = "api_key_anda";

axios.get('https://tripay.co.id/api/merchant/transactions?page=1&per_page=25', {
  headers: {
    'Authorization': 'Bearer ' + apiKey
  }
})
.then((res) => {
  console.log(res)
})
.catch((error) => {
  console.error(error)
});

Response

{
  "success": true,
  "message": "Success",
  "data": [
      {
        "reference": "T015100000358440000",
        "merchant_ref": "INV123",
        "payment_selection_type": "static",
        "payment_method": "MYBVA",
        "payment_name": "Maybank Virtual Account",
        "customer_name": "Nama Customer",
        "customer_email": "[email protected]",
        "customer_phone": null,
        "callback_url": null,
        "return_url": null,
        "amount": 153750,
        "fee_merchant": 3750,
	    "fee_customer": 0,
        "total_fee": 3750,
        "amount_received": 150000,
        "pay_code": 45649878666155,
        "pay_url": null,
        "checkout_url": "https://tripay.co.id/checkout/T015100000358440000",
        "order_items": [
          {
            "sku": null,
            "name": "T-Shirt",
            "price": 150000,
            "quantity": 1,
            "subtotal": 150000
          }
        ],
        "status": "UNPAID",
        "note": null,
        "created_at": 1592381058,
        "expired_at": 1592388303,
        "paid_at": null
      }
    ],
  "pagination": {
    "sort": "desc",
    "offset": {
      "from": 1,
      "to": 1
    },
      "current_page": 1,
      "previous_page": null,
      "next_page": null,
      "last_page": 1,
      "per_page": 25,
      "total_records": 1
  }
}
{
  "success": false,
  "message": "Invalid API Key"
}

Untuk melakukan request transaksi, Anda harus membuat signature yang akan divalidasi sistem TriPay untuk memastikan integritas data dan pengirim saat ditransmisikan ke sistem TriPay. Pada permintaan request Transaksi baru, signature ini dibuat dari kombinasi Kode Merchant, Nomor referensi dari sistem merchant, dan nominal transaksi

Ketiga data tersebut di-hash menggunakan jenis algoritma HMAC-SHA256 yang dikunci dengan Private Key Merchant. Berikut adalah contoh pembuatan signature.

<?php

$privateKey = 'ytf6ooi2gmlNPfpchd94jDOk8hRWOu';
$merchantCode = 'T0001';
$merchantRef = 'INV55567';
$amount = 1500000;

$signature = hash_hmac('sha256', $merchantCode.$merchantRef.$amount, $privateKey);

// result
// 9f167eba844d1fcb369404e2bda53702e2f78f7aa12e91da6715414e65b8c86a

?>
import hmac
import hashlib

privateKey = "ytf6ooi2gmlNPfpchd94jDOk8hRWOu"
merchant_code = "T0001"
merchant_ref = "INV55567"
amount = 1500000

signStr = "{}{}{}".format(merchant_code, merchant_ref, amount)
signature = hmac.new(bytes(privateKey,'latin-1'), bytes(signStr,'latin-1'), hashlib.sha256).hexdigest()

# result
# 9f167eba844d1fcb369404e2bda53702e2f78f7aa12e91da6715414e65b8c86a
const crypto = require('crypto')

var privateKey = "ytf6ooi2gmlNPfpchd94jDOk8hRWOu";
var merchant_code = "T0001";
var merchant_ref = "INV55567";
var amount = 1500000;

var signature = crypto.createHmac('sha256', privateKey).update(merchant_code + merchant_ref + amount).digest('hex');

// result
// 9f167eba844d1fcb369404e2bda53702e2f78f7aa12e91da6715414e65b8c86a

API ini digunakan untuk membuat transaksi baru atau melakukan generate kode pembayaran

Request

Method POST
Sandbox URL https://tripay.co.id/api-sandbox/transaction/create
Production URL https://tripay.co.id/api/transaction/create
Key Value Keterangan
Authorization Bearer {api_key} Ganti {api_key} dengan API Key merchant Anda
Parameter Contoh Nilai Tipe Wajib Keterangan
method BRIVA
Lihat lainnya
String YA Kode channel pembayaran
merchant_ref INV345675 String TIDAK Kode referensi transaksi dari sistem Anda. Kami akan mengirim balik nomor referensi ini ketika mengirim notifikasi status transaksi
amount 1000000 Integer YA Jumlah total pembayaran
customer_name Nama Pelanggan String YA Nama Pelanggan
customer_email [email protected] String YA Email Pelanggan
customer_phone 081234567890 String TIDAK (YA untuk beberapa channel) Nomor HP Pelanggan
order_items (Lihat tab Contoh Request) Array YA (TIDAK untuk merchant khusus) Rincian produk. Parameter ini harus berisi Array dengan key yang wajib: name, price, quantity
callback_url https://domainanda.com/callback String TIDAK URL untuk menerima callback notifikasi transaksi. Jika parameter ini kosong, maka akan menggunakan URL callback default pada menu Merchant
return_url https://domainanda.com/redirect String TIDAK URL untuk mengalihkan pelanggan Anda kembali
expired_time 1582855837 Integer TIDAK Batas waktu pembayaran dalam format unix timestamp (https://www.unixtimestamp.com). Jika parameter ini tidak diisi, maka akan menggunakan batas waktu default yakni 24 jam
signature fwehf874g547744b5ybnfhf String YA Signature dibuat menggunakan hash HMAC-SHA256 yang dikunci dengan Private Key. (lihat pada tab Buat Signature)
<?php

$apiKey = 'api_key_anda';
$privateKey = 'private_key_anda';
$merchantCode = 'kode merchant anda';
$merchantRef = 'nomor referensi merchant anda';
$amount = 1000000;

$data = [
  'method'            => 'BRIVA',
  'merchant_ref'      => $merchantRef,
  'amount'            => $amount,
  'customer_name'     => 'Nama Pelanggan',
  'customer_email'    => '[email protected]',
  'customer_phone'    => '081234567890',
  'order_items'       => [
    [
      'sku'       => 'PRODUK1',
      'name'      => 'Nama Produk 1',
      'price'     => $amount,
      'quantity'  => 1
    ]
  ],
  'callback_url'      => 'https://domainanda.com/callback',
  'return_url'        => 'https://domainanda.com/redirect',
  'expired_time'      => (time()+(24*60*60)), // 24 jam
  'signature'         => hash_hmac('sha256', $merchantCode.$merchantRef.$amount, $privateKey)
];

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_FRESH_CONNECT     => true,
  CURLOPT_URL               => "https://tripay.co.id/api/transaction/create",
  CURLOPT_RETURNTRANSFER    => true,
  CURLOPT_HEADER            => false,
  CURLOPT_HTTPHEADER        => array(
    "Authorization: Bearer ".$apiKey
  ),
  CURLOPT_FAILONERROR       => false,
  CURLOPT_POST              => true,
  CURLOPT_POSTFIELDS        => http_build_query($data)
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

echo !empty($err) ? $err : $response;

?>
import requests
import time
import hmac
import hashlib

try:
  apiKey = "api_key_anda"
  privateKey = "private_key_anda"

  merchant_code = "T0001"
  merchant_ref = "INV345675"
  amount = 1000000

  expiry = int(time.time() + (24*60*60)) # 24 jam

  signStr = "{}{}{}".format(merchant_code, merchant_ref, amount)
  signature = hmac.new(bytes(privateKey,'latin-1'), bytes(signStr,'latin-1'), hashlib.sha256).hexdigest()

  payload = {
    'method': 'BRIVA',
    'merchant_ref': merchant_ref,
    'amount': amount,
    'customer_name': 'Nama Pelanggan',
    'customer_email': '[email protected]',
    'customer_phone': '081234567890',
    'callback_url': 'https://domainanda.com/callback',
    'return_url': 'https://domainanda.com/redirect',
    'expired_time': expiry,
    'signature': signature
  }

  order_items = [
    {
      'sku': 'PRODUK1',
      'name': 'Nama Produk 1',
      'price': 500000,
      'quantity': 1
    },
    {
      'sku': 'PRODUK2',
      'name': 'Nama Produk 2',
      'price': 500000,
      'quantity': 1
    }
  ]

  i = 0
  for item in order_items:
    for k in item:
      payload['order_items['+ str(i) +']['+ str(k) +']'] = item[k]
    i += 1

  headers = {
    "Authorization": "Bearer " + apiKey
  }

  result = requests.post(url="https://tripay.co.id/api/transaction/create", data=payload, headers=headers)
  response = result.text
  print(response)
except Exception as e:
  print("Request Error: " + str(e))
const axios = require('axios'); // using Axios library
const crypto = require('crypto');

var apiKey = "api_key_anda";
var privateKey = "private_key_anda";

var merchant_code = "T0001";
var merchant_ref = "INV345675";
var amount = 1000000;

var expiry = parseInt(Math.floor(new Date()/1000) + (24*60*60)); # 24 jam

var signature = crypto.createHmac('sha256', privateKey).update(merchant_code + merchant_ref + amount).digest('hex');

var payload = {
    'method': 'BRIVA',
    'merchant_ref': merchant_ref,
    'amount': amount,
    'customer_name': 'Nama Pelanggan',
    'customer_email': '[email protected]',
    'customer_phone': '081234567890',
    'order_items': [
      {
        'sku': 'PRODUK1',
        'name': 'Nama Produk 1',
        'price': 500000,
        'quantity': 1
      },
      {
        'sku': 'PRODUK2',
        'name': 'Nama Produk 2',
        'price': 500000,
        'quantity': 1
      }
    ],
    'callback_url': 'https://domainanda.com/callback',
    'return_url': 'https://domainanda.com/redirect',
    'expired_time': expiry,
    'signature': signature
  }

axios.post('https://tripay.co.id/api/transaction/create', payload, {
  headers: {
    'Authorization': 'Bearer ' + apiKey
  }
})
.then((res) => {
  console.log(res)
})
.catch((error) => {
  console.error(error)
});

Response

{
  "success": true,
  "message": "",
  "data": {
    "reference": "T0001000000000000006",
    "merchant_ref": "INV345675",
    "payment_selection_type": "static",
    "payment_method": "BRIVA",
    "payment_name": "BRI Virtual Account",
    "customer_name": "Nama Pelanggan",
    "customer_email": "[email protected]",
    "customer_phone": "081234567890",
    "callback_url": "https://domainanda.com/callback",
    "return_url": "https://domainanda.com/redirect",
    "amount": 1000000,
    "fee_merchant": 1500,
    "fee_customer": 0,
    "total_fee": 1500,
    "amount_received": 998500,
    "pay_code": "57585748548596587",
    "pay_url": null,
    "checkout_url": "https://tripay.co.id/checkout/T0001000000000000006",
    "status": "UNPAID",
    "expired_time": 1582855837,
    "order_items": [
      {
        "sku": "PRODUK1",
        "name": "Nama Produk 1",
        "price": 500000,
        "quantity": 1,
        "subtotal": 500000
      },
      {
        "sku": "PRODUK2",
        "name": "Nama Produk 2",
        "price": 500000,
        "quantity": 1,
        "subtotal": 500000
      }
    ],
    "instructions": [
      {
        "title": "Internet Banking",
        "steps": [
          "Login ke internet banking Bank BRI Anda",
          "Pilih menu <b>Pembayaran</b> lalu klik menu <b>BRIVA</b>",
          "Pilih rekening sumber dan masukkan Kode Bayar (<b>57585748548596587</b>) lalu klik <b>Kirim</b>",
          "Detail transaksi akan ditampilkan, pastikan data sudah sesuai",
          "Masukkan kata sandi ibanking lalu klik <b>Request</b> untuk mengirim m-PIN ke nomor HP Anda",
          "Periksa HP Anda dan masukkan m-PIN yang diterima lalu klik <b>Kirim</b>",
          "Transaksi sukses, simpan bukti transaksi Anda"
        ]
      }
    ],
    "qr_string": null,
    "qr_url": null
  }
}
{
  "success": false,
  "message": "Invalid API Key"
}

API ini digunakan untuk mengambil detail transaksi yang pernah dibuat. Dapat juga digunakan untuk cek status pembayaran

Request

Method GET
Sandbox URL https://tripay.co.id/api-sandbox/transaction/detail
Production URL https://tripay.co.id/api/transaction/detail
Key Value Keterangan
Authorization Bearer {api_key} Ganti {api_key} dengan API Key merchant Anda
Parameter Contoh Nilai Tipe Wajib Keterangan
reference T0001000000000000006 String YA Kode referensi transaksi
<?php

$apiKey = 'api_key_anda';

$payload = [
	'reference'	=> 'T0001000000000000006'
];

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_FRESH_CONNECT     => true,
  CURLOPT_URL               => "https://tripay.co.id/api/transaction/detail?".http_build_query($payload),
  CURLOPT_RETURNTRANSFER    => true,
  CURLOPT_HEADER            => false,
  CURLOPT_HTTPHEADER        => array(
    "Authorization: Bearer ".$apiKey
  ),
  CURLOPT_FAILONERROR       => false,
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

echo !empty($err) ? $err : $response;

?>
import requests

apiKey = "api_key_anda"

try:
  payload = {
    "reference": "T0001000000000000006"
  }

  headers = {
    "Authorization": "Bearer " + apiKey
  }

  result = requests.get(url="https://tripay.co.id/api/transaction/detail", params=payload, headers=headers)
  response = result.text
  print(response)
except Exception as e:
  print("Request Error: " + str(e))
const axios = require('axios'); // using Axios library

var apiKey = "api_key_anda";

axios.get('https://tripay.co.id/api/transaction/detail?reference=T0001000000000000006', {
  headers: {
    'Authorization': 'Bearer ' + apiKey
  }
})
.then((res) => {
  console.log(res)
})
.catch((error) => {
  console.error(error)
});

Response

{
  "success": true,
  "message": "",
  "data": {
    "reference": "T0001000000000000006",
    "merchant_ref": "INV345675",
    "payment_selection_type": "static",
    "payment_method": "BRIVA",
    "payment_name": "BRI Virtual Account",
    "customer_name": "Nama Pelanggan",
    "customer_email": "[email protected]",
    "customer_phone": "081234567890",
    "callback_url": "https://domainanda.com/callback",
    "return_url": "https://domainanda.com/redirect",
    "amount": 1000000,
    "fee_merchant": 1500,
    "fee_customer": 0,
    "total_fee": 1500,
    "amount_received": 998500,
    "pay_code": "57585748548596587",
    "pay_url": null,
    "checkout_url": "https://tripay.co.id/checkout/T0001000000000000006",
    "status": "PAID",
    "paid_time": "1582856000",
    "expired_time": 1582855837,
    "order_items": [
      {
        "sku": "PRODUK1",
        "name": "Nama Produk 1",
        "price": 500000,
        "quantity": 1,
        "subtotal": 500000
      },
      {
        "sku": "PRODUK2",
        "name": "Nama Produk 2",
        "price": 500000,
        "quantity": 1,
        "subtotal": 500000
      }
    ],
    "instructions": [
      {
        "title": "Internet Banking",
        "steps": [
          "Login ke internet banking Bank BRI Anda",
          "Pilih menu <b>Pembayaran</b> lalu klik menu <b>BRIVA</b>",
          "Pilih rekening sumber dan masukkan Kode Bayar (<b>57585748548596587</b>) lalu klik <b>Kirim</b>",
          "Detail transaksi akan ditampilkan, pastikan data sudah sesuai",
          "Masukkan kata sandi ibanking lalu klik <b>Request</b> untuk mengirim m-PIN ke nomor HP Anda",
          "Periksa HP Anda dan masukkan m-PIN yang diterima lalu klik <b>Kirim</b>",
          "Transaksi sukses, simpan bukti transaksi Anda"
        ]
      },
      {
        "title": "Aplikasi BRImo",
        "steps": [
          "Login ke aplikasi BRImo Anda",
          "Pilih menu <b>BRIVA</b>",
          "Pilih sumber dana dan masukkan Nomor Pembayaran (<b>57585748548596587</b>) lalu klik <b>Lanjut</b>",
          "Klik <b>Lanjut</b>",
          "Detail transaksi akan ditampilkan, pastikan data sudah sesuai",
          "Klik <b>Konfirmasi</b>",
          "Klik <b>Lanjut</b>",
          "Masukkan kata sandi ibanking Anda",
          "Klik <b>Lanjut</b>",
          "Transaksi sukses, simpan bukti transaksi Anda"
        ]
      }
    ]
  }
}
{
  "success": false,
  "message": "Invalid API Key"
}

Untuk melakukan request transaksi open payment, Anda harus membuat signature yang akan divalidasi sistem TriPay untuk memastikan integritas data dan pengirim saat ditransmisikan ke sistem TriPay. Pada permintaan request Transaksi baru, signature ini dibuat dari kombinasi Kode Merchant, Kode channel pembayaran, dan Nomor referensi dari sistem merchant

Ketiga data tersebut di-hash menggunakan jenis algoritma HMAC-SHA256 yang dikunci dengan Private Key Merchant. Berikut adalah contoh pembuatan signature.

<?php

$privateKey = 'ytf6ooi2gmlNPfpchd94jDOk8hRWOu';
$merchantCode = 'T0001';
$channel = 'BCAVA';
$merchantRef = 'INV55567';

$signature = hash_hmac('sha256', $merchantCode.$channel.$merchantRef, $privateKey);

// result
// d239007921976248f10959295cbc0b45bbe2435f29c12d216cae0b6a1903f95e

?>
import hmac
import hashlib

privateKey = "ytf6ooi2gmlNPfpchd94jDOk8hRWOu"
merchant_code = "T0001"
merchant_ref = "INV55567"
channel = "BCAVA"

signStr = "{}{}{}".format(merchant_code, channel, merchant_ref)
signature = hmac.new(bytes(privateKey,'latin-1'), bytes(signStr,'latin-1'), hashlib.sha256).hexdigest()

# result
# d239007921976248f10959295cbc0b45bbe2435f29c12d216cae0b6a1903f95e
const crypto = require('crypto')

var privateKey = "ytf6ooi2gmlNPfpchd94jDOk8hRWOu";
var merchant_code = "T0001";
var merchant_ref = "INV55567";
var channel = "BCAVA";

var signature = crypto.createHmac('sha256', privateKey).update(merchant_code + channel + merchant_ref).digest('hex');

// result
// 9f167eba844d1fcb369404e2bda53702e2f78f7aa12e91da6715414e65b8c86a

API ini digunakan untuk membuat transaksi baru atau melakukan generate kode pembayaran untuk jenis Open Payment

Request

Method POST
Sandbox URL -
Production URL https://tripay.co.id/api/open-payment/create
Key Value Keterangan
Authorization Bearer {api_key} Ganti {api_key} dengan API Key merchant Anda
Parameter Contoh Nilai Tipe Wajib Keterangan
method BCAVAOP
Lihat lainnya
String YA Kode channel pembayaran
merchant_ref INV345675 String TIDAK Kode referensi transaksi dari sistem Anda. Kami akan mengirim balik nomor referensi ini ketika mengirim notifikasi status transaksi
customer_name Nama Pelanggan String TIDAK Nama Pelanggan
signature fwehf874g547744b5ybnfhf String YA Signature dibuat menggunakan hash HMAC-SHA256 yang dikunci dengan Private Key. (lihat pada tab Buat Signature)
<?php

$apiKey = 'api_key_anda';
$privateKey = 'private_key_anda';
$merchantCode = 'kode merchant anda';
$merchantRef = 'nomor referensi merchant anda';
$method = 'BCAVA';

$data = [
  'method'            => $method,
  'merchant_ref'      => $merchantRef,
  'customer_name'     => 'Nama Pelanggan',
  'signature'         => hash_hmac('sha256', $merchantCode.$method.$merchantRef, $privateKey)
];

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_FRESH_CONNECT     => true,
  CURLOPT_URL               => "https://tripay.co.id/api/open-payment/create",
  CURLOPT_RETURNTRANSFER    => true,
  CURLOPT_HEADER            => false,
  CURLOPT_HTTPHEADER        => array(
    "Authorization: Bearer ".$apiKey
  ),
  CURLOPT_FAILONERROR       => false,
  CURLOPT_POST              => true,
  CURLOPT_POSTFIELDS        => http_build_query($data)
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

echo !empty($err) ? $err : $response;

?>
import requests
import time
import hmac
import hashlib

try:
  apiKey = "api_key_anda"
  privateKey = "private_key_anda"

  merchant_code = "T0001"
  merchant_ref = "INV345675"
  method = "BCAVA"

  signStr = "{}{}{}".format(merchant_code, method, merchant_ref)
  signature = hmac.new(bytes(privateKey,'latin-1'), bytes(signStr,'latin-1'), hashlib.sha256).hexdigest()

  payload = {
    'method': method,
    'merchant_ref': merchant_ref,
    'customer_name': 'Nama Pelanggan',
    'signature': signature
  }

  headers = {
    "Authorization": "Bearer " + apiKey
  }

  result = requests.post(url="https://tripay.co.id/api/open-payment/create", data=payload, headers=headers)
  response = result.text
  print(response)
except Exception as e:
  print("Request Error: " + str(e))
const axios = require('axios'); // using Axios library
const crypto = require('crypto');

var apiKey = "api_key_anda";
var privateKey = "private_key_anda";

var merchant_code = "T0001";
var merchant_ref = "INV345675";
var method = "BCAVA";

var expiry = parseInt(Math.floor(new Date()/1000) + (24*60*60)); # 24 jam

var signature = crypto.createHmac('sha256', privateKey).update(merchant_code + method + merchant_ref).digest('hex');

var payload = {
    'method': method,
    'merchant_ref': merchant_ref,
    'customer_name': 'Nama Pelanggan',
    'signature': signature
  }

axios.post('https://tripay.co.id/api/open-payment/create', payload, {
  headers: {
    'Authorization': 'Bearer ' + apiKey
  }
})
.then((res) => {
  console.log(res)
})
.catch((error) => {
  console.error(error)
});

Response

{
  "success": true,
  "message": "",
  "data": {
    "uuid": "T0001OP9376HnpS",
    "merchant_ref": "INV345675",
    "customer_name": "Nama Pelanggan",
    "payment_name": "BCA Virtual Account",
    "payment_method": "BCAVA",
    "pay_code": "1234567890",
    "qr_string": null,
    "qr_url": null
  }
}
{
  "success": false,
  "message": "Invalid API Key"
}

API ini digunakan untuk mengambil detail transaksi open payment yang pernah dibuat

Request

Method GET
Sandbox URL -
Production URL https://tripay.co.id/api/open-payment/{uuid}/detail
Key Value Keterangan
Authorization Bearer {api_key} Ganti {api_key} dengan API Key merchant Anda
Parameter Contoh Nilai Tipe Wajib Keterangan
-
<?php

$apiKey = 'api_key_anda';

$uuid = "T0001OP9376HnpS";

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_FRESH_CONNECT     => true,
  CURLOPT_URL               => "https://tripay.co.id/api/open-payment/".$uuid."/detail",
  CURLOPT_RETURNTRANSFER    => true,
  CURLOPT_HEADER            => false,
  CURLOPT_HTTPHEADER        => array(
    "Authorization: Bearer ".$apiKey
  ),
  CURLOPT_FAILONERROR       => false,
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

echo !empty($err) ? $err : $response;

?>
import requests

apiKey = "api_key_anda"

try:
  uuid = "T0001OP9376HnpS"

  headers = {
    "Authorization": "Bearer " + apiKey
  }

  result = requests.get(url="https://tripay.co.id/api/open-payment/" + uuid + "/detail", headers=headers)
  response = result.text
  print(response)
except Exception as e:
  print("Request Error: " + str(e))
const axios = require('axios'); // using Axios library

var apiKey = "api_key_anda";

var uuid = "T0001OP9376HnpS";

axios.get('https://tripay.co.id/api/open-payment/' + uuid + '/detail', {
  headers: {
    'Authorization': 'Bearer ' + apiKey
  }
})
.then((res) => {
  console.log(res)
})
.catch((error) => {
  console.error(error)
});

Response

{
  "success": true,
  "message": "",
  "data": {
    "uuid": "T0001OP9376HnpS",
    "merchant_ref": "INV345675",
    "customer_name": "Nama Pelanggan",
    "payment_name": "BCA Virtual Account",
    "payment_method": "BCAVA",
    "pay_code": "1234567890",
    "qr_string": null,
    "qr_url": null
  }
}
{
  "success": false,
  "message": "Invalid API Key"
}

API ini digunakan untuk mengambil daftar pembayaran yang masuk pada open payment

Request

Method GET
Sandbox URL -
Production URL https://tripay.co.id/api/open-payment/{uuid}/transactions
Key Value Keterangan
Authorization Bearer {api_key} Ganti {api_key} dengan API Key merchant Anda
Parameter Contoh Nilai Tipe Wajib Keterangan
referenceT0001000000000000006StringTidakNomor referensi transaksi
merchant_refINV345675StringTidakNomor referensi dari sistem merchant
start_date2020-11-23 00:00:00StringTidakTanggal awal transaksi. Format: Y-m-d H:i:s
end_date2020-11-23 23:59:59StringTidakTanggal akhir transaksi. Format: Y-m-d H:i:s
per_page25IntegerTidakJumlah data per halaman (default: 25, max: 100)
<?php

$apiKey = 'api_key_anda';

$uuid = "T0001OP9376HnpS";

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_FRESH_CONNECT     => true,
  CURLOPT_URL               => "https://tripay.co.id/api/open-payment/".$uuid."/transactions",
  CURLOPT_RETURNTRANSFER    => true,
  CURLOPT_HEADER            => false,
  CURLOPT_HTTPHEADER        => array(
    "Authorization: Bearer ".$apiKey
  ),
  CURLOPT_FAILONERROR       => false,
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

echo !empty($err) ? $err : $response;

?>
import requests

apiKey = "api_key_anda"

try:
  uuid = "T0001OP9376HnpS"

  headers = {
    "Authorization": "Bearer " + apiKey
  }

  result = requests.get(url="https://tripay.co.id/api/open-payment/" + uuid + "/transactions", headers=headers)
  response = result.text
  print(response)
except Exception as e:
  print("Request Error: " + str(e))
const axios = require('axios'); // using Axios library

var apiKey = "api_key_anda";

var uuid = "T0001OP9376HnpS";

axios.get('https://tripay.co.id/api/open-payment/' + uuid + '/transactions', {
  headers: {
    'Authorization': 'Bearer ' + apiKey
  }
})
.then((res) => {
  console.log(res)
})
.catch((error) => {
  console.error(error)
});

Response

{
    "success": true,
    "message": "",
    "data": [
        {
            "reference": "T0001000000000000006",
            "merchant_ref": "INV345675",
            "payment_method": "BCAVA",
            "payment_name": "BCA Virtual Account",
            "customer_name": "Nama Pelanggan",
            "amount": 10000,
            "fee_merchant": 4250,
            "fee_customer": 0,
            "total_fee": 4250,
            "amount_received": 5750,
            "checkout_url": "https://payment.tripay.co.id/checkout/T0001000000000000006",
            "status": "PAID",
            "paid_at": 1605967886
        },
        {
            "reference": "T0001000000000000007",
            "merchant_ref": "INV345675",
            "payment_method": "BCAVA",
            "payment_name": "BCA Virtual Account",
            "customer_name": "Nama Pelanggan",
            "amount": 10000,
            "fee_merchant": 4250,
            "fee_customer": 0,
            "total_fee": 4250,
            "amount_received": 5750,
            "checkout_url": "https://payment.tripay.co.id/checkout/T0001000000000000007",
            "status": "PAID",
            "paid_at": 1605975843
        }
    ],
    "pagination": {
        "total": 2,
        "data_from": 1,
        "data_to": 2,
        "per_page": 100,
        "current_page": 1,
        "last_page": 1,
        "next_page": null
    }
}
{
  "success": false,
  "message": "Invalid API Key"
}

Callback adalah metode pengiriman notifikasi transaksi dari server TriPay ke server pengguna. Pada saat pembayaran dari pelanggan diselesaikan, maka sistem TriPay akan memberikan notifikasi yang berisi data transaksi yang kemudian dapat dikelola lebih lanjut oleh sistem pengguna.

Selain dikirim pada saat pembayaran sukses, callback juga akan dikirim ketika terjadi perubahan status transaksi sehingga sistem pengguna dapat mengambil tindakan yang sesuai dengan status pembayaran

Callback diamankan dengan adanya tanda tangan (signature) yang wajib Anda validasi untuk memastikan bahwa callback dikirim dari sistem kami dan data callback tidak berubah sewaktu dikirim. Dibawah ini adalah contoh pembuatan signature yang nantinya harus Anda cocokkan dengan X-Callback-Signature yang terkirim bersama dengan notifikasi transaksi.

Pembuatan Signature

<?php

$privateKey = 'ytf6ooi2gmlNPfpchd94jDOk8hRWOu';

// ambil data json callback notifikasi
$json = file_get_contents("php://input");
$signature = hash_hmac('sha256', $json, $privateKey);

// result
// 9f167eba844d1fcb369404e2bda53702e2f78f7aa12e91da6715414e65b8c86a

?>
from flask import Flask, request, jsonify # we are using Flask
import hmac
import hashlib

privateKey = "ytf6ooi2gmlNPfpchd94jDOk8hRWOu";

jsonString = jsonify(request.get_json(force=True))
signature = hmac.new(bytes(privateKey,'latin-1'), bytes(jsonString,'latin-1'), hashlib.sha256).hexdigest()

# result
# 9f167eba844d1fcb369404e2bda53702e2f78f7aa12e91da6715414e65b8c86a

const crypto = require("crypto");
const HmacSHA256 = crypto.createHmac("sha256", "your_private_key_here");
const express = require('express'); // we are using Express JS
const app = express();

app.use(express.json());

app.post('/your-callback-endpoint', function(request, response){
  var json = request.body;
  var signature = HmacSHA256.update(json).digest("hex");
  console.log(signature);
});

app.listen(3000);    
                

Request

Method POST
URL URL callback yang diatur di halaman Merchant atau pada saat request transaksi
Key Contoh Nilai Keterangan
Content-Type application/json Data callback dikirim menggunakan format JSON
X-Callback-Signature 85d99ec90d36c93dad61a98928ef63 Signature callback
X-Callback-Event payment_status Event callback. Contoh: payment_status
Parameter Contoh Nilai Tipe Keterangan
reference T0001000000000000006 String Kode referensi transaksi
merchant_ref INV364654 String|Null Kode referensi dari sistem merchant
payment_method BRI Virtual Account String Nama channel pembayaran yang digunakan
payment_method_code BRIVA String Kode channel pembayaran yang digunakan
total_amount 200000 Integer Jumlah pembayaran yang dibayar pelanggan
fee_merchant 2000 Integer Jumlah biaya yang dikenakan ke merchant
fee_customer 0 Integer Jumlah biaya yang dikenakan ke pelanggan
total_fee 2000 Integer Jumlah total biaya yang dikenakan
amount_received 198000 Integer Jumlah bersih yang diterima merchant
is_closed_payment 1 Integer 0 = Open Payment
1 = Closed Payment
status PAID String Status transaksi
paid_at 1585574209 Integer|Null Timestamp waktu pembayaran sukses
note Transaksi sukses String|Null Keterangan tambahan
{
    "reference": "T0001000023000XXXXX",
    "merchant_ref": "INV123456",
    "payment_method": "BCA Virtual Account",
    "payment_method_code": "BCAVA",
    "total_amount": 200000,
    "fee_merchant": 2000,
    "fee_customer": 0,
    "total_fee": 2000,
    "amount_received": 198000,
    "is_closed_payment": 1,
    "status": "PAID",
    "paid_at": 1608133017,
    "note": null
}

Response

Ketika sistem Anda berhasil menerima callback dari kami, sistem Anda harus merespon dengan format JSON yang telah ditentukan. Apabila sistem kami tidak menerima respon yang sesuai, maka akan dianggap gagal dan sistem kami akan mencoba mengirimkan ulang callback dengan jeda waktu 2 menit hingga maksimal 3 kali.

{
    "success": true
}
<?php

// include file koneksi database
require('database.php');

// ambil data JSON
$json = file_get_contents("php://input");

// ambil callback signature
$callbackSignature = isset($_SERVER['HTTP_X_CALLBACK_SIGNATURE']) ? $_SERVER['HTTP_X_CALLBACK_SIGNATURE'] : '';

// generate signature untuk dicocokkan dengan X-Callback-Signature
$signature = hash_hmac('sha256', $json, 'private_key_anda');

// validasi signature
if( $callbackSignature !== $signature ) {
    exit("Invalid Signature"); // signature tidak valid, hentikan proses
}

$data = json_decode($json);
$event = $_SERVER['HTTP_X_CALLBACK_EVENT'];

if( $event == 'payment_status' )
{
    $merchantRef = $db->real_escape_string($data->merchant_ref);
    $totalAmount = (int) $db->real_escape_string($data->total_amount);

    // lakukan validasi status
    if( $data->status == 'PAID' )
    {
        // pembayaran sukses, lanjutkan proses sesuai sistem Anda, contoh:
        $sql = "SELECT * FROM tbl_invoices WHERE ref = '{$merchantRef}' AND status = 'UNPAID' LIMIT 1";
        if( ($getInvoice = $db->query($sql)) )
        {
            while( $invoice = $getInvoice->fetch_object() )
            {
                // lakukan validasi nominal pembayaran
                if( intval($invoice->total_amount) == $totalAmount )
                {
                    $update = "UPDATE tbl_invoices SET status = 'PAID' WHERE id = {$invoice->id}";
                    $db->query($update) or die($db->error);

                    echo json_encode(['success' => true]); // berikan respon yang sesuai
                    exit;
                }
                else
                {
                    die("Invalid amount. Expected: ".$invoice->total_amount." | Received: ".$totalAmount);
                }
            }
        }
    }
    elseif( $data->status == 'EXPIRED' )
    {
        // pembayaran kadaluarsa, lanjutkan proses sesuai sistem Anda, contoh:
        $sql = "SELECT * FROM tbl_invoices WHERE ref = '{$merchantRef}' AND status = 'UNPAID' LIMIT 1";
        if( ($getInvoice = $db->query($sql)) )
        {
            while( $invoice = $getInvoice->fetch_object() )
            {
                $update = "UPDATE tbl_invoices SET status = 'CANCELED' WHERE id = {$invoice->id}";
                $db->query($update) or die($db->error);

                echo json_encode(['success' => true]); // berikan respon yang sesuai
                exit;
            }
        }
    }
    elseif( $data->status == 'FAILED' )
    {
        // pembayaran gagal, lanjutkan proses sesuai sistem Anda, contoh:
        $sql = "SELECT * FROM tbl_invoices WHERE ref = '{$merchantRef}' AND status = 'UNPAID' LIMIT 1";
        if( ($getInvoice = $db->query($sql)) )
        {
            while( $invoice = $getInvoice->fetch_object() )
            {
                $update = "UPDATE tbl_invoices SET status = 'CANCELED' WHERE id = {$invoice->id}";
                $db->query($update) or die($db->error);

                echo json_encode(['success' => true]); // berikan respon yang sesuai
                exit;
            }
        }
    }
}

die("No action was taken");

?>
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Order;

class CallbackController extends Controller
{
    protected $privateKey = 'private_key_anda';

    public function handle(Request $request)
    {
        // ambil callback signature
        $callbackSignature = $request->server('HTTP_X_CALLBACK_SIGNATURE') ?? '';

        // ambil data JSON
        $json = $request->getContent();

        // generate signature untuk dicocokkan dengan X-Callback-Signature
        $signature = hash_hmac('sha256', $json, $this->privateKey);

        // validasi signature
        if( $callbackSignature !== $signature ) {
            return "Invalid Signature"; // signature tidak valid, hentikan proses
        }

        $data = json_decode($json);
        $event = $request->server('HTTP_X_CALLBACK_EVENT');

        if( $event == 'payment_status' )
        {
            $merchantRef = $data->merchant_ref;

            // pembayaran sukses, lanjutkan proses sesuai sistem Anda, contoh:
            $order = Order::where('id', $merchantRef)
                ->where('status', 'UNPAID')
                ->first();

            if( !$order ) {
                return "Order not found or current status is not UNPAID";
            }

            // Lakukan validasi nominal
            if( intval($data->total_amount) !== intval($order->total_amount) ) {
                return "Invalid amount";
            }

            if( $data->status == 'PAID' ) // handle status PAID
            {
                $order->update([
                    'status'	=> 'PAID'
                ]);

                return response()->json([
                    'success' => true
                    ]);
            }
            elseif( $data->status == 'EXPIRED' ) // handle status EXPIRED
            {
                $order->update([
                    'status'	=> 'CANCELED'
                ]);

                return response()->json([
                    'success' => true
                    ]);
            }
            elseif( $data->status == 'FAILED' ) // handle status FAILED
            {
                $order->update([
                    'status'	=> 'CANCELED'
                ]);

                return response()->json([
                    'success' => true
                    ]);
            }
        }

        return "No action was taken";
    }
}
?>