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:
- Production:
https://snap.duitku.com
- Development:
https://snapdev.duitku.com
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.
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.
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:
- Project code sandbox
- Layanan API yang dibutuhkan. Adapun layanan API yang Duitku sediakan adalah sebagai berikut:
- Virtual Account
- Direct Debit Redirect
- Direct Debit Linking
- QRIS-MPM
- 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
- URL payment SNAP untuk menerima notifikasi pembayaran. URL ini harus mengikuti standar notifikasi pembayaran dan sesuai dengan layanan API yang dibutuhkan:
Anda dapat menggunakan format email di sini.
Email Kedua:
- Kata sandi untuk membuka Zip file pada Kunci Publik yang telah dikirimkan sebelumnya
Otentikasi API
Otentikasi di SNAP API ada:
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:
- Anda bisa menggunakan Git OpenSSL.
- Git OpenSSL biasanya perlu dijalankan di direktorinya. Jalankan perintah di bawah ini. (Contoh Windows)
cd "..\..\Program Files\Git\usr\bin"
- Kemudian, buat kunci pribadi menggunakan perintah berikut:
openssl genrsa -out C:\Users\{your_users}\Desktop\PrivateKey.pem 2048
- 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
.
HttpMethod
adalah string nama metode yang sedang digunakan. Bisa sajaPOST
,PUT
, atauDELETE
.Endpoint
adalah relative URL atau full path URL yang mana tanpa host atau domainnya.AccessToken
adalah nilai token yang Anda dapatkan dari API Get Token .RequestBody
adalah payload yang ingin Anda kirim.Timestamp
menggunakan ISO-8601.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
.
ClientKey
adalah ID proyek.Timestamp
menggunakan ISO-8601.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
.
HttpMethod
adalah string nama metode yang sedang digunakan. Mereka seharusnyaPOST
.Endpoint
adalah relative URL atau full path URL yang mana tanpa host atau domainnya.RequestBody
adalah payload yang dikirimkan dari Duitku.Timestamp
menggunakan ISO-8601.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
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 karakter 16 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.
- Close Amount
Inisiasi jumlah tagihan. VA akan dapat terbayarkan dengan tagihan yang telah di inisiasi. - 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
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 karakter 16 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
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 karakter 16 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
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 karakter 16 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
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.
- 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.
- Whitelist IP Duitku jika diperlukan.
IP range :
182.23.85.0/28
103.177.101.177/28
- Selalu validasi signature.
- Secara opsional, Anda dapat memeriksa Inquiry Status untuk memastikan bahwa pengguna Anda telah membayar transaksinya.
- Whitelist IP Duitku jika diperlukan.
IP range :
- 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 karakter 16 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
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 karakter 16 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
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
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
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
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 |
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 |
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
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 |
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 |
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)
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.
- 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.
- Whitelist IP Duitku jika diperlukan.
IP range :
182.23.85.0/28
103.177.101.177/28
- Selalu validasi signature.
- Secara opsional, Anda dapat memeriksa Debit Payment Status untuk memastikan bahwa pengguna Anda telah membayar transaksinya.
- Whitelist IP Duitku jika diperlukan.
IP range :
- 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 ,DA atau 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
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 ,DA atau 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
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 ,DA atau 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
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 |
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 |
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)
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.
- 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.
- Whitelist IP Duitku jika diperlukan.
IP range :
182.23.85.0/28
103.177.101.177/28
- Selalu validasi signature.
- Secara opsional, Anda dapat memeriksa Query Payment untuk memastikan bahwa pengguna Anda telah membayar transaksinya.
- Whitelist IP Duitku jika diperlukan.
IP range :
- 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
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
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
- API Documentation created
- SNAP VA
- SNAP Direct Debit Linking
- SNAP Direct Debit Redirect
- SNAP Registration AccountLink
- SNAP QR MPM