法币 (泰铢) 代收下单
# 代码示例
- 代码示例仅供参考,具体参数说明请参考请求参数说明
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 {
//MCH_ID: 商户ID
//请登录商户后台,点击 个人中心 > 个人信息 在基本信息中获取商户ID
private static final String MCH_ID = "S820211021094748000001";
private static final String PLAT_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2JoMfFqLsSJjAiCahEnlP3aRj8yCT+WHzR+VvPBTw9S1i7iYWb+MY09CG/HYuHF4+IxshXDJygmndxKf/esuwPybS8mAd//yubHpmZsmBqg1FffT8VH1APa6ZRWASUp4U01ZrbCCp35QA8FuWrJGMJxGx4xk7KUtV2yujxC8noQIDAQAB"; // 平台公钥
private static final String MCH_PRIVATE_KEY = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAJU8gKFKD0luIYx7X8+JRdCIE0UDBctS6LjXxWLEv/EO7jDBTid6zYP1KmNgpd2DAWWtBFBSQ+gcNwVZZSBHJiSDqVvvJVs2FEbeBvfdv4X93+IYRAXksBasSW5Tpdshbo82pVL4V7wuKCuFLk9UxBHbpQjWAbfyF66RmwIbZD71AgMBAAECgYBjPe7UU2nDDSfmQg0++CyjNjqKRC5QPfxhH6w1uF1kMueXKJWOj42n2RutJpJmsj31nY8m0u4xpsG4HvCu/GGSFhhKZCHLvzp41oY2ubYj9nuFNU//81LycQjulWo2y0UUBY0k2piEt+SwPaiUNbT6nMxNMjlnjRe2okp/3rw+KQJBANG3YlZWoVbCEqzy64bJJLxiPsCA5ErGB0NzRGitq44xkhqGtR8ZZQyVz40pruNa58d73O2xyJSy5+fmZGn4E+sCQQC2LBnguj0CSCKub0mPDcunTTz9V79VXBBZdlB1/YGmRUx2s4sQrJNZS7rL4EqBQ3maIRnG+s+AXCSTfsYrV6CfAkEAxugnVfpelhoGepEAgNuggyivmgfl/2Gpm/jk5l/qOjib+ZrQiQmeBPzGWX4yiSM8eMDrP2sC8r5pJFMp5DRONwJBAJ4n4XuSFJ9jgwCPy3vvzSv9SYLk6E6yM9uHdUlKgoGYzk6Lh6M9QFuY/J49plFdBDiEnj16yCU3WeXXfTJpzB8CQQDMNMR/rIOTE9xGybS3mlQbt22AUnO6XhupWcckEKW4nPGxATwYBQzCY3i/9FTGN0vA+9ZPC2cwHtNxI2kXf3Vp"; // 商户私钥
private static final String payUrl = "https://tl-openapi.toppay.asia/gateway/prepaidOrder";
private static final String payNotify = "your notify url";
private static final String cashNotify = "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);
requestParams.put("orderType", "0"); // 订单类型(0-法币(泰铢)交易)
requestParams.put("method", "qrPay"); // 支付方式
requestParams.put("transAccNo", "1234567890"); // 必传.用户付款的卡号,一定要真实卡号,否则会掉单
requestParams.put("orderNum", "T1642592278863"); // 商户订单号
requestParams.put("payMoney", "100.00"); // 订单金额
requestParams.put("notifyUrl", payNotify);// 回调地址
requestParams.put("dateTime", "20220101235959");// 时间戳 格式 yyyyMMddHHmmss
List<String> paramNameList = new ArrayList<>();
for (String key : maps.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); // 发送 post json请求
System.out.println("Response Msg:" + responseJson);
}
}
# 请求地址
- 收银台 (模式1) : 使用收银台链接中展示的支付信息
- 请求方式 : POST
- 请求地址 : https://tl-openapi.toppay.asia/gateway/prepaidOrder
- 直连(非收银台)模式 (模式2) : 直接获取支付信息(适用于有自己收银台页面的商户)
- 请求方式 : POST
- 请求地址 : https://tl-openapi.toppay.asia/gateway/payment
# 请求参数
注:所有的参数中,不要填写中文!!!
- 收银台 (模式1):
参数 | 类型 | 必填 | 描述 | 示例 |
---|---|---|---|---|
merchantCode | string(32) | Y | 商户ID,在商户平台获取 | S820211021094748000001 |
orderType | string(10) | Y | 订单类型 | 0-法币(泰铢)交易 |
method | string(32) | N | 支付方式 | qrPay : 二维码扫码👍 BankTransfer : 网银转账 不传则在收银台页面自选支付方式 |
orderNum | string(32) | Y | 商户订单号 | ASD12312312331 |
transAccNo | string(16) | Y | 付款的真实卡号 必传,否则会掉单 | 1234567890 |
payMoney | string(10) | Y | 付款金额(只允许两位小数位) | 100.00 |
bankCode | String(10) | Y | 付款银行编号 | 001 点击查看支持的银行编码 |
notifyUrl | string(100) | Y | 接收订单交易成功通知的地址 | https://host:port/notifyUrl |
dateTime | string(32) | Y | 时间戳格式:yyyyMMddHHmmss | 20190101235959 |
paymentName | string(64) | Y | 付款人真实名称 | Jerry |
extendParam | string(100) | N | 透传参数(上传的内容会原路返回) | 123 |
sign | string(255) | Y | 签名 | fnbSOvY83pr8hXg+Fd ... |
- 直连(非收银台)模式 (模式2):
参数 | 类型 | 必填 | 描述 | 示例 |
---|---|---|---|---|
merchantCode | string(32) | Y | 商户ID,在商户平台获取 | S820211021094748000001 |
orderType | string(10) | Y | 订单类型 | 0-法币(泰铢)交易 |
method | string(32) | Y | 支付方式 | qrPay : 二维码扫码👍 BankTransfer : 网银转账 |
orderNum | string(32) | Y | 商户订单号 | 10000001 |
payMoney | string(10) | Y | 付款金额(只允许两位小数位) | 100.00 |
notifyUrl | string(100) | Y | 接收订单交易成功通知的地址 | https://host:port/notifyUrl |
dateTime | string(32) | Y | 时间戳格式:yyyyMMddHHmmss | 20190101235959 |
transAccNo | string(16) | Y | 付款的真实卡号 必传,否则会掉单 | 1234567890 |
returnAccName | string(10) | N | 响应参数是否回传收款人姓名 | 传true则需要,不传或传false则不需要 |
paymentName | string(64) | Y | 付款人真实名称 | Jerry |
extendParam | string(100) | N | 透传参数(上传的内容会原路返回) | 123456 |
sign | string(255) | Y | 签名 | fnbSOvY83pr8hXg+Fd ... |
# 请求报文示例
- 收银台 (模式1):(method参数可不传,跳转的页面不一样)
{
"merchantCode": "S820211021094748000001",
"orderType": "0",
"orderNum": "T1642593166888",
"transAccNo": "1234567890",
"payMoney": "100.00",
"method": "qrPay",
"notifyUrl": "your notify url",
"dateTime": "20220101235959",
"paymentName": "Jerry",
"extendParam": "123456",
"sign": "fnbSOvY83pr8hXg+FdNNYi2ubQUGNv/qGYc4TjRl+Xxd1yc9fpkpTx5UQEDTgmhwdCKBkhHVsx2AiQbYDxZ5WBuU1GZeiJ"
}
- 直连(非收银台)模式 (模式2):(method参数必传)
{
"merchantCode": "S820211021094748000001",
"orderType": "0",
"orderNum": "T1642593166888",
"transAccNo": "1234567890",
"payMoney": "100.00",
"method": "BankTransfer",
"notifyUrl": "your notify url",
"dateTime": "20220101235959",
"returnAccName": "false",
"paymentName": "Jerry",
"extendParam": "123456",
"sign": "fnbSOvY83pr8hXg+FdNNYi2ubQUGNv/qGYc4TjRl+Xxd1yc9fpkpTx5UQEDTgmhwdCKBkhHVsx2AiQbYDxZ5WBuU1GZeiJ"
}
# 响应参数
参数 | 类型 | 必填 | 描述 | 示例 |
---|---|---|---|---|
platRespCode | String | Y | 请求业务是否成功 | FAIL:失败\SUCCESS:成功 |
platRespMessage | String | Y | 接口响应信息提示 | Request Transaction Success |
platOrderNum | String | Y | 平台订单号 | PI1453242857400963072 |
payMoney | string | Y | 支付金额 | 100.00 |
orderNum | String | Y | 商户订单号 | 23645782 |
bankName | String | N | 银行名称 | KABNK |
url | String | N | 收银台链接 | 收银台模式(模式1),'platRespCode'为SUCCESS时返回 |
payData | String | N | 响应参数 | 直联模式(模式2),'platRespCode'为SUCCESS时返回 |
custAccName | String | N | 收款人姓名 | 直联模式(模式2),'returnAccName'为true时返回, 为false时不返回 |
paymentName | string(64) | N | 付款人真实名称 | Jerry |
extendParam | string(100) | N | 透传参数(上传的内容会原路返回) | 123 |
# 响应报文示例
- 模式1响应报文示例(url是收银台链接)
{
"platOrderNum": "PRE1483771634191044608",
"payMoney": "100.00",
"orderNum": "T1642593166888",
"platRespCode": "SUCCESS",
"platRespMessage": "Request Transaction Success",
"url": "https://tl-openapi.toppay.asia/gateway/order/PRE1483771634191044608",
"paymentName": "Jerry",
"extendParam": "123456"
}
- 模式2响应报文示例(method=qrPay时,payData 返回的是二维码序列号,method=BankTransfer时,返回的是收款卡号)
{
"payData": "123456789",
"platOrderNum": "PRE1483771634191044608",
"payMoney": "100.00",
"orderNum": "T1642593166888",
"platRespCode": "SUCCESS",
"bankName": "KBANK",
"custAccName": "สวัสดี",
"platRespMessage": "Request Transaction Success",
"paymentName": "Jerry",
"extendParam": "123456"
}
- 失败响应报文示例
{
"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 = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2JoMfFqLsSJjAiCahEnlP3aRj8yCT+WHzR+VvPBTw9S1i7iYWb+MY09CG/HYuHF4+IxshXDJygmndxKf/esuwPybS8mAd//yubHpmZsmBqg1FffT8VH1APa6ZRWASUp4U01ZrbCCp35QA8FuWrJGMJxGx4xk7KUtV2yujxC8noQIDAQAB"; // 平台公钥
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 | 支付方式 | BankTransfer:网银转账 qrPay:二维码扫码 |
status | Y | 支付结果 | 点击查看订单状态描述 |
platOrderNum | Y | 平台订单号 | BK_1563278763273 |
orderNum | Y | 商户订单号 | T1231511321515 |
payMoney | Y | 代收金额 | 100.00 |
payFee | Y | 手续费 | 100.00 |
transAccNo | Y | 付款卡号 | 123456 |
paymentName | N | 付款人真实名称 | Jerry |
extendParam | N | 透传参数(上传的内容会原路返回) | 123 |
platSign | 平台签名 | ja6R8eukQY9jc8zrhtf34654ungj7u8sdgdfjfs |
# 异步通知报文示例
{
"code": "00",
"msg": "SUCCESS",
"status": "SUCCESS",
"method": "BankTransfer",
"platOrderNum": "PRE1483771634191044608",
"orderNum": "T1642593166888",
"payMoney": "100.00",
"payFee": "10.00",
"transAccNo": "*****1236",
"paymentName": "Jerry",
"extendParam": "123456",
"platSign": "ja6R8eukQY9jc8zrhtf34654ungj7u8sdgdfjfs"
}