MaxPay 支付接口文档
本文档提供了MaxPay支付平台所有接口的详细说明和使用方法,包括代收、代付、订单查询及回调处理等核心功能。
7. 签名方式
参数签名用于保证参数一致性,避免被篡改。通过将参数按照规则组合,使用MD5 Hash算法得到签名。
具体步骤:
-
将所有POST的非空(空值字段不参与加签)参数按照字段名升序排序,且去除前后空格,进行URL编码(UTF-8)并转换为小写,组合成参数字符串:
paramString = "aparam=xxx&bparam=yyy&cparam=zzz&..."
-
在参数字符串末尾,追加secret参数:
strToHash = paramString + "&secret=[商户的secret]"
-
将第二步得到的结果进行MD5加密:
sign = md5(strToHash)
Java 示例
Java 示例代码
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 SignatureGenerator { /** * 生成API请求签名 * @param params 请求参数Map * @param secret 商户密钥 * @return 32位小写MD5签名 */ public static String generateSign(Mapparams, String secret) { // 1. 过滤空值参数并去除空格 Map filteredParams = new TreeMap<>(); for (Map.Entry entry : params.entrySet()) { if (entry.getValue() != null && !entry.getValue().trim().isEmpty()) { // 去除值的前后空格 filteredParams.put(entry.getKey(), entry.getValue().trim()); } } // 2. 按字段名升序排序(TreeMap已自动排序) // 3. 构建参数字符串 StringBuilder paramBuilder = new StringBuilder(); for (Map.Entry entry : filteredParams.entrySet()) { if (paramBuilder.length() > 0) { paramBuilder.append("&"); } // URL编码并转换为小写 String encodedValue = URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8) .toLowerCase(); paramBuilder.append(entry.getKey()) .append("=") .append(encodedValue); } // 4. 追加secret String paramString = paramBuilder.toString(); String strToHash = paramString + "&secret=" + secret; // 5. 生成MD5签名 return md5(strToHash); } /** * 生成MD5哈希值 * @param input 输入字符串 * @return 32位小写MD5 */ private static String md5(String input) { try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] hash = md.digest(input.getBytes(StandardCharsets.UTF_8)); StringBuilder hexString = new StringBuilder(); for (byte b : hash) { 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); } } // 测试示例 public static void main(String[] args) { Map params = new HashMap<>(); params.put("amount", "100.00"); params.put("merchant", "MCH123456789"); params.put("paytype", "1"); params.put("outtradeno", "ORDER202312345"); params.put("remark", "Test payment"); params.put("emptyParam", ""); // 空值参数将被忽略 String secret = "my_secret_key"; String sign = generateSign(params, secret); System.out.println("生成的签名: " + sign); // 输出示例: 生成的签名: 2d9da9583ab81d3f1874162d517d672f } }