MertaLinkAPI v1.0

MertaLink API 文档

快速、安全、可靠的支付解决方案

API 特性
  • RESTful API 设计,简单易用
  • 支持 PHP、Python、Golang 等多种语言
  • 完整的支付流程:支付、查询、代付等
  • 实时回调通知
  • MD5 和 SHA256 签名验证

基本规则

Request URL

生产环境:

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

支付接口

API URL: /payment
创建新的支付订单
POST

请求参数

参数名说明类型必填例子
merchantCode商户号StringYtest
orderNumber用户订单号StringY1604384758793
amount金额IntegerY40000
phone电话StringY08123456789
emailEmailStringYtest@test.com
userName名称StringYJohn Doe
walletNumber钱包账号StringN08821900000
channelCode渠道编码StringYM1
returnUrl返回地址StringNhttp://test/return
callbackUrl回调地址StringYhttp://test/callback
sign签名StringYMD5(...)

签名规则

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

响应参数

参数名说明类型例子
code返回码String000
message返回消息Stringsuccess
orderNumber订单号StringO3915CB3C93E445C9
paymentUrl支付地址Stringhttp://xxx.xxx/
qrcode二维码StringQRIS支付会返回

请求示例

{
  "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..."
}

响应示例

{
  "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);

 }

}

支付查询

API URL: /checkPayment
查询支付订单状态
POST

请求参数

参数名说明类型必填例子
merchantCode商户号StringYtest
orderNumber用户订单号StringY1604384758793
sign签名StringYMD5(...)

签名规则

MD5(merchantCode + orderNumber + md5_key)

响应参数

参数名说明类型例子
code返回码String000
status支付状态int0 待支付, 1 成功, 2 失败
amount支付金额Integer40000

请求示例

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

响应示例

{
  "code": "000",
  "status": 1,
  "amount": 40000
}
代码示例
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 CheckPaymentDemo {
  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);
    String result = HttpUtil.post(url, sendParam, 10000);
    System.out.println("response==> " + result);
  }
}

代付接口

API URL: /disbursement
发起代付请求
POST

请求参数

参数名说明类型必填
merchantCode商户号StringY
orderNumber用户订单号StringY
amount金额IntegerY
bankAccount银行账号StringY
bankCode银行编码StringY
sign签名StringY

签名规则

SHA256(amount + bankAccount + bankCode + callbackUrl + channelCode + merchantCode + orderNumber + sha256_key)

请求示例

{
  "merchantCode": "test",
  "orderNumber": "1604384758793",
  "amount": 50000,
  "bankAccount": "1234567890",
  "bankCode": "BCA",
  "sign": "a1b2c3d4e5f6..."
}

响应示例

{
  "code": "000",
  "message": "success",
  "orderNumber": "1604384758793"
}
代码示例
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 DisbursementDemo {
  public static void main(String[] args) {
    String url = "https://api.mertalink.com/merta-api/disbursement";
    String merchantCode = "test";
    String key = "Gjon5exBp34mkNUU0r4wk2delkbclF4i";
    String orderNumber = "1604384758793";
    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("sign", sign);

    String sendParam = JSON.toJSONString(param);
    String result = HttpUtil.post(url, sendParam, 10000);
    System.out.println("response==> " + result);
  }
}

代付查询

API URL: /checkDisbursement
查询代付订单状态
POST

请求参数

参数名说明类型必填例子
merchantCode商户号StringYtest
orderNumber用户订单号StringY1604384758793

签名规则

SHA256(merchantCode + orderNumber + sha256_key)

请求示例

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

响应示例

{
  "code": "000",
  "status": 1,
  "amount": 50000
}
代码示例
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 CheckDisbursementDemo {
  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);
    String result = HttpUtil.post(url, sendParam, 10000);
    System.out.println("response==> " + result);
  }
}

可用渠道查询

API URL: /queryChannel
查询可用支付渠道
POST

请求参数

参数名说明类型必填例子
merchantCode商户号StringYtest
timestamp时间戳LongY1604384758793

签名规则

MD5(merchantCode + timestamp + key)

请求示例

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

响应示例

{
  "code": "000",
  "channels": [
    {
      "channelCode": "M1",
      "channelName": "QRIS",
      "minAmount": 1000,
      "maxAmount": 10000000
    }
  ]
}

余额查询

API URL: /checkBalance
查询商户余额
POST

请求参数

参数名说明类型必填例子
merchantCode商户号StringYtest
timestamp时间戳LongY1604384758793

签名规则

SHA256(merchantCode + timestamp + sha256_key)

请求示例

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

响应示例

{
  "code": "000",
  "balance": 1000000
}

异步回调

支付回调

支付完成后,系统会向您配置的 callbackUrl 发送 POST 请求

回调参数

参数名说明类型示例
orderNumber商户订单号String1604384758793
status订单状态:0待支付,1成功,2失败Integer1
amount支付金额Integer40000
sign签名:MD5(orderNumber + status + amount + key)Stringa1b2c3d4e5f6

回调示例

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

应答:请返回字符串 "success" 确认收到回调

代付回调

代付完成后,系统会向您配置的 callbackUrl 发送 POST 请求

回调参数

参数名说明类型示例
orderNumber商户订单号String1604384758793
status订单状态:0处理中,1成功,2失败Integer1
amount代付金额Integer50000
sign签名:SHA256(orderNumber + status + amount + key)Stringa1b2c3d4e5f6

回调示例

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

应答:请返回字符串 "success" 确认收到回调

支付渠道编码对照表

渠道编码列表
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_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