The Document of Indonesia
About 2549 wordsAbout 9 min
1:XwinPay developer documentation
1.1:Http Request
- Http Method : POST
- Content type : application/json
- Sandbox Environment Payment Gateway End Points:https://uat-trade.xwinpay.tech
- Production Environment Payment Gateway End Points:https://trade.xwinpay.tech
- Request URL:Payment Gateway + Resource path
- Note: If there is business logic associated processing, please use the code field. Name, message and other fields may change at any time.
1.2:After Create The Account (Http Request Need)
- merchantNo(also the http header : X-MERCHANT-CODE):123456
- merchantName: XwinPay8848
- Merchant private key (For Request XwinPay ) :MIICdQIBADANBgkqhkiG9w0B********qqLS
- Merchant public key (XwinPay Verify The Merchant Request):MIGIb3DQEBAQUAGNAD*****QAB
- Platform public key (Merchant Verify The XwinPay WebHook):MIGfMA0GCSqG3DEBAQ*****QAB
- apikey(also the http header : X-API-KEY):74918b3925ccd0******27478087
1.3:Http Header
Params Key | required | Type | description |
---|---|---|---|
X-MERCHANT-CODE | yes | Http Header (String) | merchantNo |
X-API-KEY | yes | Http Header (String) | apikey |
1.4:Common Request Http Body
{
"param": {
"accountNumber": "",
"amount": 50000,
"app": "NICE",
****,
****,
****,
},
"sign": "SQiqFRTmBn0***4Yz8iUCdeyWi/JObp9mXzXfNCQ+zbOCQ="
}
Params Key | required | Type | description |
---|---|---|---|
param | yes | Object | Business Payload |
sign | yes | String | After encryp String |
1.5:Common Reponse Http Body
{
"code": 200,
"message": "操作成功",
"data": {
"merchantNo": "58256833",
"merchantOrderNo": "5825683320230508569",
****,
****,
****
}
}
Params Key | required | Type | description |
---|---|---|---|
code | yes | Integer | Interface Status(200: Success) |
message | yes | String | message |
data | yes | Object | Business data |
1.6:Error Code
code | description |
---|---|
200 | Request successful"), |
415 | parameter passing exception |
500 | Please contact technical support for business exceptions. |
4001 | Merchant code cannot be empty |
4002 | Merchant does not exist |
4003 | Merchant APIKEY is incorrect |
4004 | Merchant APIKEY cannot be empty |
4005 | The sign signature cannot be empty. |
4006 | Sign Failure |
4007 | The current merchant does not have this type of currency account |
4008 | The current merchant balance is insufficient and the payment on behalf of the merchant has failed! |
40081 | There is an outstanding escrow order on the account! |
40082 | Payment on behalf of an order creation exception! |
40083 | Payment on behalf of an order rate calculation anomaly! |
4009 | Duplicate Merchant Order Number |
4010 | Merchant order number not passed |
4011 | Missing parameter error |
4012 | Merchant order does not exist |
4013 | Current order parameter validation error |
4014 | channel request param error |
4015 | No permission to pay for products, please contact the administrator |
4016 | Merchant fee calculation method is wrong |
4017 | amount in excess of limit |
4018 | bank request param error |
4019 | ewallet request param error |
4020 | Abnormal rate setting |
4021 | The bank has suspended use, please contact the administrator. |
4022 | param error" |
4023 | reached daily transaction count limit |
4024 | transaction must between %d and %d" |
4025 | The daily transaction volume has reached %d" |
5001 | The payment channel is temporarily unavailable, please try again later. |
5002 | Order data does not exist |
5003 | Unknown handling fee calculation method |
5004 | Not getting the fee calculation method |
5006 | Payment request is abnormal, please check the parameters |
5007 | Payment product is not configured |
5008 | Payment exception |
50071 | The merchant has not configured payment products |
40084 | Abnormal data in access channel for payment orders |
40085 | Pipeline write exception |
1.7:Order Status
参数名 | 说明 |
---|---|
PENDING | pending |
COMPLETED | payment completed |
FAILED | payment failed |
1.8:The Method For Get Sign String
SHA256WithRSAUtils signature verification method. After sorting the keys of all non-empty parameters according to ASCII, take the parameter values (excluding Key) and splice them, and then use the SHA256WithRSAUtils algorithm to calculate the string to calculate the signature string.
for example
String sign = SHA256WithRSAUtils.encryptByPrivateKey(SignUtils.getSign(payLoad), privateKey);
1.9:demo
Params Key | Type |
---|---|
merchantCode | S820211021094748000001 |
orderNum | T1642592278863 |
payMoney | 150.6 |
notifyUrl | your notify ur |
dateTime | 2022/1/1 10:55 |
expiryPeriod | 1440 |
1.10:The Describe For Get Signed string
sorting the keys of all non-empty parameters according to ASCII
StrA = 2022-01-01 10:55:[email protected] notify urlT1642593166888150.60082122965511Test Pay
1.11:Amount Limit
trans type | limit (Unit:IDR) |
---|---|
payin | qris: 10,000-5000,000 va: 10,000-200,000,000 ewallet:10,000-200,000,000 |
pay out | bank: 10,000-400,000,000 ewallet: 10,000-200,000,000 |
2:JAVA Demo
2.1:SignUtils (Signed string method)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class SignUtils {
public static String getSign(Map<String, Object> map) {
Set<String> keys = map.keySet();
List<String> list = new ArrayList<>(keys);
Collections.sort(list);
StringBuilder sb = new StringBuilder();
for (String key : list) {
Object val = map.get(key);
if (!("".equals(val) || val == null || "sign".equals(key))) {
sb.append(val);
}
}
return sb.toString();
}
}
2.2:SHA256WithRSA
package com.example.eventdemo;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
* SHA256WithRSA
* Base64 Use apache tools, maven https://mvnrepository.com/artifact/commons-codec/commons-codec
*/
public class SHA256WithRSAUtils {
/**
* RSA
*/
public static final String ALGORITHM_RSA = "RSA";
private SHA256WithRSAUtils() {
}
/**
* get private key
*
* @param privateKey Key string (base64 encoded)
*/
public static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
//通过PKCS#8编码的Key指令获得私钥对象
KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_RSA);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
return (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);
}
/**
* get public key
*
* @param publicKey Key string (base64 encoded)
*/
public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_RSA);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));
return (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);
}
/**
* RSA algorithm public key decrypts data
*
* @param data Base64-encoded ciphertext string to be decrypted
* @param key RSA public key string
* @return Plain text string decrypted by RSA public key
*/
public static String decryptByPublicKey(String data, String key) {
try {
RSAPublicKey publicKey = getPublicKey(key);
Cipher cipher = Cipher.getInstance(ALGORITHM_RSA);
cipher.init(Cipher.DECRYPT_MODE, publicKey);
return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), publicKey.getModulus().bitLength()), StandardCharsets.UTF_8);
} catch (Exception e) {
throw new RuntimeException("decrypt [" + data + "] error", e);
}
}
/**
* RSA algorithm private key encrypted data
*
* @param data Plain text string to be encrypted
* @param key RSA private key string
* @return Base64-encoded ciphertext string encrypted by RSA private key
*/
public static String encryptByPrivateKey(String data, String key) {
try {
RSAPrivateKey privateKey = getPrivateKey(key);
Cipher cipher = Cipher.getInstance(ALGORITHM_RSA);
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return Base64.encodeBase64String(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(StandardCharsets.UTF_8), privateKey.getModulus().bitLength()));
} catch (Exception e) {
throw new RuntimeException("encrypt [" + data + "] error", e);
}
}
private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, int keySize) throws IOException {
int maxBlock = 0;
if (opmode == Cipher.DECRYPT_MODE) {
maxBlock = keySize / 8;
} else {
maxBlock = keySize / 8 - 11;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] buff;
int i = 0;
try {
while (datas.length > offSet) {
if (datas.length - offSet > maxBlock) {
buff = cipher.doFinal(datas, offSet, maxBlock);
} else {
buff = cipher.doFinal(datas, offSet, datas.length - offSet);
}
out.write(buff, 0, buff.length);
i++;
offSet = i * maxBlock;
}
} catch (Exception e) {
throw new RuntimeException("encrypt [" + maxBlock + "] error", e);
}
byte[] resultDatas = out.toByteArray();
out.close();
return resultDatas;
}
}
2.3:test demo
/**
* test
*
* @param args
*/
public static void main(String[] args) {
String privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANkyOMTXOBCWBy3Ps39b/rymWWFqujOPxpdp1IAVlk8PuTxWBBscFIHLVAXdf9sCqAw+Wm89RSGDzky6TVIgRXSo6+6hk3ZSIMnu53f9cZlL2G/3+b4BRP3lKsP7nVTTwAEOH1uiJFlJbcCaRuRpGyQJ0mNg/HbCTIWxdKyelBXPAgMBAAECgYAB/eTpYTPhaw7Ly8DQpS5T2o6tRwZIHMRsdQr+1bPYK8O+GufUu9AwVIYDu8FFZ+PUoOnBZWVx5jyJFZhJ7YPVhrZSE4XqMqrtJqIER7m0VDejDSKcKIm6pnmdZHlIvQqkhoCdaCI9kFYgmS0x82SrlMqBpsA9qkSYrRJMZdDv2QJBAPiqjtR5LmfHtrgWE8JezcQqq6IQGQXzGTY73PpuBdIuRAPIvE3b8zuccyUPdozwNzxWEY429aw/XnkZQImZCHsCQQDfmhA2vmSh4eJqtpfhoQqa3IH7wQ20O6nQeIr10lwScfnj8UiKh5GuiOrus8EY0KIQUtA5DAks8RBcJfpNfYm9AkEA9n37P1swSOeLlEcuJwpa5g12PRu/8knbwArvLb9KPeJmwWmGX5ecMIcRDLebSHIGDuUyWcrZFHlsaJZDhyIPaQJBAIgxoNqXUVhA69Yv7YbivkDhOtMLHbu/84klQw7D2Izrm1e5qYOnW5bBksdd+amRuoTSzD1TFWuoUVyvTSxR4MkCQAgTzQAytBOYITp/Ks+0KOrsDPP7KquBDLKNLttayW+0L+ZLJyZvLCpY9Rj1T8lElUD2O16NBp8SafLz7XYEgLk=";
String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZMjjE1zgQlgctz7N/W/68pllharozj8aXadSAFZZPD7k8VgQbHBSBy1QF3X/bAqgMPlpvPUUhg85Muk1SIEV0qOvuoZN2UiDJ7ud3/XGZS9hv9/m+AUT95SrD+51U08ABDh9boiRZSW3AmkbkaRskCdJjYPx2wkyFsXSsnpQVzwIDAQAB";
Map<String, Object> param = new HashMap<>();
param.put("merOrderNo", "123456");
param.put("amount", 100);
String sign = SignUtils.getSign(param);
// sign = 100123456
System.out.println("sign = " + sign);
String encryptData = SHA256WithRSAUtils.encryptByPrivateKey(sign, privateKey);
String decryptData = SHA256WithRSAUtils.decryptByPublicKey(encryptData, publicKey);
//encrypt:bg2Q3dZY0Tv9ycQUMGKVOL7rR1sRZCUk5EnkYeOCpKaCgg1E/NRM9njtNEW5205/BABW6PHnLX9tmNR+C7n9Aj4edsXdCr1uOdgSgaki+4M/Kh2Z3vO+PrYJxBRZjolV+ue51RUqlxYQXcKrygj74QLCLsFRKzk4V2qcHVhs8e4=
System.out.println("encrypt:" + encryptData);
//decrypt:100123456
System.out.println("decrypt:" + decryptData);
//Verify Sign:true
System.out.println("Verify Sign:" + sign.equals(decryptData));
}
2:Python Demo (In progress)
2:C## Demo (In progress)
3:Account Balance
Resource path :/common/openapi/account/balance
Payload:
Params Key | required | value |
---|---|---|
country | yes | IDN |
currency | yes | IDR |
request
{
"param": {
"country": "IDN",
"currency": "IDR",
},
"sign": "Gw6D0kuWlnngLMiSxQQ2Dz2ciZz4LUZ7gWA8dRkEbcsE+UoiTOy6T3g6vNvGUlz+vPV2aRHKZ6aPBh0PaJkWW36T/lf8qId4D9uh8lFeTe7zW0+hTgTnN9YmruA6rlRNCo9QytbMRk6qkEZh1PZ2NrFnC77FhYVEVdOk6bIOv/vnGo1RVpbmsO+Gw+tPnvkQ1jvVDEHUlKgnAFGYa7+oWw8eClh9T4Ob7ZUPI0Z+dhefAmEX+z8DCyUxZrtbgA0li21KW2TmErIiRJQxep/f4quWRoTKkPziiMefKo1jFgbyL/gVzgkp91YaMMyk1QJKW1UoZ8iqHKNMI6pmvBCk8g=="
}
response
{
"code": 200,
"message": "",
"data": {
"merId": "",
"merName": "",
"currency": "",
"amountTotal": "0.00",
"freeAmount": "1085178690.00",
"unrecordedAmount": "0.00",
"freezeAmount": "1085178690.00",
"frzBal": "0.00"
}
}
response data
Params Key | Type | description |
---|---|---|
merId | string | merchant no |
merName | string | merchant name |
currency | string | PHP |
amountTotal | BigDecimal | total balance |
freeAmount | BigDecimal | available amount |
unrecordedAmount | BigDecimal | Amount in transit |
freezeAmount | BigDecimal | frozen amount |
4:PayOut
4.1:payout apply
Resource path:/idn/openapi/disburse
Payload:
Params Key | required | Type | description |
---|---|---|---|
accountName | no | string | Required when channelCode is bank |
accountNumber | yes | string | |
amount | yes | number | The payment amount is required and supports two decimal places (unit yuan) (No 0 after the decimal point, for example: transmission of 123.40 is prohibited, should be transmitted: 123.4) |
app | no | string | Application Name |
bankCode | no | string | Bank Code |
channelCode | yes | string | Channel Code |
currency | no | string | IDN |
merchantOrderNo | yes | string | Merchant order id, format: letters + numbers, 1-32 digits |
notifyUrl | yes | strin | WebHook Url, Notify merchant when order is successful or failed |
timestamp | yes | integer | current Time Millis |
request
{
"param": {
"accountNumber": "62817345545",
"amount": 20000,
"channelCode": "dana",
"merchantOrderNo": "2443806920230508574",
"notifyUrl": "http://www.",
"timestamp": 1684591961
},
"sign": "111"
}
response
{
"code": 200,
"message": "操作成功",
"data": {
"merchantNo": "24438069",
"merchantOrderNo": "2443806920230508574",
"plaOrderNo": "1223050832685691405",
"channelCode": "dana",
"bankCode": null,
"bankName": null,
"accountNumber": "62817345545",
"accountName": "",
"amount": "20000",
"status": "PENDING"
}
}
response data
Params Key | Type | description |
---|---|---|
accountName | string | |
accountNumber | string | |
amount | string | |
bankCode | string | |
bankName | string | |
channelCode | string | |
merchantNo | string | |
merchantOrderNo | string | |
plaOrderNo | long | |
status | string | order status('PENDING','COMPLETED','FAILED') |
4.2:Bank Code(payout)
https://docs.google.com/spreadsheets/d/1pONmLSq5_R9LUkd1x78s7PPUKC5fdtod
4.3:Channel Code(payout)
channelCode | channelName |
---|---|
bank | bank |
dana | dana wallet |
ovo | ovo wallet |
gopay | gopay wallet |
linkaja | linkaja wallet |
5:PayIn
5.0:The video for PayIn
1.dana wallet: https://drive.google.com/file/d/16i8brpAiDeyO83upU89gIkOh2D89aLPD/view
2.QRIS: https://drive.google.com/file/d/1qs17QTE7JTHdmZi-Bk2mM1Y1FuKZKVe4/view
3.VA : https://drive.google.com/file/d/1k5z3N4q9bQTY9v-72uJ--MP9xERiLs7B/view
5.1:payin apply
Note: When the channelCode is ovo, you need to call the ovo binding status query interface first. Only after it is bound can you initiate an order. Use the 5.3-5.5 interface.
Resource path:/idn/openapi/payment
Params:
Params Key | required | Type | description |
---|---|---|---|
accountNumber | no | string | Trading account number (required when channelCode is ovo) |
amount | yes | number | |
app | no | string | Application Name |
bankCode | no | string | Bank Code (Required when channelCode is va_dynamic) |
channelCode | yes | string | Channel Code |
currency | no | string | IDN |
merchantOrderNo | yes | string | Merchant order id, format: letters + numbers, 1-32 digits |
notifyUrl | yes | string | WebHook Url, Notify merchant when order is successful or failed |
redirectUrl | no | string | callback url when the Payer’s pay success |
timestamp | yes | integer | current Time Millis |
request
{
"param": {
"accountNumber": "",
"amount": 10000,
"app": "",
"bankCode": "014",
"channelCode": "va_dynamic",
"currency": "",
"merchantOrderNo": "2443806920230526256",
"notifyUrl": "http://",
"redirectUrl": "http://",
"timestamp": 0
},
"sign": "111"
}
response
{
"code": 200,
"message": "操作成功",
"data": {
"merchantNo": "24438069",
"merchantOrderNo": "2443806920230526256",
"plaOrderNo": "11230052651992093247",
"channelCode": "va_dynamic",
"bankCode": "014",
"bankName": "BCA",
"accountNumber": "",
"amount": "10000",
"status": "PENDING",
"vaNumber": "107182305262100001",
"payUrl": null,
"qrCode": null
}
}
response data
Params Key | Type | description |
---|---|---|
accountNumber | string | |
amount | string | |
bankCode | string | Bank code (valid when channelCode is va_dynamic) |
bankName | string | Bank name (valid when channelCode is va_dynamic) |
channelCode | string | Channel Code |
merchantNo | string | |
merchantOrderNo | string | |
payUrl | string | Payment link (channelCode is ovo, dana has a value) |
plaOrderNo | long | |
status | string | order status ('PENDING','COMPLETED','FAILED') |
vaNumber | string | Bank va number (valid when channelCode is va_dynamic) |
qrCode | string | qris QR code content |
5.2:payin apply-H5
Resource path:/idn/openapi/paymentH5
Params:
Params Key | required | Type | description |
---|---|---|---|
amount | yes | number | The payment amount is required and supports two decimal places (unit yuan) (No 0 after the decimal point, for example: transmission of 123.40 is prohibited, should be transmitted: 123.4) |
app | no | string | Application Name |
currency | no | string | IDN |
merchantOrderNo | yes | string | |
notifyUrl | yes | string | WebHook Url, Notify merchant when order is successful or failed |
redirectUrl | no | string | callback url when the Payer’s pay success |
timestamp | yes | integer | current Time Millis |
request
{
"param": {
"amount": 10000,
"app": "",
"currency": "",
"merchantOrderNo": "2443806920230526256",
"notifyUrl": "http://",
"redirectUrl": "http://",
"timestamp": 0
},
"sign": "111"
}
response
{
"code": 200,
"message": "操作成功",
"data": {
"merchantNo": "24438069",
"merchantOrderNo": "2443806920230526256",
"plaOrderNo": "11230052651992093247",
"amount": "10000",
"status": "PENDING",
"payUrl": null
}
}
response data
Params Key | Type | description |
---|---|---|
amount | string | |
merchantNo | string | |
merchantOrderNo | string | |
payUrl | string | Payment link (channelCode is ovo, dana has a value) |
plaOrderNo | long | |
status | string | order status ('PENDING','COMPLETED','FAILED') |
5.3:ovo account binding status query
Resource path:/idn/openapi/ovo/lookupAccount
Params:
Params Key | required | Type | description |
---|---|---|---|
accountNumber | yes | string | ovo account |
request
{
"param": {
"accountNumber": "082213317778"
},
"sign": "JeHzXCUXzUQye+W+hdzBVOVdfyreZkZ0Wpo48cUhM0K+G2n3dy+T69s+AxhYow1z3nG8M1QFMDqmJCmJkQVxRGmjSYBp9LLyS2b+LOnCOj9SSh6qOYkN9IX6dWcWU3byo1BTdIzt33gKw/RczObnb4k9bvirDEBsNXFDIzw1oLc="
}
response
{
"code": 0,
"data": {
"accountNumber": "",
"link": "",
"status": ""
},
"message": ""
}
response data
Params Key | Type | description |
---|---|---|
accountNumber | string | ovo account |
link | string | Action link |
status | string | open=Bindable recorded=Bound processing=Binding unusable=unavailable |
5.4:ovo account binding
Resource path:/idn/openapi/ovo/bindAccount
Params:
Params Key | required | Type | description |
---|---|---|---|
accountNumber | yes | string | ovo account |
redirectUrl | yes | string | Action link |
request
{
"param": {
"accountNumber": "",
"redirectUrl": ""
},
"sign": ""
}
response
{
"code": 0,
"data": {
"accountNumber": "",
"link": "",
"status": ""
},
"message": ""
}
response data
Params Key | Type | description |
---|---|---|
accountNumber | string | ovo account |
link | string | Action link |
status | string | open=Bindable recorded=Bound processing=Binding unusable=unavailable |
5.5:Unbind ovo account
Resource path:/idn/openapi/ovo/unbindAccount
Params:
Params Key | required | Type | description |
---|---|---|---|
accountNumber | yes | string | ovo account |
redirectUrl | yes | string | Action link |
request
{
"param": {
"accountNumber": "",
"redirectUrl": ""
},
"sign": ""
}
response
{
"code": 0,
"data": {
"accountNumber": "",
"link": "",
"status": ""
},
"message": ""
}
response data
Params Key | Type | description |
---|---|---|
accountNumber | string | ovo account |
link | string | Action link |
status | string | open=Bindable recorded=Bound processing=Binding unusable=unavailable |
5.6:Channel Code(payin)
channelCode | channelName |
---|---|
va_dynamic | bank va |
dana | dana ewallet |
ovo | ovo ewallet |
qris | qris |
5.7:Bank Code(payin)
bankCode | bankName |
---|---|
014 | BCA |
011 | DANAMON |
013 | PERMATA |
008 | MANDIRI |
002 | BRI |
009 | BNI |
6:Order Status
Resource path:/vnm/openapi/orderStatus
Params:
Params Key | required | Type |
---|---|---|
plaOrderNo | yes | String |
request
{
"param": {
"plaOrderNo": "1223050839733260230"
},
"sign": "111"
}
response — order success
{
"code": 200,
"message": "Success",
"data": {
"merchantNo": "58256833",
"merchantOrderNo": "5825683320230508569",
"plaOrderNo": "1223050839733260230",
"channelCode": "bank_transfer",
"status": "COMPLETED",
"amount": "50000",
"fee": "600",
"merchantPayTime": "2023-05-08 11:13:21",
"plaStatusTime": "2023-05-08 11:13:41"
}
}
response data
Params Key | Type |
---|---|
amount | string |
channelCode | string |
fee | string |
merchantNo | string |
merchantOrderNo | string |
merchantPayTime | string |
plaOrderNo | long |
plaStatusTime | string |
status | string |
7:WebHook
URL: When the system transaction is completed or the balance is insufficient, a callback will be sent to the notify_url callback notification address.
Response Body: After accepting the request, please return the "success" string to us
Request Method:
- method: POST
- Content Type: application/json
body Params:
Params Key | Type | description |
---|---|---|
amount | string | |
fee | string | |
merchantNo | string | |
merchantOrderNo | string | |
merchantPayTime | string | |
plaOrderNo | long | |
plaStatusTime | string | Platform order status change time |
status | string | order status |
errorCode | string | Error code (valid when status is FAILED) |
errorMessage | string | Error message (valid when status is FAILED) |
sign | string | The signature is verified using the platform public key (get the data in the request body,) |
request
{
"merchantNo": "24438069",
"merchantOrderNo": "2443806920230508574",
"plaOrderNo": "1223050832685691405",
"status": "COMPLETED",
"amount": "20000",
"merchantPayTime": "2023-05-08 15:08:41",
"plaStatusTime": "2023-05-08 15:08:42",
"fee": "700",
"sign": "bXE1dI7TrjmRvIGrcfgBqMKhSCsTAtvtoZBd4GIl6NQOqd/8qGudTmX3WJn37NX+v8ehaSGUNSa+4ocAzWQlNQMqJ/OH2Hd+mViXjR2+6n3q4WsvHTzoDGR0VT85jT2cjR421RnnzaC/eLy/02Zx/j7y2snodVnzi6L3RfiY2gM="
}