签名算法
在调用接口进行编码前,开发者需先计算签名,计算方式如下:
- 把所有参数按照参数名首字母进行升序排序。(参数sign不参与签名)
- 对排序后的参数按照’key1=value1&key2=value2&key3=value3…’排列,生成字符串A。
- 将字符串A全部转化成小写字母,生成字符串B
- 在字符串B末尾拼接商户接口密钥(app_key),生成字符串C。
- 对字符串C进行MD5计算,结果以小写表示。
将得到的签名赋给sign作为请求参数(空字符串也参与签名,如 key1=&key2=&key2=value2&... )
签名代码如下(仅供参考):
签名代码示例(PHP):
-------------------------------------------------------
$post['customerId'] = 8000000;
$post['page'] = 1;
$post['pageSize'] = 20;
$secret = "E36BC06C************3DBB33465";
ksort($post); //排序
$sign_string = urldecode(http_build_query($post));
$back_sign = md5(strtolower($sign_string) . $secret);
$post['sign'] = $back_sign;
签名代码示例(JAVA):
-------------------------------------------------------
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import java.net.URLDecoder;
import java.io.UnsupportedEncodingException;
import java.util.stream.Collectors;
public class SignGenerator {
public static void main(String[] args) {
Map post = new HashMap<>();
post.put("customerId", 8000000);
post.put("page", 1);
post.put("pageSize", 20);
String secret = "E36BC06C************3DBB33465";
// Sort the parameters by key
Map sortedPost = new TreeMap<>(post);
// Build the query string
String signString = sortedPost.entrySet().stream()
.map(entry -> entry.getKey() + "=" + entry.getValue())
.collect(Collectors.joining("&"));
try {
// URL decode the string (similar to urldecode in PHP)
signString = URLDecoder.decode(signString, "UTF-8");
// Append the secret and convert to lowercase
String stringToSign = signString.toLowerCase() + secret;
// Calculate MD5 hash
String backSign = md5(stringToSign);
// Add the signature to the post data
post.put("sign", backSign);
System.out.println("Generated sign: " + backSign);
System.out.println("Final post data: " + post);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
private static String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(input.getBytes());
// Convert byte array to hex string
StringBuilder hexString = new StringBuilder();
for (byte b : messageDigest) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}
签名代码示例(PHP): ------------------------------------------------------- $post['customerId'] = 8000000; $post['page'] = 1; $post['pageSize'] = 20; $secret = "E36BC06C************3DBB33465"; ksort($post); //排序 $sign_string = urldecode(http_build_query($post)); $back_sign = md5(strtolower($sign_string) . $secret); $post['sign'] = $back_sign;
签名代码示例(JAVA): ------------------------------------------------------- import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; import java.net.URLDecoder; import java.io.UnsupportedEncodingException; import java.util.stream.Collectors; public class SignGenerator { public static void main(String[] args) { Mappost = new HashMap<>(); post.put("customerId", 8000000); post.put("page", 1); post.put("pageSize", 20); String secret = "E36BC06C************3DBB33465"; // Sort the parameters by key Map sortedPost = new TreeMap<>(post); // Build the query string String signString = sortedPost.entrySet().stream() .map(entry -> entry.getKey() + "=" + entry.getValue()) .collect(Collectors.joining("&")); try { // URL decode the string (similar to urldecode in PHP) signString = URLDecoder.decode(signString, "UTF-8"); // Append the secret and convert to lowercase String stringToSign = signString.toLowerCase() + secret; // Calculate MD5 hash String backSign = md5(stringToSign); // Add the signature to the post data post.put("sign", backSign); System.out.println("Generated sign: " + backSign); System.out.println("Final post data: " + post); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } private static String md5(String input) { try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] messageDigest = md.digest(input.getBytes()); // Convert byte array to hex string StringBuilder hexString = new StringBuilder(); for (byte b : messageDigest) { String hex = Integer.toHexString(0xff & b); if (hex.length() == 1) { hexString.append('0'); } hexString.append(hex); } return hexString.toString(); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } }