MaxPay 支付接口文档
本文档提供了MaxPay支付平台所有接口的详细说明和使用方法,包括代收、代付、订单查询及回调处理等核心功能。
1. 代收接口
POST
https://{请联系客服}/api/pay/add
application/json
输入参数
| 参数名 | 是否可空 | 类型 | 描述 | 备注 |
|---|---|---|---|---|
amount |
N | number | 金额(元) | |
merchant |
N | string | 商户id | |
paytype |
N | string | 支付方式 | 1:promptpay 2:truewallet 3:wangguan1 传支付方式编码,例如:1 |
outtradeno |
N | string | 商户订单号 | |
remark |
Y | string | 备注 | |
bankname |
Y | string | 银行名称 | |
notifyurl |
Y | string | 异步回调通知地址 | |
returnurl |
Y | string | ClientHtml跳回地址 | |
payername |
Y | string | 付款人姓名 | |
returndataformat |
N | string | 返回格式 | clienthtml: 重定向到clienthtml serverhtml: 返回订单支付页面的url serverjson: 返回订单json |
cardno |
Y | string | 指定卡号 | |
sign |
N | string | 签名 | 查看签名方法 |
paybanknumber |
Y | number | 付款人银行账户 | 咨询客服确认是否需要传入该字段 |
输入参数示例
JSON 示例
{
"amount": 100,
"merchant": "1912774432960262146",
"paytype": "3",
"outtradeno": "9c4bd61ff72a46159f2af820",
"remark": "备注",
"notifyurl": "www.xx.com",
"returnurl": "www.xx.com",
"payername": "张三",
"returndataformat": "serverjson",
"sign": "sign"
}
接口返回说明
clienthtml 返回
重定向到订单支付页面
serverhtml 返回
{
"code": 0,
"results": "www.xx.com/pay",
"uid": ""
}
serverjson 返回
{
"code": 0,
"results": {
"tradeno": "123123123132",
"amount": 1000,
"discountamount": 999.99,
"paytype": "1",
"cardname": "赵四",
"cardno": "6000000000000",
"bankname": "xx银行",
"subbankname": "xx银行xx支行",
"payername": "张三",
"bankqrcode": "JSI5S45WE22GR3E...",
"createtime": 15000000000,
"timeout": 90
},
"uid": ""
}
返回参数
| 参数名 | 类型 | 描述 |
|---|---|---|
tradeno |
string | 订单号 |
amount |
number | 订单金额 |
discountamount |
number | 实际需要支付的金额 |
paytype |
string | 支付方式 |
cardname |
string | 收款人姓名 |
cardno |
string | 收款人账号 |
bankname |
string | 收款人银行名称 |
subbankname |
string | 支行名称 |
payername |
string | 付款人姓名 |
bankqrcode |
string | 收款银行二维码地址 |
createtime |
int | 创建时间(Unix时间) |
timeout |
int | 超时时长 |
Java 示例
Java 示例代码
import com.google.gson.Gson;
import java.net.URLEncoder;
import java.net.http.*;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.*;
//代收接口
public class CollectionExample {
public static void main(String[] args) throws Exception {
String merchantId = "1912774432960262146";
String secret = "your_secret_key"; // 替换为你的商户密钥
String apiUrl = "https://{请联系客服}/api/pay/add";
Map params = new HashMap<>();
params.put("amount", "100.000"); // 三位小数更保险
params.put("merchant", merchantId);
params.put("paytype", "3");
params.put("outtradeno", "ORDER_" + System.currentTimeMillis());
params.put("remark", "测试订单");
params.put("notifyurl", "https://yourdomain.com/notify");
params.put("returnurl", "https://yourdomain.com/return");
params.put("payername", "张三");
params.put("returndataformat", "serverjson");
// ✅ 签名
String sign = generateSign(params, secret);
params.put("sign", sign);
// ✅ 发送请求
Gson gson = new Gson();
String json = gson.toJson(params);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(apiUrl))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("API响应: " + response.body());
}
private static String generateSign(Map params, String secret) {
try {
TreeMap sortedParams = new TreeMap<>();
for (Map.Entry entry : params.entrySet()) {
String value = entry.getValue();
if (value != null && !value.trim().isEmpty()) {
sortedParams.put(entry.getKey(), value.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 hex = new StringBuilder();
for (byte b : digest) {
String h = Integer.toHexString(0xff & b);
if (h.length() == 1) hex.append("0");
hex.append(h);
}
return hex.toString();
} catch (Exception e) {
throw new RuntimeException("MD5计算失败", e);
}
}
}