QRIS Merchant Presented Mode (MPM) Dinamis v1.1
Apa itu QRIS Merchant Presented Mode (MPM) Dinamis ?
Quick Response Code Indonesian Standard atau disingkat QRIS (dibaca KRIS) adalah penyatuan berbagai macam QR dari berbagai Penyelenggara Jasa Sistem Pembayaran (PJSP) menggunakan QR Code. QRIS dikembangkan oleh industri sistem pembayaran bersama dengan Bank Indonesia agar proses transaksi dengan QR Code dapat lebih mudah, cepat, dan terjaga keamanannya.
Dengan QRIS, seluruh aplikasi pembayaran dari Penyelenggara manapun baik bank dan nonbank yang digunakan masyarakat, dapat digunakan di seluruh toko, pedagang, warung, parkir, tiket wisata, donasi (merchant) berlogo QRIS, meskipun penyedia QRIS di merchant berbeda dengan penyedia aplikasi yang digunakan masyarakat.
QRIS Merchant Presented Mode (MPM) Dinamis sendiri adalah kode QR dengan metode yakni kode QR dikeluarkan melalui suatu device seperti mesin EDC atau smartphone. Merchant harus me-masukkan nominal pembayaran terlebih dahulu, kemudian pelanggan melakukan scan QRIS yang tampil atau tercetak.
BRI juga menyediakan API fitur notifikasi untuk pembayaran menggunakan QRIS MPM dinamis.
Contoh Penggunaan API QRIS Merchant Presented Mode (MPM) Dinamis
QRIS Merchant Presented Mode (MPM) Dinamis sangat cocok untuk merchant skala usaha menengah dan besar atau dengan volume transaksi tinggi. Dengan QRIS MPM Dinamis merchant perlu me-masukkan nominal pembayaran lalu mencetak kode QRIS dengan detail sesuai yang merchant masukkan sebelumnya selanjutnya pelanggan dapat melakukan scan QRIS untuk melakukan pembayaran.
Informasi API
Title | QRIS Dinamis - MPM |
---|---|
Version | v1.1 |
URL Sandbox | https://sandbox.partner.api.bri.co.id/ |
URL Production | https://partner.api.bri.co.id/ |
Kendali Versi
API Version | Date | Link to document | Deskripsi |
---|---|---|---|
v1.0 | 11 Mei 2022 | Disini | Baseline version. |
v1.1 | 31 Juli 2023 | Halaman ini | Penambahan Field issuerRrn pada Endpoint Inquiry QR |
Deskripsi Produk
Gambaran Produk
Dokumen ini bertujuan untuk menjelaskan spesifikasi API dari pengembangan QRIS Dinamis - MPM dengan skema merchant mengeluarkan QRIS, nasabah menggunakan alat untuk memindai scan QRIS merchant. Kemudian dari BRI mengiriman notifikasi callback sesuai dengan spesifikasi yang telah ditentukan.
Endpoint
A. Get Token
Endpoint Description
Endpoint ini digunakan untuk mendapatkan access token yang berfungsi sebagai otentikasi saat ingin mengakses API yang lain. Pilot test pengecekan bahwa get token tidak dihit setiap kali mengakses endpoint (integrator)
General Information
HTTP Method | POST |
---|---|
Path | /snap/v1.0/access-token/b2b |
Type Format | JSON |
Authentication | Digital Signature |
Header Structure
Key | Value | Format | Mandatory | Length | Deskripsi | Contoh |
---|---|---|---|---|---|---|
X-SIGNATURE | M | Dengan algoritma asymmetric signature SHA256withRSA (Private_Key, stringToSign). stringToSign = client_ID + “|” + XTIMESTAMP | Y | |||
X-CLIENT-KEY | Alphanumeric | M | Client’s client_id (Nama PJP) (diberikan pada saat proses registrasi selesai) | |||
X-TIMESTAMP | Datetime | M | Waktu lokal klien saat ini yyyy-MM-ddTHH:mm:ss.SSSTZD format | |||
Content-Type | application/json | M |
Request Structure
Field | Data Type | Format | Mandatory | Length | Description | Example |
---|---|---|---|---|---|---|
grantType | String | Alphabet | Y | “client_credentials”: klien dapat meminta token akses hanya menggunakan kredensial kliennya (atau cara otentikasi lain yang didukung) ketika klien meminta akses ke sumber daya yang dilindungi di bawah kendalinya (OAuth 2.0: RFC 6749 & 6750) | client_credentials |
Response Structure
Field | Data Type | Format | Mandatory | Length | Deskripsi | Contoh |
---|---|---|---|---|---|---|
responseCode | String | Numeric | C | Kode respon | (example code) | |
responseMessage | String | Alphabet | C | Respon deskripsi | (example message) | |
accessToken | String | Alphanumeric | M | Jenis token akses menyediakan klien dengan informasi yang diperlukan untuk berhasil menggunakan token akses untuk melindungi resource request (bersama dengan atribut tipe-spesifik) Tipe jenis token: - “Bearer”: termasuk token akses string saat request - “Mac”: mengeluarkan pesan kunci kode otentikasi (MAC) bersama dengan token akses yang digunakan untuk menandatangani komponen tertentu dari permintaan HTTP Referensi: OAuth2.0 RFC 6749 & 6750 |
(example access token) | |
tokenType | String | Alphabet | M | (example token type) | ||
expiresIn | String | Alphanumeric | M | Sesi berakhir dalam hitungan detik : 900 (15 menit) | (example expiration) |
{ "grantType": "client_credentials" }
Normal Response:
{ "accessToken": "jwy7GgloLqfqbZ9OnxGxmYOuGu85", "tokenType": "BearerToken", "expiresIn": "899" }
Error Response:
{ "responseCode": "4007301", "responseMessage": "Invalid Field Format" }
List of Error/Response Code
HTTP Status Code | Response Status | Response Description | Deskripsi |
---|---|---|---|
200 | Success | - | - |
400 | 4007300 | Failed Bad Request | - |
400 | 4007301 | Failed Invalid Field Format | - |
401 | 4017300 | Failed Unauthorized Client | - |
401 | 4017300 | Failed Unauthorized stringToSign | - |
401 | 4017300 | Failed Unauthorized Signature | - |
401 | 4017301 | Failed Invalid Token (B2B) | - |
500 | 500000 | Failed General Error | - |
Signature
Signature memastikan data yang dikirimkan adalah asli dan tidak bisa disanggah. Signature dihasilkan oleh pemakai layanan dan diverifikasi oleh penerima layanan. Signature dibentuk dari payload yang sudah ditentukan, dengan mengimplementasikan algoritma HMAC_SHA512 dengan clientSecret sebagai kuncinya.
Payload
Payload tergabung dari verb, path, token, timestamp, and body. Dengan format Symetric-Signature: HMAC_SHA512 (clientSecret, stringToSign) dengan formula stringToSign = HTTPMethod+”:“+ EndpointUrl +":"+ AccessToken+":“ + Lowercase(HexEncode(SHA-256(minify(RequestBody))))+ ":“ +TimeStamp
Contoh:
POST:/snap/v1.1/dummy:muhpwhwOkPRU9nNXYnyYHj8t54x3:8b4e9e83b5231cff4f84358ec8ca81951cfe9f999f635b1566452a501d5c23b2:2021-11- 29T09:22:18.172+07:00
Detail setiap elemen di dalam payload dijelaskan di bawah ini:
Path
Value pada path yaitu URL setelah hostname dan port tanpa Query Parameter
Contoh:
https://sandbox.partner.api.bri.co.id/simulator/qr/qr-cpm-payment-url becomes /simulator/qr/qr-cpm-payment-ur
Verb
Method HTTP dengan huruf kapital.
Contoh: GET, POST, PUT, PATCH, and DELETE.
Token
Token yang dipakai di header Authorization
Contoh: Bearer R04XSUbnm1GXNmDiXx9ysWMpFWBr
Timestamp
TWaktu saat mengirimkan request API. Format waktu harus mengikuti ISO8601 format (yyyy-MM-ddTHH:mm:ss.SSSZ). Harus dalam zero UTC offset Example:
Contoh:
2021-11-02T13:14:15.678+07:00
Body
Body saat mengirimkan request API. Lowercase(HexEncode(SHA-256(minify(RequestBody))))
Contoh: {"hello":"world"}
Result SHA256 : a47a5f14b3e78b5e3d3f81b1a1468499be964660f818c10adcac792c42709749
Jika tidak terdapat body request, contoh menggunakan metode GET, biarkan saja kosong
contoh: &body=
Rerefrensi : https://developers.bri.co.id/en/snap-bi/apidocs-oauth-snap-bi
B. Generate QR
Endpoint Description
API Generate QR digunakan untuk melakukan generate QR MPM Dinamis
General Information
HTTP Method |
POST |
---|---|
Path |
/v1.1/qr-dynamic-mpm/qr-mpm-generate-qr |
Type Format |
JSON |
Authentication |
OAuth 2.0 |
Header Structure
Key | Value | Format | Mandatory | Length | Deskripsi |
---|---|---|---|---|---|
Authorization | Authorization | Alphanumeric | M | - | Bearer {Token} |
X-TIMESTAMP | BRI - timestamp | Datetime | M | - | Format Timestamp ISO8601 |
X-SIGNATURE | BRI - Signature | Alphanumeric | M | - | HMAC_SHA512 |
Content-Type | application/json | Alpha | M | - | application/json |
X-PARTNER-ID | Alphanumeric | M | 36 | ||
CHANNEL-ID | Alpha | M | 5 | ||
X-EXTERNAL-ID | Numeric | M | 36 |
Request Structure
Field | Data Type | Mandatory | Length | Description | Example |
---|---|---|---|---|---|
partnerReferenceNo | String | M | 6 | Identifikasi transaksi pada sistem layanan konsumen | 1234567890133 |
amount | Object | M | - | Rincian untuk jumlah objek tercantum dalam tabel | |
merchantId | String | M | 64 | ID unik yang dimiliki oleh setiap merchant | 00007100010926 |
terminalId | String | M | 16 | Terminal ID | 213141251124 |
Request Structure dalam Object "amount"
Field | Data Type | Mandatory | Length | Description | Example |
---|---|---|---|---|---|
value | Decimal | M | 18 | Jumlah bersih dari transaksi. Jika itu IDR maka nilainya termasuk 2 angka desimal. misalnya Rp 10.000,- akan ditempatkan dengan 10000.00 | 123456.00 |
currency | String | M | 3 | 3 digit kode ISO Currency | IDR |
Response Structure
Field | Data Type | Mandatory | Length | Description | Example |
---|---|---|---|---|---|
responseCode | String | M | 7 | Kode response HTTP status code + service code + case code | 2004700 |
responseMessage | String | M | 150 | Deskripsi response | Successfull |
partnerReferenceNo | String | M | 6 | Nomor identifikasi transaksi pada sistem layanan konsumen | 1234567890133 |
qrContent | String | M | 512 | QR String MPM 0002xxxxxxxxxx | |
referenceNo | String | M | 12 | Nomor identifikasi transaksi pada sistem penyedia layanan. | 409676201434 |
Request & Response Payload Sample
Request:
{ "partnerReferenceNo": "1234567890133", "amount": { "value": "123456.00", "currency": "IDR" }, "merchantId": "00007100010926", "terminalId": "213141251124" }
Normal Response:
{ "responseCode": "2004700", "responseMessage": "Successful", "partnerReferenceNo": "1234567890133", "qrContent": "0002XXXXXXXXX", "referenceNo": "409676201434" }
C. Inquiry Payment
Endpoint Description
Endpoint untuk melakukan inquiry payment QR MPM Dinamis
General Information
HTTP Method |
POST |
---|---|
Path |
/v1.1/qr-dynamic-mpm/qr-mpm-query |
Type Format |
JSON |
Authentication |
OAuth 2.0 |
Header Structure
Key | Value | Format | Mandatory | Length | Deskripsi |
---|---|---|---|---|---|
Authorization | Authorization Bearer {Token} | Alphanumeric | M | ||
X-TIMESTAMP | BRI - timestamp | Datetime | M | Format Timestamp ISO8601 | |
X-SIGNATURE | BRI - Signature | Alphanumeric | M | HMAC_SHA512 | |
Content-Type | application/json | Alpha | M | application/json | |
X-PARTNER-ID | Alphanumeric | M | 36 | ||
CHANNEL-ID | Alpha | M | 5 | ||
X-EXTERNAL-ID | Numeric | M | 36 |
Request Structure
Field | Data Type | Mandatory | Length | Description | Example |
---|---|---|---|---|---|
originalReferenceNo | String | M | 64 | Nomor identifikasi transaksi pada sistem penyedia layanan | 000008526955 |
serviceCode | String | M | 2 | Indikator jenis transaksi (kode service dari transaksi request asli) | 17 |
additionalInfo | Object | M | Detail isian dari object additionalInfo terdapat pada tabel dibawah ini |
Request Structure dalam Object "additionalInfo"
Field | Data Type | Mandatory | Length | Description | Example |
---|---|---|---|---|---|
terminalId | String | M | 16 | ID Terminal | 100492 |
Response Structure
Field | Data Type | Mandatory | Length | Description | Example |
---|---|---|---|---|---|
responseCode | String | M | 7 | Kode Response HTTP status code + service code + case code | 2005100 |
responseMessage | String | M | 150 | Deskripsi Response | Successful |
originalReferenceNo | String | C | 64 | Nomor Identifikasi transaksi pada sistem penyedia layanan | 290005165369 |
serviceCode | String | M | 2 | Kode Service | 17 |
latestTransactionStatus | String | M | 2 | Status Transaksi | 00 - Success |
transactionStatusDesc | String | O | 50 | Deskripsi dari status transaksi | Successfully |
amount | Object | M | Detail isian dari object amount terdapat pada tabel dibawah ini | ||
terminalId | String | O | 16 | Indentifikasi terminal | 10049258 |
additionalInfo | Object | O | Detail isian dari object additionalInfo terdapat pada tabel dibawah ini |
Response Structure dalam Object "amount"
Field | Data Type | Mandatory | Length | Description | Example |
---|---|---|---|---|---|
value | Decimal | M | 18 | Jumlah bersih dari transaksi. Jika itu IDR maka nilainya termasuk 2 angka desimal. | 2000.00 |
currency | String | M | 3 | 3 digit kode ISO Currency | IDR |
Response Structure dalam Object "additionalInfo"
Field | Data Type | Mandatory | Length | Description | Example |
---|---|---|---|---|---|
customerName | String | O | Nama konsumen | I GEDE TONI DHARMAWAN | |
customerNumber | String | O | Nomor konsumen | 9360015723456789 | |
invoiceNumber | String | O | Nomor invoice | 10009121031000912103 | |
issuerName | String | O | Nama issuer | Finnet 2 | |
issuerRrn | String | O | transaksi id dari issuer QR | 110002756582 | |
mpan | String | O | Merchant PAN dari original Payment QR | 9360000201102921379 |
Request & Response Payload Sample Request:
{ "originalReferenceNo":"290005165369", "serviceCode":"17", "additionalInfo":{ "terminalId": "10049258" } }
Normal Response:
{ "responseCode": "2005100", "responseMessage": "Successful", "originalReferenceNo": "290005165369", "serviceCode": "17", "latestTransactionStatus": "00", "transactionStatusDesc": "Successfully", "amount": { "value": "2000.00", "currency": "IDR" }, "terminalId": "10049258", "additionalInfo": { "customerName": "I GEDE TONI DHARMAWAN", "customerNumber": "9360015723456789", "invoiceNumber": "10009121031000912103", "issuerName": "Finnet 2", "issuerRrn": "110002756582", "mpan": "9360000201102921379" } }
List of Error/Response Code
HTTP Status Code | Code | Status | Response Description | Deskripsi |
---|---|---|---|---|
200 | 00 | Sukses | Successfull | Success |
202 | 00 | Pending | Transaction still on process | Transaction in progress |
202 | 00 | Pending | Request on progress | Payment is in process / failed |
400 | 01 | Gagal | Invalid Field Format Request | Invalid Request Format |
403 | 00 | Gagal | Transaction Expired | Refund is no longer possible |
403 | 02 | Gagal | Exceeds Transaction Amount Limit | Amount exceeding the limit |
403 | 15 | Gagal | Transaction Not Permitted. Invalid Data. Abort Process | Invalid Data. Abort Process |
403 | 15 | Gagal | Transaction Not Permitted. QR Expired | QR Expired |
403 | 23 | Gagal | Account Limit Exceed | Accumulated Amount Exceeds Limit |
404 | 01 | Gagal | Transaction Not Found |
|
404 | 08 | Gagal | Invalid Merchant | Invalid Merchant |
404 | 11 | Gagal | Invalid Card/Account/Customer [info]/Virtual Account | Invalid CPAN |
404 | 12 | Gagal | Invalid Bill | Invalid transaction / invalid number |
404 | 13 | Gagal | Invalid Amount | Invalid Amount |
404 | 14 | Gagal | Paid Bill | Transaction Paid |
500 | 01 | Gagal | Internal Server Error Retrieve Data Failed | Retrieve Data Failed |
500 | 01 | Gagal | Internal Server Error Database Error | Database Error |