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";

        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);
        }
    }
}