数字货币代付下单
- 数字货币交易支持币种:(USDT/BTC/ETH/TRX),如果您想使用数字货币交易,请设置 orderType=1,并传入对应的货币币种 Currenecy 和网络 netWork。
- 使用数字货币进行交易时,币种和链网络是必传项,您需要告诉我们您想使用何种数字货币和链网络 (TRC20/BEP20/OMNI/ERC20/TRX) 进行交易。
- 使用数字货币进行交易时,您需要传入您的 inAddress 用以收取数字货币。
# 代码示例
- 代码示例仅供参考,具体参数说明请参考请求参数说明
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import java.util.Map;
import java.util.TreeMap;
public class TopPayDemo {
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 cashUrl = "https://id-openapi.toppay.asia/gateway/cash";
private static final String cashNotify = "http://host:port/notify";
public static void main(String[] args) throws Exception {
cash();
}
private static void cash() throws Exception {
Map<String, String> requestParams = new TreeMap<>();
requestParams.put("merchantCode", MCH_ID);
requestParams.put("orderNum", "186888188666"); // 商户订单号
requestParams.put("method", "USDT"); // 收款方式(USDT/BTC/ETH/TRX)
requestParams.put("orderType", "1"); // 订单类型(1-数字货币交易)
requestParams.put("money", "1.000001"); // 订单金额,最大支持6位小数
requestParams.put("feeType", "1"); // 手续费类型(0:代付金额内扣除,1:手续费另计)
requestParams.put("dateTime", "20200101235959"); // 时间戳 格式 yyyyMMddHHmmss
requestParams.put("name", "test cash name"); // 客户名称
requestParams.put("mobile", "082122965511"); // 客户手机号
requestParams.put("email", "[email protected]"); // 客户邮箱
requestParams.put("description", "test cash"); // 描述
requestParams.put("notifyUrl", cashNotify); // 回调地址
requestParams.put("currency", "USDT"); // 数字货币币种(必填项,否则会无法完成交易)
requestParams.put("netWork", "TRC20"); // 链网络(必填项,否则无法完成交易)
requestParams.put("inAddress", "zkif74bhvkf8934rgg6"); // 入账地址(必填项,否则无法完成交易)
StringBuilder stringBuilder = new StringBuilder();
for (String key : requestParams.keySet()) {
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(cashUrl, postJson); // 发送 post json请求
System.out.println("Response Msg:" + responseJson);
boolean pass = TopPayRequestUtil.verifySign(new Gson().fromJson(responseJson, JsonObject.class), PLAT_PUBLIC_KEY); // 签名验证
if (pass) {
// ... 签名验证通过,执行正常的业务逻辑
} else {
// ... 签名验证错误
}
}
}
# 请求地址
- 请求方式 : POST
- 请求地址 : https://id-openapi.toppay.asia/gateway/cash
# 请求参数
注:所有的参数中,不要填写中文!!!
参数 | 类型 | 必填 | 描述 | 示例 |
---|---|---|---|---|
merchantCode | String | Y | 商户ID,在商户平台-个人中心-个人信息中获取 | S820211021094748000001 |
orderType | string(10) | Y | 订单类型 | 1-数字货币交易 |
method | string(10) | Y | 收款方式 | USDT BTC ETH TRX |
orderNum | String | Y | 商户订单号 | 186888188666 |
money | String | Y | 代付金额 (最大支持6位小数) 如果feeType选择0的话,因为涉及到手续费,所以麻烦您先以3位小数的金额进行代付下单 | 1.000001 |
feeType | String | Y | 手续费类型 0:代付金额内扣除 1:手续费另计 | 0 |
name | String | Y | 客户名称 | Jack |
mobile | String | Y | 用户手机号码 | 081234567890 |
String | Y | 用户邮箱 | [email protected] | |
notifyUrl | String | Y | 回调地址 | https://***.com |
dateTime | String | Y | 时间戳 (格式:yyyyMMddHHmmss) | 20200101235959 |
currency | string(14) | Y | 数字货币币种 | USDT |
netWork | string(30) | Y | 链网络 | TRC20 |
inAddress | String | Y | 入账地址 | vboj3457vbiae5y35y |
# 请求报文示例
{
"merchantCode": "S820211021094748000001",
"orderType": "1",
"method": "USDT",
"orderNum": "186888188666",
"money": "1.00000001",
"feeType": "1",
"name": "test cash name",
"mobile": "082122965511",
"email": "[email protected]",
"notifyUrl": "your notify url",
"dateTime": "2021-07-12 09:41:00",
"currency": "USDT",
"netWork": "TRC20",
"inAddress": "vboj3457vbiae5y35y",
"sign": "Yg+ePvTFhiRrARcZKBcRG0l89rqisPIuZQStYqBIwSMPaqwH77qRXI1J+jElOBpa"
}
# 响应参数
参数 | 类型 | 描述 | 示例 |
---|---|---|---|
platRespCode | String | 请求业务是否成功 | FAIL:失败\SUCCESS:成功 |
platRespMessage | String | 接口响应信息提示 | 请求成功 |
platOrderNum | String | 平台订单号 | PI1453242857400963072 |
status | String | 订单状态 | 查看订单状态描述 |
statusMsg | String | 订单状态信息 | Apply |
orderNum | String | 商户订单号 | 23645782 |
money | String | 代付金额 | 1.00000001 |
fee | String | 手续费金额 | 12.25 |
feeType | String | 手续费类型 0:代付金额内扣除 1:手续费另计 | 0 |
name | String | 客户名称 | Jack |
currency | String | 数字货币币种 | USDT |
netWork | String | 链网络 | TRC20 |
platSign | String | 签名 | PI1453242857400963072 |
# 响应报文示例
{
"platRespCode": "SUCCESS",
"platRespMessage": "Request success",
"platOrderNum": "W0620220119174331000001",
"orderNum": "186888188666",
"status": "0",
"statusMsg": "Apply",
"money": "50000",
"fee": "7",
"feeType": "1",
"currency": "USDT",
"netWork": "TRC20",
"platSign": "E5uNF7B9NXyhtlRo2I7/KVHN4Sbz0c3VbwCLpH3vjUpv6Cai+bmJA/Q8dVE2RJRe1+dsbzg=="
}
# 代付异步通知
- 进行验签时,要用 商户后台-收付款配置-API配置 中提供的平台公钥进行解密!!!
- 进行验签时,以实际回调的参数为准,不要验签固定的参数。
- 订单的最终状态以通知的 status 为准!!!
- 接收到结果异步通知后,需响应 SUCCESS 字符串,不包含引号,不是 Json 格式。否则 TopPay 将继续向下游发起5次通知。
# 通知参数
参数 | 描述 | 示例 |
---|---|---|
platOrderNum | 平台订单号 | BK_1563278763273 |
orderNum | 商户订单号 | T1231511321515 |
money | 代付金额 | 1.00000001 |
feeType | 手续费类型 0:代付金额内扣除 1:手续费另计 | 1 |
fee | 手续费 | 500 |
name | 客户名称 | Neo |
status | 订单状态 | 查看订单状态描述 |
statusMsg | 订单状态描述 | Payout Success |
hashCode | 交易哈希 | 5e5c356af0ewrhgnf3d757h8a6a5506cc66354620 |
inAddress | 接收地址 | TDBbbeAB32WE576DVGE82GEC5BhsZs4 |
sendAddress | 发送地址 | TDBbbeAB32WE576DVGE82GEC5BhsZs4 |
platSign | 平台签名 | ja6R8eukQY9jc8... |
# 异步通知报文示例
{
"platOrderNum": "W0620220119174331000001",
"orderNum": "186888188666",
"money": "1.00000001",
"fee": "0.0001",
"feeType": "1",
"currency": "USDT",
"netWork": "TRC20",
"name": "test cash name",
"status": "2",
"statusMsg": "SUCCESS",
"hashCode": "5e5c356af0ewrhgnf3d757h8a6a5506cc66354620",
"inAddress": "Twrgtehsd576gsdre876d2545C5Br23324",
"sendAddress": "TDBbbeAB32WE576DVGE82GEC5BhsZs4",
"platSign": "LGEpz2LjbZ6Iyvn+zLc/+t26AaH0aEhHVD62lSCdo6XIkAg86AUncCvmym62wVoE3r2+dHnv27qi/01UQDcqFK8DYioRCcydYSjB4QRVezG3fcZlhWrACmWGacnXkE7p5zChL7pK5h0HuBhbo1zKt4FunQR6QMmcBVfv7YfB3W0"
}