MertaLink API Documentation
Fast, Secure, and Reliable Payment Solution
- RESTful API design, simple and easy to use
- Supports PHP, Python, Golang and more
- Complete payment flow: payment, query, disbursement, etc.
- Real-time callback notification
- MD5 and SHA256 signature verification
Basic Rules
Production Environment:
https://api.mertalink.com/merta-apiapplication/jsonPayment API
Request Parameters
| Parameter Name | Description | Type | Required | Example |
|---|---|---|---|---|
| merchantCode | Merchant Code | String | Y | test |
| orderNumber | Order Number | String | Y | 1604384758793 |
| amount | Amount | Integer | Y | 40000 |
| phone | Phone | String | Y | 08123456789 |
| String | Y | test@test.com | ||
| userName | Name | String | Y | John Doe |
| walletNumber | Wallet Number | String | N | 08821900000 |
| channelCode | Channel Code | String | Y | M1 |
| returnUrl | Return URL | String | N | http://test/return |
| callbackUrl | Callback URL | String | Y | http://test/callback |
| sign | Signature | String | Y | MD5(...) |
Signature Rule
MD5(amount + callbackUrl + channelCode + merchantCode + orderNumber + md5_key)
Response Parameters
| Parameter Name | Description | Type | Example |
|---|---|---|---|
| code | Response Code | String | 000 |
| message | Response Message | String | success |
| orderNumber | Order ID | String | O3915CB3C93E445C9 |
| paymentUrl | Payment URL | String | http://xxx.xxx/ |
| qrcode | QR Code | String | Returned for QRIS payment |
Request Example
{
"merchantCode": "test",
"orderNumber": "1604384758793",
"amount": 40000,
"phone": "08123456789",
"email": "test@test.com",
"userName": "John Doe",
"channelCode": "M1",
"returnUrl": "http://test/return",
"callbackUrl": "http://test/callback",
"sign": "a1b2c3d4e5f6..."
}Response Example
{
"code": "000",
"message": "success",
"orderNumber": "O3915CB3C93E445C9",
"paymentUrl": "http://xxx.xxx/",
"qrcode": "data:image/png;base64,..."
}package com.customer.demo;
import cn.hutool.crypto.digest.DigestAlgorithm;
import cn.hutool.crypto.digest.Digester;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import java.util.HashMap;
import java.util.Map;
public class ZkpayPaymentDemo {
public static void main(String[] args) {
String url = "https://api.mertalink.com/merta-api/payment";
String merchantCode = "test";
String key = "Gjon5exBp34mkNUU0r4wk2delkbclF4i";
String orderNumber = System.currentTimeMillis() + "";
Integer amount = 40000;
String phone = "08123456789";
String email = "test@test.com";
String userName = "John Doe";
String channelCode = "M1";
String returnUrl = "http://test/return";
String callbackUrl = "http://test/callback";
Digester md5 = new Digester(DigestAlgorithm.MD5);
String signOrigin = amount + callbackUrl + channelCode + merchantCode + orderNumber + key;
String sign = md5.digestHex(signOrigin);
System.out.println(sign);
Map<String, Object> param = new HashMap<>();
param.put("merchantCode", merchantCode);
param.put("orderNumber", orderNumber);
param.put("amount", amount);
param.put("phone", phone);
param.put("email", email);
param.put("userName", userName);
param.put("channelCode", channelCode);
param.put("returnUrl", returnUrl);
param.put("callbackUrl", callbackUrl);
param.put("sign", sign);
String sendParam = JSON.toJSONString(param);
System.out.println("request==> " + sendParam);
String result = HttpUtil.post(url, sendParam, 10000);
System.out.println("response==> " + result);
}
}Payment Query
Request Parameters
| Parameter Name | Description | Type | Required | Example |
|---|---|---|---|---|
| merchantCode | Merchant Code | String | Y | test |
| orderNumber | Order Number | String | Y | 1604384758793 |
| sign | Signature | String | Y | MD5(...) |
Signature Rule
MD5(merchantCode + orderNumber + md5_key)
Response Parameters
| Parameter Name | Description | Type | Example |
|---|---|---|---|
| code | Response Code | String | 000 |
| status | Payment Status | int | 0 Pending, 1 Success, 2 Failed |
| amount | Payment Amount | Integer | 40000 |
Request Example
{
"merchantCode": "test",
"orderNumber": "1604384758793",
"sign": "a1b2c3d4e5f6..."
}Response Example
{
"code": "000",
"status": 1,
"amount": 40000
}package com.customer.demo;
import cn.hutool.crypto.digest.DigestAlgorithm;
import cn.hutool.crypto.digest.Digester;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import java.util.HashMap;
import java.util.Map;
public class ZkpayCheckPaymentDemo {
public static void main(String[] args) {
String url = "https://api.mertalink.com/merta-api/checkPayment";
String merchantCode = "test";
String key = "Gjon5exBp34mkNUU0r4wk2delkbclF4i";
String orderNumber = "1604384758793";
Digester md5 = new Digester(DigestAlgorithm.MD5);
String signOrigin = merchantCode + orderNumber + key;
String sign = md5.digestHex(signOrigin);
Map<String, Object> param = new HashMap<>();
param.put("merchantCode", merchantCode);
param.put("orderNumber", orderNumber);
param.put("sign", sign);
String sendParam = JSON.toJSONString(param);
System.out.println("request==> " + sendParam);
String result = HttpUtil.post(url, sendParam, 10000);
System.out.println("response==> " + result);
}
}Disbursement API
Request Parameters
| Parameter Name | Description | Type | Required |
|---|---|---|---|
| merchantCode | Merchant Code | String | Y |
| orderNumber | Order Number | String | Y |
| amount | Amount | Integer | Y |
| bankAccount | Bank Account | String | Y |
| bankCode | Bank Code | String | Y |
| sign | Signature | String | Y |
Signature Rule
SHA256(amount + bankAccount + bankCode + callbackUrl + channelCode + merchantCode + orderNumber + sha256_key)
Request Example
{
"merchantCode": "test",
"orderNumber": "1604384758793",
"amount": 50000,
"bankAccount": "1234567890",
"bankCode": "BCA",
"channelCode": "B1",
"callbackUrl": "http://test/callback",
"sign": "a1b2c3d4e5f6..."
}Response Example
{
"code": "000",
"message": "success",
"orderNumber": "O3915CB3C93E445C9"
}package com.customer.demo;
import cn.hutool.crypto.digest.DigestAlgorithm;
import cn.hutool.crypto.digest.Digester;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import java.util.HashMap;
import java.util.Map;
public class ZkpayDisbursementDemo {
public static void main(String[] args) {
String url = "https://api.mertalink.com/merta-api/disbursement";
String merchantCode = "test";
String key = "Gjon5exBp34mkNUU0r4wk2delkbclF4i";
String orderNumber = System.currentTimeMillis() + "";
Integer amount = 50000;
String bankAccount = "1234567890";
String bankCode = "BCA";
String callbackUrl = "http://test/callback";
String channelCode = "B1";
Digester sha256 = new Digester(DigestAlgorithm.SHA256);
String signOrigin = amount + bankAccount + bankCode + callbackUrl + channelCode + merchantCode + orderNumber + key;
String sign = sha256.digestHex(signOrigin);
Map<String, Object> param = new HashMap<>();
param.put("merchantCode", merchantCode);
param.put("orderNumber", orderNumber);
param.put("amount", amount);
param.put("bankAccount", bankAccount);
param.put("bankCode", bankCode);
param.put("channelCode", channelCode);
param.put("callbackUrl", callbackUrl);
param.put("sign", sign);
String sendParam = JSON.toJSONString(param);
System.out.println("request==> " + sendParam);
String result = HttpUtil.post(url, sendParam, 10000);
System.out.println("response==> " + result);
}
}Disbursement Query
Request Parameters
| Parameter Name | Description | Type | Required | Example |
|---|---|---|---|---|
| merchantCode | Merchant Code | String | Y | test |
| orderNumber | Order Number | String | Y | 1604384758793 |
Signature Rule
SHA256(merchantCode + orderNumber + sha256_key)
Request Example
{
"merchantCode": "test",
"orderNumber": "1604384758793",
"sign": "a1b2c3d4e5f6..."
}Response Example
{
"code": "000",
"status": 1,
"amount": 50000
}package com.customer.demo;
import cn.hutool.crypto.digest.DigestAlgorithm;
import cn.hutool.crypto.digest.Digester;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import java.util.HashMap;
import java.util.Map;
public class ZkpayCheckDisbursementDemo {
public static void main(String[] args) {
String url = "https://api.mertalink.com/merta-api/checkDisbursement";
String merchantCode = "test";
String key = "Gjon5exBp34mkNUU0r4wk2delkbclF4i";
String orderNumber = "1604384758793";
Digester sha256 = new Digester(DigestAlgorithm.SHA256);
String signOrigin = merchantCode + orderNumber + key;
String sign = sha256.digestHex(signOrigin);
Map<String, Object> param = new HashMap<>();
param.put("merchantCode", merchantCode);
param.put("orderNumber", orderNumber);
param.put("sign", sign);
String sendParam = JSON.toJSONString(param);
System.out.println("request==> " + sendParam);
String result = HttpUtil.post(url, sendParam, 10000);
System.out.println("response==> " + result);
}
}Available Channels
Signature Rule:MD5(merchantCode + timestamp + key)
Balance Query
Signature Rule:SHA256(merchantCode + timestamp + sha256_key)
Async Callback
After payment is completed, the system will send a POST request to your configured callbackUrl
Callback Parameters
| Parameter Name | Description | Type | Example |
|---|---|---|---|
| orderNumber | Merchant Order Number | String | 1604384758793 |
| status | Order Status: 0 Pending, 1 Success, 2 Failed | Integer | 1 |
| amount | Payment Amount | Integer | 40000 |
| sign | Signature: MD5(orderNumber + status + amount + key) | String | a1b2c3d4e5f6 |
Callback Example
{
"orderNumber": "1604384758793",
"status": 1,
"amount": 40000,
"sign": "a1b2c3d4e5f6"
}Response: Please return string "success" to confirm receipt of callback
After disbursement is completed, the system will send a POST request to your configured callbackUrl
Callback Parameters
| Parameter Name | Description | Type | Example |
|---|---|---|---|
| orderNumber | Merchant Order Number | String | 1604384758793 |
| status | Order Status: 0 Processing, 1 Success, 2 Failed | Integer | 1 |
| amount | Disbursement Amount | Integer | 50000 |
| sign | Signature: SHA256(orderNumber + status + amount + key) | String | a1b2c3d4e5f6 |
Callback Example
{
"orderNumber": "1604384758793",
"status": 1,
"amount": 50000,
"sign": "a1b2c3d4e5f6"
}Response: Please return string "success" to confirm receipt of callback
Payment Channel Code Reference
| channel_code | bank_name |
|---|---|
| QRIS | QRIS |
| VC | Credit Card (Visa / Master) |
| BK | BCA KlikPay |
| BCA | BCA Virtual Account |
| BBC | BCA BC |
| M1 | Mandiri Virtual Account |
| ME | Mandiri eCash |
| MP | Mandiri PC |
| BT | Permata Bank Virtual Account |
| PN | Permata Net |
| A1 | ATM Bersama |
| B1 | CIMB Niaga Virtual Account |
| I1 | BNI Virtual Account |
| VA | Maybank Virtual Account |
| M2U | Maybank2U |
| FT | Ritel |
| OV | OVO |
| LA | LINKAJA |
| DANA | DANA |
| SP | Shopee Pay |
| SA | Shopee Pay Apps |
| AG | Bank Artha Graha |
Bank Code Reference
| bank_code | bank_name |
|---|---|
| BCA | Bank BCA |
| BRI | Bank BRI |
| MANDIRI | BANK MANDIRI |
| BNI | BANK BNI 46 |
| CIMB | BANK CIMB NIAGA |
| PERMATA | BANK PERMATA |
| BJB | Bank BJB |
| DANAMON | BANK DANAMON INDONESIA |
| BTN | Bank BTN |
| MAYBANK | BANK MAYBANK INDONESIA |
| SINARMAS | BANK SINARMAS |
| PANIN | BANK PANIN |
| BNI_SYR | BANK BNI SYARIAH |
| MANDIRI_SYR | BANK SYARIAH MANDIRI |
| DKI | BPD DKI JAKARTA |
| MEGA | BANK MEGA |
| BSI | BSI (Bank Syariah Indonesia) |
| BTPN | Bank BTPN |
| BRI_SYR | BANK BRI SYARIAH |
| MUAMALAT | BANK MUAMALAT INDONESIA |
| OCBC | BANK OCBC NISP |
| OVO | OVO |
| LINKAJA | LINKAJA |