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 | 签名 | 查看签名方法 |
输入参数示例
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"; Mapparams = 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); } } }