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