Appearance
Payment Notification SNAP
Information
This API is used by iFortePay to send payment notifications to the Merchant. The notification contains transaction details and the latest payment status, which the Merchant can use to update their system accordingly.
- For Dynamic QRIS, payment notifications will be delivered to the callback URL specified during the QR generation request.
- For Static QRIS, merchants must provide a Payment Notification URL to the Integration Support Team, which will then configure it in the system.
Path | /v1.0/qr/qr-mpm-notify |
---|---|
HTTP Method | POST |
Service Code | 52 |
Type Format | JSON |
Request
Details
Parameter | Data Type | Mandatory | Length | Description |
---|---|---|---|---|
originalReferenceNo | String | M | 64 | Transaction identifier on service provider system |
originalPartnerReferenceNo | String | M | 64 | Transaction identifier on service consumer system |
latestTransactionStatus | String | M | 2 | Transaction Status Code. Only send payment notify to merchant for status 00 - Success |
transactionStatusDesc | String | M | 50 | Description status transaction |
amount | Object | M | ||
amount.value | String | M | 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 |
amount.currency | String | M | 3 | Currency (Format: ISO4217) |
additionalInfo | Object | M | Additional information | |
additionalInfo.merchantId | String | M | Identifier merchant | |
additionalInfo.merchantAccountNumber | String | O | Merchant PAN | |
additionalInfo.paymentChannel | String | M | ||
additionalInfo.issuer | String | M | ||
additionalInfo.retrievalReferenceNo | String | M | 64 | Reference number generated by Issuer. The value will be returned for successful payment. |
additionalInfo.invoiceNo | String | M | Reference number if payment is successful. | |
additionalInfo.customerName | String | O | Customer name from Issuer | |
additionalInfo.customerNumber | String | O | Customer PAN from Issuer | |
additionalInfo.paymentDetail | Object | M | ||
additionalInfo.paymentDetail.totalAmount | Object | M | ||
additionalInfo.paymentDetail.totalAmount.value | String | M | 16,2 | Total 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 |
additionalInfo.paymentDetail.totalAmount.currency | String | M | 3 | Currency |
additionalInfo.itemDetails | Array of Obejcts | O | Explain the items purchased | |
additionalInfo.itemDetails.itemId | String(25) | C | 25 | ID of product. |
additionalInfo.itemDetails.name | String(150) | C | 100 | Name of product. |
additionalInfo.itemDetails.amount | Object | C | 13 | |
additionalInfo.itemDetails.amount.value | Object | C | Price per unit. | |
additionalInfo.itemDetails.amount.currency | String | C | 3 | |
additionalInfo.itemDetails.qty | Int | C | 10 | Number of product units. |
additionalInfo.itemDetails.description | String | O | 255 | Description of product |
additionalInfo.createdTime | String | M | Created time | |
additionalInfo.validityPeriod | String | M | Valid time for payment | |
additionalInfo.paidTime | String | C | The value will be returned for successful payment. | |
additionalInfo.acquirerIssuerRelation | String | O | 8 | |
additionalInfo.callbackUrl | String | M | URL Notify payment |
Example Request
Details
sh
curl --location '.../v1.0/qr/qr-mpm-notify' \
--header 'Content-Type: application/json' \
--header 'X-TIMESTAMP: 2020-12-23T08:46:11+07:00' \
--header 'X-SIGNATURE: 85be817c55b2c135157c7e89f52499bf0c25ad6eeebe04a986e8c862561b19a5' \
--header 'X-PARTNER-ID: MC2025024500' \
--header 'X-EXTERNAL-ID: 41807553358950093184162180797837' \
--header 'CHANNEL-ID: QR004' \
--data '{
"originalReferenceNo": "0196b437-86ab-7529-93ac-b6c1d92fefbf",
"originalPartnerReferenceNo": "69003543869326",
"latestTransactionStatus": "00",
"transactionStatusDesc": "Success",
"amount": {
"value": "100000.00",
"currency": "IDR"
},
"additionalInfo": {
"issuer": "BCA",
"retrievalReferenceNo": "697350261088",
"paymentChannel": "IFORTEPAY",
"paymentDetail": {
"totalAmount": {
"value": "100000.00",
"currency": "IDR"
}
},
"createdTime": "2025-05-09T15:44:20+07:00",
"validityPeriod": "2025-05-09T15:59:20+07:00",
"paidTime": "2025-05-09T15:44:37+07:00",
"acquirerIssuerRelation": "off_us",
"callbackUrl": "https://testcallback.free.beeceptor.com",
"invoiceNo": "01746780277897819043",
"merchantId": "MC2025024500",
"merchantAccountNumber": "9360088802024078316",
"customerName": "Dummy Name",
"customerNumber": "9360002319993788396",
"issuerCode": "93600014",
"itemDetails": [
{
"itemId": "12345",
"name": "pulsa",
"amount": {
"value": "20000.00",
"currency": "IDR"
},
"qty": 1,
"description": "pembelian pulsa"
},
{
"itemId": "jbl789",
"name": "kuota internet",
"amount": {
"value": "80000.00",
"currency": "IDR"
},
"qty": 1,
"description": "pembelian kuota internet"
}
],
"customerDetail": {
"email": "test@gmail.com",
"fullName": "Customer name",
"phone": "08888888888"
}
}
}'
go
package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := ".../v1.0/qr/qr-mpm-notify"
method := "POST"
payload := strings.NewReader(`{
"originalReferenceNo": "0196b437-86ab-7529-93ac-b6c1d92fefbf",
"originalPartnerReferenceNo": "69003543869326",
"latestTransactionStatus": "00",
"transactionStatusDesc": "Success",
"amount": {
"value": "100000.00",
"currency": "IDR"
},
"additionalInfo": {
"issuer": "BCA",
"retrievalReferenceNo": "697350261088",
"paymentChannel": "IFORTEPAY",
"paymentDetail": {
"totalAmount": {
"value": "100000.00",
"currency": "IDR"
}
},
"createdTime": "2025-05-09T15:44:20+07:00",
"validityPeriod": "2025-05-09T15:59:20+07:00",
"paidTime": "2025-05-09T15:44:37+07:00",
"acquirerIssuerRelation": "off_us",
"callbackUrl": "https://testcallback.free.beeceptor.com",
"invoiceNo": "01746780277897819043",
"merchantId": "MC2025024500",
"merchantAccountNumber": "9360088802024078316",
"customerName": "Dummy Name",
"customerNumber": "9360002319993788396",
"issuerCode": "93600014",
"itemDetails": [
{
"itemId": "12345",
"name": "pulsa",
"amount": {
"value": "20000.00",
"currency": "IDR"
},
"qty": 1,
"description": "pembelian pulsa"
},
{
"itemId": "6789",
"name": "kuota internet",
"amount": {
"value": "80000.00",
"currency": "IDR"
},
"qty": 1,
"description": "pembelian kuota internet"
}
],
"customerDetail": {
"email": "test@gmail.com",
"fullName": "Customer name",
"phone": "08888888888"
}
}
}`)
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-23T08:46:11+07:00")
req.Header.Add("X-SIGNATURE", "85be817c55b2c135157c7e89f52499bf0c25ad6eeebe04a986e8c862561b19a5")
req.Header.Add("X-PARTNER-ID", "IFP2024067944")
req.Header.Add("X-EXTERNAL-ID", "41807553358950093184162180797837")
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 = JSON.stringify({
"originalReferenceNo": "0196b437-86ab-7529-93ac-b6c1d92fefbf",
"originalPartnerReferenceNo": "69003543869326",
"latestTransactionStatus": "00",
"transactionStatusDesc": "Success",
"amount": {
"value": "100000.00",
"currency": "IDR"
},
"additionalInfo": {
"issuer": "BCA",
"retrievalReferenceNo": "697350261088",
"paymentChannel": "IFORTEPAY",
"paymentDetail": {
"totalAmount": {
"value": "100000.00",
"currency": "IDR"
}
},
"createdTime": "2025-05-09T15:44:20+07:00",
"validityPeriod": "2025-05-09T15:59:20+07:00",
"paidTime": "2025-05-09T15:44:37+07:00",
"acquirerIssuerRelation": "off_us",
"callbackUrl": "https://testcallback.free.beeceptor.com",
"invoiceNo": "01746780277897819043",
"merchantId": "MC2025024500",
"merchantAccountNumber": "9360088802024078316",
"customerName": "Dummy Name",
"customerNumber": "9360002319993788396",
"issuerCode": "93600014",
"itemDetails": [
{
"itemId": "12345",
"name": "pulsa",
"amount": {
"value": "20000.00",
"currency": "IDR"
},
"qty": 1,
"description": "pembelian pulsa"
},
{
"itemId": "6789",
"name": "kuota internet",
"amount": {
"value": "80000.00",
"currency": "IDR"
},
"qty": 1,
"description": "pembelian kuota internet"
}
],
"customerDetail": {
"email": "test@gmail.com",
"fullName": "Customer name",
"phone": "08888888888"
}
}
});
let config = {
method: 'post',
maxBodyLength: Infinity,
url: '.../v1.0/qr/qr-mpm-notify',
headers: {
'Content-Type': 'application/json',
'X-TIMESTAMP': '2020-12-23T08:46:11+07:00',
'X-SIGNATURE': '85be817c55b2c135157c7e89f52499bf0c25ad6eeebe04a986e8c862561b19a5',
'X-PARTNER-ID': 'IFP2024067944',
'X-EXTERNAL-ID': '41807553358950093184162180797837',
'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-23T08:46:11+07:00".parse()?);
headers.insert("X-SIGNATURE", "85be817c55b2c135157c7e89f52499bf0c25ad6eeebe04a986e8c862561b19a5".parse()?);
headers.insert("X-PARTNER-ID", "IFP2024067944".parse()?);
headers.insert("X-EXTERNAL-ID", "41807553358950093184162180797837".parse()?);
headers.insert("CHANNEL-ID", "QR004".parse()?);
let data = r#"{
"originalReferenceNo": "0196b437-86ab-7529-93ac-b6c1d92fefbf",
"originalPartnerReferenceNo": "69003543869326",
"latestTransactionStatus": "00",
"transactionStatusDesc": "Success",
"amount": {
"value": "100000.00",
"currency": "IDR"
},
"additionalInfo": {
"issuer": "BCA",
"retrievalReferenceNo": "697350261088",
"paymentChannel": "IFORTEPAY",
"paymentDetail": {
"totalAmount": {
"value": "100000.00",
"currency": "IDR"
}
},
"createdTime": "2025-05-09T15:44:20+07:00",
"validityPeriod": "2025-05-09T15:59:20+07:00",
"paidTime": "2025-05-09T15:44:37+07:00",
"acquirerIssuerRelation": "off_us",
"callbackUrl": "https://testcallback.free.beeceptor.com",
"invoiceNo": "01746780277897819043",
"merchantId": "MC2025024500",
"merchantAccountNumber": "9360088802024078316",
"customerName": "Dummy Name",
"customerNumber": "9360002319993788396",
"issuerCode": "93600014",
"itemDetails": [
{
"itemId": "12345",
"name": "pulsa",
"amount": {
"value": "20000.00",
"currency": "IDR"
},
"qty": 1,
"description": "pembelian pulsa"
},
{
"itemId": "6789",
"name": "kuota internet",
"amount": {
"value": "80000.00",
"currency": "IDR"
},
"qty": 1,
"description": "pembelian kuota internet"
}
],
"customerDetail": {
"email": "test@gmail.com",
"fullName": "Customer name",
"phone": "08888888888"
}
}
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, ".../v1.0/qr/qr-mpm-notify")
.headers(headers)
.json(&json);
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-notify',
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 =>'{
"originalReferenceNo": "0196b437-86ab-7529-93ac-b6c1d92fefbf",
"originalPartnerReferenceNo": "69003543869326",
"latestTransactionStatus": "00",
"transactionStatusDesc": "Success",
"amount": {
"value": "100000.00",
"currency": "IDR"
},
"additionalInfo": {
"issuer": "BCA",
"retrievalReferenceNo": "697350261088",
"paymentChannel": "IFORTEPAY",
"paymentDetail": {
"totalAmount": {
"value": "100000.00",
"currency": "IDR"
}
},
"createdTime": "2025-05-09T15:44:20+07:00",
"validityPeriod": "2025-05-09T15:59:20+07:00",
"paidTime": "2025-05-09T15:44:37+07:00",
"acquirerIssuerRelation": "off_us",
"callbackUrl": "https://testcallback.free.beeceptor.com",
"invoiceNo": "01746780277897819043",
"merchantId": "MC2025024500",
"merchantAccountNumber": "9360088802024078316",
"customerName": "Dummy Name",
"customerNumber": "9360002319993788396",
"issuerCode": "93600014",
"itemDetails": [
{
"itemId": "12345",
"name": "pulsa",
"amount": {
"value": "20000.00",
"currency": "IDR"
},
"qty": 1,
"description": "pembelian pulsa"
},
{
"itemId": "jbl789",
"name": "kuota internet",
"amount": {
"value": "80000.00",
"currency": "IDR"
},
"qty": 1,
"description": "pembelian kuota internet"
}
],
"customerDetail": {
"email": "test@gmail.com",
"fullName": "Customer name",
"phone": "08888888888"
}
}
}',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'X-TIMESTAMP: 2020-12-23T08:46:11+07:00',
'X-SIGNATURE: 85be817c55b2c135157c7e89f52499bf0c25ad6eeebe04a986e8c862561b19a5',
'X-PARTNER-ID: IFP2024067944',
'X-EXTERNAL-ID: 41807553358950093184162180797837',
'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 |
Example Response
Details
{
"responseCode":"2005200",
"responseMessage":"Request has been processed successfully"
}