Introduction
Welcome to the Artha Remit API V1. Our API services are accepts json-encoded POST request bodies and returns JSON-encoded responses.
Request And Response
API can be requested through HTTPS Request to Artha Remit API Base URL endpoint. The HTTPS Header has to be used to allow proper authentication, additionally HTTPS Request should only be made from IP Address which has been registered in Artha Remit.
Endpoint Url
Production : https://api.artharemit.co.id
Sanbox : Coomingsoon
Request Common Parameters
Parameter | Type | Description |
---|---|---|
mchNo | string | provide by us. |
appId | string | provide by us. |
reqTime | int | request time in minute. |
signType | string | Use MD5 or RSA2 |
version | string | Use 1.0 only |
sign | string | authenticate a partner request, see how to compute sign here |
Sign
To sign, use this code:
function getSign($params, $appSecret) {
$arrayToSort = [];
foreach($params as $key => $value) {
if ($key == 'sign') {
continue;
}
if ($value == null || $value == '') {
continue;
}
$arrayToSort[] = "$key=$value&";
}
sort($arrayToSort);
return md5(implode('', $arrayToSort) . 'key=' . $appSecret);
}
public class SignKit {
private static String encodingCharset = "UTF-8";
public static String getSign(Map<String,Object> map, String appSecret){
ArrayList<String> list = new ArrayList<String>();
for(Map.Entry<String,Object> entry:map.entrySet()){
if(null != entry.getValue() && !"".equals(entry.getValue())){
list.add(entry.getKey() + "=" + entry.getValue() + "&");
}
}
int size = list.size();
String [] arrayToSort = list.toArray(new String[size]);
Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < size; i ++) {
sb.append(arrayToSort[i]);
}
String result = sb.toString();
result += "key=" + appSecret;
result = md5(result, encodingCharset).toUpperCase();
return result;
}
public static String md5(String value, String charset) {
MessageDigest md = null;
try {
byte[] data = value.getBytes(charset);
md = MessageDigest.getInstance("MD5");
byte[] digestData = md.digest(data);
return toHex(digestData);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
}
sort the all key of parameters and generate string array to use template "{key}={value}", then get variable string source by combining string array into a string with separator "&" and splice "&key={appSecret}", finally get sign use md5(source). eg:
{ "name": "xxx", "gender": 1, "address": "bbb" }
appSecret=df8xnjfsd0dsf
source is "address=bbb&gender=1&name=xxx&key=df8xnjfsd0dsf"
sign = md5(source)
Response error
when happend error, response has properties code and msg
{ "code": 100, "msg": "Parameter value error[reqTime error]" }
Parameter | Type | Description |
---|---|---|
code | int | error code, when error, it is not zero. see error code detail |
msg | string | error message. |
Response success
when happend success, response has properties code, msg, data and sign
{ "code": 0, "data": { }, "msg": "SUCCESS", "sign": "8402789DFFF08AEF95A4187FAFB02A9E" }
Parameter | Type | Description |
---|---|---|
code | int | 0, fixed |
msg | string | "SUCCESS" fixed. |
sign | string | sign for data. |
data | object | the result data |
Virtual Account
Use this API to create new VA number
path="/api/pay/virtual_account"
to create new VA number, use this code
<?php
$mchNo = 'mch000000001';
$appId = 'app0000000001';
$appSecret = 'fd8sjx9saoka';
$signType = 'MD5';
$version = '1.0';
$phone = "0811223344";
$userName = "jony"
$amount = 10000;
$mchOrderNo = "TX00001210200";
$subject = "shopping";
$wayCode = "BNI";
$displayName = "app name";
$expiredTime = 60; // 60 minutes
$notifyUrl = "https://yourcallback.com/notify";
$req_data = [
'mchNo' => $mchNo,
'appId' => $appId,
'signType' => $signType,
'version' => $version,
'phone' => $phone,
'userName' => $userName,
'amount' => $amount,
'mchOrderNo' => $mchOrderNo,
'subject' => $subject,
'wayCode' => $wayCode,
'displayName' => $displayName,
'expiredTime' => $expiredTime,
'notifyUrl ' => $notifyUrl,
];
$req_data['sign'] = getSign($req_data, $appSecret);
$data_payload = json_encode($req_data);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.artharemit.co.id/api/pay/virtual_account',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $data_payload,
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
public class Example {
public static void sendRequest() throws Exception {
String mchNo = "mch000000001";
String appId = "app0000000001";
String appSecret = "fd8sjx9saoka";
String signType = "MD5";
String version = "1.0";
String phone = "0811223344";
String userName = "jony";
int amount = 10000;
String mchOrderNo = "TX00001210200";
String subject = "shopping";
String wayCode = "BNI";
String displayName = "app name";
int expiredTime = 60;
String notifyUrl = "https://yourcallback.com/notify";
Map<String, Object> reqData = new TreeMap<>();
reqData.put("mchNo", mchNo);
reqData.put("appId", appId);
reqData.put("signType", signType);
reqData.put("version", version);
reqData.put("phone", phone);
reqData.put("userName", userName);
reqData.put("amount", amount);
reqData.put("mchOrderNo", mchOrderNo);
reqData.put("subject", subject);
reqData.put("wayCode", wayCode);
reqData.put("displayName", displayName);
reqData.put("expiredTime", expiredTime);
reqData.put("notifyUrl ", notifyUrl);
reqData.put("sign", SignKit.getSign(reqData, appSecret));
String dataPayload = new Gson().toJson(reqData);
URL url = new URL("https://api.artharemit.co.id/api/pay/virtual_account");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
conn.getOutputStream().write(dataPayload.getBytes());
String response = new String(conn.getInputStream().readAllBytes());
System.out.println(response);
conn.disconnect();
}
}
Request
Parameter | Required | Type | Description |
---|---|---|---|
userName | true | string | user's name |
phone | true | string | Customer mobile number, prefix 08 e.g (0811223344) |
amount | true | long | Amount your user must paid to complete the transaction |
mchOrderNo | true | string | merchant trx id must be unique |
subject | true | string | product description |
wayCode | true | string | code product, see wayCode here |
displayName | true | string | Customizable VA display name that will be seen by user |
expiredTime | true | int | Transaction expiration time in minutes, e.g If Transaction want to be expired after 5 minutes, you just have to set expired_on to 5. |
notifyUrl | true | string | url that will receive payment success/fail notification. see callback |
commonParameter | - | - | see Request Common Parameters |
Response
Parameter | Required | Type | Description |
---|---|---|---|
data.accountNumber | true | string | Generated VA number |
data.mchFeeAmount | true | long | the fee we provide |
data.mchOrderNo | true | string | trx id from merchant |
data.payOrderId | true | string | id transaction from us |
data.state | true | int | VA state, see state detail |
Payment Code Virtual Account
VA wayCode |
---|
BRI |
BNI |
BCA |
PERMATA |
DANAMON |
CIMB |
MANDIRI |
Disburstment
Use this API to start disbursing money to a specific beneficiary account.
path="/api/transfer/bank_card"
to disburstment, use this code
<?php
$mchNo = 'mch000000001';
$appId = 'app0000000001';
$appSecret = 'fd8sjx9saoka';
$signType = 'MD5';
$version = '1.0';
$phone = "0811223344";
$accountName = "jony"
$amount = 10000;
$mchOrderNo = "TX00001210200";
$remark = "Refund";
$entryType = "BANK_CARD";
$bankCode = "BCA";
$accountNo = '0000000000001';
$notifyUrl = "https://yourcallback.com/notify";
$req_data = [
'mchNo' => $mchNo,
'appId' => $appId,
'signType' => $signType,
'version' => $version,
'phone' => $phone,
'accountName' => $accountName,
'amount' => $amount,
'mchOrderNo' => $mchOrderNo,
'remark' => $remark,
'entryType' => $entryType,
'bankCode' => $bankCode,
'accountNo' => $accountNo,
'notifyUrl ' => $notifyUrl,
];
$req_data['sign'] = getSign($req_data, $appSecret);
$data_payload = json_encode($req_data);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.artharemit.co.id/api/transfer/bank_card',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $data_payload,
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
public class Example {
public static void sendRequest() throws Exception {
String mchNo = "mch000000001";
String appId = "app0000000001";
String appSecret = "fd8sjx9saoka";
String signType = "MD5";
String version = "1.0";
String phone = "0811223344";
String accountName = "jony";
int amount = 10000;
String mchOrderNo = "TX00001210200";
String remark = "Refund";
String entryType = "BANK_CARD";
String bankCode = "BCA";
String accountNo = "0000000000001";
String notifyUrl = "https://yourcallback.com/notify";
Map<String, Object> reqData = new HashMap<String, Object>();
reqData.put("mchNo", mchNo);
reqData.put("appId", appId);
reqData.put("signType", signType);
reqData.put("version", version);
reqData.put("phone", phone);
reqData.put("accountName", accountName);
reqData.put("amount", amount);
reqData.put("mchOrderNo", mchOrderNo);
reqData.put("remark", remark);
reqData.put("entryType", entryType);
reqData.put("bankCode", bankCode);
reqData.put("accountNo", accountNo);
reqData.put("notifyUrl", notifyUrl);
reqData.put("sign", SignKit.getSign(reqData, appSecret));
String dataPayload = new Gson().toJson(reqData);
URL url = new URL("https://api.artharemit.co.id/api/transfer/bank_card");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
conn.getOutputStream().write(dataPayload.getBytes());
String response = new String(conn.getInputStream().readAllBytes());
System.out.println(response);
conn.disconnect();
}
}
Request
Parameter | Required | Type | Description |
---|---|---|---|
accountName | true | string | name of account |
phone | true | string | Customer mobile number, prefix 08 e.g (0811223344) |
amount | true | long | Amount of disbursement (Number Only), min amount 10000 |
mchOrderNo | true | string | merchant trx id must be unique |
entryType | true | string | only "BANK_CARD" |
remark | true | string | remark |
bankCode | true | string | Bank Code of the Beneficiary account, see Disbursement Bank Codes |
accountNo | true | string | Beneficiary account number, numeric only |
notifyUrl | true | string | For notification transaction disburst status success or fail. see callback |
commonParameter | - | - | see Request Common Parameters |
Response
Parameter | Required | Type | Description |
---|---|---|---|
data.amount | true | long | Amount of disbursement |
data.mchFeeAmount | true | long | the fee we provide |
data.mchOrderNo | true | string | trx id from merchant |
data.transferId | true | string | id transaction from us |
data.state | true | int | transfer state, see state detail |
List Bank Supported (bankShort)
bankShort | Bank Name | Digital Code |
---|---|---|
BCA | Bank Central Asia | 014 |
MANDIRI | Bank Mandiri | 008 |
BNI | Bank Negara Indonesia | 009 |
PERMATA | Bank Permata | 013 |
BRI | Bank Rakyat Indonesia | 002 |
CIMB_NIAGA | CIMB Niaga Bank | 022 |
DANAMON | Bank Danamon | 011 |
PANIN | Bank Panin | 019 |
BII | Bank Maybank | 016 |
ANGLOMAS | Anglomas International Bank | 531 |
BANGKOK | Bangkok Bank | 040 |
IBK | Bank IBK Indonesia | 945 |
SINARMAS | Sinarmas | 153 |
BRI_AGRO | Bank BRI Agro | 494 |
ANDARA | Bank Andara | 466 |
ANTAR_DAERAH | Bank CCB Indonesia | 088 |
ANZ | Bank ANZ Indonesia | 061 |
ARTHA | Bank Artha Graha International | 037 |
ARTOS | Bank Artos Indonesia | 542 |
BISNIS | Bank Bisnis Internasional | 459 |
BJB | Bank BJB | 110 |
BNP | Bank BNP Paribas | 057 |
BUKOPIN | Bank Bukopin | 441 |
BUMI_ARTA | Bank Bumi Arta | 076 |
CAPITAL | Bank Capital Indonesia | 054 |
BCA_SYR | Bank Central Asia (BCA) Syariah | 536 |
CHINATRUST | Bank Chinatrust Indonesia | 069 |
CIMB_UUS | Bank CIMB Niaga UUS | 022 |
COMMONWEALTH | Bank Commonwealth | 950 |
DBS | Bank DBS Indonesia | 046 |
DINAR_INDONESIA | Bank Dinar Indonesia | 526 |
OKE | Bank OKE | 466 |
DKI | Bank DKI | 111 |
FAMA | Bank Fama International | 562 |
GANESHA | Bank Ganesha | 161 |
HANA | Bank Hana | 484 |
HARDA_INTERNASIONAL | Bank Harda Internasional | 567 |
WOORI_SAUDARA | Bank Woori Saudara | 212 |
ICBC | Bank ICBC Indonesia | 164 |
INA_PERDANA | Bank Ina Perdana | 513 |
INDEX_SELINDO | Bank Index Selindo | 555 |
JASA_JAKARTA | Bank Jasa Jakarta | 472 |
KESEJAHTERAAN_EKONOMI | Bank Kesejahteraan Ekonomi | 535 |
MASPION | Bank Maspion Indonesia | 157 |
MAYAPADA | Bank Mayapada International | 097 |
MAYBANK_SYR | Bank Maybank Syariah Indonesia | 947 |
MAYORA | Bank Mayora | 553 |
MEGA | Bank Mega | 426 |
MESTIKA_DHARMA | Bank Mestika Dharma | 151 |
SHINHAN | Bank Shinhan Indonesia | 152 |
MIZUHO | Bank Mizuho Indonesia | 48 |
MNC_INTERNASIONAL | Bank MNC Internasional | 485 |
MUAMALAT | Bank Muamalat Indonesia | 147 |
MULTI_ARTA_SENTOSA | Bank Multi Arta Sentosa | 548 |
J_TRUST | Bank J Trust Indonesia | 095 |
NATIONALNOBU | Bank Nationalnobu | 503 |
NUSANTARA_PARAHYANGAN | Bank Nusantara Parahyangan | 145 |
OCBC | Bank OCBC NISP | 028 |
BOC | Bank of China (BOC) | 069 |
INDIA | Bank of India Indonesia | 146 |
PANIN_SYR | Bank Panin Syariah | 517 |
QNB | Bank QNB Indonesia | 167 |
RABOBANK | Bank Rabobank International Indonesia | 060 |
RESONA | Bank Resona Perdania | 047 |
ROYAL | Bank Royal Indonesia | 501 |
BTPN_SYR | Bank BTPN Syariah | 547 |
SAHABAT_SAMPOERNA | Bank Sahabat Sampoerna | 523 |
SBI_INDONESIA | Bank SBI Indonesia | 498 |
MANDIRI_TASPEN | Bank Mandiri Taspen | 564 |
MITSUI | Bank Sumitomo Mitsui Indonesia | 045 |
BRI_SYR | Bank Syariah BRI | 422 |
BUKOPIN_SYR | Bank Syariah Bukopin | 521 |
MANDIRI_SYR | Bank Syariah Mandiri | 451 |
MEGA_SYR | Bank Syariah Mega | 506 |
BTN | Bank Tabungan Negara (BTN) | 200 |
UOB | Bank UOB Indonesia | 023 |
VICTORIA_INTERNASIONAL | Bank Victoria Internasional | 566 |
VICTORIA_SYR | Bank Victoria Syariah | 405 |
CCB | Bank CCB Indonesia | 036 |
YUDHA_BHAKTI | Bank Yudha Bhakti | 490 |
ACEH | BPD Aceh | 116 |
BANTEN | BPD Banten | 137 |
BALI | BPD Bali | 129 |
BENGKULU | BPD Bengkulu | 133 |
BPD_DIY | Bank Pembangunan Daerah (BPD DIY) | 112 |
JAMBI | BPD Jambi | 115 |
JAWA_TENGAH | BPD Jawa Tengah | 113 |
JAWA_TIMUR | BPD Jawa Timur | 114 |
KALIMANTAN_BARAT | BPD Kalimantan Barat | 123 |
KALIMANTAN_SELATAN | BPD Kalimantan Selatan | 122 |
KALIMANTAN_TENGAH | BPD Kalimantan Tengah | 123 |
KALIMANTAN_TIMUR | BPD Kalimantan Timur | 124 |
LAMPUNG | BPD Lampung | 121 |
MALUKU | BPD Maluku | 131 |
PAPUA | BPD Papua | 132 |
RIAU_DAN_KEPRI | BPD Riau Dan Kepri | 119 |
SULAWESI | BPD Sulawesi Tengah | 134 |
SULSELBAR | BPD Sulselbar | 126 |
SULUTGO | Bank Sulutgo | 127 |
SUMSEL_DAN_BABEL | BPD Sumsel Dan Babel | 120 |
SUMUT | BPD Sumut | 117 |
CENTRATAMA | Centratama Nasional Bank | 559 |
CITIBANK | Citibank | 031 |
HSBC | Hongkong and Shanghai Bank Corporation (HSBC) | 087 |
JPMORGAN | JP Morgan Chase Bank | 032 |
PRIMA_MASTER | Prima Master Bank | 520 |
STANDARD_CHARTERED | Standard Charted Bank | 050 |
MITRA_NIAGA | Bank Mitra Niaga | 491 |
EKSPOR_INDONESIA | Bank Ekspor Indonesia | 003 |
ARTA_NIAGA_KENCANA | Bank Arta Niaga Kencana | 020 |
BJB_SYR | Bank BJB Syariah | 425 |
BNI_SYR | Bank BNI Syariah | 427 |
BPR_KS | BPR Karyajatnika Sadaya | 688 |
METRO_EXPRESS | Bank Metro Express | 152 |
SINAR_HARAPAN_BALI | Bank Sinar Harapan Bali | 564 |
WINDU | Bank Windu Kentjana Int | 162 |
PUNDI_INDONESIA | Bank Eksekutif Internasional | 558 |
ABN_AMRO | Bank ABN Amro | 052 |
KEBD | Korea Exchange Bank Danamon | 059 |
OCBC_INDONESIA | Bank OCBC - Indonesia | 028 |
JENIUS | Bank Jenius (BTPN) | 213 |
topup_ovo | OVO | ovo |
topup_linkaja | LinkAja | linkaja |
topup_dana | DANA | dana |
topup_gopay | Gopay | gopay |
topup_shopeepay | ShopeePay | shopeepay |
Bank Account Inquiry
Use this API to get beneficiary account details.
path="/api/other/account_inquiry"
to inquiry, use this code
<?php
$mchNo = 'mch000000001';
$appId = 'app0000000001';
$appSecret = 'fd8sjx9saoka';
$signType = 'MD5';
$version = '1.0';
$mchOrderNo = "TX00001210200";
$accountNo = "900000000000";
$accountName = "jony"
$bankCode = 'MANDIRI';
$req_data = [
'mchNo' => $mchNo,
'appId' => $appId,
'signType' => $signType,
'version' => $version,
'mchOrderNo' => $mchOrderNo,
'accountNo' => $accountNo,
'bankCode' => $bankCode,
'accountNo' => $accountNo,
];
$req_data['sign'] = getSign($req_data, $appSecret);
$data_payload = json_encode($req_data);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.artharemit.co.id/api/other/account_inquiry',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $data_payload,
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
public class Example {
public static void sendRequest() throws Exception {
String mchNo = 'mch000000001';
String appId = 'app0000000001';
String appSecret = 'fd8sjx9saoka';
String signType = 'MD5';
String version = '1.0';
String mchOrderNo = "TX00001210200";
String accountNo = "900000000000";
String accountName = "jony";
String bankCode = 'MANDIRI';
Map<String, Object> reqData = new HashMap<String, Object>();
reqData.put("mchNo", mchNo);
reqData.put("appId", appId);
reqData.put("signType", signType);
reqData.put("version", version);
reqData.put("mchOrderNo", mchOrderNo);
reqData.put("accountNo", accountNo);
reqData.put("accountName", accountName);
reqData.put("bankCode", bankCode);
String sign = SignKit.getSign(reqData, appSecret);
reqData.put("sign", sign);
String dataPayload = new Gson().toJson(reqData);
URL url = new URL("https://api.artharemit.co.id/api/other/account_inquiry");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
conn.getOutputStream().write(dataPayload.getBytes());
String response = new String(conn.getInputStream().readAllBytes());
System.out.println(response);
conn.disconnect();
}
}
Request
Parameter | Required | Type | Description |
---|---|---|---|
mchOrderNo | true | string | merchant trx id must be unique |
accountName | true | string | name of account |
bankCode | true | string | Bank Code of the Beneficiary account, see Disbursement Bank Codes |
accountNo | true | string | Beneficiary account number, numeric only |
commonParameter | - | - | see Request Common Parameters |
Response
Parameter | Required | Type | Description |
---|---|---|---|
data.accountName | true | string | the name you provide |
data.targetAccountName | true | string | the name that is inquiry from banking institution |
data.similarity | true | double | similarity of the above two names |
data.mchFeeAmount | true | long | the fee we provide |
data.mchOrderNo | true | string | trx id from merchant |
data.transactionId | true | string | id transaction from us |
Response Error Code Inquiry
code | Description |
---|---|
900 | Inquiry process is complete but the account number is invalid or maybe a virtual account number |
901 | Bank account have been suspected on doing fraud. You still can do a disbursement to this account |
902 | Bank account have been confirmed on doing a fraud and therefore is blacklisted. You can’t do a disbursment to this account. |
903 | The inquiry process is complete and the account is valid, but it is closed/inactive so that it cannot receive money. You cannot do a disbursement to this account. |
1002 | Submit fail, inquiry fail |
Credit Card Link
Use this API to request Credit Card Link for payment.
path="/api/pay/credit_card"
to request Credit Card Link, use this code
<?php
$mchNo = 'mch000000001';
$appId = 'app0000000001';
$appSecret = 'fd8sjx9saoka';
$signType = 'MD5';
$version = '1.0';
$phone = "0811223344";
$userName = "jony"
$amount = 10000;
$mchOrderNo = "TX00001210200";
$subject = "shopping";
$displayName = "app name";
$expiredTime = 60; // 60 minutes
$notifyUrl = "https://yourcallback.com/notify";
$redirectUrl = "https://yourcallback.com/success";
$req_data = [
'mchNo' => $mchNo,
'appId' => $appId,
'signType' => $signType,
'version' => $version,
'phone' => $phone,
'userName' => $userName,
'amount' => $amount,
'mchOrderNo' => $mchOrderNo,
'subject' => $subject,
'displayName' => $displayName,
'expiredTime' => $expiredTime,
'notifyUrl ' => $notifyUrl,
'redirectUrl' => $redirectUrl,
];
$req_data['sign'] = getSign($req_data, $appSecret);
$data_payload = json_encode($req_data);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.artharemit.co.id/api/pay/credit_card',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $data_payload,
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
public class Example {
public static void sendRequest() throws Exception {
String mchNo = "mch000000001";
String appId = "app0000000001";
String appSecret = "fd8sjx9saoka";
String signType = "MD5";
String version = "1.0";
String phone = "0811223344";
String userName = "jony";
int amount = 10000;
String mchOrderNo = "TX00001210200";
String subject = "shopping";
String displayName = "app name";
int expiredTime = 60; // 60 minutes
String notifyUrl = "https://yourcallback.com/notify";
String redirectUrl = "https://yourcallback.com/success";
Map<String, Object> reqData = new HashMap<String, Object>();
reqData.put("mchNo", mchNo);
reqData.put("appId", appId);
reqData.put("signType", signType);
reqData.put("version", version);
reqData.put("phone", phone);
reqData.put("userName", userName);
reqData.put("amount", amount);
reqData.put("mchOrderNo", mchOrderNo);
reqData.put("subject", subject);
reqData.put("displayName", displayName);
reqData.put("expiredTime", expiredTime);
reqData.put("notifyUrl", notifyUrl);
reqData.put("redirectUrl", redirectUrl);
String sign = SignKit.getSign(reqData, appSecret);
reqData.put("sign", sign);
String dataPayload = new Gson().toJson(reqData);
URL url = new URL("https://api.artharemit.co.id/api/pay/credit_card");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
conn.getOutputStream().write(dataPayload.getBytes());
String response = new String(conn.getInputStream().readAllBytes());
System.out.println(response);
conn.disconnect();
}
}
Request
Parameter | Required | Type | Description |
---|---|---|---|
userName | true | string | user's name |
phone | true | string | Customer mobile number, prefix 08 e.g (0811223344) |
amount | true | long | Amount your user must paid to complete the transaction |
mchOrderNo | true | string | merchant trx id must be unique |
subject | true | string | product description |
displayName | true | string | Customizable display name that will be seen by user |
expiredTime | true | int | Transaction expiration time in minutes, e.g If Transaction want to be expired after 5 minutes, you just have to set expired_on to 5. |
notifyUrl | true | string | url that will receive payment success/fail notification. see callback |
redirectUrl | true | string | Indicates the URL of your environment (to redirect the customers back once payment has been completed in Credit Card Link issuers.) |
commonParameter | - | - | see Request Common Parameters |
Response
Parameter | Required | Type | Description |
---|---|---|---|
data.returnUrl | true | int | Payment link which used for payment |
data.mchFeeAmount | true | long | the fee we provide |
data.mchOrderNo | true | string | trx id from merchant |
data.payOrderId | true | string | id transaction from us |
data.state | true | int | transfer state, see state detail |
E-Wallet
E-Wallet Aggregator API allows partners / mitra to seamlessly charge and receive payments directly from top e-wallet issuers. With one integration, they are able to get access to all of Artha Remit ID available e-wallets ((OVO, ShopeePay, LinkAja, and DANA) and upcoming e-wallet integrations.
path="/api/pay/e_wallet"
Example Request E-Wallet
<?php
<?php
$mchNo = 'mch000000001';
$appId = 'app0000000001';
$appSecret = 'fd8sjx9saoka';
$signType = 'MD5';
$version = '1.0';
$phone = "0811223344";
$userName = "jony"
$amount = 10000;
$mchOrderNo = "TX00001210200";
$subject = "shopping";
$wayCode = "OVO";
$displayName = "app name";
$expiredTime = 60; // 60 minutes
$notifyUrl = "https://yourcallback.com/notify";
$redirectUrl = "https://yourcallback.com/success";
$req_data = [
'mchNo' => $mchNo,
'appId' => $appId,
'signType' => $signType,
'version' => $version,
'phone' => $phone,
'userName' => $userName,
'amount' => $amount,
'mchOrderNo' => $mchOrderNo,
'subject' => $subject,
'wayCode' => $wayCode,
'displayName' => $displayName,
'expiredTime' => $expiredTime,
'notifyUrl ' => $notifyUrl,
'redirectUrl ' => $redirectUrl
];
$req_data['sign'] = getSign($req_data, $appSecret);
$data_payload = json_encode($req_data);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.artharemit.co.id/api/pay/e_wallet',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $data_payload,
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
public class Example {
public static void sendRequest() throws Exception {
String mchNo = "mch000000001";
String appId = "app0000000001";
String appSecret = "fd8sjx9saoka";
String signType = "MD5";
String version = "1.0";
String phone = "0811223344";
String userName = "jony";
int amount = 10000;
String mchOrderNo = "TX00001210200";
String subject = "shopping";
String wayCode = "OVO";
String displayName = "app name";
int expiredTime = 60; // 60 minutes
String notifyUrl = "https://yourcallback.com/notify";
String redirectUrl = "https://yourcallback.com/success";
Map<String, Object> reqData = new HashMap<String, Object>();
reqData.put("mchNo", mchNo);
reqData.put("appId", appId);
reqData.put("signType", signType);
reqData.put("version", version);
reqData.put("phone", phone);
reqData.put("userName", userName);
reqData.put("amount", amount);
reqData.put("mchOrderNo", mchOrderNo);
reqData.put("subject", subject);
reqData.put("wayCode", wayCode);
reqData.put("displayName", displayName);
reqData.put("expiredTime", expiredTime);
reqData.put("notifyUrl", notifyUrl);
reqData.put("redirectUrl", redirectUrl);
String sign = SignKit.getSign(reqData, appSecret);
reqData.put("sign", sign);
String dataPayload = new Gson().toJson(reqData);
URL url = new URL("https://api.artharemit.co.id/api/pay/e_wallet");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
conn.getOutputStream().write(dataPayload.getBytes());
String response = new String(conn.getInputStream().readAllBytes());
System.out.println(response);
conn.disconnect();
}
}
Example Response
{
"code": 0,
"data": {
"checkoutUrl": "https://checkout.negapay.com/success",
"imageUrl": "",`
"mchFeeAmount": 200,
"mchOrderNo": "TX00001210200",
"mobileNumber": "0811223344",
"payOrderId": "P1632984294158790658",
"qrCode": "",
"state": 1,
"viewName": "jony"
},
"msg": "SUCCESS",
"sign": "8651697B00D66D83898CB5814EAEB39E"
}
Request
Parameter | Required | Type | Description |
---|---|---|---|
userName | true | string | user's name |
phone | true | string | Customer mobile number, prefix 08 e.g (0811223344) |
amount | true | long | Amount your user must paid to complete the transaction |
mchOrderNo | true | string | merchant trx id must be unique |
subject | true | string | product description |
wayCode | true | string | code product, see wayCode here |
displayName | true | string | Customizable VA display name that will be seen by user |
expiredTime | true | int | Transaction expiration time in minutes, e.g If Transaction want to be expired after 5 minutes, you just have to set expired_on to 5. |
notifyUrl | true | string | url that will receive payment success/fail notification. see callback |
redirectUrl | true | string | Indicates the URL of your environment (to redirect the customers back once payment has been completed in e-wallet issuers.) |
commonParameter | - | - | see Request Common Parameters |
Response
Parameter | Required | Type | Description |
---|---|---|---|
data.mchFeeAmount | true | long | the fee we provide |
data.mchOrderNo | true | string | trx id from merchant |
data.payOrderId | true | string | id transaction from us |
data.mobileNumber | true | string | number phone enduser |
data.checkoutUrl | true | string | Checkout URL passed from the e-wallet issuers to be used for payment purposes(OVO does not return, and the user will be notified directly in the OVO wallet APP) |
data.imageUrl | true | string | Url Image QR National Dynamic Data |
data.qrCode | true | string | QR National Dynamic Data |
data.viewName | true | string | Customizable display name that will be seen by user |
data.state | true | int | E-Wallet state, see state detail |
Payment Code E-wallet
E-Wallet Providers | E_WALLET_CODE | Minimum (IDR) | Maximum (IDR) |
---|---|---|---|
DANA | dana | 10.000 | 10.000.000 |
OVO | ovo | 10.000 | 10.000.000 |
SHOPEEPAY | shopeepay | 10.000 | 10.000.000 |
Dynamic QRIS
This API will be used by partner to request Dynamic QRIS for payment.
path="/api/pay/qris"
Example Request Dynamic QRIS
<?php
<?php
$mchNo = 'mch000000001';
$appId = 'app0000000001';
$appSecret = 'fd8sjx9saoka';
$signType = 'MD5';
$version = '1.0';
$phone = "0811223344";
$userName = "jony"
$amount = 10000;
$mchOrderNo = "TX00001210200";
$subject = "shopping";
$wayCode = "QRIS";
$displayName = "app name";
$expiredTime = 60; // 60 minutes
$notifyUrl = "https://yourcallback.com/notify";
$redirectUrl = "https://yourcallback.com/success";
$req_data = [
'mchNo' => $mchNo,
'appId' => $appId,
'signType' => $signType,
'version' => $version,
'phone' => $phone,
'userName' => $userName,
'amount' => $amount,
'mchOrderNo' => $mchOrderNo,
'subject' => $subject,
'wayCode' => $wayCode,
'displayName' => $displayName,
'expiredTime' => $expiredTime,
'notifyUrl ' => $notifyUrl,
'redirectUrl ' => $redirectUrl
];
$req_data['sign'] = getSign($req_data, $appSecret);
$data_payload = json_encode($req_data);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.artharemit.co.id/api/pay/e_wallet',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $data_payload,
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
public class Example {
public static void sendRequest() throws Exception {
String mchNo = "mch000000001";
String appId = "app0000000001";
String appSecret = "fd8sjx9saoka";
String signType = "MD5";
String version = "1.0";
String phone = "0811223344";
String userName = "jony";
int amount = 10000;
String mchOrderNo = "TX00001210200";
String subject = "shopping";
String wayCode = "QRIS";
String displayName = "app name";
int expiredTime = 60; // 60 minutes
String notifyUrl = "https://yourcallback.com/notify";
String redirectUrl = "https://yourcallback.com/success";
Map<String, Object> reqData = new HashMap<String, Object>();
reqData.put("mchNo", mchNo);
reqData.put("appId", appId);
reqData.put("signType", signType);
reqData.put("version", version);
reqData.put("phone", phone);
reqData.put("userName", userName);
reqData.put("amount", amount);
reqData.put("mchOrderNo", mchOrderNo);
reqData.put("subject", subject);
reqData.put("wayCode", wayCode);
reqData.put("displayName", displayName);
reqData.put("expiredTime", expiredTime);
reqData.put("notifyUrl", notifyUrl);
reqData.put("redirectUrl", redirectUrl);
String sign = SignKit.getSign(reqData, appSecret);
reqData.put("sign", sign);
String dataPayload = new Gson().toJson(reqData);
URL url = new URL("https://api.artharemit.co.id/api/pay/qris");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
conn.getOutputStream().write(dataPayload.getBytes());
String response = new String(conn.getInputStream().readAllBytes());
System.out.println(response);
conn.disconnect();
}
}
Example Response
{
"code": 0,
"data": {
"imageUrl": "https://negapay.com/image-qris/MDAwMjAxMDEwMjEyMjY2NzAwMTZDT00uTk9CVUJBTksuV1dXMDExO",
"mchFeeAmount": 200,
"mchOrderNo": "TX00001210200",
"mobileNumber": "0811223344",
"payOrderId": "P1632994407934148609",
"qrCode": "00020101021226680016COM.NOBUBANK.WWW011993600503000000309000214082200000002450303UBE51440014ID.CO.QRISWWW0215ID20190822000010303UBE520454995303360540450005502015802ID5925GAJAHPAY ID, JAKARTA610515811625301140822000022963305031230617201908221840560010703A0163042904",
"state": 1,
"viewName": "jony"
},
"msg": "SUCCESS",
"sign": "25EA605C497808F282D228F11C4D4BDF"
}
Request
Parameter | Required | Type | Description |
---|---|---|---|
userName | true | string | user's name |
phone | true | string | Customer mobile number, prefix 08 e.g (0811223344) |
amount | true | long | Amount your user must paid to complete the transaction |
mchOrderNo | true | string | merchant trx id must be unique |
subject | true | string | product description |
wayCode | true | string | Artha Remit Code product, for qris use qris |
displayName | true | string | Customizable VA display name that will be seen by user |
expiredTime | true | int | Transaction expiration time in minutes, e.g If Transaction want to be expired after 5 minutes, you just have to set expired_on to 5. |
notifyUrl | true | string | url that will receive payment success/fail notification. see callback |
redirectUrl | true | string | for qris this feature disable |
commonParameter | - | - | see Request Common Parameters |
Response
Parameter | Required | Type | Description |
---|---|---|---|
data.mchFeeAmount | true | long | the fee we provide |
data.mchOrderNo | true | string | trx id from merchant |
data.payOrderId | true | string | id transaction from us |
data.mobileNumber | true | string | number phone enduser |
data.checkoutUrl | true | string | Checkout URL passed from the e-wallet issuers to be used for payment purposes |
data.imageUrl | true | string | Url Image QR National Dynamic Data |
data.qrCode | true | string | QR National Dynamic Data |
data.viewName | true | string | Customizable display name that will be seen by user |
data.state | true | int | QRIS state, see state detail |
Callback
Once the request is opened, our system will generate a request callback status to open the system to your system and will send it according to the notifyUrl
the callback use json-encoded POST request
Payorder callback
the callback contains Virtual Account, Credit Card Link
Parameter | Required | Type | Description |
---|---|---|---|
mchNo | true | string | mchNo |
appId | true | string | appId |
payOrderId | true | string | id transaction from us |
amount | true | long | Amount your user must paid to complete the transaction |
mchOrderNo | true | string | merchant trx id must be unique |
wayCode | true | string | wayCode |
reqTime | true | long | (s)the time of push callback into notify task |
createdAt | true | long | (ms) create time of order |
state | true | int | payment state, see state detail |
sign | true | sign for notify data. see how to compute sign here |
Transfer callback
Parameter | Required | Type | Description |
---|---|---|---|
mchNo | true | string | mchNo |
appId | true | string | appId |
transferId | true | string | id transaction from us |
amount | true | long | Amount your user must paid to complete the transaction |
mchOrderNo | true | string | merchant trx id must be unique |
entryType | true | string | entryType |
reqTime | true | long | (s)the time of push callback into notify task |
createdAt | true | long | (ms)create time of order |
successTime | true | long | (ms)transaction success time |
state | true | int | payment state, see state detail |
sign | true | sign for notify data. see how to compute sign here |
Status Transaction
Status | State | Description |
---|---|---|
0 | NON-FINAL | Transaction is pending (Processed / Unpaid) |
1 | FINAL | Transaction is completed (Success / Paid) |
2 | FINAL | Transaction is failed |
6 | FINAL | Transaction is expired |
Error Response Code
code | Description |
---|---|
0 | SUCCESS |
10 | System error |
11 | Parameter error |
12 | Server error |
100 | Paramter value error |
101 | App error |
102 | Sign error |
900 | Inquiry process is complete but the account number is invalid or maybe a virtual account number |
901 | Bank account have been suspected on doing fraud. You still can do a disbursement to this account |
902 | Bank account have been confirmed on doing a fraud and therefore is blacklisted. You can’t do a disbursment to this account. |
903 | The inquiry process is complete and the account is valid, but it is closed/inactive so that it cannot receive money. You cannot do a disbursement to this account. |
1001 | Available balance is insufficient |
1002 | Submit fail, Explicitly indicate failure |
1003 | Logic error |
others | others error |