NAV Navbar
javascript json

Perkenalan

SNAP atau Standar Nasional Open Api merupakan peraturan yang ditetapkan oleh Bank Indonesia melalui Surat Keputusan Gubernur Bank Indonesia No.23/10/KEP.GBI/2021 tanggal 16 Agustus 2021 tentang Penetapan Standar Open API (Application Programming Interface) Pembayaran yang dikelola oleh ASPI (Asosiasi Sistem Pembayaran Indonesia).

SNAP berperan sebagai protokol dan instruksi nasional yang memfasilitasi interkoneksi antar aplikasi dalam standar proses transaksi pembayaran untuk gateway pembayaran dan ditentukan oleh Bank Indonesia.

Saat ini Duitku sebagai salah satu payment gateway sedang bergerak menerapkan standar tersebut. Berikut alur yang telah disiapkan dan disesuaikan untuk Anda.

API SNAP

Berikut adalah host yang digunakan untuk API:

Registrasi SNAP di Duitku

Untuk dapat menggunakan API yang telah terstandarisasi oleh SNAP, merchant perlu mendapatkan persetujuan dari ASPI berupa surat rekomendasi. Untuk menerima surat tersebut, merchant harus melakukan uji developer site dan uji fungsionalitas.

  1. Uji Developer Site: Pengujian ini dilakukan di halaman ASPI, yang bertujuan untuk memastikan API telah sesuai dengan standar teknis dan keamanan dari SNAP. Untuk melakukan uji developer site, merchant harus mendaftar pada halaman registrasi di ASPI terlebih dahulu. Selanjutnya, merchant dapat melakukan pengujian dengan mengikuti petunjuk uji developer site pada website ASPI. Uji developer site meliputi minimal 1 test skenario positif dan 1 skenario negatif untuk setiap sub API yang digunakan.

  2. Uji Fungsionalitas: Setelah hasil uji developer site sudah sesuai dengan standar, merchant dapat melakukan Uji Fungsionalitas yang telah disediakan. Uji fungsionalitas dilakukan untuk menguji komponen API SNAP yang telah terintegrasi dengan Duitku secara end-to-end.

Sebelum memulai integrasi SNAP, Anda perlu melakukan registrasi SNAP di Duitku, silahkan kirim kunci publik, informasi, dan dokumen yang diperlukan menggunakan email yang terdaftar di Duitku ke [email protected].

Anda perlu mengirimkan 2 email terpisah ke Duitku. Untuk memudahkan proses registrasi, Anda harus menggunakan email utama yang terdaftar di Duitku. Berikut adalah informasi dan dokumen yang perlu Anda lampirkan saat mengirim email tersebut:

Email Pertama:

  1. Project code sandbox
  2. Layanan API yang dibutuhkan. Adapun layanan API yang Duitku sediakan adalah sebagai berikut:
    1. Virtual Account
    2. Direct Debit Redirect
    3. Direct Debit Linking
    4. QRIS-MPM
  3. File Zip yang berisi Kunci Publik dalam bentuk format .pem dan diberi kata sandi. Untuk aturan membuat kunci publik dapat dilihat pada Public Key dan Private Key
  4. URL payment SNAP untuk menerima notifikasi pembayaran. URL ini harus mengikuti standar notifikasi pembayaran dan sesuai dengan layanan API yang dibutuhkan:
    1. Payment Virtual Account
    2. Payment Notify Direct Debit
    3. Payment Notify QRIS-MPM

Anda dapat menggunakan format email di sini.

Email Kedua:

  1. Kata sandi untuk membuka Zip file pada Kunci Publik yang telah dikirimkan sebelumnya

Otentikasi API

Otentikasi di SNAP API ada:

  1. Private Key dan Public Key
  2. Bearer Token
  3. Signature

Public Key dan Private Key

Buat pasangan kunci RSA untuk akses Anda. Simpan kunci pribadi dan simpan dengan aman dan terlindungi. Kemudian Anda perlu mengirimkan kunci publik ke Duitku untuk memberi Anda akses untuk meminta API. Pastikan Anda membuat kunci dalam 2048-bit.

Berikut ini contoh cara membuat kunci publik dan privat RSA:

  1. Anda bisa menggunakan Git OpenSSL.
  2. Git OpenSSL biasanya perlu dijalankan di direktorinya. Jalankan perintah di bawah ini. (Contoh Windows)
    cd "..\..\Program Files\Git\usr\bin"
  3. Kemudian, buat kunci pribadi menggunakan perintah berikut:
    openssl genrsa -out C:\Users\{your_users}\Desktop\PrivateKey.pem 2048
  4. Setelah Anda membuat kunci privat, Anda dapat membuat kunci publik menggunakan kunci privat dengan perintah di bawah ini:
    openssl rsa -in C:\Users\{your_users}\Desktop\PrivateKey.pem -pubout -out C:\Users\{your_users}\Desktop\Publickey.pem

Sekarang, Anda harus memiliki pasangan kunci RSA. Selanjutnya, Anda perlu menyimpan dan memasukkan kunci pribadi pada proyek Anda dan mengirimkan kunci publik ke Duitku. Anda mungkin memerlukan kunci pribadi dalam proyek Anda sehingga proyek Anda harus tetap memiliki akses.

Bearer Token

Saat Anda bekerja dengan API web, Bearer Token adalah token akses yang sering digunakan untuk tujuan otorisasi. Token ini bertindak seperti kunci keamanan yang digunakan server untuk memverifikasi bahwa permintaan tersebut berasal dari pengguna atau layanan yang diautentikasi.

Untuk menggunakan Bearer Token dengan SNAP API, Anda perlu mendapatkan token dengan memberikan kredensial Anda ke titik akhir autentikasi.

Get Token API

Untuk menggunakan contoh kode ini Anda mungkin perlu menginstal npm axios dan jsrsasign.
Instal paket pada proyek Anda menggunakan npm:

npm install axios jsrsasign jsrsasign-util

Salin kode di bawah ini:
(pilih tab javascript untuk menampilkan contoh kode)

const axios = require("axios")
const rs = require('jsrsasign')
const rsu = require('jsrsasign-util')
const CryptoJS = require('crypto-js')
const partnerId = "DXXXX"
const date = new Date()
const headers = headersAuthGenerator(partnerId, date)
const body = {
    "grantType": "client_credentials"
}
axios.post("https://snapdev.duitku.com/auth/v1.0/access-token/b2b/", body, {headers: headers })
    .then(response => res.json(response.data))
    .catch(err => res.json(err.response.data))

//Function to create headers
function headersAuthGenerator(partnerId, date){
    let stringToSign = `${partnerId}|${toIsoString(date)}`

    //read your private key from your private key file
    let privateKey = rs.KEYUTIL.getKey(rsu.readFile("./mykey/privatekey.pem"))
    let sign = new rs.KJUR.crypto.Signature({"alg": "SHA256withRSA"});
    sign.init(privateKey)
    let hash = sign.signString(stringToSign)
    const signature = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(hash))
    let headers = {
        "X-TIMESTAMP": toIsoString(date),
        "X-SIGNATURE": signature,
        "X-CLIENT-KEY": partnerId
    }
    return headers
}

//function to iso string helper
function toIsoString(date) {
    var tzo = -date.getTimezoneOffset(),
        dif = tzo >= 0 ? '+' : '-',
        pad = function(num) {
            return (num < 10 ? '0' : '') + num;
        };

    return date.getFullYear() +
        '-' + pad(date.getMonth() + 1) +
        '-' + pad(date.getDate()) +
        'T' + pad(date.getHours()) +
        ':' + pad(date.getMinutes()) +
        ':' + pad(date.getSeconds()) +
        dif + pad(Math.floor(Math.abs(tzo) / 60)) +
        ':' + pad(Math.abs(tzo) % 60);
}

Method : HTTP POST

Type : application/json

Development : https://snapdev.duitku.com/auth/v1.0/access-token/b2b

Production : https://snap.duitku.com/auth/v1.0/access-token/b2b

Service Code : 73

Header :

Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Pemeriksaan Non-Repudiasi & Integritas X-Signature dengan algoritma asimetris.
Formula:
stringToSign = Client Key + “|” + Timestamp
signature = SHA256withRSA(Private_Key, stringToSign)
X-CLIENT-KEY string

Id Proyek disediakan oleh Duitku. DXXXX

Body :

{
    "grantType": "client_credentials"
}
Parameter Tipe Mandatori Keterangan Contoh
grantType string

The value is "client_credentials" "client_credentials"

Response :

{
    "responseCode": "2007300",
    "responseMessage": "Successful",
    "accessToken": "ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0",
    "tokenType": "Bearer",
    "expiresIn": "900"
}
Code Message Keterangan
2007300 Successful Berhasil di proses dan mendapatkan accessToken.
4007301 Invalid Field Format {grantType} Nilai value yang tidak tepat untuk parameter grantType.
4007302 Invalid Mandatory Field {grantType} Parameter grantType tidak ada.
4007302 Invalid Client Key or Timestamp or Signature Terjadi kesalahan di antara Client Key, Timestamp atau Signature.
4017300 Invalid Client Key Kekeliruan pada Client Key.
4017300 Invalid Signature Kekeliruan pada Signature.

Signature

Mekanisme keamanan Tanda Tangan untuk API Pembayaran menawarkan dua pendekatan berbeda. Pertama, memanfaatkan fungsi kriptografi HMAC_512 simetris, di mana token akses merupakan bagian integral dari proses. Sebagai alternatif, fungsi kriptografi SHA256withRSA asimetris dapat digunakan, berfungsi secara independen dari token akses.

Disarankan bagi klien untuk mengadopsi fungsi kriptografi HMAC_512 simetris bersama dengan token akses saat membuat tanda tangan untuk API Metode Pembayaran. Metode ini memastikan pendekatan yang kuat dan aman.

Sebaliknya, Notify Payment API akan secara eksklusif memanfaatkan fungsi kriptografi SHA256withRSA asimetris, memastikan tindakan keamanan spesifik dan disesuaikan yang diterapkan oleh Duitku.

Penting untuk dicatat bahwa spesifikasi ini selaras dengan dokumen SNAP API Pembayaran yang disediakan oleh Bank Indonesia, yang dapat diakses di sini.

SNAP API Duitku bergantung pada penggunaan kunci API untuk otentikasi permintaan, sebuah aspek penting yang memerlukan perhatian khusus karena berbagai fitur keamanannya. Memastikan keamanan maksimal dari kunci API ini adalah hal yang terpenting.

Dalam proses transaksi yang melibatkan API Duitku, mitra kami wajib memberikan Kunci API sebagai kredensial yang ditentukan, yang disediakan oleh Duitku. Kunci ini berfungsi sebagai alat untuk mengautentikasi transaksi melalui metode autentikasi pembawa, menggunakan header -H "Authorization: Bearer ". Penting untuk diperhatikan bahwa semua permintaan API harus dilakukan melalui HTTPS untuk menjamin saluran komunikasi yang aman. Permintaan yang dilakukan melalui HTTP tidak akan berhasil.

Selain itu, segala upaya untuk mengakses API tanpa autentikasi yang tepat akan mengakibatkan kegagalan, hal ini menekankan pentingnya mematuhi protokol autentikasi yang ada.

Kerja sama Anda dalam mengikuti langkah-langkah keamanan ini sangat kami hargai, karena hal ini memastikan lingkungan yang kuat dan aman untuk transaksi API.

Symmetric

Untuk menggunakan contoh kode ini, Anda mungkin perlu menginstal npm crypto-js.
Instal paket pada proyek Anda menggunakan npm:

npm i crypto-js

Salin kode di bawah ini:
(pilih tab javascript untuk menampilkan contoh kode)

const CryptoJS = require('crypto-js')
function symetricGenerator(date, method, endpoint, body, accessToken, clientSecret){
    let minifyBody = JSON.stringify(body)
    let encBody = CryptoJS.SHA256(minifyBody).toString()
    let stringToSign = `${method}:${endpoint}:${accessToken}:${encBody.toLowerCase()}:${date}`
    let signature = CryptoJS.HmacSHA512(stringToSign, clientSecret).toString(CryptoJS.enc.Base64)
    console.log("minifyBody : ", minifyBody)
    console.log("encBody : ", encBody)
    console.log("stringToSign : ", stringToSign)
    return signature 
}

Formula:

stringToSign = HttpMethod + “:” + Endpoint + “:” + AccessToken + “:” + LowerCase(HexEncode(SHA-256(Minify(RequestBody)))) + “:” + Timestamp
hash = HMAC_SHA512(stringToSign, secretKey)
signature = Base64(hash)

Penjelasan:

Buatlah sebuah variabel stringToSign.

  1. HttpMethod adalah string nama metode yang sedang digunakan. Bisa saja POST, PUT, atau DELETE.
  2. Endpoint adalah relative URL atau full path URL yang mana tanpa host atau domainnya.
  3. AccessToken adalah nilai token yang Anda dapatkan dari API Get Token .
  4. RequestBody adalah payload yang ingin Anda kirim.
  5. Timestamp menggunakan ISO-8601.
  6. secretKey adalah rahasia klien atau kunci API proyek.

Hash stringToSign menggunakan HMAC_SHA512 cryptographic dan secret key (nama lain saat ini adalah API key). Kemudian, encode dengan Base 64.

Masukkan nilainya ke X-SIGNATURE.





Asymmetric

Asymmetric untuk get auth token API

Untuk menggunakan contoh kode ini, Anda mungkin perlu menginstal npm crypto-js dan jsrsasign.
Instal paket pada proyek Anda menggunakan npm:

npm i crypto-js jsrsasign jsrsasign-util

Salin kode di bawah ini:
(pilih tab javascript untuk menampilkan kode contoh)

const rs = require('jsrsasign')
const rsu = require('jsrsasign-util')
const CryptoJS = require('crypto-js')
function asymmetricGetAuthHelper(partnerId, date){
    let stringToSign = `${partnerId}|${toIsoString(date)}`
    let privateKey = rs.KEYUTIL.getKey(rsu.readFile("./mykey/privatekey.pem")) //your private key
    let sign = new rs.KJUR.crypto.Signature({"alg": "SHA256withRSA"});
    sign.init(privateKey)
    let hash = sign.signString(stringToSign)
    const signature = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(hash))

    return signature 
}

Formula:

stringToSign = ClientKey + “|” + Timestamp
hash = SHA256withRSA(stringToSign,privateKey)
signature = Base64(hash)

Penjelasan:

Buatlah sebuah variabel stringToSign.

  1. ClientKey adalah ID proyek.
  2. Timestamp menggunakan ISO-8601.
  3. privateKey adalah kunci RSA yang Anda buat. Lihat Public Key dan Private Key untuk melihat cara menghasilkannya.

Hash stringToSign menggunakan SHA256withRSA cryptographic dan secret key (nama lain saat ini adalah API key). Kemudian, encode dengan Base 64.

Masukkan nilainya ke X-SIGNATURE.









Asymmetric untuk payment atau notification

Untuk menggunakan contoh kode ini, Anda mungkin perlu menginstal npm crypto-js dan jsrsasign.
Instal paket pada proyek Anda menggunakan npm:

npm i crypto-js jsrsasign jsrsasign-util

Salin kode di bawah ini:
(pilih tab javascript untuk menampilkan contoh kode)

const rs = require('jsrsasign')
const rsu = require('jsrsasign-util')
const CryptoJS = require('crypto-js')

function paymentSignatureValidator(body, date, signature, url){
    let minifyBody = JSON.stringify(body)
    let encBody = CryptoJS.SHA256(minifyBody).toString()
    let stringToSign = `POST:${url}:${encBody.toLowerCase()}:${date}`
    let publicKey = rs.KEYUTIL.getKey(rsu.readFile("./duitkukey/duitku_publickey.pem"))
    let sign = new rs.KJUR.crypto.Signature({"alg": "SHA256withRSA"})
    sign.init(publicKey)
    sign.updateString(stringToSign)
    const isSignatureValid = sign.verify(CryptoJS.enc.Hex.stringify(CryptoJS.enc.Base64.parse(signature)))
    console.log("minifyBody", minifyBody)
    console.log("encBody", encBody)
    console.log("isSignatureValid", isSignatureValid)
    return isSignatureValid
}

Formula:

stringToSign = HttpMethod + “:” + Endpoint + “:” + LowerCase(HexEncode(SHA-256(Minify(RequestBody)))) + “:” + Timestamp
hash = SHA256withRSA(stringToSign, publicKey)
signature = Base64(hash)

Penjelasan:

Buatlah sebuah variabel stringToSign.

  1. HttpMethod adalah string nama metode yang sedang digunakan. Mereka seharusnya POST.
  2. Endpoint adalah relative URL atau full path URL yang mana tanpa host atau domainnya.
  3. RequestBody adalah payload yang dikirimkan dari Duitku.
  4. Timestamp menggunakan ISO-8601.
  5. publicKey adalah kunci RSA yang dihasilkan untuk Anda validasi yang telah diberikan oleh Duitku.

Hash stringToSign menggunakan SHA256withRSA cryptographic and secret key (nama lain saat ini adalah API key). Kemudian, encode dengan Base 64.

Masukkan nilainya ke X-SIGNATURE.

Virtual Account

Interaksi Antar API Akun Virtual

Siklus hidup akun virtual biasanya melibatkan beberapa tahapan, masing-masing ditangani oleh API berbeda. Interaksi antara API ini memastikan kelancaran pengelolaan akun virtual.

Create Virtual Account

Prosesnya dimulai dengan API Buat Akun Virtual, yang digunakan untuk membuat akun virtual baru dengan nomor akun virtual unik (virtualAccountNo) dan pengidentifikasi transaksi (trxId).

Update Virtual Account

Setelah pembuatan, jika ada kebutuhan untuk mengubah detail seperti nama atau jumlah akun, API Pembaruan Akun Virtual dapat digunakan. API ini memungkinkan modifikasi dilakukan menggunakan virtualAccountNo dan trxId yang sama yang disediakan selama pembuatan.

Inquiry Virtual Account

Pada titik mana pun, untuk mengambil rincian terkini dari akun virtual, seperti status, nama, atau jumlah, API Akun Virtual Inquiry digunakan. Hal ini membuat seseorang mendapat informasi tentang keadaan akun virtual menggunakan virtualAccountNo dan trxId terkait.

Delete Virtual Account

Terakhir, ketika akun virtual dibuat tidak dapat digunakan, API Hapus Akun Virtual ikut berperan. Ini akan membuat akun virtual kedaluwarsa untuk memastikannya tidak dapat lagi menerima pembayaran, memanfaatkan virtualAccountNo dan trxId asli untuk identifikasi.

Setiap interaksi API memerlukan virtualAccountNo dan trxId untuk mencocokkan informasi yang diberikan pada awalnya, memastikan operasi yang aman dan akurat di seluruh siklus hidup akun virtual.

Create VA

Duitku SNAP API Create VA Sequence Diagram

Method : HTTP POST

Type : application/json

Development : https://snapdev.duitku.com/merchant/va/v1.0/transfer-va/create-va

Production : https://snap.duitku.com/merchant/va/v1.0/transfer-va/create-va

Service Code : 27

Header :

Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat symmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

ID permintaan yang unik.
CHANNEL-ID string

Nilai seharusnya DUITKU DUITKU
Authorization string

Otentikasi dengan bearer token Bearer ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0

Body :

{
  "partnerServiceId": "123456",
  "customerNo": "1234567890",
  "virtualAccountNo": "1234561234567890",
  "virtualAccountName": "John Doe",
  "trxId": "Transaction-0001",
  "totalAmount": {
    "value": "120000.00",
    "currency": "IDR"
  },
  "virtualAccountTrxType": "C",
  "expiredDate": "2022-10-18T23:27:43+0700",
  "additionalInfo": {
    "minAmount": "0.00",
    "maxAmount": "0.00"
  }
}
Parameter Tipe Mandatori Keterangan Contoh
partnerServiceId String(10)

Prefix dari Duitku. 123456
customerNo String(20)

Nomor untuk VA. 1234567890
virtualAccountNo String(28)

PartnerServiceId + CustomerNo.
Rekomendasi:
Untuk maksimal karakter16 digits.
1234561234567890
virtualAccountName String(20)

Nama akan ditampilkan di sisi bank. John Doe
trxId String(50)

ID transaksi. Unik di setiap pembuatan VA. Transaction-0001
ExpiredDate string

ISO-8601. 2022-09-16T13:00:00+07:00
virtualAccountTrxType String(1)

Close Amount : C
Open Amount : O
C
totalAmount Object

Lihat tabel di bawah ini.
additionalInfo Object

Lihat tabel di bawah ini.

totalAmount:

Parameter Tipe Mandatori Keterangan Contoh
value String

ISO4217
dengan 2 desimal
Teruntuk Open Amount atur nilainya “0.00”.
100000.00
currency String(3)

Kode mata uang, hanya menerima IDR. IDR

additionalInfo:

Parameter Tipe Mandatori Keterangan Contoh
minAmount String

ISO4217
Open Amount diatur sama dengan minimum Anda yang telah diinformasikan oleh Duitku.
Close Amount atur nilainya “0.00”.
10000.00
maxAmount String

ISO4217
Open Amount diatur sama dengan maksimum yang telah diinformasikan oleh Duitku.
Close Amount atur nilainya “0.00”.
10000.00

Response :

{
  "responseCode": "2002700",
  "responseMessage": "Successful",
  "virtualAccountData": {
    "partnerServiceId": "98886699",
    "customerNo": "20000001",
    "virtualAccountNo": "9888669920000001",
    "virtualAccountName": "SNAP VA",
    "trxId": "CHECK-002",
    "totalAmount": {
      "value": "120000.00",
      "currency": "IDR"
    },
    "expiredDate": "2022-10-18T23:27:43+0700",
    "additionalInfo": {
      "minAmount": "0.00",
      "maxAmount": "0.00"
    }
  }
}

Seperti yang Anda lihat pada contoh respons JSON di sini. Anda harus fokus pada variabel virtualAccountData. Untuk responseCode dan responseMessage, ini menunjukkan permintaan proses Anda.

Code Message Keterangan
2002700 Successful Berhasil di proses dan mendapatkan virtualAccountData.
4002701 Invalid Field Format virtualAccountTrxType Nilai value yang tidak tepat untuk parameter virtualAccountTrxType.
4002701 Invalid Field Format duplicated TrxId Nilai value yang tidak tepat untuk parameter TrxId atau sudah pernah di gunakan.
4002701 Invalid Field Format maxAmount should not be greater than 50000000 Nilai value yang tidak tepat untuk parameter maxAmount.
4002701 Invalid Field Format totalAmount should not be less than 10000 Nilai value yang tidak tepat untuk parameter totalAmount.
4002701 Invalid Field Format totalAmount should not be greater than 50000000 Nilai value yang tidak tepat untuk parameter totalAmount.
4002701 Invalid Field Format totalAmount.Currency Nilai value yang tidak tepat untuk parameter totalAmount bagian Currency.
4002701 Invalid Field Format totalAmount.Value Nilai value yang tidak tepat untuk parameter totalAmount bagian value.
4002701 Invalid Field Format totalAmount Value must be greater than 0.00 for Close Amount and must be filled in 0.00 if Open Amount Nilai value yang tidak tepat untuk parameter totalAmount bagian value.
4002701 Invalid Field Format minAmount should not be less than 10000 Nilai value yang tidak tepat untuk parameter minAmount.
4002701 Invalid Field Format trxId Nilai value yang tidak tepat untuk parameter trxId.
4002701 Invalid Field Format virtualAccountNo Nilai value yang tidak tepat untuk parameter virtualAccountNo.
4002701 Invalid Field Format virtualAccountName Nilai value yang tidak tepat untuk parameter virtualAccountName.
4002701 Invalid Field Format partnerServiceId Nilai value yang tidak tepat untuk parameter partnerServiceId.
4002701 Invalid Field Format customerNo Nilai value yang tidak tepat untuk parameter customerNo.
4002701 Invalid Field Format param,totalAmount.value Format nilai yang tidak sesuai untuk parameter totalAmount bagian value.
4002701 Invalid Field Format param,virtualAccountName Format nilai yang tidak sesuai untuk parameter virtualAccountName.
4002701 Invalid Field Format param,customerNo Format nilai yang tidak sesuai untuk parameter customerNo.
4002701 Invalid Field Format param,virtualAccountTrxType Format nilai yang tidak sesuai untuk parameter virtualAccountTrxType.
4002701 Invalid Field Format param,virtualAccountNo Format nilai yang tidak sesuai untuk parameter virtualAccountNo.
4002701 Invalid Field Format param,partnerServiceId Format nilai yang tidak sesuai untuk parameter partnerServiceId.
4002701 Invalid Field Format param,trxId Format nilai yang tidak sesuai untuk parameter trxId.
4002701 Invalid Field Format param,expiredDate Format nilai yang tidak sesuai untuk parameter expiredDate.
4002702 Invalid Mandatory Field virtualAccountTrxType Parameter virtualAccountTrxType tidak ada.
4002702 Invalid Mandatory Field expiredDate Parameter expiredDate tidak ada.
4002702 Invalid Mandatory Field totalAmount Parameter totalAmount tidak ada.
4002702 Invalid Mandatory Field virtualAccountName Parameter virtualAccountName tidak ada.
4002702 Invalid Mandatory Field partnerServiceId Parameter partnerServiceId tidak ada.
4002702 Invalid Mandatory Field customerNo Parameter customerNo tidak ada.
4002702 Invalid Mandatory Field virtualAccountNo Parameter virtualAccountNo tidak ada.
4002702 Invalid Mandatory Field trxId Parameter trxId tidak ada.
4012700 Unauthorized Signature Kekeliruan pada Signature.
4012700 Unauthorized stringToSign Kekeliruan pada Signature.
4012700 Unauthorized Client Kekeliruan pada Client ID.
4012701 Invalid Access Token Access Token Kadaluarsa atau keliru.
4042712 Invalid Bill/Virtual Account Already Exists Nomor VA sudah terdaftar.
4092700 Conflict Kekeliruan pada External ID.

Tipe Virtual Account

Ada dua macam jenis akun virtual yang ada saat ini.

  1. Close Amount
    Inisiasi jumlah tagihan. VA akan dapat terbayarkan dengan tagihan yang telah di inisiasi.
  2. Open Amount
    Tidak ada jumlah tertentu pada tagihan. Ini memungkinkan pengguna untuk menentukan jumlah yang akan dimasukkan. Sebagai contoh adalah skema top-up.

Contoh Close Amount

Untuk contoh dapat Anda lihat pada bagian javascript.

Untuk menggunakan contoh kode ini, Anda mungkin perlu menginstal npm axios dan crypto-js.
Instal paket pada proyek Anda menggunakan npm:

npm i crypto-js axios

Salin kode di bawah ini:
(pilih tab javascript untuk menampilkan contohl kode)

const axios = require("axios");
const CryptoJS = require("crypto-js");

const host = "https://snapdev.duitku.com";
const url = "/merchant/va/v1.0/transfer-va/create-va";
const date = new Date();
const expiredDate = new Date();
expiredDate.setDate(expiredDate.getDate() + 1);
const config = {
  partnerId: "DXXXXX",
  partnerServiceId: "123456",
  channelId: "Duitku",
  clientSecret: "x66485x31358x0e008c2dxx30f1152a6",
  accessToken: "ZmY0YWFjOTUtMWEwYi00ZjAxLTlmYmQtMDhkYzIzMTIxZmZh",
};
const customerNo = "1234567890";
const virtualAccountName = "John Doe"; //displayed as name on the bank side
const trxId = "Transaction-00001"; //need unique in every request
const amount = 12000;
const body = {
  partnerServiceId: config.partnerServiceId,
  customerNo,
  virtualAccountNo: `${config.partnerServiceId}${customerNo}`,
  virtualAccountName,
  trxId,
  totalAmount: {
    value: `${amount}.00`,
    currency: "IDR",
  },
  virtualAccountTrxType: "C",
  expiredDate: toIsoString(expiredDate),
  additionalInfo: {
    minAmount: "0.00",
    maxAmount: "0.00"
  },
};

const headers = headersSymetricGenerator(date, "POST", url, body);
console.log(headers, body);

axios
  .post(host + url, body, { headers: headers })
  .then((response) => {
    console.log(response.data);
  })
  .catch((err) => {
    console.log(err.response.data);
  });

//Header symmetric generate
function headersSymetricGenerator(date, method, endpoint, body) {
  let minifyBody = JSON.stringify(body);
  let encBody = CryptoJS.SHA256(minifyBody).toString();
  let stringToSign = `${method}:${endpoint}:${
    config.accessToken
  }:${encBody.toLowerCase()}:${toIsoString(date)}`;
  let signature = CryptoJS.HmacSHA512(
    stringToSign,
    config.clientSecret
  ).toString(CryptoJS.enc.Base64);
  let headers = {
    "X-TIMESTAMP": toIsoString(date),
    "X-SIGNATURE": signature,
    "X-PARTNER-ID": config.partnerId,
    "X-EXTERNAL-ID": Math.floor(
      1000000000000000000 + Math.random() * 9000000000000000000
    ).toString(),
    "channel-id": config.channelId,
    Authorization: `bearer ${config.accessToken}`,
  };
  console.log("minifyBody : ", minifyBody);
  console.log("encBody : ", encBody);
  console.log("stringToSign : ", stringToSign);
  return headers;
}

//helper function for timestamp
function toIsoString(date) {
  var tzo = -date.getTimezoneOffset(),
    dif = tzo >= 0 ? "+" : "-",
    pad = function (num) {
      return (num < 10 ? "0" : "") + num;
    };

  return (
    date.getFullYear() +
    "-" +
    pad(date.getMonth() + 1) +
    "-" +
    pad(date.getDate()) +
    "T" +
    pad(date.getHours()) +
    ":" +
    pad(date.getMinutes()) +
    ":" +
    pad(date.getSeconds()) +
    dif +
    pad(Math.floor(Math.abs(tzo) / 60)) +
    ":" +
    pad(Math.abs(tzo) % 60)
  );
}

Open Amount Example

Untuk contoh dapat Anda lihat pada bagian javascript.

Untuk menggunakan contoh kode ini, Anda mungkin perlu menginstal npm axios dan crypto-js.
Instal paket pada proyek Anda menggunakan npm:

npm i crypto-js axios

Salin kode di bawah ini:
(pilih tab javascript untuk menampilkan contohl kode)

const axios = require("axios");
const CryptoJS = require("crypto-js");

const host = "https://snapdev.duitku.com";
const url = "/merchant/va/v1.0/transfer-va/create-va";
const date = new Date();
const expiredDate = new Date();
expiredDate.setDate(expiredDate.getDate() + 1);
const config = {
  partnerId: "DXXXXX",
  partnerServiceId: "123456",
  channelId: "Duitku",
  clientSecret: "x66485x31358x0e008c2dxx30f1152a6",
  accessToken: "ZmY0YWFjOTUtMWEwYi00ZjAxLTlmYmQtMDhkYzIzMTIxZmZh",
};
const customerNo = "1234567890";
const virtualAccountName = "John Doe"; //displayed as name on the bank side
const trxId = "Transaction-00001"; //need unique in every request
const minAmount = 12000; //ask Duitku for your minimum transaction limit
const maxAmount = 12000; //ask Duitku for your maximum transaction limit
const body = {
  partnerServiceId: config.partnerServiceId,
  customerNo,
  virtualAccountNo: `${config.partnerServiceId}${customerNo}`,
  virtualAccountName,
  trxId,
  totalAmount: {
    value: `0.00`,
    currency: "IDR",
  },
  virtualAccountTrxType: "O",
  expiredDate: toIsoString(expiredDate),
  additionalInfo: {
    minAmount: `${minAmount}.00`,
    maxAmount: `${maxAmount}.00`
  },
};

const headers = headersSymetricGenerator(date, "POST", url, body);
console.log(headers, body);

axios
  .post(host + url, body, { headers: headers })
  .then((response) => {
    console.log(response.data);
  })
  .catch((err) => {
    console.log(err.response.data);
  });

//Header symmetric generate
function headersSymetricGenerator(date, method, endpoint, body) {
  let minifyBody = JSON.stringify(body);
  let encBody = CryptoJS.SHA256(minifyBody).toString();
  let stringToSign = `${method}:${endpoint}:${
    config.accessToken
  }:${encBody.toLowerCase()}:${toIsoString(date)}`;
  let signature = CryptoJS.HmacSHA512(
    stringToSign,
    config.clientSecret
  ).toString(CryptoJS.enc.Base64);
  let headers = {
    "X-TIMESTAMP": toIsoString(date),
    "X-SIGNATURE": signature,
    "X-PARTNER-ID": config.partnerId,
    "X-EXTERNAL-ID": Math.floor(
      1000000000000000000 + Math.random() * 9000000000000000000
    ).toString(),
    "channel-id": config.channelId,
    Authorization: `bearer ${config.accessToken}`,
  };
  console.log("minifyBody : ", minifyBody);
  console.log("encBody : ", encBody);
  console.log("stringToSign : ", stringToSign);
  return headers;
}

//helper function for timestamp
function toIsoString(date) {
  var tzo = -date.getTimezoneOffset(),
    dif = tzo >= 0 ? "+" : "-",
    pad = function (num) {
      return (num < 10 ? "0" : "") + num;
    };

  return (
    date.getFullYear() +
    "-" +
    pad(date.getMonth() + 1) +
    "-" +
    pad(date.getDate()) +
    "T" +
    pad(date.getHours()) +
    ":" +
    pad(date.getMinutes()) +
    ":" +
    pad(date.getSeconds()) +
    dif +
    pad(Math.floor(Math.abs(tzo) / 60)) +
    ":" +
    pad(Math.abs(tzo) % 60)
  );
}

Untuk menjalankan contoh proyek ini Anda mungkin perlu menginstal npm crypto-js and axios. Instal paket pada proyek Anda menggunakan npm:

npm i crypto-js axios

Update VA

Duitku SNAP API Update VA

const axios = require("axios");
const toIsoString = require("./toIsoString.js");
const headersSymetricGenerator = require("./headersSymetricGenerator.js");
const config = require("./config.js");

const host = "https://snapdev.duitku.com";
const url = "/merchant/va/v1.0/transfer-va/update-va";
const date = new Date();
const expiredDate = new Date();
expiredDate.setDate(expiredDate.getDate() + 1);
const customerNo = "1234567890"; //need equal with the one that would like to update
const virtualAccountName = "John Doe Update"; //displayed as name on the bank side
const trxId = "Transaction-00001"; //need equal with the one that would like to update
const amount = 24000;
const body = {
  partnerServiceId: config.partnerServiceId,
  customerNo,
  virtualAccountNo: `${config.partnerServiceId}${customerNo}`,
  virtualAccountName,
  trxId,
  totalAmount: {
    value: `${amount}.00`,
    currency: "IDR",
  },
  virtualAccountTrxType: "C",
  expiredDate: toIsoString(expiredDate),
  additionalInfo: {
    minAmount: "0.00",
    maxAmount: "0.00"
  },
};

const headers = headersSymetricGenerator(date, "PUT", url, body);
console.log(headers, body);

axios
  .put(host + url, body, { headers: headers })
  .then((response) => {
    console.log(response.data);
  })
  .catch((err) => {
    console.log(err.response.data);
  });

Untuk mengubah detail akun virtual yang ada, seperti nama atau jumlah akun, API Pembaruan Akun Virtual digunakan.

Method : HTTP PUT

Type : application/json

Development : https://snapdev.duitku.com/merchant/va/v1.0/transfer-va/update-va

Production : https://snap.duitku.com/merchant/va/v1.0/transfer-va/update-va

Service Code : 28

Header :

Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat symmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai seharusnya DUITKU DUITKU
Authorization string

Otentikasi dengan token pembawa Bearer ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0

Body :

{
  "partnerServiceId": "123456",
  "customerNo": "1234567890",
  "virtualAccountNo": "1234561234567890",
  "virtualAccountName": "John Doe Update",
  "trxId": "Transaction-0001",
  "totalAmount": {
    "value": "150000.00",
    "currency": "IDR"
  },
  "virtualAccountTrxType": "C",
  "expiredDate": "2022-10-18T23:27:43+0700",
  "additionalInfo": {
    "minAmount": "0.00",
    "maxAmount": "0.00"
  }
}
Parameter Tipe Mandatori Keterangan Contoh
partnerServiceId String(10)

Prefix dari Duitku. 123456
customerNo String(20)

Nomor untuk VA. 1234567890
virtualAccountNo String(28)

PartnerServiceId + CustomerNo.
Rekomendasi:
Untuk maksimal karakter16 digits.
1234561234567890
virtualAccountName String(20)

Nama akan ditampilkan di sisi bank. John Doe Update
trxId String(50)

ID transaksi. Unik di setiap pembuatan VA. Harus sesuai dengan yang trxId ingin diedit. Transaction-0001
ExpiredDate string

ISO-8601. 2022-09-16T13:00:00+07:00
virtualAccountTrxType String(1)

Close Amount : C
Open Amount :O
C
totalAmount Object

Lihat tabel di bawah ini.
additionalInfo Object

Lihat tabel di bawah ini.

totalAmount:

Parameter Tipe Mandatori Keterangan Contoh
value String

ISO4217
dengan 2 desimal
untuk Open Amount atur “0.00”.
150000.00
currency String(3)

Kode mata uang, hanya menerima IDR. IDR

additionalInfo:

Parameter Tipe Mandatori Keterangan Contoh
minAmount String

ISO4217
Open Amount diatur sama dengan minimum Anda yang telah diinformasikan oleh Duitku.
Close Amount atur “0.00”.
10000.00
maxAmount String

ISO4217
Open Amount diatur sama dengan maksimum yang telah diinformasikan oleh Duitku.
Close Amount atur “0.00”.
10000.00

Response :

{
  "responseCode": "2002800",
  "responseMessage": "Successful",
  "virtualAccountData": {
    "partnerServiceId": "123456",
    "customerNo": "1234567890",
    "virtualAccountNo": "1234561234567890",
    "virtualAccountName": "John Doe Update",
    "trxId": "Transaction-0001",
    "totalAmount": {
      "value": "150000.00",
      "currency": "IDR"
    },
    "virtualAccountTrxType": "C",
    "expiredDate": "2022-10-18T23:27:43+0700",
    "additionalInfo": {
      "minAmount": "0.00",
      "maxAmount": "0.00"
    }
  }
}

VirtualAccountData akan menampilkan informasi terbaru.

Code Message Keterangan
2002800 Successful Berhasil di proses dan mendapatkan virtualAccountData yang telah terupdate.
4002801 Invalid Field Format virtualAccountTrxType Nilai value yang tidak tepat untuk parameter virtualAccountTrxType.
4002801 Invalid Field Format maxAmount should not be greater than 50000000 Nilai value yang tidak tepat untuk parameter maxAmount.
4002801 Invalid Field Format totalAmount.Currency Nilai value yang tidak tepat untuk parameter totalAmount bagian Currency.
4002801 Invalid Field Format totalAmount.Value Nilai value yang tidak tepat untuk parameter totalAmount bagian value.
4002801 Invalid Field Format param,totalAmount.value Nilai value yang tidak tepat untuk parameter totalAmount bagian value.
4002801 Invalid Field Format param,virtualAccountName Nilai value yang tidak tepat untuk parameter virtualAccountName.
4002801 Invalid Field Format param,customerNo Nilai value yang tidak tepat untuk parameter customerNo.
4002802 Invalid Mandatory Field virtualAccountTrxType Parameter virtualAccountTrxType tidak ada.
4002802 Invalid Mandatory Field expiredDate Parameter expiredDate tidak ada.
4002802 Invalid Mandatory Field totalAmount Parameter totalAmount tidak ada.
4002802 Invalid Mandatory Field virtualAccountName Parameter virtualAccountName tidak ada.
4002802 Invalid Mandatory Field partnerServiceId Parameter partnerServiceId tidak ada.
4012800 Unauthorized Signature Kekeliruan pada Signature.
4012800 Unauthorized stringToSign Kekeliruan pada Signature.
4012800 Unauthorized Client Kekeliruan pada Client ID.
4012801 Invalid Access Token Access Token Kadaluarsa atau keliru.
4032800 Transaction Expired Transaksi yang akan di update telah kadaluarsa atau tidak aktif.
4042812 Invalid Bill/Virtual Account Not Found Kombinasi nomor va dan Id transaksi tidak di temukan.
4092800 Conflict Kekeliruan pada External ID.

Inquiry VA

Duitku SNAP API INQUIRY VA

const axios = require("axios");
const headersSymetricGenerator = require("./headersSymetricGenerator.js");
const config = require("./config.js");

const host = "https://snapdev.duitku.com";
const url = "/merchant/va/v1.0/transfer-va/inquiry-va";
const date = new Date();
const customerNo = "1234567890"; //need equal with the one that would like to update
const trxId = "Transaction-00001"; //need equal with the one that would like to update
const body = {
  partnerServiceId: config.partnerServiceId,
  customerNo,
  virtualAccountNo: `${config.partnerServiceId}${customerNo}`,
  trxId,
};
const headers = headersSymetricGenerator(date, "POST", url, body);
console.log(headers, body);

axios
  .post(host + url, body, { headers: headers })
  .then((response) => {
    console.log(response.data);
  })
  .catch((err) => {
    console.log(err.response.data);
  });

Untuk mendapatkan rincian tentang virtual account tertentu, seperti status, nama, dan jumlah, API Inquiry Virtual Account dapat digunakan.

Method : HTTP POST

Type : application/json

Development : https://snapdev.duitku.com/merchant/va/v1.0/transfer-va/inquiry-va

Production : https://snap.duitku.com/merchant/va/v1.0/transfer-va/inquiry-va

Service Code : 30

Header :

Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat symmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai seharusnya DUITKU DUITKU
Authorization string

Otentikasi dengan token pembawa Bearer ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0

Body :

{
  "partnerServiceId": "123456",
  "customerNo": "1234567890",
  "virtualAccountNo": "1234561234567890",
  "trxId": "Transaction-0001"
}
Parameter Tipe Mandatori Keterangan Contoh
partnerServiceId String(10)

Prefix dari Duitku. 123456
customerNo String(20)

Nomor untuk VA. 1234567890
virtualAccountNo String(28)

PartnerServiceId + CustomerNo.
Rekomendasi:
Untuk maksimal karakter16 digits.
1234561234567890
trxId String(50)

ID transaksi. Unik di setiap pembuatan VA. Harus cocok dengan trxId yang ingin dilihat. Transaction-0001

Response :

{
  "virtualAccountData": {
    "partnerServiceId": "123456",
    "customerNo": "1234567890",
    "virtualAccountNo": "1234561234567890",
    "virtualAccountName": "John Doe update",
    "trxId": "Transaction-0001",
    "totalAmount": {
      "value": "100000.00",
      "currency": "IDR"
    },
    "virtualAccountTrxType": "C",
    "expiredDate": "2022-10-18T14:01:15+07:00",
    "additionalInfo": {
      "minAmount": "0.00",
      "maxAmount": "0.00"
    }
  },
  "responseCode": "2003000",
  "responseMessage": "Successful"
}

Status code 200
Success
VirtualAccountData akan menampilkan informasi VA yang cocok.

Delete VA

Duitku SNAP API DELETE VA

const axios = require("axios");
const headersSymetricGenerator = require("./headersSymetricGenerator.js");
const config = require("./config.js");

const host = "https://snapdev.duitku.com";
const url = "/merchant/va/v1.0/transfer-va/delete-va";
const date = new Date();
const customerNo = "1234567890"; //need equal with the one that would like to update
const trxId = "Transaction-00001"; //need equal with the one that would like to update
const body = {
  partnerServiceId: config.partnerServiceId,
  customerNo,
  virtualAccountNo: `${config.partnerServiceId}${customerNo}`,
  trxId,
};
const headers = headersSymetricGenerator(date, "DELETE", url, body);
console.log(headers, body);

axios
  .delete(host + url, {
    headers: headers,
    data: body,
  })
  .then((response) => {
    console.log(response.data);
  })
  .catch((err) => {
    console.log(err.response.data);
  });

Untuk membuat akun virtual tidak dapat digunakan dan menandai statusnya sebagai kedaluwarsa, API Hapus Akun Virtual dapat dipanggil. API ini memastikan bahwa virtual account tertentu tidak dapat menerima pembayaran lagi.

Method : HTTP DELETE

Type : application/json

Development : https://snapdev.duitku.com/merchant/va/v1.0/transfer-va/delete-va

Production : https://snap.duitku.com/merchant/va/v1.0/transfer-va/delete-va

Service Code : 31

Header :

Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat symmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai seharusnya DUITKU DUITKU
Authorization string

Otentikasi dengan token pembawa Bearer ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0

Body :

{
  "partnerServiceId": "123456",
  "customerNo": "1234567890",
  "virtualAccountNo": "1234561234567890",
  "trxId": "Transaction-0001"
}
Parameter Tipe Mandatori Keterangan Contoh
partnerServiceId String(10)

Prefix dari Duitku. 123456
customerNo String(20)

Nomor untuk VA. 1234567890
virtualAccountNo String(28)

PartnerServiceId + CustomerNo.
Rekomendasi:
Untuk maksimal karakter16 digits.
1234561234567890
trxId String(50)

ID transaksi. Unik di setiap pembuatan VA. Harus cocok dengan trxId yang ingin dihapus. Transaction-0001

Response :

{
  "responseCode": "2002800",
  "responseMessage": "Successful",
  "virtualAccountData": {
    "partnerServiceId": "123456",
    "customerNo": "1234567890",
    "virtualAccountNo": "1234561234567890",
    "trxId": "Transaction-0001"
  }
}

Status code 200
Success
VirtualAccountData akan mengembalikan informasi VA yang dihapus.

Contoh Helper dan config

const config = {
  partnerId: "DXXXXX",
  partnerServiceId: "123456",
  channelId: "Duitku",
  clientSecret: "x66485x31358x0e008c2dxx30f1152a6",
  accessToken: "ZmY0YWFjOTUtMWEwYi00ZjAxLTlmYmQtMDhkYzIzMTIxZmZh",
};
module.exports = config;

//helper function for timestamp
function toIsoString(date) {
  var tzo = -date.getTimezoneOffset(),
    dif = tzo >= 0 ? "+" : "-",
    pad = function (num) {
      return (num < 10 ? "0" : "") + num;
    };

  return (
    date.getFullYear() +
    "-" +
    pad(date.getMonth() + 1) +
    "-" +
    pad(date.getDate()) +
    "T" +
    pad(date.getHours()) +
    ":" +
    pad(date.getMinutes()) +
    ":" +
    pad(date.getSeconds()) +
    dif +
    pad(Math.floor(Math.abs(tzo) / 60)) +
    ":" +
    pad(Math.abs(tzo) % 60)
  );
}

module.exports = toIsoString;

//Header symmetric generate
const CryptoJS = require("crypto-js");
const config = require("./config.js");
const toIsoString = require("./toIsoString.js");
function headersSymetricGenerator(date, method, endpoint, body) {
  let minifyBody = JSON.stringify(body);
  let encBody = CryptoJS.SHA256(minifyBody).toString();
  let stringToSign = `${method}:${endpoint}:${
    config.accessToken
  }:${encBody.toLowerCase()}:${toIsoString(date)}`;
  let signature = CryptoJS.HmacSHA512(
    stringToSign,
    config.clientSecret
  ).toString(CryptoJS.enc.Base64);
  let headers = {
    "X-TIMESTAMP": toIsoString(date),
    "X-SIGNATURE": signature,
    "X-PARTNER-ID": config.partnerId,
    "X-EXTERNAL-ID": Math.floor(
      1000000000000000000 + Math.random() * 9000000000000000000
    ).toString(),
    "channel-id": config.channelId,
    Authorization: `bearer ${config.accessToken}`,
  };
  console.log("minifyBody : ", minifyBody);
  console.log("encBody : ", encBody);
  console.log("stringToSign : ", stringToSign);
  return headers;
}

module.exports = headersSymetricGenerator;

Payment VA

Duitku SNAP API Payment Sequence Diagram

Payment berupa webhook atau notifikasi ketika pengguna sudah membayar. Untuk menerima informasi ini, Anda perlu membuat API untuk menerima notifikasi. Berikut hal-hal yang perlu Anda lakukan saat menerima pembayaran.

  1. Secure: Anda perlu melakukan pembayaran dengan aman. Karena informasi pembayarannya akan selalu melalui API ini. Kita perlu memastikan lingkungan yang kuat dan aman. Anda mungkin melihat gambar diagram urutan di bagian atas halaman ini.
    1. Whitelist IP Duitku jika diperlukan. IP range : 182.23.85.0/28 103.177.101.177/28
    2. Selalu validasi signature.
    3. Secara opsional, Anda dapat memeriksa Inquiry Status untuk memastikan bahwa pengguna Anda telah membayar transaksinya.
  2. Update: Anda perlu memperbarui status transaksi Anda atau Anda dapat mendaftarkan pembayaran pada transaksi Anda.

Payment API

Untuk melakukan pembayaran kita memerlukan API, misalnya kita menggunakan express js. Di sini direktori proyek seperti:

.
├── app.js
├── controllers
   └── SnapController.js
├── helpers
   └── paymentSignatureValidator.js
└── routes
    └── index.js


3 directories, 4 files

Untuk menjalankan contoh proyek ini Anda mungkin perlu menginstal npm express, jsrsasign, and crypto-js. Instal paket pada proyek Anda menggunakan npm:

npm i express crypto-js axios jsrsasign jsrsasign-util

Berikut adalah contoh kode proyek:

app.js

const express = require("express");
const app = express();
const port = 3000;
const router = require("./routes");

app.use("", router);

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
});

routes/index.js

cconst bodyParser = require('body-parser');
const SnapController = require('../controllers/SnapController');

const router = require('express').Router();

router.post('/callback/v1.0/transfer-va/payment', bodyParser.json() , SnapController.PaymentVa)

module.exports = router

controllers/SnapController

const paymentSignatureValidator = require("../helpers/paymentSignatureValidator");

class SnapController {
  static PaymentVa(req, res) {
    const body = req.body;
    const url = req.url;
    const date = new Date();
    const xExternalId = req.headers["x-external-id"];
    const xPartnerId = req.headers["x-partner-id"];
    const xSignature = req.headers["x-signature"];
    const xTimestamp = req.headers["x-timestamp"];
    const channelId = req.headers["channel-id"];
    let isValid = paymentSignatureValidator(body, xTimestamp, xSignature, url);
    if (isValid) {
      /**
       * You may create your logic here after validating the signature
       * You also may hit inquiry status and get the value here
       */
      //Your code here
      res.send({
        message: "Received and validated",
      });
    } else {
      res.send({
        message: "Received but not validated",
      });
    }
  }
}

module.exports = SnapController;

helpers/paymentSignatureValidator.js

const rs = require("jsrsasign");
const rsu = require("jsrsasign-util");
const toIsoString = require("./toIsoString");
const CryptoJS = require("crypto-js");

function paymentSignatureValidator(body, date, signature, url) {
  let minifyBody = JSON.stringify(body);
  let encBody = CryptoJS.SHA256(minifyBody).toString();
  let stringToSign = `POST:${url}:${encBody.toLowerCase()}:${date}`;
  let publicKey = rs.KEYUTIL.getKey(
    rsu.readFile("./duitkukey/duitku_publickey.pem")
  );
  let sign = new rs.KJUR.crypto.Signature({ alg: "SHA256withRSA" });
  sign.init(publicKey);
  sign.updateString(stringToSign);
  const isSignatureValid = sign.verify(
    CryptoJS.enc.Hex.stringify(CryptoJS.enc.Base64.parse(signature))
  );
  console.log("minifyBody", minifyBody);
  console.log("encBody", encBody);
  console.log("isSignatureValid", isSignatureValid);
  return isSignatureValid;
}

module.exports = paymentSignatureValidator;

Method : HTTP POST

Type : application/json

Url : https://yourdomain.com/v1.0/transfer-va/payment

Endpoint : /v1.0/transfer-va/payment

Service Code : 25

Header :

Parameter Tipe Mandatori Keterangan Contoh
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat Asymmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai seharusnya DUITKU-PAYMENT DUITKU-PAYMENT

Body :

{
  "partnerServiceId": "123456",
  "customerNo": "1234567890",
  "virtualAccountNo": "1234561234567890",
  "paymentRequestId": "46181",
  "trxId": "Transaction-0001",
  "paidAmount": {
    "value": "100000.00",
    "currency": "IDR"
  },
  "additionalInfo": {
    "reference": "D0001YB1CUE2ET3027DK",
    "paymentCode": "M2"
  }
}
Parameter Tipe Mandatori Keterangan Contoh
partnerServiceId String(10)

Prefix dari Duitku. 123456
customerNo String(20)

Nomor untuk VA. 1234567890
virtualAccountNo String(28)

PartnerServiceId + CustomerNo.
Rekomendasi:
Untuk maksimal karakter16 digits.
1234561234567890
paymentRequestId String(20)

Nama akan ditampilkan di sisi bank. 46181
trxId String(50)

ID transaksi. Unik dari setiap Create VA. Transaction-0001
paidAmount Object

Lihat tabel di bawah ini.
additionalInfo Object

Lihat tabel di bawah ini.

paidAmount:

Parameter Tipe Mandatori Keterangan Contoh
value String

ISO4217
\dengan 2 desimal
untuk Open Amount atur menjadi “0.00”.
100000.00
currency String(3)

CurreKode mata uang, hanya menerima IDR. IDR

additionalInfo:

Parameter Tipe Mandatori Keterangan Contoh
reference String

Referensi dari Duitku. D0001YB1CUE2ET3027DK
paymentCode String

Payment method. M2

Response :

{
  "responseCode": "2002500",
  "responseMessage": "Successful",
  "virtualAccountData": {
    "partnerServiceId": "123456",
    "customerNo": "1234567890",
    "virtualAccountNo": "1234561234567890",
    "virtualAccountName": "John Doe",
    "paymentRequestId": "46181",
    "paidAmount": {
      "value": "100000.00",
      "currency": "IDR"
    }
  }
}

Seperti yang Anda lihat pada contoh respons JSON di sini. Anda harus fokus pada variabel virtualAccountData. Untuk responseCode dan responseMessage, ini menunjukkan permintaan proses Anda.

Code Message Keterangan
2002500 Successful Berhasil di proses dan mendapatkan data.
4002501 Invalid Field Format {fieldName} Nilai value yang tidak tepat untuk parameter {fieldName}.
4002502 Invalid Mandatory Field {fieldName} Parameter {fieldName} tidak ada.
4012500 Unauthorized Signature Kekeliruan pada Signature.
4012501 Invalid Access Token Access Token kedaluwarsa atau keliru.
4012501 Invalid Bill/Virtual Account Not Found Nomor VA tidak ditemukan.
4042512 Bill not found Tagihan tidak ditemukan.
4042513 Invalid Amount Kekeliruan pada jumlah harga.
4042514 Bill already paid Tagihan sudah dibayar.
4092500 Conflict Kekeliruan pada External ID.
5002500 General Error Error pada saat melakukan proses permohonan.
5042500 Time Out Waktu kedaluwarsa.

Inquiry Status VA

Duitku SNAP API Inquiry Status Sequence Diagram

Inquiry Status Scheme

API ini akan membantu Anda menanyakan status pembayaran. Seperti yang Anda lihat pada urutan di atas. Anda mungkin perlu menanyakan kapan ada konfirmasi pembayaran dari pengguna. Atau sebagai pilihan keamanan, Anda mungkin menanyakan status setelah menerima payment. Ini membantu Anda memastikan status pembayaran asli.

Inquiry Status Request

Untuk menjalankan contoh proyek ini Anda mungkin perlu menginstal npm crypto-js and axios. Instal paket pada proyek Anda menggunakan npm:

npm i crypto-js axios

Salin kode di bawah ini:
(pilih tab javascript untuk menampilkan contoh kode)

const axios = require("axios");
const CryptoJS = require("crypto-js");

const customerNo = "1234567890";
const trxId = "Transaction-00001";
const host = "https://snapdev.duitku.com";
const url = "/merchant/va/v1.0/transfer-va/status";
const date = new Date();
const config = {
  partnerId: "DXXXXX",
  partnerServiceId: "123456",
  channelId: "Duitku",
  clientSecret: "x66485x31358x0e008c2dxx30f1152a6",
  accessToken: "ZmY0YWFjOTUtMWEwYi00ZjAxLTlmYmQtMDhkYzIzMTIxZmZh",
};
const body = {
  partnerServiceId: config.partnerServiceId,
  customerNo,
  virtualAccountNo: `${config.partnerServiceId}${customerNo}`,
  inquiryRequestId: trxId,
};
const headers = headersSymetricGenerator(date, "POST", url, body);
console.log(headers, body);

axios
  .post(host + url, body, { headers: headers })
  .then((response) => {
    console.log(response.data);
  })
  .catch((err) => {
    console.log(err.response.data);
  });

//Header symmetric generate
function headersSymetricGenerator(date, method, endpoint, body) {
  let minifyBody = JSON.stringify(body);
  let encBody = CryptoJS.SHA256(minifyBody).toString();
  let stringToSign = `${method}:${endpoint}:${
    config.accessToken
  }:${encBody.toLowerCase()}:${toIsoString(date)}`;
  let signature = CryptoJS.HmacSHA512(
    stringToSign,
    config.clientSecret
  ).toString(CryptoJS.enc.Base64);
  let headers = {
    "X-TIMESTAMP": toIsoString(date),
    "X-SIGNATURE": signature,
    "X-PARTNER-ID": config.partnerId,
    "X-EXTERNAL-ID": Math.floor(
      1000000000000000000 + Math.random() * 9000000000000000000
    ).toString(),
    "channel-id": config.channelId,
    Authorization: `bearer ${config.accessToken}`,
  };
  console.log("minifyBody : ", minifyBody);
  console.log("encBody : ", encBody);
  console.log("stringToSign : ", stringToSign);
  return headers;
}

//helper function for timestamp
function toIsoString(date) {
  var tzo = -date.getTimezoneOffset(),
    dif = tzo >= 0 ? "+" : "-",
    pad = function (num) {
      return (num < 10 ? "0" : "") + num;
    };

  return (
    date.getFullYear() +
    "-" +
    pad(date.getMonth() + 1) +
    "-" +
    pad(date.getDate()) +
    "T" +
    pad(date.getHours()) +
    ":" +
    pad(date.getMinutes()) +
    ":" +
    pad(date.getSeconds()) +
    dif +
    pad(Math.floor(Math.abs(tzo) / 60)) +
    ":" +
    pad(Math.abs(tzo) % 60)
  );
}

Method : HTTP POST

Type : application/json

Development : https://snapdev.duitku.com/merchant/va/v1.0/transfer-va/status

Production : https://snap.duitku.com/merchant/va/v1.0/transfer-va/status

Service Code : 26

Header :

Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat symmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai seharusnya DUITKU DUITKU
Authorization string

Otentikasi dengan token pembawa Bearer ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0

Body :

{
  "partnerServiceId": "123456",
  "customerNo": "1234567890",
  "virtualAccountNo": "1308301000000001",
  "inquiryRequestId": "1234561234567890"
}
Parameter Tipe Mandatori Keterangan Contoh
partnerServiceId String(10)

Prefix dari Duitku. 123456
customerNo String(20)

Nomor untuk VA. 1234567890
virtualAccountNo String(28)

PartnerServiceId + CustomerNo.
Rekomendasi:
Untuk maksimal karakter16 digits.
1234561234567890
inquiryRequestId String(50)

TrxID dari Create VA. Transaction-0001

Response :

{
  "responseCode": "2002600",
  "responseMessage": "Successful",
  "virtualAccountData": {
    "partnerServiceId": "123456",
    "customerNo": "1234567890",
    "virtualAccountNo": "1234561234567890",
    "inquiryRequestId": "46181",
    "paymentRequestId": "46181",
    "paidAmount": {
      "value": "100000.00",
      "currency": "IDR"
    },
    "totalAmount": {
      "value": "100000.00",
      "currency": "IDR"
    },
    "transactionDate": "2022-09-14T16:00:00+07:00",
    "trxDateTime": "2022-09-29T10:00:00+07:00",
    "paymentFlagStatus": "00",
    "paymentFlagReason": {
      "english": "SUCCESS",
      "indonesia": "SUKSES"
    }
  }
}

Status code 200
Success
Lihat pada contoh JSON. Anda harus fokus pada variabel virtualAccountData. Untuk responseCode dan responseMessage, ini menunjukkan hasil request hit API.
Lihat nilai dari paymentFlagStatus dalam virtualAccountData. Untuk melihat indikasi status pembayaran.
Status untuk pembayaran diantaranya:
00: SUCCESS
01: PROCESS
02: EXPIRED

Direct Debit

Account Binding

Duitku SNAP API Registration

Layanan API yang digunakan untuk menghubungkan saluran dengan aplikasi merchant menggunakan nomor telepon pelanggan yang telah terdaftar pada akun tersebut.

Method : HTTP POST

Type : application/json

Development : https://snapdev.duitku.com/merchant/registration/v1.0/registration-account-binding

Production : https://snap.duitku.com/merchant/registration/v1.0/registration-account-binding

Service Code : 07

Header :

Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat symmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai seharusnya OL atau SL OL
Authorization string

Otentikasi dengan bearer token Bearer ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0

Body :

{
  "phoneNo": "0857181XX",
  "merchantId": "DXX01",
  "additionalInfo": {
    "customerUniqueId": "123"
  },
  "redirectUrl": "https://example.com"
}
Parameter Tipe Mandatori Keterangan Contoh
phoneNo String(15)

Nomor Handpone Pelanggan. 0812345xxxx
merchantId String(10)

Kode merchant dari Duitku. D00XXX
redirectUrl String(255)

Respon yang dikembalikan setelah memasukan PIN. http://{returnUrl}?resultCode=00&phoneNumber=0812345xxx&state=accountLink
additionalInfo Object

Lihat tabel di bawah ini.

additionalInfo:

Parameter Tipe Mandatori Keterangan Contoh
customerUniqueId String(50)

Id yang digunakan sebagai id unik pelanggan di aplikasi Anda. 1234567

Response :

{
    "responseCode": "2000700",
    "responseMessage": "Success",
    "redirectUrl": "https://webview.byte-stack.net/
        cellblockui/partner/activation?authType=2FA
        &submissionType=redirect"
}
Code Message Keterangan
2000700 Successful Berhasil di proses dan mendapatkan redirectUrl.
4000700 Bad Request, Invalid Merchant Request Kekeliruan pada Request merchantId.
4000700 Service Not Implemented Service tidak terdaftar pada request CHANNEL-ID.
4000701 Invalid Field Format {,PhoneNo} Nilai value yang tidak tepat untuk parameter PhoneNo.
4000701 Invalid Field Format {,RedirectUrl} Nilai value yang tidak tepat untuk parameter RedirectUrl.
4000702 Missing Mandatory Field {additionalInfo.CustomerUniqueId} Parameter CustomerUniqueId tidak ada.
4000702 Invalid Mandatory Field, [additionalInfo.CustomerUniqueId] Parameter additionalInfo tidak ada.
4000702 Missing Mandatory Field {RedirectUrl} Parameter RedirectUrl tidak ada.
4000702 Missing Mandatory Field {MerchantId} Parameter MerchantId tidak ada.
4000702 Missing Mandatory Field {PhoneNo} Parameter PhoneNo tidak ada.
4010700 Unauthorized Signature Kekeliruan pada Signature.
4010700 Unauthorized stringToSign Kekeliruan pada Signature.
4010700 Unauthorized Client Kekeliruan pada PARTNER-ID.
4010701 Invalid Access Token Access Token Kadaluarsa atau keliru.
4030700 Transaction Expired Transaksi yang akan di update telah kadaluarsa atau tidak aktif.
4030715 Transaction Not Permitted:Akun terkunci dalam waktu 30 menit Request transaksi telah melawati batas maksimal 6 kali permintaan.
4040701 Invalid Request Nilai value yang tidak tepat untuk parameter additionalInfo.
4090700 Conflict Kekeliruan pada External ID.

Account Binding Inquiry

Duitku SNAP API Direct Inquiry

Layanan API yang digunakan jika ada kebutuhan untuk pengecekan status akun dengan aplikasi merchant menggunakan nomor telepon pelanggan yang telah terdaftar pada akun tersebut.

Method : HTTP POST

Type : application/json

Development : https://snapdev.duitku.com/merchant/registration/v1.0/registration-account-inquiry

Production : https://snap.duitku.com/merchant/registration/v1.0/registration-account-inquiry

Service Code : 08

Header :

Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat symmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai seharusnya OL atau SL OL
Authorization string

Otentikasi dengan bearer token Bearer ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0

Body :

{
    "additionalInfo": {
        "credentialCode": "95e8ad58-7acc-ee11-9f5e-9440c9319978"
    }
}
Parameter Tipe Mandatori Keterangan Contoh
additionalInfo Object

Lihat tabel di bawah ini.

additionalInfo:

Parameter Tipe Mandatori Keterangan Contoh
credentialCode String(50)

Kode kredensial untuk autentikasi. C0B32F16-2A51-ED11-8135-96724827090C

Response :

{
    "responseCode": "2000800",
    "responseMessage": "Success",
    "accountNo": "0xxxxxx9006",
    "additionalInfo": {
        "balanceCash": 1181712,
        "accountStatus": "LINKED"
    }
}
Code Message Keterangan
2000800 Successful Berhasil di proses.
2000801 Invalid Token:Anda Tidak Memiliki Akses Kekeliruan pada Request credentialCode.
4000802 Missing Mandatory Field {AdditionalInfo.CredentialCode} Parameter CredentialCode tidak ada.
4000802 Invalid Mandatory Header X-EXTERNAL-ID Parameter X-EXTERNAL-ID tidak ada.
4000802 Invalid Mandatory Header CHANNEL-ID Parameter CHANNEL-ID tidak ada.
4010800 Unauthorized Signature Kekeliruan pada Signature.
4010800 Unauthorized stringToSign Kekeliruan pada Signature.
4010800 Unauthorized Client Kekeliruan pada PARTNER-ID.
4010801 Invalid Access Token Access Token Kadaluarsa atau keliru.
4040801 Invalid Request Kesalahan format pada saat request.
5000801 Internal Server Error Error pada saat melakukan proses permohonan.

Account Unbinding

Duitku SNAP API Direct Inquiry

Layanan API yang digunakan jika pelanggan ingin memutuskan hubungan saluran dengan aplikasi merchant menggunakan nomor telepon pelanggan yang telah terdaftar pada akun tersebut.

Method : HTTP POST

Type : application/json

Development : https://snapdev.duitku.com/merchant/registration/v1.0/registration-account-unbinding

Production : https://snap.duitku.com/merchant/registration/v1.0/registration-account-unbinding

Service Code : 09

Header :

Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat symmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai seharusnya OL atau SL OL
Authorization string

Otentikasi dengan bearer token Bearer ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0

Body :

{
    "merchantId": "DXX01",
    "tokenId": "C0B32F16-2A51-ED11-8135-96724827090C"
}
Parameter Tipe Mandatori Keterangan Contoh
merchantId String(10)

Kode merchant dari Duitku. D00XXX
tokenId String(25)

Kode kredensial untuk autentikasi. C0B32F16-2A51-ED11-8135-96724827090C

Response :

{
    "responseCode": "2000900",
    "responseMessage": "Success",
    "unlinkResult": "Success"
}
Code Message Keterangan
2000900 Successful Berhasil di proses.
4000902 Invalid Mandatory Header X-EXTERNAL-ID Parameter X-EXTERNAL-ID tidak ada.
4000902 Invalid Mandatory Header CHANNEL-ID Parameter CHANNEL-ID tidak ada.
4010900 Unauthorized Signature Kekeliruan pada Signature.
4010900 Unauthorized stringToSign Kekeliruan pada Signature.
4010900 Unauthorized Client Kekeliruan pada PARTNER-ID.
4010901 Invalid Access Token Access tokenId Kadaluarsa atau keliru.
5000901 Internal Server Error Error pada saat melakukan proses permohonan.

Debit Payment Linking

Duitku SNAP API Direct Debit linking

API ini digunakan untuk layanan Debit Payment dengan menggunakan proses Account Linking terlebih dahulu untuk proses permintaannya. Terdapat 2 tipe transaksi pada API ini yaitu Manual Debit dan Auto Debit. API ini telah mendukung metode pembayaran ShopeePay dan OVO dengan menggunakan value sebagai berikut SL dan OL.

Method : HTTP POST

Type : application/json

Development : https://snapdev.duitku.com/merchant/debit/v1.0/debit/payment-host-to-host

Production : https://snap.duitku.com/merchant/debit/v1.0/debit/payment-host-to-host

Service Code : 54

Header :

Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat symmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai seharusnya OL atau SL OL
Authorization string

Otentikasi dengan bearer token Bearer ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0

Request Body:

Contoh Request Payment Linking

{
    "partnerReferenceNo": "INV1708588643",
    "chargeToken": "OL",
    "bankCardToken": "4a17a847-94d0-ee11-9f5e-9440c9319978",
    "merchantId": "D0XXX",
    "amount": {
        "value": "1000.00",
        "currency": "IDR"
    },
    "additionalInfo": {
        "productDetails": "Tes pembayaran Direct debit Duitku",
        "additionalParam": "test additional param",
        "phoneNumber": "0821XXXXXXX",
        "email": "[email protected]",
        "returnUrl": "http:\/\/example.com\/return",
        "itemDetails": [
            {
                "name": "Test Item 1",
                "price": 500,
                "quantity": 1
            },
            {
                "name": "Test Item 2",
                "price": 500,
                "quantity": 1
            }
        ],
        "transactionType": "M",
        "merchantUserInfo": "",
        "customerDetail": {
            "firstName": "John",
            "lastName": "Doe",
            "email": "[email protected]",
            "phoneNumber": "0821XXXXXXX",
            "billingAddress": {
                "firstName": "John",
                "lastName": "Doe",
                "address": "Jl. Kembangan Raya",
                "city": "Jakarta",
                "postalCode": "11530",
                "phone": "0821XXXXXXX",
                "countryCode": "ID"
            },
            "shippingAddress": {
                "firstName": "John",
                "lastName": "Doe",
                "address": "Jl. Kembangan Raya",
                "city": "Jakarta",
                "postalCode": "11530",
                "phone": "0821XXXXXXX",
                "countryCode": "ID"
            }
        }
    },
    "payOptionDetails": [
        {
            "payMethod": "CASH",
            "transAmount": {
                "value": "1000.00",
                "currency": "IDR"
            }
        }
    ]
}
Parameter Tipe Mandatori Keterangan Contoh
partnerReferenceNo String(64)

Nomor transaksi dari merchant. INV123456
chargeToken String(2)

Kode metode pembayaran yang disediakan oleh duitku, untuk value harus sesuai dengan CHANNEL-ID di Header OL
bankCardToken String(50)

Kode kredensial untuk autentikasi. 67af67e7-e0ce-ee11-9f5e-9440c9319978
merchantId String(50)

Kode merchant dari Duitku. D00XXX
payOptionDetails Object Array

Lihat tabel payOptionDetails dibawah ini.
additionalInfo Object

Lihat tabel additionalInfo dibawah ini.
amount Object

Lihat tabel amount dibawah ini.

additionalInfo

Parameter Tipe Mandatori Keterangan Contoh
productDetails String(255)

Keterangan produk/jasa yang diperjual belikan.
transactionType String(20)

C

Berikut adalah nilai yang digunakan:
M: Digunakan untuk pembayaran secara Manual Debit yang memerlukan proses PIN.
A: Digunakan untuk pembayaran secara Auto Debit yang tidak memerlukan proses PIN.
M
phoneNumber String(15)

Nomor telepon pelanggan. 0857181XX
email String(60)

Alamat email pelanggan anda. [email protected]
additionalParam String(255)

Parameter tambahan.
returnUrl String(255)

Tautan untuk mengarahkan setelah transaksi selesai atau dibatalkan. http://example.com/return
merchantUserInfo String(255)

Username atau email pelanggan di situs merchant. 1234567
itemDetails object

Lihat tabel itemDetails dibawah ini.
customerDetail object

Lihat tabel customerDetail dibawah ini.

Item Details

Parameter Tipe Mandatori Keterangan Contoh
name string(255)

Nama barang yang dibeli. Apel
quantity integer

Jumlah barang dibeli. 10
price integer

Harga barang. Catatan: Jangan tambahkan desimal. 50000

Customer Detail

Parameter Tipe Mandatori Keterangan Contoh
firstName string(255)

Nama pertama pelanggan. John
lastName string(255)

Nama belakang pelanggan. Doe
email string(255)

Email pelanggan. [email protected]
phoneNumber string(255)

Nomor telepon pelanggan. 08123456789
billingAddress object

Lihat tabel Address dibawah ini.
shippingAddress object

Lihat tabel Address dibawah ini.

Address

Parameter Tipe Mandatori Keterangan Contoh
firstName string(255)

Nama pertama pelanggan. John
lastName string(255)

Nama belakang pelanggan. Doe
address string(255)

Alamat tagihan atau pengiriman pelanggan. Jl. Kembangan Raya
city string(255)

Keterangan alamat kota. Jakarta
postalCode string(255)

Kode Pos alamat. 11530
phone string(255)

Nomor Telepon Tagihan atau Pengiriman Pelanggan. 08123456789
countryCode string(255)

ISO 3166-1 alpha-3. ID

payOptionDetails

Parameter Tipe Mandatori Keterangan Contoh
payMethod String(255)

Jenis saldo yang anda gunakan, bisa di isi CASH. CASH
transAmount object

Lihat tabel amount dibawah ini.

amount

Parameter Tipe Mandatori Keterangan Contoh
value String

ISO4217
dengan 2 desimal.
10000.00
currency String(3)

Kode mata uang, hanya menerima IDR. IDR

Response :

Contoh Response Payment Linking Manual

{
  "responseCode": "2025400",
  "responseMessage": "Request In Progress",
  "referenceNo": "DXXXXX24OWAA7JJHALBAL6J",
  "partnerReferenceNo": "INV1708597771",
  "webRedirectUrl": "https://webview.byte-stack.net/
  cellblockui/v2/paymentPin?action=payment&submission
  Type=redirect&destination=https://snapdev.duitku.com"
}

Contoh Response Payment Linking Auto

{
  "responseCode": "2005400",
  "responseMessage": "Success",
  "referenceNo": "DXXXXX24OWAA7JJHALBAL6J",
  "partnerReferenceNo": "INV1708597771"
}
Code Message Keterangan
2005400 Successful Berhasil.
2025400 Request In Progress Transaksi sedang di proses.
4005400 Bad Request, Invalid Merchant Request Kekeliruan pada Request merchantId.
4005400 Service Not Implemented Service tidak terdaftar pada request CHANNEL-ID.
4005401 Invalid Field Format Nilai value yang tidak tepat untuk parameter tersebut.
4005402 Missing Mandatory Field {AdditionalInfo.ReturnUrl} Parameter ReturnUrl tidak ada.
4015400 Unauthorized Signature Kekeliruan pada Signature.
4015400 Unauthorized stringToSign Kekeliruan pada Signature.
4015400 Unauthorized Client Kekeliruan pada PARTNER-ID.
4015401 Invalid Access Token Access Token Kadaluarsa atau keliru.
4035400 Transaction Expired Transaksi yang akan di update telah kadaluarsa atau tidak aktif.
4035414 Insufficient Fund Saldo anda tidak mencukupi untuk transaksi ini.
4045401 Invalid Request Nilai value yang tidak tepat untuk parameter.
4045413 Invalid Amount, Amount must be equal with total price item details Kekeliruan pada value parameter amount dan price di item detail.
4095400 Conflict Kekeliruan pada External ID.

Debit Payment Redirect

Duitku SNAP API Direct Debit redirect

API ini digunakan untuk layanan Debit Payment Redirect tanpa memerlukan proses Account Linking terlebih dahulu. Saat melakukan permintaan API parameter chargeToken harus disertakan. Untuk saat ini channel yang telah didukung adalah ShopeePay Apps dan Dana dengan value sebagai berikut SA dan DA.

Method : HTTP POST

Type : application/json

Development : https://snapdev.duitku.com/merchant/debit/v1.0/debit/payment-host-to-host

Production : https://snap.duitku.com/merchant/debit/v1.0/debit/payment-host-to-host

Service Code : 54

Header :

Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat symmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai seharusnya DA atau SA DA
Authorization string

Otentikasi dengan bearer token Bearer ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0

Request Body:

Contoh Request Payment Redirect

{
    "partnerReferenceNo": "INV1708588643",
    "chargeToken": "DA",
    "merchantId": "D0XXX",
    "validUpTo":"2022-09-16T13:00:00+07:00",
    "amount": {
        "value": "1000.00",
        "currency": "IDR"
    },
    "additionalInfo": {
        "productDetails": "Tes pembayaran Direct debit Duitku",
        "additionalParam": "test additional param",
        "phoneNumber": "0821XXXXXXX",
        "email": "[email protected]",
        "returnUrl": "http:\/\/example.com\/return",
        "itemDetails": [
            {
                "name": "Test Item 1",
                "price": 500,
                "quantity": 1
            },
            {
                "name": "Test Item 2",
                "price": 500,
                "quantity": 1
            }
        ],
        "merchantUserInfo": "",
        "customerDetail": {
            "firstName": "John",
            "lastName": "Doe",
            "email": "[email protected]",
            "phoneNumber": "0821XXXXXXX",
            "billingAddress": {
                "firstName": "John",
                "lastName": "Doe",
                "address": "Jl. Kembangan Raya",
                "city": "Jakarta",
                "postalCode": "11530",
                "phone": "0821XXXXXXX",
                "countryCode": "ID"
            },
            "shippingAddress": {
                "firstName": "John",
                "lastName": "Doe",
                "address": "Jl. Kembangan Raya",
                "city": "Jakarta",
                "postalCode": "11530",
                "phone": "0821XXXXXXX",
                "countryCode": "ID"
            }
        }
    },
    "payOptionDetails": [
        {
            "payMethod": "CASH",
            "transAmount": {
                "value": "1000.00",
                "currency": "IDR"
            }
        }
    ]
}
Parameter Tipe Mandatori Keterangan Contoh
partnerReferenceNo String(64)

Nomor transaksi dari merchant. INV123456
chargeToken String(2)

Kode metode pembayaran yang disediakan oleh duitku, untuk value harus sesuai dengan CHANNEL-ID di Header DA
merchantId String(50)

Kode merchant dari Duitku. D00XXX
payOptionDetails Object Array

Lihat tabel payOptionDetails dibawah ini.
additionalInfo Object

Lihat tabel additionalInfo dibawah ini.
amount Object

Lihat tabel amount dibawah ini.
validUpTo String

Waktu kadaluwarsa transaksi dalam ISO-8601. 2022-09-16T13:00:00+07:00

additionalInfo

Parameter Tipe Mandatori Keterangan Contoh
productDetails String(255)

Keterangan produk/jasa yang diperjual belikan.
phoneNumber String(15)

Nomor telepon pelanggan. 0857181XX
email String(60)

Alamat email pelanggan anda. [email protected]
additionalParam String(255)

Parameter tambahan.
returnUrl String(255)

Tautan untuk mengarahkan setelah transaksi selesai atau dibatalkan. http://example.com/return
merchantUserInfo String(255)

Username atau email pelanggan di situs merchant. 1234567
itemDetails object

Lihat tabel itemDetails dibawah ini.
customerDetail object

Lihat tabel customerDetail dibawah ini.

Item Details

Parameter Tipe Mandatori Keterangan Contoh
name string(255)

Nama barang yang dibeli. Apel
quantity integer

Jumlah barang dibeli. 10
price integer

Harga barang. Catatan: Jangan tambahkan desimal. 50000

Customer Detail

Parameter Tipe Mandatori Keterangan Contoh
firstName string(255)

Nama pertama pelanggan. John
lastName string(255)

Nama belakang pelanggan. Doe
email string(255)

Email pelanggan. [email protected]
phoneNumber string(255)

Nomor telepon pelanggan. 08123456789
billingAddress object

Lihat tabel Address dibawah ini.
shippingAddress object

Lihat tabel Address dibawah ini.

Address

Parameter Tipe Mandatori Keterangan Contoh
firstName string(255)

Nama pertama pelanggan. John
lastName string(255)

Nama belakang pelanggan. Doe
address string(255)

Alamat tagihan atau pengiriman pelanggan. Jl. Kembangan Raya
city string(255)

Keterangan alamat kota. Jakarta
postalCode string(255)

Kode Pos alamat. 11530
phone string(255)

Nomor Telepon Tagihan atau Pengiriman Pelanggan. 08123456789
countryCode string(255)

ISO 3166-1 alpha-3. ID

payOptionDetails

Parameter Tipe Mandatori Keterangan Contoh
payMethod String(255)

Jenis saldo yang anda gunakan, bisa di isi CASH. CASH
transAmount object

Lihat tabel amount dibawah ini.

amount

Parameter Tipe Mandatori Keterangan Contoh
value String

ISO4217
dengan 2 desimal.
10000.00
currency String(3)

Kode mata uang, hanya menerima IDR. IDR

Response :

Contoh Response Payment Redirect

{
    "responseCode": "2005400",
    "responseMessage": "SUCCESS",
    "referenceNo": "DXXXXX24OWAA7JJHALBAL6J",
    "partnerReferenceNo": "INV1708597771",
    "webRedirectUrl": "https://webview.byte-stack.net/cellblockui
    /v2/paymentPin?action=payment&submissionType=redirect&destination
    =https://snapdev.duitku.com"
}
Code Message Keterangan
2005400 Successful Berhasil.
2025400 Request In Progress Transaksi sedang di proses.
4005400 Bad Request, Invalid Merchant Request Kekeliruan pada Request merchantId.
4005400 Service Not Implemented Service tidak terdaftar pada request CHANNEL-ID.
4005401 Invalid Field Format Nilai value yang tidak tepat untuk parameter tersebut.
4005402 Missing Mandatory Field {AdditionalInfo.ReturnUrl} Parameter ReturnUrl tidak ada.
4015400 Unauthorized Signature Kekeliruan pada Signature.
4015400 Unauthorized stringToSign Kekeliruan pada Signature.
4015400 Unauthorized Client Kekeliruan pada PARTNER-ID.
4015401 Invalid Access Token Access Token Kadaluarsa atau keliru.
4035400 Transaction Expired Transaksi yang akan di update telah kadaluarsa atau tidak aktif.
4035414 Insufficient Fund Saldo anda tidak mencukupi untuk transaksi ini.
4045401 Invalid Request Nilai value yang tidak tepat untuk parameter.
4045413 Invalid Amount, Amount must be equal with total price item details Kekeliruan pada value parameter amount dan price di item detail.
4095400 Conflict Kekeliruan pada External ID.

Debit Payment Notify (CALLBACK)

Duitku SNAP API Payment Sequence Diagram

Payment berupa webhook atau notifikasi ketika pengguna sudah membayar. Untuk menerima informasi ini, Anda perlu membuat API untuk menerima notifikasi. Berikut hal-hal yang perlu Anda lakukan saat menerima pembayaran.

  1. Secure: Anda perlu melakukan pembayaran dengan aman. Karena informasi pembayarannya akan selalu melalui API ini. Kita perlu memastikan lingkungan yang kuat dan aman. Anda mungkin melihat gambar diagram urutan di bagian atas halaman ini.
    1. Whitelist IP Duitku jika diperlukan. IP range : 182.23.85.0/28 103.177.101.177/28
    2. Selalu validasi signature.
    3. Secara opsional, Anda dapat memeriksa Debit Payment Status untuk memastikan bahwa pengguna Anda telah membayar transaksinya.
  2. Update: Anda perlu memperbarui status transaksi Anda atau Anda dapat mendaftarkan pembayaran pada transaksi Anda.

Method : HTTP POST

Type : application/json

Url : https://yourdomain.com/v1.0/debit/notify

Endpoint : /v1.0/debit/notify

Service Code : 56

Header :

Parameter Tipe Mandatori Keterangan Contoh
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat Asymmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai yang digunakan harus sesuai dengan detail transaksi yang telah di generate sebelumnya. Nilai seharusnya OL,SA,DAatau SL OL

Body :

Contoh Request Payment Notify

{
    "originalReferenceNo": "DXX116FL4KD00EBRDE5",
    "originalPartnerReferenceNo": "BMA-140",
    "latestTransactionStatus": "00",
    "amount": {
        "value": "2001.00",
        "currency": "IDR"
    },
    "additionalInfo": {
        "productDetails": "tes product",
        "additionalParam": "tes 123",
        "paymentMethod": "OL",
        "publisherOrderId": "OLZQ476GYOYZBSREF",
        "merchantUserId": "[email protected]",
        "settlementDate": "2022-11-20"
    }
}
Parameter Tipe Mandatori Keterangan Contoh
originalPartnerReferenceNo string(64)

Nilai berasal dari parameter PartnerReferenceNo pada response debit payment. INV1708656785
originalReferenceNo string(64)

Nilai berasal dari parameter ReferenceNo pada response debit payment. D00XXXWIG5BV1WW8F3RMF
latestTransactionStatus String(2)

Kode dari status transaksi. 00
amount Object

Lihat tabel di bawah ini.
additionalInfo Object

Lihat tabel di bawah ini.

amount

Parameter Tipe Mandatori Keterangan Contoh
value String

ISO4217
dengan 2 desimal.
10000.00
currency String(3)

Kode mata uang, hanya menerima IDR. IDR

additionalInfo

Parameter Tipe Mandatori Keterangan Contoh
productDetails String(50)

Keterangan produk/jasa yang diperjual belikan. Tes payment
additionalParam String(255)

Parameter tambahan.
paymentMethod String(2)

Payment method. OL
publisherOrderId String(30)

Kode unik transaksi dari duitku. OLZQ476GYOYZBSREF
merchantUserId String(255)

User name atau email pelanggan di situs merchant. [email protected]
settlementDate String(10)

Informasi waktu estimasi penyelesaian. Format: YYYY-MM-DD 2023-07-25

Response :

Contoh Response Payment Notify

{
    "responseCode": "2005600",
    "responseMessage": "Successful",
}
Code Message Keterangan
2005600 Successful Berhasil di proses dan mendapatkan data.
4005601 Invalid Field Format {fieldName} Nilai value yang tidak tepat untuk parameter {fieldName}.
4005602 Invalid Mandatory Field {fieldName} Parameter {fieldName} tidak ada.
4015600 Unauthorized Signature Kekeliruan pada Signature.
4015601 Invalid Access Token Access Token kedaluwarsa atau keliru.
4045614 Bill already paid Tagihan sudah dibayar.
4095600 Conflict Kekeliruan pada External ID.
5005600 General Error Error pada saat melakukan proses permohonan.
5045600 Time Out Waktu kedaluwarsa.

Debit Payment Status

Duitku SNAP API Direct Debit

API ini akan membantu Anda untuk pengecekan status dari transaksi yang telah dilakukan. Seperti yang Anda lihat pada urutan di atas. Anda mungkin perlu menanyakan kapan ada konfirmasi pembayaran dari pengguna. Atau sebagai pilihan keamanan, Anda mungkin menanyakan status setelah menerima Debit Payment Notify. Ini membantu Anda memastikan status pembayaran asli.

Method : HTTP POST

Type : application/json

Development : https://snapdev.duitku.com/merchant/debit/v1.0/debit/status

Production : https://snap.duitku.com/merchant/debit/v1.0/debit/status

Service Code : 55

Header :

Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat symmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai yang digunakan harus sesuai dengan detail transaksi yang telah di generate sebelumnya. Nilai seharusnya OL,SA,DAatau SL OL
Authorization string

Otentikasi dengan bearer token Bearer ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0

Body :

Contoh Request Payment Status

{
    "originalPartnerReferenceNo": "INV1708656785",
    "originalReferenceNo": "D00XXXWIG5BV1WW8F3RMF",
    "serviceCode": "55"
}
Parameter Tipe Mandatori Keterangan Contoh
originalPartnerReferenceNo string(64)

Nilai berasal dari parameter PartnerReferenceNo pada response debit payment. INV1708656785
originalReferenceNo string(64)

Nilai berasal dari parameter ReferenceNo pada response debit payment. D00XXXWIG5BV1WW8F3RMF
serviceCode string(2)

Indikator jenis transaksi (kode layanan permintaan transaksi debit status). 55

Response :

Contoh Response Payment Status

{
    "responseCode": "2005500",
    "responseMessage": "SUCCESS",
    "originalReferenceNo": "D0XX17PGP6GGKB86UBQM",
    "originalPartnerReferenceNo": "12313131313131",
    "serviceCode": "55",
    "latestTransactionStatus": "00",
    "transactionStatusDesc": "Success",
    "transAmount": {
        "value": "1000.00",
        "currency": "IDR"
    }
}
Code Message Keterangan
2005500 SUCCESS Berhasil di proses.
2005501 Invalid Token:Anda Tidak Memiliki Akses Kekeliruan pada Request credentialCode.
4005502 Missing Mandatory Field {originalPartnerReferenceNo} Parameter originalPartnerReferenceNo tidak ada.
4005502 Missing Mandatory Field {originalReferenceNo} Parameter originalReferenceNo tidak ada.
4005502 Missing Mandatory Field {serviceCode} Parameter serviceCode tidak ada.
4005502 Invalid Mandatory Header X-EXTERNAL-ID Parameter X-EXTERNAL-ID tidak ada.
4005502 Invalid Mandatory Header CHANNEL-ID Parameter CHANNEL-ID tidak ada.
4015500 Unauthorized Signature Kekeliruan pada Signature.
4015500 Unauthorized stringToSign Kekeliruan pada Signature.
4015500 Unauthorized Client Kekeliruan pada PARTNER-ID.
4015501 Invalid Access Token Access Token Kadaluarsa atau keliru.
4045501 Invalid Request Kesalahan format pada saat request.
5005501 Internal Server Error Error pada saat melakukan proses permohonan.

Transactions status

Untuk detail response latestTransactionStatus lihat tabel di bawah ini.

Status Keterangan
00 Successful
03 Pending
04 Refunded
06 Failed
07 Not Found

Debit Payment Refund

Duitku SNAP API Direct Refund

Layanan API yang digunakan untuk pengembalian dana dari transaksi yang telah dilakukan.

Method : HTTP POST

Type : application/json

Development : https://snapdev.duitku.com/merchant/debit/v1.0/debit/refund

Production : https://snap.duitku.com/merchant/debit/v1.0/debit/refund

Service Code : 58

Header :

Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat symmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai yang digunakan harus sesuai dengan detail transaksi yang telah di generate sebelumnya. Nilai seharusnya OL,SA,DAatau SL OL
Authorization string

Otentikasi dengan bearer token Bearer ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0

Body :

Contoh Request Payment Refund

{
    "partnerRefundNo": "RFD-143",
    "originalPartnerReferenceNo": "INV-143",
    "originalReferenceNo": "DXX01OYA8GFJXA130B1P",
    "refundAmount": {
        "value": "2001.00",
        "currency": "IDR"
    }
}
Parameter Tipe Mandatori Keterangan Contoh
partnerRefundNo String(64)

Kode unik untuk refund dari merchant. RFD-143
originalPartnerReferenceNo string(64)

Nilai berasal dari parameter PartnerReferenceNo pada response debit payment. INV1708656785
originalReferenceNo string(64)

Nilai berasal dari parameter ReferenceNo pada response debit payment. D00XXXWIG5BV1WW8F3RMF
refundAmount Object

Lihat tabel dibawah ini.

amount

Parameter Tipe Mandatori Keterangan Contoh
value String

ISO4217
dengan 2 desimal.
10000.00
currency String(3)

Kode mata uang, hanya menerima IDR. IDR

Response :

Contoh Response Payment Refund

{
    "responseCode": "2005800",
    "responseMessage": "SUCCESS",
    "originalReferenceNo": "D0001OYA8GFJXA130B1P",
    "originalPartnerReferenceNo": "INV-143",
    "partnerRefundNo": "RFD-143",
    "refundTime": "2023-03-01T10:08:45Z",
    "refundNo": "REFUND-OLOSFPBRGMNFI6RJS-1677665317584"
}
Code Message Keterangan
2005800 Successful Berhasil di proses.
4005802 Invalid Mandatory Header X-EXTERNAL-ID Parameter X-EXTERNAL-ID tidak ada.
4005802 Invalid Mandatory Header CHANNEL-ID Parameter CHANNEL-ID tidak ada.
4015800 Unauthorized Signature Kekeliruan pada Signature.
4015800 Unauthorized stringToSign Kekeliruan pada Signature.
4015800 Unauthorized Client Kekeliruan pada PARTNER-ID.
4015801 Invalid Access Token Access tokenId Kadaluarsa atau keliru.
5005801 Internal Server Error Error pada saat melakukan proses permohonan.

QRIS

Generate QR MPM

Duitku SNAP API QR MPM

API Generate QR MPM (Merchant Presented Mode) adalah layanan API yang dapat digunakan oleh Merchant untuk mendapatkan sebuah kode QR, Kemudian merchant dapat menampilkan kode QR tersebut untuk dapat menerima pembayaran dari pelanggan menggunakan aplikasi penyelenggara dengan cara melakukan scan.

Method : HTTP POST

Type : application/json

Development : https://snapdev.duitku.com/merchant/qris/v1.0/qr/qr-mpm-generate

Production : https://snap.duitku.com/merchant/qris/v1.0/qr/qr-mpm-generate

Service Code : 47

Header :

{
    "partnerReferenceNo": "INV1709543217",
    "validityPeriod": "2022-09-16T13:00:00+07:00",
    "amount": {
        "value": "321.00",
        "currency": "IDR"
    },
    "additionalInfo": {
        "productDetails": "Tes pembayaran Qris Duitku",
        "additionalParam": "test additional param",
        "phoneNumber": "08221XXXXXXXX",
        "email": "[email protected]",
        "returnUrl": "http:\/\/example.com\/return",
        "itemDetails": [
            {
                "name": "Test Item 1",
                "price": 101,
                "quantity": 1
            },
            {
                "name": "Test Item 2",
                "price": 220,
                "quantity": 1
            }
        ],
        "customerDetail": {
            "firstName": "John",
            "lastName": "Doe",
            "email": "[email protected]",
            "phoneNumber": "08221XXXXXXXX",
            "billingAddress": {
                "firstName": "John",
                "lastName": "Doe",
                "address": "Jl. Kembangan Raya",
                "city": "Jakarta",
                "postalCode": "11530",
                "phone": "08221XXXXXXXX",
                "countryCode": "ID"
            },
            "shippingAddress": {
                "firstName": "John",
                "lastName": "Doe",
                "address": "Jl. Kembangan Raya",
                "city": "Jakarta",
                "postalCode": "11530",
                "phone": "08221XXXXXXXX",
                "countryCode": "ID"
            }
        }
    }
}
Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat symmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Berikut list nilai yang bisa digunakan :
SP(ShopeePay)
GQ(GudangVoucher)
DQ(Dana)
NQ(Nobu)
SP
Authorization string

Otentikasi dengan bearer token Bearer ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0

Request Body:

Parameter Tipe Mandatori Keterangan Contoh
partnerReferenceNo String(64)

Nomor transaksi dari merchant. INV123456
validityPeriod String(4)

Waktu kadaluwarsa transaksi dalam ISO-8601. 2022-09-16T13:00:00+07:00
additionalInfo Object

Lihat tabel additionalInfo dibawah ini.
amount Object

Lihat tabel amount dibawah ini.

additionalInfo

Parameter Tipe Mandatori Keterangan Contoh
productDetails String(255)

Keterangan produk/jasa yang diperjual belikan.
phoneNumber String(15)

Nomor telepon pelanggan. 0857181XX
email String(60)

Alamat email pelanggan anda. [email protected]
additionalParam String(255)

Parameter tambahan.
returnUrl String(255)

Tautan untuk mengarahkan setelah transaksi selesai atau dibatalkan. http://example.com/return
itemDetails object

Lihat tabel itemDetails dibawah ini.
customerDetail object

Lihat tabel customerDetail dibawah ini.

Item Details

Parameter Tipe Mandatori Keterangan Contoh
name string(255)

Nama barang yang dibeli. Apel
quantity integer

Jumlah barang dibeli. 10
price integer

Harga barang. Catatan: Jangan tambahkan desimal. 50000

Customer Detail

Parameter Tipe Mandatori Keterangan Contoh
firstName string(255)

Nama pertama pelanggan. John
lastName string(255)

Nama belakang pelanggan. Doe
email string(255)

Email pelanggan. [email protected]
phoneNumber string(255)

Nomor telepon pelanggan. 08123456789
billingAddress object

Lihat tabel Address dibawah ini.
shippingAddress object

Lihat tabel Address dibawah ini.

Address

Parameter Tipe Mandatori Keterangan Contoh
firstName string(255)

Nama pertama pelanggan. John
lastName string(255)

Nama belakang pelanggan. Doe
address string(255)

Alamat tagihan atau pengiriman pelanggan. Jl. Kembangan Raya
city string(255)

Keterangan alamat kota. Jakarta
postalCode string(255)

Kode Pos alamat. 11530
phone string(255)

Nomor Telepon Tagihan atau Pengiriman Pelanggan. 08123456789
countryCode string(255)

ISO 3166-1 alpha-3. ID

amount

Parameter Tipe Mandatori Keterangan Contoh
value String

ISO4217
dengan 2 desimal.
10000.00
currency String(3)

Kode mata uang, hanya menerima IDR. IDR

Response :

{
  "partnerReferenceNo": "INV1709717052",
  "referenceNo": "D1XXXXXXOWPHSWXXWTW4MP5",
  "redirectUrl": "https://sandbox.duitku.com/TopUp/v2/
    TopUpQrisPaymentPage.aspx?reference=GQ24ELJK4A78KUGJV40",
  "responseCode": "2004700",
  "responseMessage": "SUCCESS",
  "qrContent": "00020101021226730021COM.GUDANGVOUCHER.WWW0118
  93600916300373281602151142230919000010303UME51450015ID.OR.G
  PNQR.WWW02151142230919000010303UME5204970553033605403321580
  2ID5906DUITKU6015JAKARTA SELATAN610511530624101066527840520
  24030627840636662CSX0703A016304EA56"
}
Code Message Keterangan
2004700 Success Berhasil.
4004700 Service Not Implemented Service tidak terdaftar pada request CHANNEL-ID.
4004701 Invalid Field Format Nilai value yang tidak tepat untuk parameter tersebut.
4004702 Missing Mandatory Field, {PartnerReferenceNo} Parameter PartnerReferenceNo tidak ada.
4004702 Missing Mandatory Field, {Amount} Parameter Amount tidak ada.
4004702 Missing Mandatory Field, {AdditionalInfo.ReturnUrl} Parameter ReturnUrl tidak ada.
4014700 Unauthorized Signature Kekeliruan pada Signature.
4014700 Unauthorized stringToSign Kekeliruan pada Signature.
4014700 Unauthorized Client Kekeliruan pada PARTNER-ID.
4014701 Invalid Access Token Access Token Kadaluarsa atau keliru.
4044701 Invalid Request Nilai value yang tidak tepat untuk parameter.
4044713 Invalid Amount, Amount must be equal with total price item details Kekeliruan pada value parameter amount dan price di item detail.
4094700 Conflict Kekeliruan pada External ID.
4094700 The expired in field must be at least 30. Untuk validityPeriod anda dapat mengaturnya minimal 30 menit

Payment Notify (CALLBACK)

Duitku SNAP API Payment QR NOTIFY

Payment berupa webhook atau notifikasi ketika pengguna sudah membayar. Untuk menerima informasi ini, Anda perlu membuat API untuk menerima notifikasi. Berikut hal-hal yang perlu Anda lakukan saat menerima pembayaran.

  1. Secure: Anda perlu melakukan pembayaran dengan aman. Karena informasi pembayarannya akan selalu melalui API ini. Kita perlu memastikan lingkungan yang kuat dan aman. Anda mungkin melihat gambar diagram urutan di bagian atas halaman ini.
    1. Whitelist IP Duitku jika diperlukan. IP range : 182.23.85.0/28 103.177.101.177/28
    2. Selalu validasi signature.
    3. Secara opsional, Anda dapat memeriksa Query Payment untuk memastikan bahwa pengguna Anda telah membayar transaksinya.
  2. Update: Anda perlu memperbarui status transaksi Anda atau Anda dapat mendaftarkan pembayaran pada transaksi Anda.

Method : HTTP POST

Type : application/json

Url : https://yourdomain.com/v1.0/qr/qr-mpm-notify

Endpoint : /v1.0/qr/qr-mpm-notify

Service Code : 52

Header :

Parameter Tipe Mandatori Keterangan Contoh
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat Asymmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai yang digunakan harus sesuai dengan detail transaksi yang telah di generate sebelumnya. Berikut list Nilai yang digunakan SP,GQ,DQ atau NQ SP

Body :

{
    "originalReferenceNo": "DXX116FL4KD00EBRDE5",
    "originalPartnerReferenceNo": "BMA-140",
    "latestTransactionStatus": "00",
    "amount": {
        "value": "2001.00",
        "currency": "IDR"
    },
    "additionalInfo": {
        "productDetails": "tes product",
        "additionalParam": "tes 123",
        "issuerCode": "93600916",
        "paymentMethod": "GQ",
        "publisherOrderId": "GQ241EKHWNVPFBC86LV",
        "settlementDate": "2024-04-20"
    }
}
Parameter Tipe Mandatori Keterangan Contoh
originalPartnerReferenceNo string(64)

Nilai berasal dari parameter PartnerReferenceNo pada response debit payment. INV1708656785
originalReferenceNo string(64)

Nilai berasal dari parameter ReferenceNo pada response debit payment. D00XXXWIG5BV1WW8F3RMF
latestTransactionStatus String(2)

Kode dari status transaksi. 00
amount Object

Lihat tabel di bawah ini.
additionalInfo Object

Lihat tabel di bawah ini.

amount

Parameter Tipe Mandatori Keterangan Contoh
value String

ISO4217
dengan 2 desimal.
10000.00
currency String(3)

Kode mata uang, hanya menerima IDR. IDR

additionalInfo

Parameter Tipe Mandatori Keterangan Contoh
productDetails String(50)

Keterangan produk/jasa yang diperjual belikan. Tes payment
additionalParam String(255)

Parameter tambahan.
issuerCode String(15)

Issuer pembayaran yang digunakan. 972131
publisherOrderId String(30)

Kode unik transaksi dari duitku. GQ241EKHWNVPFBC86LV
paymentMethod String(40)

Kode metode pembayaran yang digunakan. GQ
settlementDate String(10)

Informasi waktu estimasi penyelesaian. Format: YYYY-MM-DD 2023-07-25

Response :

{
    "responseCode": "2005200",
    "responseMessage": "Successful",
}
Code Message Keterangan
2005200 Successful Berhasil di proses dan mendapatkan data.
4005201 Invalid Field Format {fieldName} Nilai value yang tidak tepat untuk parameter {fieldName}.
4005202 Invalid Mandatory Field {fieldName} Parameter {fieldName} tidak ada.
4015200 Unauthorized Signature Kekeliruan pada Signature.
4015201 Invalid Access Token Access Token kedaluwarsa atau keliru.
4045214 Bill already paid Tagihan sudah dibayar.
4095200 Conflict Kekeliruan pada External ID.
5005200 General Error Error pada saat melakukan proses permohonan.
5045200 Time Out Waktu kedaluwarsa.

Query Payment

Duitku SNAP API QR MPM QUERY

API ini akan membantu Anda untuk pengecekan status dari transaksi yang telah dilakukan. Seperti yang Anda lihat pada urutan di atas. Anda mungkin perlu menanyakan kapan ada konfirmasi pembayaran dari pengguna. Atau sebagai pilihan keamanan, Anda mungkin menanyakan status setelah menerima Payment Notify. Ini membantu Anda memastikan status pembayaran asli.

Method : HTTP POST

Type : application/json

Development : https://snapdev.duitku.com/merchant/qris/v1.0/qr/qr-mpm-query

Production : https://snap.duitku.com/merchant/qris/v1.0/qr/qr-mpm-query

Service Code : 51

Header :

Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat symmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai yang digunakan harus sesuai dengan detail transaksi yang telah di generate sebelumnya. Berikut list Nilai yang digunakan SP,GQ,DQ atau NQ SP
Authorization string

Otentikasi dengan bearer token Bearer ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0

Body :

{
    "originalPartnerReferenceNo": "INV1708656785",
    "originalReferenceNo": "D00XXXWIG5BV1WW8F3RMF",
    "serviceCode": "51"
}
Parameter Tipe Mandatori Keterangan Contoh
originalPartnerReferenceNo string(64)

Nilai berasal dari parameter PartnerReferenceNo pada response debit payment. INV1708656785
originalReferenceNo string(64)

Nilai berasal dari parameter ReferenceNo pada response debit payment. D00XXXWIG5BV1WW8F3RMF
serviceCode string(2)

Indikator jenis transaksi (kode layanan permintaan transaksi debit status). 51

Response :

{
  "responseCode": "2005100",
  "responseMessage": "SUCCESS",
  "originalReferenceNo": "DXXXX424A5WNCS7ZDKAHVP5",
  "originalPartnerReferenceNo": "INV1709787234",
  "serviceCode": "51",
  "transactionStatusDesc": "Success",
  "latestTransactionStatus": "00",
  "amount": {
    "value": "321.00",
    "currency": "IDR"
  }
}
Code Message Keterangan
2005100 Success Transaksi berhasil di proses.
2005101 Invalid Token:Anda Tidak Memiliki Akses Kekeliruan pada Request credentialCode.
4005101 Invalid Field Format Nilai value yang tidak tepat untuk parameter.
4005102 Missing Mandatory Field, {originalPartnerReferenceNo} Parameter originalPartnerReferenceNo tidak ada.
4005102 Missing Mandatory Field, {originalReferenceNo} Parameter originalReferenceNo tidak ada.
4005102 Missing Mandatory Field, {serviceCode} Parameter serviceCode tidak ada.
4005102 Invalid Mandatory Header X-EXTERNAL-ID Parameter X-EXTERNAL-ID tidak ada.
4005102 Invalid Mandatory Header CHANNEL-ID Parameter CHANNEL-ID tidak ada.
4015100 Unauthorized Signature Kekeliruan pada Signature.
4015100 Unauthorized stringToSign Kekeliruan pada Signature.
4015100 Unauthorized Client Kekeliruan pada PARTNER-ID.
4015101 Invalid Access Token Access Token Kadaluarsa atau keliru.
4045101 Invalid Request Kesalahan format pada saat request.
5005101 Internal Server Error Error pada saat melakukan proses permohonan.

Transactions status

Untuk detail response latestTransactionStatus lihat tabel di bawah ini.

Status Keterangan
00 Successful
03 Pending
04 Refunded
06 Failed
07 Not Found

Refund Payment

Duitku SNAP API QR MPM REFUND

Layanan API yang digunakan untuk pengembalian dana dari transaksi yang telah dilakukan.

Method : HTTP POST

Type : application/json

Development : https://snapdev.duitku.com/merchant/qris/v1.0/qr/qr-mpm-refund

Production : https://snap.duitku.com/merchant/qris/v1.0/qr/qr-mpm-refund

Service Code : 78

Header :

Parameter Tipe Mandatori Keterangan Contoh
Content-Type string

String yang menunjukkan jenis media. application/json
X-TIMESTAMP string

ISO-8601 2022-09-16T13:00:00+07:00
X-SIGNATURE string

Lihat symmetric.
X-PARTNER-ID string

ID Proyek. DXXXX
X-EXTERNAL-ID string

Request ID yang unik.
CHANNEL-ID string

Nilai yang digunakan harus sesuai dengan detail transaksi yang telah di generate sebelumnya. Berikut list Nilai yang digunakan SP,GQ,DQ atau NQ SP
Authorization string

Otentikasi dengan bearer token Bearer ZGMyNDA3NWQtNmM4Ny00NGNiLTQ2NTAtMDhkYWMxNTAzNzY0

Body :

{
    "partnerRefundNo": "RFD-143",
    "originalPartnerReferenceNo": "INV-143",
    "originalReferenceNo": "DXX01OYA8GFJXA130B1P",
    "refundAmount": {
        "value": "2001.00",
        "currency": "IDR"
    }
}
Parameter Tipe Mandatori Keterangan Contoh
partnerRefundNo String(64)

Kode unik untuk refund dari merchant. RFD-143
originalPartnerReferenceNo string(64)

Nilai berasal dari parameter PartnerReferenceNo pada response debit payment. INV1708656785
originalReferenceNo string(64)

Nilai berasal dari parameter ReferenceNo pada response debit payment. D00XXXWIG5BV1WW8F3RMF
refundAmount Object

Lihat tabel dibawah ini.

amount

Parameter Tipe Mandatori Keterangan Contoh
value String

ISO4217
dengan 2 desimal.
10000.00
currency String(3)

Kode mata uang, hanya menerima IDR. IDR

Response :

{
    "responseCode": "2007800",
    "responseMessage": "SUCCESS",
    "originalReferenceNo": "D0001OYA8GFJXA130B1P",
    "originalPartnerReferenceNo": "INV-143",
    "partnerRefundNo": "RFD-143",
    "refundTime": "2023-03-01T10:08:45Z",
    "refundNo": "REFUND-OLOSFPBRGMNFI6RJS-1677665317584"
}
Code Message Keterangan
2007800 Successful Berhasil di proses.
4007802 Invalid Mandatory Header X-EXTERNAL-ID Parameter X-EXTERNAL-ID tidak ada.
4007802 Invalid Mandatory Header CHANNEL-ID Parameter CHANNEL-ID tidak ada.
4017800 Unauthorized Signature Kekeliruan pada Signature.
4017800 Unauthorized stringToSign Kekeliruan pada Signature.
4017800 Unauthorized Client Kekeliruan pada PARTNER-ID.
4017801 Invalid Access Token Access tokenId Kadaluarsa atau keliru.
5007801 Internal Server Error Error pada saat melakukan proses permohonan.

Issuer List (QRIS)

Code Issuer
93600999 AHDI
93600947 Aladin Syariah
93600567 Allo Bank Indonesia
93600531 Amar
93600822 Astrapay
93600116 Bank Aceh Syariah
93600037 Bank Artha Graha Internasional
93600133 Bank BPD Bengkulu
93600124 Bank BPD Kalimantan Timur dan Kalimantan Utara
93600161 Bank Ganesha
93600513 Bank Ina Perdana
93600113 Bank Jateng
93600123 Bank Kalbar
93600122 Bank Kalsel
93600441 Bank KB Bukopin
93600121 Bank Lampung
93600157 Bank Maspion
93600553 Bank Mayora
93600548 Bank Multiarta Sentosa
93600490 Bank Neo Commerce
93600128 Bank NTB Syariah
93600019 Bank Panin
93600132 Bank Papua
93600115 Bank Pembangunan Daerah Jambi
93600494 Bank Raya
93600119 Bank Riau Kepri
93600523 Bank Sahabat Sampoerna
93600152 Bank Shinhan
93600126 Bank Sulsel
93600120 Bank Sumselbabel
93600023 Bank UOB Indonesia
93600808 Bayarind
93600014 BCA
93600536 BCA Syariah
93600501 BCAD
93600815 Bimasakti Multi Sinergi
93600110 BJB
93600425 BJB Syariah
93600919 BluePay
93600009 BNI
93600129 BPD Bali
93600112 BPD DIY
93600130 BPD NTT
93600114 BPD-JATIM
93600002 BRI
93600422 BRIS Pay
93600200 BTN
93600076 Bumi Arta
93600031 Citibank
93600950 Commonwealth
93600915 Dana
93600011 Danamon
93600046 DBS MAX QRIS
93600111 DKI
93600899 Doku
93600998 DSP
93600827 Fello
93600777 Finpay
93600813 GAJA
93600914 Go-Pay
93600916 Gudang Voucher
93600484 Hana bank
93600789 IMkas
93600920 Isaku
93600542 JAGO
93600213 Jenius
93600812 Kaspro
93600911 LinkAja
93600008 Mandiri Pay
93600016 Maybank
93600426 Mega
93600821 Midazpay
93600485 Motion Banking
93600147 Muamalat
93600118 Nagari
93600814 Netzme
93600022 Niaga
93600503 Nobu
93600028 OCBC
93600811 OTTOCASH
93600912 OVO
93600820 PAC Cash
93600818 Paydia
93600917 Paytrend
93600013 Permata
93608161 POS Indonesia
93600167 QNB Indonesia
93600921 Saldomu
93600535 Seabank
93600918 ShopeePay
93600153 Sinarmas
93600816 SPIN
93600451 Syariah Indonesia
93600898 T-Money
93600828 TrueMoney
93600835 Virgo
93600830 YODU
93600817 Yukk
93600825 Zipay

Uji Coba

Setelah anda melewati langkah-langkah integrasi di atas, anda dapat melakukan pengecekan pembayaran. Berikut adalah daftar uji coba pembayaran yang dapat digunakan di Sandbox Environtment:

VA

Demo pembayaran transaksi virtual account pada sandbox klik di sini.

E-Wallet

Shopee

Untuk pengetesan transaksi shopee dapat mengunduh shopeeapp staging apk disini.

Gudang Voucher

Untuk Gudang Voucher dapat menggunakan demo sukses virtual account.

Changelog

Version 1.0