代收下单
# 代码示例
- 代码示例仅供参考,具体参数说明请参考请求参数说明
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.Map;
import java.util.TreeMap;
public class TopPayDemo {
//请登录商户后台,点击 个人中心 > 个人信息 在基本信息中获取商户ID
private static final String MCH_ID = "S820250514103726000009";
// 平台公钥
private static final String PLAT_PUBLIC_KEY = "MIGfMA0GCSqG.........iDtQIDAQAB";
// 商户私钥
private static final String MCH_PRIVATE_KEY = "MIICeAIBAD9Fz0.......jKTtoWN6j3F1V0bdyvhh";
private static final String payUrl = "https://vnm-openapi.toppay.asia/gateway/prePayIn";
private static final String payNotify = "your notify url";
public static void main(String[] args) throws Exception {
// 代收
pay();
}
private static void pay() throws Exception {
Map<String, String> requestParams = new TreeMap<>();
requestParams.put("merchantCode", MCH_ID);
// 订单类型默认传0
requestParams.put("orderType", "0");
// 支付方式(BANK_QR/MOMO/ZOLA/VN_BANKAPI/VTPAY/BANK_TRANSFER)
requestParams.put("method", "BANK_QR");
// 商户订单号
requestParams.put("orderNum", "T1324657980");
// 订单金额(仅支持正整数格式金额)
requestParams.put("payMoney", "10000");
// 回调地址
requestParams.put("notifyUrl", payNotify);
requestParams.put("dateTime", "20240514102512");// 时间戳 格式 yyyyMMddHHmmss
List<String> paramNameList = new ArrayList<>();
for (String key : requestParams.keySet()) {
paramNameList.add(key);
}
Collections.sort(paramNameList);
StringBuilder stringBuilder = new StringBuilder();
//拼接签名串
for (String key : paramNameList) {
stringBuilder.append(requestParams.get(key));
}
String keyStr = stringBuilder.toString();
System.out.println("keyStr:" + keyStr);
//签名
String signedStr = TopPayRequestUtil.privateEncrypt(keyStr, TopPayRequestUtil.getPrivateKey(MCH_PRIVATE_KEY));
requestParams.put("sign", signedStr);
String postJson = new Gson().toJson(requestParams);
System.out.println("Post Json Params:" + postJson);
String responseJson = TopPayRequestUtil.doPost(payUrl, postJson);
System.out.println("Response Msg:" + responseJson);
}
}
# 请求地址
- 收银台 (模式1) : 使用我们的收银台进行交易
- 请求方式 : POST
- 请求地址 : https://vnm-openapi.toppay.asia/gateway/prePayIn
- 直连模式 (模式2) : 获取支付信息(适用于有自己收银台页面的商户)
- 请求方式 : POST
- 请求地址 : https://vnm-openapi.toppay.asia/gateway/payment
# 请求参数
注:所有的参数中,不要填写中文!!!
- 收银台及直连
| 参数 | 类型 | 必填 | 描述 | 示例 |
|---|---|---|---|---|
| merchantCode | string(32) | Y | 商户ID,在商户平台获取 | S820250514103726000009 |
| orderType | string(10) | Y | 订单类型 | 默认传0 |
| method | string(32) | N | 支付方式, 直连模式必传 | BANK_QR 点击查看支持的支付方式 |
| orderNum | string(32) | Y | 商户订单号 | T1642592278863 |
| payMoney | string(10) | Y | 付款金额(仅允许正整数格式金额) | 10000 |
| notifyUrl | string(100) | Y | 接收订单交易成功通知的地址 | https://host:port/notifyUrl |
| dateTime | string(32) | Y | 时间戳格式:yyyyMMddHHmmss | 20190101235959 |
| extendParam | string(100) | N | 透传参数(上传的内容会原路返回) | test |
| sign | string(255) | Y | 签名 | fnbSOvY83pr8hXg+Fd ... |
# 请求报文示例
{
"merchantCode": "S820250514103726000009",
"orderType": "0",
"orderNum": "T1642593166888",
"payMoney": "10000",
"method": "BANK_QR",
"notifyUrl": "your notify url",
"dateTime": "20250514102565",
"extendParam": "TEST",
"sign": "fnbSOvY83pr8hXg+FdNNYi2ubQUGNv/qGYc4TjRl+Xxd1yc9fpkpTx5UQEDTgmhwdCKBkhHVsx2AiQbYDxZ5WBuU1GZeiJ"
}
# 响应参数
| 参数 | 类型 | 必填 | 描述 | 示例 |
|---|---|---|---|---|
| platRespCode | String | Y | 请求业务是否成功 | FAIL:失败\SUCCESS:成功 |
| platRespMessage | String | Y | 接口响应信息提示 | Request Transaction Success |
| platOrderNum | String | Y | 平台订单号 | PI1453242857400963072 |
| payMoney | string | Y | 支付金额 | 10000 |
| orderNum | String | Y | 商户订单号 | T1234567980 |
| accNo | String | N | 收款人银行卡号 | 12345678 |
| accName | String | N | 收款人姓名 | ZHANG SAN |
| accBankName | String | N | 收款人银行名称 | ACB |
| paymentCode | String | N | 付款备注 | ERD5HGFK |
| method | String | N | 支付方式 | BANK_QR 等 |
| payData | String | N | 响应参数 | 返回收银台二维码数据或支付链接 |
| extendParam | string(100) | N | 透传参数(上传的内容会原路返回) | 123 |
# 响应报文示例
- 模式1响应报文示例
{
"platOrderNum": "P16546513165462132132",
"payMoney": "10000",
"orderNum": "T1642593166888",
"platSign": "TPd72nbjEWPQHKf9KwhUUmFZkM4j2lnEBl0l...",
"platRespCode": "SUCCESS",
"platRespMessage": "Request Transaction Success",
"payData": "https://vnm-openapi.toppay.asia/gateway/order/P16546513165462132132",
"extendParam": "TEST"
}
- 模式2响应报文示例(method=BANK_QR时)
{
"platOrderNum": "PRE1496117742095368264",
"payMoney": "51200",
"paymentCode": "B8DAF293",
"method": "BANK_QR",
"extendParam": "test-extend-param",
"accBankName": "ACB",
"accNo": "000011111",
"accName": "ACC NAME",
"orderNum": "20251015001082223288222221",
"platRespCode": "SUCCESS",
"platRespMessage": "Request Transaction Success",
"payData": "00020101021138520010A000000727012201084489131700069704160208QRIBFTTA54051120062120808B8DAF****"
}
- 失败响应报文示例
{
"platRespCode": "FAIL",
"platRespMessage": "Error message"
}
# 异步通知
- 进行验签时,要用 商户后台-收付款配置-API配置中提供的平台公钥进行解密!!!
- 进行验签时,以实际回调的参数为准,不要验签固定的参数
- 订单的最终状态以通知的status为准!!!
- 接受异步通知后,需响应
SUCCESS字符串,否则TopPay将继续发起5次通知!!!
import com.google.gson.JsonObject;
public class TopPayNotify {
private static final String PLAT_PUBLIC_KEY = "MIGfMA0GCSqG.........iDtQIDAQAB"; // 平台公钥
public static void main(String[] args) throws Exception {
// 代收
JsonObject notifyBody = new jsonObject();
boolean verifyResult = TopPayRequestUtil.verifySign(notifyBody,PLAT_PUBLIC_KEY);
if (verifyResult) {
// ... 签名验证通过,处理正常的业务逻辑
} else {
// ... 签名验证错误
}
}
}
# 通知参数
| 参数 | 必填 | 描述 | 示例 |
|---|---|---|---|
| code | Y | 响应状态 | 00 |
| msg | Y | 响应信息 | SUCCESS |
| method | Y | 支付方式 | BANK_QR / MOMO / ZALO / VTPAY / VN_BANKAPI |
| status | Y | 支付结果 | 点击查看订单状态描述 |
| platOrderNum | Y | 平台订单号 | P16546513165462132132 |
| orderNum | Y | 商户订单号 | T1231511321515 |
| payMoney | Y | 代收金额 | 10000 |
| extendParam | N | 透传参数(上传的内容会原路返回) | TEST |
| platSign | 平台签名 | ja6R8eukQY9jc8zrhtf34654ungj7u8sdgdfjfs |
# 异步通知报文示例
{
"code": "00",
"msg": "SUCCESS",
"status": "SUCCESS",
"method": "BANK_QR",
"platOrderNum": "P16546513165462132132",
"orderNum": "T1642593166888",
"payMoney": "10000",
"extendParam": "TEST",
"platSign": "ja6R8eukQY9jc8zrhtf34654ungj7u8sdgdfjfs"
}