sudalinkAPI v1.0

sudalink 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://id.sudalink.net/sudalink-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 (Required for DANA, format 08********; Required for OVO cashier with real number, otherwise optional)
channelCodeChannel CodeStringYM1 (If CASH, will use cashier payment. See channel code table for other codes)
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
accountNumberBank AccountStringTEST0001 (VA only)
paymentUrlPayment URLStringhttp://xxx.xxx/
qrcodeQR CodeStringReturned for QRIS payment
merchantCodeMerchant CodeStringtest

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://id.sudalink.net/sudalink-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
messageResponse MessageStringcomplete
userOrderNumberUser Order NumberString1604384968942
orderNumberPlatform Order NumberStringtest16043849702603
amountPayment AmountInteger40000
merchantCodeMerchant CodeStringtest
phonePhoneStringHidden (00)
emailEmailStringHidden (00)
userNameNameStringJohn Doe
channelCodeChannel CodeStringM1
statusPayment Statusint0 Pending, 1 Success, 2 Failed
createTimeOrder Create TimeDate2020-11-03 13:29:30
payTimePayment TimeDate2020-11-03 13:39:30 (Returned on success)

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://id.sudalink.net/sudalink-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 NameDescriptionTypeRequiredExample
merchantCodeMerchant CodeStringYtest
orderNumberOrder NumberStringY1604384758793
amountAmountIntegerY40000
bankAccountBank AccountStringY100100100
bankCodeBank CodeStringYPERMATA
phonePhoneStringY08123456789
emailEmailStringYtest@test.com
userNameRecipient NameStringYJohn Doe
channelCodeChannel CodeStringYALL
returnUrlReturn URLStringNhttp://test/return
callbackUrlCallback URLStringYhttp://test/callback
signSignatureStringYSHA256(amount + bankAccount + bankCode + callbackUrl + channelCode + merchantCode + orderNumber + sha256_key)

Signature Rule

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

PS

channelCode available: ALL for all channels, ID IDN US ZH for different countries, use ALL if not specified

Request Example

{
  "merchantCode": "test",
  "orderNumber": "1604384758793",
  "amount": 50000,
  "bankAccount": "1234567890",
  "bankCode": "BCA",
  "phone": "08123456789",
  "email": "test@test.com",
  "userName": "John Doe",
  "channelCode": "ALL",
  "returnUrl": "http://test/return",
  "callbackUrl": "http://test/callback",
  "sign": "a1b2c3d4e5f6..."
}

Response Example

{
  "code": "000",
  "message": "success",
  "amount": 40000,
  "merchantCode": "test"
}
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://id.sudalink.net/sudalink-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
signSignatureStringYSHA256(...)

Signature Rule

SHA256(merchantCode + orderNumber + sha256_key)

Request Example

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

Response Example

{
  "code": "000",
  "message": "complete",
  "userOrderNumber": "1604384968942",
  "orderNumber": "test16043849702603",
  "amount": 40000,
  "merchantCode": "test",
  "phone": "00",
  "email": "00",
  "userName": "John Doe",
  "bankCode": "PERMATA",
  "bankAccount": "100100100",
  "channelCode": "M1",
  "status": 1,
  "createTime": "2020-11-03 13:29:30",
  "payTime": "2020-11-03 13:39:30"
}
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://id.sudalink.net/sudalink-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
codeResponse CodeString000
messageResponse MessageStringcomplete
orderNumberMerchant Order NumberString1604384758793
amountPayment AmountInteger40000
merchantCodeMerchant CodeStringtest
phonePhone (hidden as 00)String00
emailEmail (hidden as 00)String00
userNameUser NameStringJohn Doe
channelCodeChannel CodeStringM1
statusStatus: 0 Pending, 1 SuccessInteger1
createTimeOrder Create Time (timestamp)Long1617695193459
payTimePayment Time (timestamp, returned on success)Long1617695193459
signMD5(amount + channelCode + email + merchantCode + orderNumber + phone + userName + md5_key)Stringa1b2c3d4e5f6

Callback Example

{
  "code": "000",
  "message": "complete",
  "orderNumber": "1604384758793",
  "amount": 40000,
  "merchantCode": "test",
  "phone": "00",
  "email": "00",
  "userName": "John Doe",
  "channelCode": "M1",
  "status": 1,
  "createTime": 1617695193459,
  "payTime": 1617695193459,
  "sign": "a1b2c3d4e5f6"
}

Response: Please return HTTP 200 status code 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
codeResponse CodeString000
messageResponse MessageStringcomplete
orderNumberMerchant Order NumberString1604384758793
amountDisbursement AmountInteger40000
merchantCodeMerchant CodeStringtest
phonePhone (hidden as 00)String00
emailEmail (hidden as 00)String00
userNameRecipient NameStringJohn Doe
bankCodeBank CodeStringPERMATA
bankAccountBank AccountString100100100
channelCodeChannel CodeStringM1
statusStatus: 1 Success, 2 FailedInteger1
createTimeOrder Create Time (timestamp)Long1617695193459
payTimePayment Time (timestamp, returned on success)Long1617695193459
signSHA256(amount + bankAccount + bankCode + channelCode + email + merchantCode + orderNumber + phone + userName + sha256_key)Stringa1b2c3d4e5f6

Callback Example

{
  "code": "000",
  "message": "complete",
  "orderNumber": "1604384758793",
  "amount": 40000,
  "merchantCode": "test",
  "phone": "00",
  "email": "00",
  "userName": "John Doe",
  "bankCode": "PERMATA",
  "bankAccount": "100100100",
  "channelCode": "M1",
  "status": 1,
  "createTime": 1617695193459,
  "payTime": 1617695193459,
  "sign": "a1b2c3d4e5f6"
}

Response: Please return HTTP 200 status code to confirm receipt of callback

Payment Channel Code Reference

🇮🇩 Indonesia
channel_codechannel_nameType
QRISQRISCollection
VCCredit Card (Visa / Master)Collection
BKBCA KlikPayCollection
BCABCA Virtual AccountCollection
BBCBCA BCCollection
M1Mandiri Virtual AccountCollection
MEMandiri eCashCollection
MPMandiri PCCollection
BTPermata Bank Virtual AccountCollection
PNPermata NetCollection
A1ATM BersamaCollection
B1CIMB Niaga Virtual AccountCollection
I1BNI Virtual AccountCollection
VAMaybank Virtual AccountCollection
M2UMaybank2UCollection
FTRitelCollection
OVOVOCollection
LALINKAJACollection
DANADANACollection
SPShopee PayCollection
SAShopee Pay AppsCollection
AGBank Artha GrahaCollection
S1Sahabat SampoernaCollection
NIBank Negara IndonesiaCollection
RIBank Rakyat IndonesiaCollection
RIEBRI ePayCollection
ININDOMARETCollection
ALALFAMARTCollection
DOBDanamon Online BankingCollection
DVADanamon Virtual AccountCollection
AIAlto iDebitCollection
JIBJenius IBCollection
JAJAKONECollection
OCOcto ClicksCollection
SKSakukuCollection
ALFAlfagroupCollection
KRKredivoCollection
BLBTNONLINECollection
SVASinarmas Virtual AccountCollection
CASHCashier PaymentCollection
ID_ALLIndonesia Disbursement All ChannelDisbursement
🇵🇰 Pakistan
channel_codechannel_nameType
PK_JAZZJAZZ WalletCollection
PK_EASYEASY WalletCollection
PK_ALLPakistan Disbursement All ChannelDisbursement
🇧🇷 Brazil
channel_codechannel_nameType
BR_BRLQR Code PaymentCollection
BR_ALLPIX Disbursement ChannelDisbursement

Bank Code Reference

Bank Code List

🇮🇩 Indonesia

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
SHOPEEPAYSHOPEEPAY
DANADANA
GOPAYGOPAY

🇵🇰 Pakistan

bank_codebank_name
PK_EASYEASY Wallet
PK_JAZZJAZZ Wallet

🇧🇷 Brazil

bank_codebank_name
BR_CPFCPF Number
BR_PHONEPhone Number
BR_EMAILEmail