法币(卢比)代付下单
# 代码示例
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.Map;
public class LoanOrderCreate {
//MCH_ID: 商户ID
//请登录商户后台,点击 个人中心 > 个人信息 在基本信息中获取商户ID
private static final String MCH_ID = "S820211021094748000001";
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 REQ_URL = "https://india-openapi.toppay.asia/cash/newOrder";
public static void main(String[] args) throws Exception {
create();
}
private static void create() throws Exception {
//根据接口要求组装参数
Map<String, String> requestParams = new HashMap<>();
requestParams.put("merchantCode", MCH_ID);
requestParams.put("orderNum", "T1642593166888");
//bankCode是代付需要的分行号编码 不是写死的,要客户手动填入!!!
requestParams.put("bankCode", "001");
requestParams.put("bankAccount", "2021071209403321313122");
requestParams.put("bankUsername", "test-name");
requestParams.put("orderAmount", "999.56");
requestParams.put("callback", "https://xxx/yyy");
requestParams.put("timestamp", "1745377181");
//参数格式化并计算签名 并将签名值加入到请求参数中
String source = TopPaySignUtil.paramFormat(requestParams);
requestParams.put("sign", TopPaySignUtil.sign(MCH_PRIVATE_KEY, source));
//参数序列化成Json 并发起post请求
String postJson = new Gson().toJson(requestParams);
System.out.println("Post Json Params:" + postJson);
String responseJson = TopPaySignUtil.doPost(REQ_URL, postJson);
System.out.println("Response Msg:" + responseJson);
}
}
# 请求地址
- 请求方式 : POST
- 请求地址 : https://india-openapi.toppay.asia/cash/newOrder
# 请求参数
注:所有的参数中,不要填写中文!!! 注:bankCode不是固定值,千万不能写死!!!SBIN0001234 只是案例 注:bankCode就是IFSC,规则是4位大写英文字母和7位数字的组合(前四位必须是大写字母) 注:本接口新增 payType 与 upi 字段,老商户不传时按 payType=1(银行卡代付) 处理,签名规则不变,无需任何改动。
| 参数 | 必填 | 描述 | 示例 |
|---|---|---|---|
| merchantCode | Y | 商户ID,在商户平台获取 | S820211021094748000001 |
| orderNum | Y | 商户订单号 | 10000001 |
| payType | N | 出款类型,不传默认为 1:1 = 银行卡代付2 = UPI 代付 | 1 |
| bankCode | payType=1 时必填 | 银行编号(IFSC),4 位大写字母 + 7 位数字 | SBIN0001234 |
| bankAccount | payType=1 时必填 | 客户银行卡号 | 1234567890 |
| bankUsername | payType=1 时必填 | 客户名称(UPI 代付无需传) | mike |
| upi | payType=2 时必填 | 收款 UPI VPA 地址 | test@ybl |
| orderAmount | Y | 订单金额(单位:1卢比) | 10000.00 |
| callback | Y | 回调地址 | https://123123.com |
| timestamp | Y | 时间戳(秒),取系统实时时间戳 | 1745377181 |
| sign | Y | 签名 | Yg+ePvTFhiRrARcZKBcRG0l8 ... |
签名注意: payType 与 upi 也参与签名。签名规则不变(按 key 字母升序,空值/未传的字段会被自动跳过),因此老商户不传这两个字段时签名串与历史一致,无需迁移。
# 请求报文示例
注:bankCode不是固定值,千万不能写死!!!SBIN0001234 只是案例 注:bankCode就是IFSC,规则是4位大写英文字母和7位数字的组合(前四位必须是大写字母)
# 1. 银行卡代付(payType=1,默认)
推荐写法:显式传 payType=1,更清晰、更规范,也方便后续扩展。
{
"merchantCode": "S820211021094748000001",
"orderNum": "186888188666",
"payType": "1",
"bankCode": "SBIN0001234",
"bankAccount": "2021071209403321313122",
"bankUsername": "test cash name",
"orderAmount": "10000.00",
"callback": "your notify url",
"timestamp": "20220101235959",
"sign": "Yg+ePvTFhiRrARcZKBcRG0l89rqisPIuZQStYqBIwSMPaqwH77qRXI1J+jElOBpa"
}
待签名串示例(按字母升序拼接):
bankAccount=2021071209403321313122&bankCode=SBIN0001234&bankUsername=test cash name&callback=your notify url&merchantCode=S820211021094748000001&orderAmount=10000.00&orderNum=186888188666&payType=1×tamp=20220101235959
向后兼容说明: 老商户原有请求(不传 payType)会被服务端按 payType=1 处理,签名串里也不会出现 payType 字段(空值跳过),与历史签名完全一致,无需任何改动。新接入或希望规范化的商户建议改为显式传 payType=1。
# 2. UPI 代付(payType=2,新增)
⚠ 开通提示:使用 UPI 代付前请先联系您的专属客服开通 UPI 代付通道。未开通通道直接发起 UPI 代付请求会返回失败,开通后即可使用 payType=2 模式下单。
UPI 模式下:必须传 payType=2 和 upi;bankCode / bankAccount / bankUsername 不需要传。
{
"merchantCode": "S820211021094748000001",
"orderNum": "186888188667",
"payType": "2",
"upi": "test@ybl",
"orderAmount": "100.00",
"callback": "your notify url",
"timestamp": "1745377181",
"sign": "Yg+ePvTFhiRrARcZKBcRG0l89rqisPIuZQStYqBIwSMPaqwH77qRXI1J+jElOBpa"
}
待签名串示例(按字母升序拼接,跳过空字段):
callback=your notify url&merchantCode=S820211021094748000001&orderAmount=100.00&orderNum=186888188667&payType=2×tamp=1745377181&upi=test@ybl
# 响应参数
- 外层统一返回结构
| 参数 | 类型 | 必填 | 描述 | 示例 |
|---|---|---|---|---|
| code | int | Y | 接口响应码 | 0代表成功,其他的都为失败 |
| message | String | Y | 接口响应信息 | 返回具体响应信息 |
| data | Json | Y | 接口响应参数 | 参考如下data字段内部结构 |
- data字段内部结构
| 参数 | 类型 | 必填 | 描述 | 示例 |
|---|---|---|---|---|
| platOrderNum | String | Y | 平台订单号 | PI1453242857400963072 |
# 响应报文示例
{
"success": true,
"code": 0,
"message": "Success",
"data": {
"platOrderNum": "PAY1483771634191044608"
}
}
# 白名单不匹配
如果返回: {"code":999,"message":"白名单不匹配","data":null},可以做以下简单排查或联系您的客服:
1,查看您的网络IP是否在菜单:【收付款配置->API配置->商户API提现IP白名单】文本内
2,您的网络IP在白名单内,请检查是否在使用VPN等工具,并关闭后再尝试。
