MertaLinkAPI v1.0

MertaLink API Documentation

Fast, Secure, and Reliable Payment Solution

API Features
  • 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

Request URL

Production Environment:

https://api.mertalink.com/merta-api
Request Method
POST
Content-Type
application/json

Payment API

API URL: /payment
Create new payment order
POST

Request Parameters

Parameter NameDescriptionTypeRequiredExample
merchantCodeMerchant CodeStringYtest
orderNumberOrder NumberStringY1604384758793
amountAmountIntegerY40000
phonePhoneStringY08123456789
emailEmailStringYtest@test.com
userNameNameStringYJohn Doe
walletNumberWallet NumberStringN08821900000
channelCodeChannel CodeStringYM1
returnUrlReturn URLStringNhttp://test/return
callbackUrlCallback URLStringYhttp://test/callback
signSignatureStringYMD5(...)

Signature Rule

MD5(amount + callbackUrl + channelCode + merchantCode + orderNumber + md5_key)

Response Parameters

Parameter NameDescriptionTypeExample
codeResponse CodeString000
messageResponse MessageStringsuccess
orderNumberOrder IDStringO3915CB3C93E445C9
paymentUrlPayment URLStringhttp://xxx.xxx/
qrcodeQR CodeStringReturned 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,..."
}
Code Examples
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

API URL: /checkPayment
Query payment order status
POST

Request Parameters

Parameter NameDescriptionTypeRequiredExample
merchantCodeMerchant CodeStringYtest
orderNumberOrder NumberStringY1604384758793
signSignatureStringYMD5(...)

Signature Rule

MD5(merchantCode + orderNumber + md5_key)

Response Parameters

Parameter NameDescriptionTypeExample
codeResponse CodeString000
statusPayment Statusint0 Pending, 1 Success, 2 Failed
amountPayment AmountInteger40000

Request Example

{
  "merchantCode": "test",
  "orderNumber": "1604384758793",
  "sign": "a1b2c3d4e5f6..."
}

Response Example

{
  "code": "000",
  "status": 1,
  "amount": 40000
}
Code Examples
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

API URL: /disbursement
Initiate Disbursement Request
POST

Request Parameters

Parameter NameDescriptionTypeRequired
merchantCodeMerchant CodeStringY
orderNumberOrder NumberStringY
amountAmountIntegerY
bankAccountBank AccountStringY
bankCodeBank CodeStringY
signSignatureStringY

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"
}
Code Examples
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

API URL: /checkDisbursement
Query disbursement order status
POST

Request Parameters

Parameter NameDescriptionTypeRequiredExample
merchantCodeMerchant CodeStringYtest
orderNumberOrder NumberStringY1604384758793

Signature Rule

SHA256(merchantCode + orderNumber + sha256_key)

Request Example

{
  "merchantCode": "test",
  "orderNumber": "1604384758793",
  "sign": "a1b2c3d4e5f6..."
}

Response Example

{
  "code": "000",
  "status": 1,
  "amount": 50000
}
Code Examples
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

API URL: /queryChannel
Query available payment channels

Signature Rule:MD5(merchantCode + timestamp + key)

Balance Query

API URL: /checkBalance
Query merchant balance

Signature Rule:SHA256(merchantCode + timestamp + sha256_key)

Async Callback

Payment Callback

After payment is completed, the system will send a POST request to your configured callbackUrl

Callback Parameters

Parameter NameDescriptionTypeExample
orderNumberMerchant Order NumberString1604384758793
statusOrder Status: 0 Pending, 1 Success, 2 FailedInteger1
amountPayment AmountInteger40000
signSignature: MD5(orderNumber + status + amount + key)Stringa1b2c3d4e5f6

Callback Example

{
  "orderNumber": "1604384758793",
  "status": 1,
  "amount": 40000,
  "sign": "a1b2c3d4e5f6"
}

Response: Please return string "success" to confirm receipt of callback

Disbursement Callback

After disbursement is completed, the system will send a POST request to your configured callbackUrl

Callback Parameters

Parameter NameDescriptionTypeExample
orderNumberMerchant Order NumberString1604384758793
statusOrder Status: 0 Processing, 1 Success, 2 FailedInteger1
amountDisbursement AmountInteger50000
signSignature: SHA256(orderNumber + status + amount + key)Stringa1b2c3d4e5f6

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 List
channel_codebank_name
QRISQRIS
VCCredit Card (Visa / Master)
BKBCA KlikPay
BCABCA Virtual Account
BBCBCA BC
M1Mandiri Virtual Account
MEMandiri eCash
MPMandiri PC
BTPermata Bank Virtual Account
PNPermata Net
A1ATM Bersama
B1CIMB Niaga Virtual Account
I1BNI Virtual Account
VAMaybank Virtual Account
M2UMaybank2U
FTRitel
OVOVO
LALINKAJA
DANADANA
SPShopee Pay
SAShopee Pay Apps
AGBank Artha Graha

Bank Code Reference

Bank Code List
bank_codebank_name
BCABank BCA
BRIBank BRI
MANDIRIBANK MANDIRI
BNIBANK BNI 46
CIMBBANK CIMB NIAGA
PERMATABANK PERMATA
BJBBank BJB
DANAMONBANK DANAMON INDONESIA
BTNBank BTN
MAYBANKBANK MAYBANK INDONESIA
SINARMASBANK SINARMAS
PANINBANK PANIN
BNI_SYRBANK BNI SYARIAH
MANDIRI_SYRBANK SYARIAH MANDIRI
DKIBPD DKI JAKARTA
MEGABANK MEGA
BSIBSI (Bank Syariah Indonesia)
BTPNBank BTPN
BRI_SYRBANK BRI SYARIAH
MUAMALATBANK MUAMALAT INDONESIA
OCBCBANK OCBC NISP
OVOOVO
LINKAJALINKAJA