签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,得到sign值signValue。
◆ key直接拼接,前面无须加&key=
public static String createSign(String characterEncoding, SortedMap<Object,Object> parameters, String key){
StringBuffer sb = new StringBuffer();
StringBuffer sbkey = new StringBuffer();
Set es = parameters.entrySet(); //所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
//空值不传递,不参与签名组串
if(null != v && !"".equals(v)) {
sb.append(k + "=" + v + "&");
sbkey.append(k + "=" + v + "&");
}
}
//System.out.println("字符串:"+sb.toString());
sbkey.deleteCharAt(sb.length() - 1);
sbkey=sbkey.append(key);
System.out.println("字符串:"+sbkey.toString());
//MD5加密,结果转换为大写字符
String sign = MD5Util.MD5Encode(sbkey.toString(), characterEncoding).toUpperCase();
System.out.println("MD5加密值:"+sign);
return sb.toString()+"sign="+sign;
}
public static void main(String[] args) {
SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();
String mch_id="101723";
String out_trade_no="2019120214550201";
String pay_type="alipay_pdd";
String order_amount="198.00";
String user_code ="1723";
String notify_url ="www.baidu.com";
parameters.put("mch_id", mch_id);
parameters.put("pay_type", pay_type);
parameters.put("out_trade_no",out_trade_no);
parameters.put("order_amount",order_amount);
parameters.put("user_code",user_code);
parameters.put("notify_url",notify_url);
String characterEncoding = "UTF-8"; //指定字符集UTF-8
String mySign = createSign(characterEncoding,parameters,"594e2a8282e85addad20bcc45c5a44ab90b8beb6");
System.out.println("我 的签名是:"+mySign);
}
MD5Util 工具类
import java.security.MessageDigest;
public class MD5Util {
private static String byteArrayToHexString(byte b[]) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++)
resultSb.append(byteToHexString(b[i]));
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0)
n += 256;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
public static String MD5Encode(String origin, String charsetname) {
String resultString = null;
try {
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance("MD5");
if (charsetname == null || "".equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString
.getBytes()));
else
resultString = byteArrayToHexString(md.digest(resultString
.getBytes(charsetname)));
} catch (Exception exception) {
}
return resultString;
}
private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
}
MD5工具也可以用自己的