法币代付下单
# 请求地址
POST https://test2-openapi.91fafafa.com/api/payout/india/order/create/v1
# 请求参数
注意:所有的参数中,不要填写中文!!!
参数 | 类型 | 必填 | 描述 | 示例 |
---|---|---|---|---|
appId | string | Y | 商户appId | B2iwKFIM4tvo |
merchantId | string | Y | 商户id | CH10001165 |
mchOrderNo | string | Y | 商户订单号 (长度限制在32位以内) | 20240109021322 |
paymentMethod | string | Y | 支付方式 P2P_UPI; BANK_IN; P2P_BANK_IN; | BANK_IN |
amount | string | Y | 金额 | 900 |
name | string | N | 客户名称 | CheezeePayTest |
phone | string | N | 客户电话 | 9123456789 |
string | Y | 邮箱 填写的越真实,成功率越高, 触发风控系数越低 | [email protected] | |
notifyUrl | string | Y | 通知回调地址 | https://host:port/notifyUrl |
payeeAccountInfos | string | Y | 收款信息json字符串 | {"name":"CheezeePayTest", "accountNumber":"9388881234", "ifscCode":"SBIN0008888", "accountType":"Bank", "bankName":"RBL Bank", "branchName":"branch bank name"} |
language | string | Y | 收银台语言 paymentMode等于BANK_IN 支持en-英语 paymentMode等于P2P_UPI 支持zh_hk-中文;en-英语; indonesia-印尼 | en |
timestamp | long | Y | 提交时间(时间戳:毫秒) | 1704167614000 |
sign | string | Y | 签名 | czZMXl782WIh0e5af53bQ4daed Vwpaq+up3lP/fHk3fCatPlzdDy D/Tg7pqcvBAvbjeXFQgJ/O836k y2ECVFrnZ6dBKCyLf/ftZ2Y+iA MEqe3q1p9zorJ+b6M/jaQpyzJE 82KS994IcGwQe0BVthG1TkP6kw bylSOdgItOL8ivEy6La557QOIq TiVJdMxnmqYg+VwINcf8+QLtfc +/GlTEc7R4KdpqCB7SryaHhg6R xUnnG2Zum2E6/UlabwvpPg6mgl E+LB5ys0kMfptAmOhjnZo6/gKO Y/kjZTZ6LxUzc1kbdfdtVtgGTA eTJ/OPQY2DpI9YfA1L6AM4rDEd bE8A== |
# paymentMethod
为BANK_IN
或P2P_BANK_IN
时payeeAccountInfos
参数说明
参数 | 类型 | 必填 | 描述 | 示例 |
---|---|---|---|---|
name | string | Y | 收款人姓名 | cheezeePayTest |
accountNumber | string | Y | 收款人账户号 | 9388881234 |
ifscCode | string | Y | IFSC 印度ifsc(ifsc必须为11位, 前四位为银行编码, 第五位是0), bankCode为BANK_IN时必传 | SBIN0008888 |
accountType | string | Y | 账户类型,可以默认填写Bank | Bank |
bankName | string | Y | 银行名称 | RBL Bank |
branchName | string | Y | 支行名称 | branch bank name |
# paymentMethod
为P2P_UPI
时payeeAccountInfos
参数说明
参数 | 类型 | 必填 | 描述 | 示例 |
---|---|---|---|---|
name | string | Y | 收款人姓名 | cheezeePayTest |
upiId | string | Y | 收款人账户号 | 9388881234@rbl |
# 请求报文示例
{
"appId": "B2iwKFIM4tvo",
"merchantId": "CH10001165",
"mchOrderNo": "20240109021322",
"paymentMethod": "BANK_IN",
"amount": "900",
"name": "CheezeePayTest",
"phone": "9123456789",
"email": "[email protected]",
"notifyUrl": "https://yourdomain/notifyUrl",
"payeeAccountInfos": "{\"name\":\"CheezeePayTest\",\"accountNumber\":\"10002993920002\",\"ifscCode\":\"SBIN0001537\",\"accountType\":\"india\",\"bankName\":\"visa\",\"branchName\":\"branch\"}",
"language": "cn",
"timestamp": 1704167614000,
"sign": "czZMXl782WIh0e5af53bQ4daedVwpaq+up3lP/fHk3fCatPlzdDyD/Tg7pqcvBAvbjeXFQgJ/O836ky2ECVFrnZ6dBKCyLf/ftZ2Y+iAMEqe3q1p9zorJ+b6M/jaQpyzJE82KS994IcGwQe0BVthG1TkP6kwbylSOdgItOL8ivEy6La557QOIqTiVJdMxnmqYg+VwINcf8+QLtfc+/GlTEc7R4KdpqCB7SryaHhg6RxUnnG2Zum2E6/UlabwvpPg6mglE+LB5ys0kMfptAmOhjnZo6/gKOY/kjZTZ6LxUzc1kbdfdtVtgGTAeTJ/OPQY2DpI9YfA1L6AM4rDEdbE8A=="
}
# 响应参数
参数 | 类型 | 必填 | 描述 | 示例 |
---|---|---|---|---|
code | String | Y | 响应码 000000为成功,其余为失败 | 000000 |
msg | String | Y | 响应描述 success:成功 | success |
tradeNo | String | Y | 平台订单号 | 1746108644859187200 |
sign | String | Y | 签名 | HcMyGbT+yHStKP/axYRPmWtYku2TPr1zyxA2Uv+i Vt+5LPgIARTJuZ/DbndC9wUEaFZT0cm7OV8yfHFi pniN2dSwnTc3TI93tnrtXGkZ9I6WYhNpZh6H2dwp aaKSzUul/8BB4Q441ZS9Nk9Kz8oIg8ztOvWzzoML dOqnDOlG8Hb6iIudDZWi4t5Ut5SzUIX+LcEGe7lI N3i1WFflgRw2Zm1CfZ+N7Xw5/Ox/JxGjaBqW1CZI naN66uGWd3qlKxPen5GkTY2zRqm0PbzoaXuouOKO yAvrkOcgp07sxfVWukZ9H7Gcs9iyK8vtz4ICIXGl zUVNwjalC8rPEXr8J3U7FQ== |
# 代付响应报文示例
- 下单成功响应报文示例
{
"code": "000000",
"msg": "success",
"tradeNo": "1746108644859187200",
"sign": "HcMyGbT+yHStKP/axYRPmWtYku2TPr1zyxA2Uv+iVt+5LPgIARTJuZ/DbndC9wUEaFZT0cm7OV8yfHFipniN2dSwnTc3TI93tnrtXGkZ9I6WYhNpZh6H2dwpaaKSzUul/8BB4Q441ZS9Nk9Kz8oIg8ztOvWzzoMLdOqnDOlG8Hb6iIudDZWi4t5Ut5SzUIX+LcEGe7lIN3i1WFflgRw2Zm1CfZ+N7Xw5/Ox/JxGjaBqW1CZInaN66uGWd3qlKxPen5GkTY2zRqm0PbzoaXuouOKOyAvrkOcgp07sxfVWukZ9H7Gcs9iyK8vtz4ICIXGlzUVNwjalC8rPEXr8J3U7FQ=="
}
- 下单失败响应报文示例
{
"code": "A0497",
"msg": "Unable to trade, contact customer service (A0497)",
"sign": "QujGMEBgK5g+ne8drbKu74rpYC99gU/8noDZ/1o/7gTFpx5xNmppclbpw6aGy97nLxDSsJq1m0ZHYz4TU24XgtnTLZwdgf8ievl1Tmj61dts2rR2hcsYFc63lub+V2p3AhJ6H2dmfaqY9deWZeSl6DD5zb2xYcp8QitVqAze/j0g7EDAPHG/ShC+r8FyqFYy0KQddP/s+kzusKrFyCTilRNQXSLUT5Ompy82IkpghDLPLRxEJbCRmnUZ/sD8KENsdmqhcJrmAq+WbCz5tWnxbvAsFTMI/dgnm91ZhelfoKceErJaePxzZrsHvgkmPehAgyb/CKb1345r1ckG7gnPKg=="
}
# 代码实现Demo
- 代码示例仅供参考,具体参数说明请参考请求参数说明
package com.cheesepay;
import com.google.gson.Gson;
import com.cheesepay.CheeseTradeRSAUtil;
import okhttp3.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
public class PayoutDemo {
// 平台公钥
private static final String PLAT_PUBLIC_KEY ="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1dad35S74jfLPbHJh8P0jDHiTvkxwrtITK97ovVu19B24UdiHyHoEZgtNlS6alFQj1ULQ71d6EPh2rWCNkS2b5HGQXwDYBtwvesVQ8h4Sf3eVPTTLGw3BS7Os4vtDEN6BezMdv3sUG2N5i6JF+5H4CQTq3MD2Cx6u/Cv7oFOdFqeDT0AH+TR7uyZxn69OtkJaHHr834EUcdShJKKMQtbC11WCcut7ilDUgdvZnThiVTq7cfl8mcC9FDKcQ9bMWamScWIB5cJQdUW23Kr0c1NvZlpgPS8U5VODM4Uc4muHJPD2cJmquuJ+4AGP36rEk27lUB3h7B6JI1QGiuh1yyPDwIDAQAB";
// 商户私钥
private static final String MCH_PRIVATE_KEY ="MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC/wgJqa2WHUTrJwdrtOig8lwuKPaL462/1rF45p+xi25uoGUEyiOtB0OC6HLePUfkGYzPULPH/O0yF5GmWkhSuz3lKK/XtXSeRdQIwAQ7lYlhfdJjTLVC7mwkDRZeFePwbnAX5pC0h6Yxf0ibjAglkW2d45AscouZt91xIxgf0VLNZ9dHe8R7j8hPKOGpNi+709ThmRZQVHQLN+6w+mrID7JyWBSbbf2bVWc7UBlHCkudwjEiW/r96CefTukb0SigaS0XpqWEKYHeNWS0DP/a5OUDzXMi6fqHEzMPa6uNYbLpOW1rxMhMhU97W8pLYBba0T9BI7F/xusozxVDVeQbDAgMBAAECggEAdZ4EaU3yemuCiZoUNIoFgBSNiX+A5PlUNPZC3U54mbJl6VeEPADre/Uowj82//uhqR9T/QKMdKbkqwONGEQF16t+k9YfBDatPHTuoI8lmeEWn4Ye7vjOmiPgBVe8NqwcxrqOl67x1+kupt955qerJxlBgE8v2aK5gB3HRwPggSYZgSZJ3X2zQMJ+XN4qe49Un+utqFuGtVRwPQvs/Kazp5GL7WlR0OnpQ2KZ+ur9T58VfTKmIeqBckey7nIrb/fdodJ7IqcykWjSLmy8p84W78iiRDfPn81Ujb231EWW+AbuV399aXBZ4oaR4q8wwkhe9xHUADWLvcfCnMrB40LkEQKBgQD2TEeBEB5Gwj/zpriq23xKJyzfo0hOxzGY/Ol2EykGeEYhny/YiTlMYtOMy37RiGKr4lN7G/pKl2fI5kRjgQM1QXgx6dxd11D0rORXj+SAy6+zAq3NVY4c3zDKmrQQ8x3f2QFffo+TmLtw/BH0Frp+a2lzKzIcXtZ4/akJdVIihwKBgQDHT7xvOaNyAPnnYwpROMI9eUVgFc9pMRAmQ18at8ggZ8M+Ww1nhr00loufzkovCb9MvGR4HSedWHfgmtDu1hUFtl7PItNItsB347yWPxR/lVLs44NVXt7jkFisoBoEBXaNVVt6uOSvBiqINmX3gm4FoisI2SRZsH7nMr07OXO85QKBgCkXdN6Nh9+aTP0jla+7yrK8cnolTc0G4rl5iKHQdInFyz2Ux3DDBDJAUrcsxE3FCWFP80mY01tag1A7SrGnNpfOAnWhZMirQbBwn/AT67WpRfkBu2mEmp8qhYNn6B7j0Nol5FrATMf9NViWVZB5skehOAik7klZcULiXy9ayYdFAoGAA+0bLim5gYZpZdh6nIz8ro9UAYeMdWsFAWv0VKdoJtNEclcC1ZY+5elNSNGcfn63qQBRDlisrhnPCrqiAQJwmZM1HOl3tgf7lKEE1wTZF4ZOguIcdTMQOvVd+dCRkqC07CXRToKT5qq9bb98lLqaBjxikqMMZ0PlzBIgzijckc0CgYAH16CziStEZVvKbiR8b0ftF9mf6V8I0KHianMgV8X6Y51aE0Ig1eQhIvqSjqtBac7gEppiu3OQVrp39uLdgyvDSVta1Hq9QYYTDNt8crt69aD/Th1h5esYvApYyZIhHbFDR5meE4Y3nHpfY7J8zhmfyaVW/6cuwPaToTtrEjQmWQ==";
// payment接口URL
private static final String apiUrl = "https://test2-openapi.91fafafa.com/api/payout/india/order/create/v1";
// 回调地址
private static final String cashNotify = "https://yourdomain/notifyUrl";
public static void main(String[] args) throws Exception {
payout();
}
private static String getCurrentTime(){
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
return now.format(formatter);
}
private static void payout() throws Exception {
Map<String, Object> requestParams = new HashMap<>();
requestParams.put("appId", "B2iwKFIM4tvo");
requestParams.put("merchantId", "CH10001165");
// 订单号不可重复
String currentTime = getCurrentTime();
requestParams.put("mchOrderNo", currentTime);
requestParams.put("paymentMethod", "BANK_IN");
requestParams.put("amount", "900");
requestParams.put("name", "CheezeePayTest");
requestParams.put("phone", "9123456789");
requestParams.put("email", "[email protected]");
requestParams.put("notifyUrl", cashNotify);
requestParams.put("payeeAccountInfos", "{\"name\":\"CheezeePayTest\",\"accountNumber\":\"10002993920002\",\"ifscCode\":\"SBIN0001537\",\"accountType\":\"india\",\"bankName\":\"visa\",\"branchName\":\"branch\"}");
requestParams.put("language", "en");
Long timestamp = System.currentTimeMillis();
requestParams.put("timestamp", timestamp);
// 私钥加密
String platSign = CheeseTradeRSAUtil.getSign(requestParams, MCH_PRIVATE_KEY);
requestParams.put("sign", platSign);
System.out.println("requestParams Msg:" + requestParams);
// 接口请求
Gson gson = new Gson();
String requestBody = gson.toJson(requestParams);
System.out.println("Post Json Params:" + requestBody);
// 发送请求并获取响应
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(mediaType, requestBody);
Request request = new Request.Builder()
.url(apiUrl)
.post(body)
.addHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36")
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
// 失败处理...
System.out.println("Request failed: " + response.code() + " - " + response.message());
}
// 验签处理
String responseBody = response.body().string();
System.out.println("Response: " + responseBody);
Type type = new com.google.gson.reflect.TypeToken<Map<String, Object>>() {}.getType();
Map<String, Object> map = gson.fromJson(responseBody, type);
boolean verifyResult = CheeseTradeRSAUtil.verifySign(map, PLAT_PUBLIC_KEY);
if (verifyResult) {
// ... 签名验证通过,处理正常的业务逻辑
} else {
// ... 签名验证错误
}
response.close();
}
}