Appearance
Generate QR MPM SNAP
Information
Merchants use this API to generate QRIS codes. The API response provides a QR string, QR URL, or QR image that can be utilized to render the QR Code.
Path | /v1.0/qr/qr-mpm-generate |
---|---|
HTTP Method | POST |
Service Code | 47 |
Type Format | JSON |
Request
Details
Parameter | Data Type | Mandatory | Length | Description |
---|---|---|---|---|
partnerReferenceNo | String | M | 64 | Transaction identifier on service consumer system. Alphanumeric only, not special characters and space allowed. |
amount | Object | M | ||
amount.value | String | C | 16,2 | Amount of the transaction. If it's IDR then the value includes 2 decimal digits. e.g. IDR 10.000,- will be placed with 10000.00 with 2 decimal. Amount refers to amount validation |
amount.currency | String | C | 3 | Currency (Format: ISO4217) fixed value: IDR |
terminalId | String | O | 16 | Terminal Identification |
validityPeriod | String | O | 25 | The time when the QRIS is valid. - Minimum 15 minutes - Maximum 60 minutes. - If empty, default validityPeriod 15 minutes. ISO-8601 |
additionalInfo | Object | C | Additional information | |
additionalInfo.callbackUrl | Text | M | Payment Notification URL, must use SNAP format. | |
additionalIfo.customerDetail | Object | O | ||
additionalIfo.customerDetail.email | String | O | 255 | Give validation format. Use @ |
additionalIfo.customerDetail.phone | String | O | 30 | Number only |
additionalIfo.customerDetail.fullName | String | O | 100 | |
additionalIfo.itemDetails | Array of Objects | O | Explain the items purchased | |
additionalIfo.itemDetails.itemId | String(25) | C | 25 | ID of product. Mandatory if item details is filled |
additionalIfo.itemDetails.name | String(150) | C | 100 | Name of product. Mandatory if item details is filled |
additionalIfo.itemDetails.amount | Object | C | Price per unit. Mandatory if item details is filled. Accumulation amount should be match with original amount | |
additionalIfo.itemDetails.amount.value | String | C | Mandatory if item details is filled | |
additionalIfo.itemDetails.amount.currency | String | C | 16,2 | Mandatory if item details is filled |
additionalIfo.itemDetails.qty | Int(10) | C | 8 | Number of product units. Mandatory if item details is filled. Maximum 99999999 |
additionalIfo.itemDetails.description | String(255) | O | 255 | Description of product |
Example Request
Details
sh
curl --location '.../v1.0/qr/qr-mpm-generate' \
--header 'Content-Type: application/json' \
--header 'X-TIMESTAMP: 2020-12-18T10:55:00+07:00' \
--header 'X-SIGNATURE: EW54nOonmAK58n7lFuAd6RJCa9Th1NnIkRO3fEk2IXSPqukTvBukrBTSJKEsh8Lk5A3cCWnTpMUjcirsvCGpjqtBuDLfQWHA6Cr/Ah4lfPwVMxfDS+tPqb+ZhGBBSv6Wz39CfHHWXoEs1hpRONBUc02zO5ancLtyU3mn4IbYPfP72eUKpqH+Zw9IDBnFyVQ0isr9DDwiS8MZyNdN7io3ZL6SCvuOpxeaC4I/zbeauyiswqwb/hF51M60tD79yTzjDLlgz/e4X3Z3kJyQHUauVldb13Fl7F81wxj+iDrg6AjfSbRJ3QnkAndo/ZIUKcihq7AkUm9uhLYEhrW+iUW4eg==' \
--header 'X-PARTNER-ID: MC2024113943' \
--header 'X-EXTERNAL-ID: 63005301609284' \
--header 'CHANNEL-ID: QR004' \
--data '{
"partnerReferenceNo": "63064359768847",
"amount": {
"value": "800000.00",
"currency": "IDR"
},
"terminalId": "A01",
"validityPeriod": "2025-02-26T16:00:08+07:00",
"additionalInfo": {
"callbackUrl": "https://testcallback.com",
"customerDetail": {
"email": "test@gmail.com",
"phone": "08888888888",
"fullName": "Customer name"
},
"itemDetails": [
{
"itemId": "12345",
"name": "Dress wanita",
"amount": {
"value": "700000.00",
"currency": "IDR"
},
"qty": 1,
"description": "pembelian baju"
},
{
"itemId": "45789",
"name": "kaos kaki",
"amount": {
"value": "100000.00",
"currency": "IDR"
},
"qty": 1,
"description": "pembelian kaos kaki"
}
]
}
}
go
package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := ".../v1.0/qr/qr-mpm-generate"
method := "POST"
payload := strings.NewReader(`{`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Content-Type", "application/json")
req.Header.Add("X-TIMESTAMP", "2020-12-18T10:55:00+07:00")
req.Header.Add("X-SIGNATURE", "EW54nOonmAK58n7lFuAd6RJCa9Th1NnIkRO3fEk2IXSPqukTvBukrBTSJKEsh8Lk5A3cCWnTpMUjcirsvCGpjqtBuDLfQWHA6Cr/Ah4lfPwVMxfDS+tPqb+ZhGBBSv6Wz39CfHHWXoEs1hpRONBUc02zO5ancLtyU3mn4IbYPfP72eUKpqH+Zw9IDBnFyVQ0isr9DDwiS8MZyNdN7io3ZL6SCvuOpxeaC4I/zbeauyiswqwb/hF51M60tD79yTzjDLlgz/e4X3Z3kJyQHUauVldb13Fl7F81wxj+iDrg6AjfSbRJ3QnkAndo/ZIUKcihq7AkUm9uhLYEhrW+iUW4eg==")
req.Header.Add("X-PARTNER-ID", "MC2024113943")
req.Header.Add("X-EXTERNAL-ID", "63005301609284")
req.Header.Add("CHANNEL-ID", "QR004")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
js
const axios = require('axios');
let data = '{';
let config = {
method: 'post',
maxBodyLength: Infinity,
url: '.../v1.0/qr/qr-mpm-generate',
headers: {
'Content-Type': 'application/json',
'X-TIMESTAMP': '2020-12-18T10:55:00+07:00',
'X-SIGNATURE': 'EW54nOonmAK58n7lFuAd6RJCa9Th1NnIkRO3fEk2IXSPqukTvBukrBTSJKEsh8Lk5A3cCWnTpMUjcirsvCGpjqtBuDLfQWHA6Cr/Ah4lfPwVMxfDS+tPqb+ZhGBBSv6Wz39CfHHWXoEs1hpRONBUc02zO5ancLtyU3mn4IbYPfP72eUKpqH+Zw9IDBnFyVQ0isr9DDwiS8MZyNdN7io3ZL6SCvuOpxeaC4I/zbeauyiswqwb/hF51M60tD79yTzjDLlgz/e4X3Z3kJyQHUauVldb13Fl7F81wxj+iDrg6AjfSbRJ3QnkAndo/ZIUKcihq7AkUm9uhLYEhrW+iUW4eg==',
'X-PARTNER-ID': 'MC2024113943',
'X-EXTERNAL-ID': '63005301609284',
'CHANNEL-ID': 'QR004'
},
data : data
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
rust
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
headers.insert("X-TIMESTAMP", "2020-12-18T10:55:00+07:00".parse()?);
headers.insert("X-SIGNATURE", "EW54nOonmAK58n7lFuAd6RJCa9Th1NnIkRO3fEk2IXSPqukTvBukrBTSJKEsh8Lk5A3cCWnTpMUjcirsvCGpjqtBuDLfQWHA6Cr/Ah4lfPwVMxfDS+tPqb+ZhGBBSv6Wz39CfHHWXoEs1hpRONBUc02zO5ancLtyU3mn4IbYPfP72eUKpqH+Zw9IDBnFyVQ0isr9DDwiS8MZyNdN7io3ZL6SCvuOpxeaC4I/zbeauyiswqwb/hF51M60tD79yTzjDLlgz/e4X3Z3kJyQHUauVldb13Fl7F81wxj+iDrg6AjfSbRJ3QnkAndo/ZIUKcihq7AkUm9uhLYEhrW+iUW4eg==".parse()?);
headers.insert("X-PARTNER-ID", "MC2024113943".parse()?);
headers.insert("X-EXTERNAL-ID", "63005301609284".parse()?);
headers.insert("CHANNEL-ID", "QR004".parse()?);
let data = "{";
let request = client.request(reqwest::Method::POST, ".../v1.0/qr/qr-mpm-generate")
.headers(headers)
.body(data);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}
php
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => '.../v1.0/qr/qr-mpm-generate',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS =>'{',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'X-TIMESTAMP: 2020-12-18T10:55:00+07:00',
'X-SIGNATURE: EW54nOonmAK58n7lFuAd6RJCa9Th1NnIkRO3fEk2IXSPqukTvBukrBTSJKEsh8Lk5A3cCWnTpMUjcirsvCGpjqtBuDLfQWHA6Cr/Ah4lfPwVMxfDS+tPqb+ZhGBBSv6Wz39CfHHWXoEs1hpRONBUc02zO5ancLtyU3mn4IbYPfP72eUKpqH+Zw9IDBnFyVQ0isr9DDwiS8MZyNdN7io3ZL6SCvuOpxeaC4I/zbeauyiswqwb/hF51M60tD79yTzjDLlgz/e4X3Z3kJyQHUauVldb13Fl7F81wxj+iDrg6AjfSbRJ3QnkAndo/ZIUKcihq7AkUm9uhLYEhrW+iUW4eg==',
'X-PARTNER-ID: MC2024113943',
'X-EXTERNAL-ID: 63005301609284',
'CHANNEL-ID: QR004'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
Response
Details
Parameter | Data Type | Mandatory | Length | Description |
---|---|---|---|---|
responseCode | String | M | 7 | Response code |
responseMessage | String | M | 150 | Response description |
referenceNo | String | M | 64 | Transaction identifier on service provider system. Must be filled upon successful transaction. Value : UUID |
partnerReferenceNo | String | M | 64 | Transaction identifier on service consumer system |
qrContent | String | M | 512 | QR String MPM. |
qrUrl | String | O | 256 | QR URL for download QR Image. QR URL is valid until 1 menit before validityPeriod |
qrImage | String | O | - | base64 from image QRIS. Max length is unlimited. |
terminalId | String | O | - | Default value A01 |
additionalInfo | Object | O | - | Additional information |
additionalInfo.paymentChannel | String | M | - | Description of the payment channel name |
additionalInfo.type | String | C | - | QR Type |
additionalInfo.validityPeriod | String | O | The time when the QRIS is valid. | |
additionalInfo.createdTime | String | O | The time when the QRIS is created. |
Example Response
Details
{
"responseCode": "2004700",
"responseMessage": "Request has been processed successfully",
"referenceNo": "2020102977770000000009",
"partnerReferenceNo": "2020102900000000000001",
"qrContent": "xxxxxxxxxxxxxxxx",
"qrUrl": "https": //qrurl?img=12345, "qrImage":"TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCAuLi4=",
"terminalId": "213141251124",
"additionalInfo": {
"paymentChannel": "IFORTEPAY",
"type": "DYNAMIC",
"validityPeriod":"2024-07-03T12:08:56+07:00",
"createdTime":"2024-07-03T12:08:20+07:00",
}
}
}