MertaLink API 文档
快速、安全、可靠的支付解决方案
API 特性
- RESTful API 设计,简单易用
- 支持 PHP、Python、Golang 等多种语言
- 完整的支付流程:支付、查询、代付等
- 实时回调通知
- MD5 和 SHA256 签名验证
基本规则
Request URL
生产环境:
https://api.mertalink.com/merta-apiRequest Method
POST
Content-Type
application/json支付接口
API URL: /payment
创建新的支付订单
请求参数
| 参数名 | 说明 | 类型 | 必填 | 例子 |
|---|---|---|---|---|
| merchantCode | 商户号 | String | Y | test |
| orderNumber | 用户订单号 | String | Y | 1604384758793 |
| amount | 金额 | Integer | Y | 40000 |
| phone | 电话 | String | Y | 08123456789 |
| String | Y | test@test.com | ||
| userName | 名称 | String | Y | John Doe |
| walletNumber | 钱包账号 | String | N | 08821900000 |
| channelCode | 渠道编码 | String | Y | M1 |
| returnUrl | 返回地址 | String | N | http://test/return |
| callbackUrl | 回调地址 | String | Y | http://test/callback |
| sign | 签名 | String | Y | MD5(...) |
签名规则
MD5(amount + callbackUrl + channelCode + merchantCode + orderNumber + md5_key)
响应参数
| 参数名 | 说明 | 类型 | 例子 |
|---|---|---|---|
| code | 返回码 | String | 000 |
| message | 返回消息 | String | success |
| orderNumber | 订单号 | String | O3915CB3C93E445C9 |
| paymentUrl | 支付地址 | String | http://xxx.xxx/ |
| qrcode | 二维码 | String | QRIS支付会返回 |
请求示例
{
"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
查询支付订单状态
请求参数
| 参数名 | 说明 | 类型 | 必填 | 例子 |
|---|---|---|---|---|
| merchantCode | 商户号 | String | Y | test |
| orderNumber | 用户订单号 | String | Y | 1604384758793 |
| sign | 签名 | String | Y | MD5(...) |
签名规则
MD5(merchantCode + orderNumber + md5_key)
响应参数
| 参数名 | 说明 | 类型 | 例子 |
|---|---|---|---|
| code | 返回码 | String | 000 |
| status | 支付状态 | int | 0 待支付, 1 成功, 2 失败 |
| amount | 支付金额 | Integer | 40000 |
请求示例
{
"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
发起代付请求
请求参数
| 参数名 | 说明 | 类型 | 必填 |
|---|---|---|---|
| merchantCode | 商户号 | String | Y |
| orderNumber | 用户订单号 | String | Y |
| amount | 金额 | Integer | Y |
| bankAccount | 银行账号 | String | Y |
| bankCode | 银行编码 | String | Y |
| sign | 签名 | String | Y |
签名规则
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
查询代付订单状态
请求参数
| 参数名 | 说明 | 类型 | 必填 | 例子 |
|---|---|---|---|---|
| merchantCode | 商户号 | String | Y | test |
| orderNumber | 用户订单号 | String | Y | 1604384758793 |
签名规则
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
查询可用支付渠道
请求参数
| 参数名 | 说明 | 类型 | 必填 | 例子 |
|---|---|---|---|---|
| merchantCode | 商户号 | String | Y | test |
| timestamp | 时间戳 | Long | Y | 1604384758793 |
签名规则
MD5(merchantCode + timestamp + key)
请求示例
{
"merchantCode": "test",
"timestamp": 1604384758793,
"sign": "a1b2c3d4e5f6..."
}响应示例
{
"code": "000",
"channels": [
{
"channelCode": "M1",
"channelName": "QRIS",
"minAmount": 1000,
"maxAmount": 10000000
}
]
}余额查询
API URL: /checkBalance
查询商户余额
请求参数
| 参数名 | 说明 | 类型 | 必填 | 例子 |
|---|---|---|---|---|
| merchantCode | 商户号 | String | Y | test |
| timestamp | 时间戳 | Long | Y | 1604384758793 |
签名规则
SHA256(merchantCode + timestamp + sha256_key)
请求示例
{
"merchantCode": "test",
"timestamp": 1604384758793,
"sign": "a1b2c3d4e5f6..."
}响应示例
{
"code": "000",
"balance": 1000000
}异步回调
支付回调
支付完成后,系统会向您配置的 callbackUrl 发送 POST 请求
回调参数
| 参数名 | 说明 | 类型 | 示例 |
|---|---|---|---|
| orderNumber | 商户订单号 | String | 1604384758793 |
| status | 订单状态:0待支付,1成功,2失败 | Integer | 1 |
| amount | 支付金额 | Integer | 40000 |
| sign | 签名:MD5(orderNumber + status + amount + key) | String | a1b2c3d4e5f6 |
回调示例
{
"orderNumber": "1604384758793",
"status": 1,
"amount": 40000,
"sign": "a1b2c3d4e5f6"
}应答:请返回字符串 "success" 确认收到回调
代付回调
代付完成后,系统会向您配置的 callbackUrl 发送 POST 请求
回调参数
| 参数名 | 说明 | 类型 | 示例 |
|---|---|---|---|
| orderNumber | 商户订单号 | String | 1604384758793 |
| status | 订单状态:0处理中,1成功,2失败 | Integer | 1 |
| amount | 代付金额 | Integer | 50000 |
| sign | 签名:SHA256(orderNumber + status + amount + key) | String | a1b2c3d4e5f6 |
回调示例
{
"orderNumber": "1604384758793",
"status": 1,
"amount": 50000,
"sign": "a1b2c3d4e5f6"
}应答:请返回字符串 "success" 确认收到回调
支付渠道编码对照表
渠道编码列表
| 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 | 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 |