MaxPay 支付接口文档
本文档提供了MaxPay支付平台所有接口的详细说明和使用方法,包括代收、代付、订单查询及回调处理等核心功能。
4. 代付订单查询接口
POST
https://{请联系客服}/api/transfer/query
application/json
输入参数
| 参数名 | 是否可空 | 类型 | 描述 |
|---|---|---|---|
merchant |
N | string | 商户id |
outtransferno |
N | string | 商户代付订单号 |
sign |
N | string | 签名 |
输入参数示例
JSON 示例
{
"outtransferno": "TEST122",
"merchant": "1904572121431658498",
"sign": "sign"
}
接口返回示例
JSON 返回
{
"code": 0,
"results": {
"transferno": "1342123134",
"outtransferno": "TEST122",
"tradeamount": 1000.2,
"transferamount": 1000,
"endtime": "2023-12-12 23:12:32",
"remark": "备注",
"status": "1",
"sign": "sign1",
"fee": 2,
"rate": 0.02,
"bankfee": 0,
"totalfee": 2.2
},
"uid": ""
}
返回参数
| 参数名 | 类型 | 描述 |
|---|---|---|
transferno |
string | 订单号 |
outtransferno |
string | 商户订单号 |
tradeamount |
number | 商户账户扣除金额 |
transferamount |
number | 代付金额 |
endtime |
string | 支付时间 |
remark |
string | 备注 |
status |
string | 订单状态
0: 未结算 1: 已结算 2: 结算中 3: 结算异常 4: 已撤销 |
sign |
string | 签名 |
fee |
number | 单笔手续费 |
rate |
number | 手续费率 |
bankfee |
number | 银行手续费 |
totalfee |
number | 总手续费 |
Java 示例
Java 示例代码
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
//代付订单查询接口
public class TransferQueryExample {
public static void main(String[] args) {
String merchantId = "1904572121431658498";
String secret = "your_secret_key"; // 替换为你的密钥
String apiUrl = "https://{请联系客服}/api/transfer/query";
String transferId = "TRANSFER_1753034";
Map params = new HashMap<>();
params.put("merchant", merchantId);
params.put("outtransferno", transferId);
// 生成签名
String sign = generateSign(params, secret);
params.put("sign", sign);
// 发送请求
try {
String response = sendPostRequest(apiUrl, params);
System.out.println("API响应: " + response);
// 解析响应
JsonObject json = new Gson().fromJson(response, JsonObject.class);
if (json.get("code").getAsInt() == 0) {
JsonObject results = json.getAsJsonObject("results");
String status = results.get("status").getAsString();
double totalFee = results.get("totalfee").getAsDouble();
System.out.println("订单状态: " + status);
System.out.println("总手续费: " + totalFee);
} else {
System.out.println("查询失败: " + json.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static String generateSign(Map params, String secret) {
try {
TreeMap sortedParams = new TreeMap<>();
for (Map.Entry entry : params.entrySet()) {
if (entry.getValue() != null && !entry.getValue().trim().isEmpty()) {
sortedParams.put(entry.getKey(), entry.getValue().trim());
}
}
StringBuilder sb = new StringBuilder();
for (Map.Entry entry : sortedParams.entrySet()) {
if (sb.length() > 0) {
sb.append("&");
}
// ✅ 编码并转小写(是签名失败的根本)
String encoded = URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8).toLowerCase();
sb.append(entry.getKey()).append("=").append(encoded);
}
sb.append("&secret=").append(secret);
return md5(sb.toString());
} catch (Exception e) {
throw new RuntimeException("签名生成失败", e);
}
}
private static String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder hexString = new StringBuilder();
for (byte b : digest) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append("0");
hexString.append(hex);
}
return hexString.toString();
} catch (Exception e) {
throw new RuntimeException("MD5计算失败", e);
}
}
private static String sendPostRequest(String url, Map params) throws Exception {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoOutput(true);
String jsonInputString = new Gson().toJson(params);
try (OutputStream os = conn.getOutputStream()) {
byte[] input = jsonInputString.getBytes("utf-8");
os.write(input, 0, input.length);
}
int responseCode = conn.getResponseCode();
if (responseCode != 200) {
throw new RuntimeException("HTTP请求失败,响应码:" + responseCode);
}
try (BufferedReader br = new BufferedReader(
new InputStreamReader(conn.getInputStream(), "utf-8"))) {
StringBuilder response = new StringBuilder();
String responseLine;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine.trim());
}
return response.toString();
}
}
}