java paysign_微信支付签名算法java版本-其他地方都可通用
一、算法簡介
簽名生成的通用步驟如下:
第一步,設所有發送或者接收到的數據為集合M,將集合M內非空參數值的參數按照參數名ASCII碼從小到大排序(字典序),使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特別注意以下重要規則:
◆ 參數名ASCII碼從小到大排序(字典序);
◆ 如果參數的值為空不參與簽名;
◆ 參數名區分大小寫;
◆ 驗證調用返回或微信主動通知簽名時,傳送的sign參數不參與簽名,將生成的簽名與該sign值作校驗。
◆ 微信接口可能增加字段,驗證簽名時必須支持增加的擴展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并對stringSignTemp進行MD5運算,再將得到的字符串所有字符轉換為大寫,得到sign值signValue。
二、代碼實現
public class WxPaySignUtils {
public static final String MD5 = "MD5";
public static final String HMAC_SHA256 = "HMAC-SHA256";
/**
* 簽名
* @param data
* @param key
* @param signType
* @return
*/
public static String sign(Map data,String key,String signType){
if(null == data || data.size() == 0 || null == key || key.trim().equals("") || null == signType || !(MD5.equals(signType) || HMAC_SHA256.equals(signType))){
throw new RuntimeException("參數缺失");
}
// 簽名值
String signKey = "";
SortedMap sortedMap = new TreeMap<>(data);
String paramStr = "";
for (Map.Entry stringStringEntry : sortedMap.entrySet()) {
if(paramStr.equals("")){
paramStr = stringStringEntry.getKey() + "=" + stringStringEntry.getValue();
}else{
paramStr = paramStr + "&" +stringStringEntry.getKey() + "=" + stringStringEntry.getValue();
}
}
paramStr = paramStr + "&key=" + key;
if(signType.equals(MD5)){
signKey = getMD5(paramStr);
}else{
signKey = getHmacSha256(paramStr,key);
}
return signKey.toUpperCase();
}
/**
* 獲取MD5
* @param str
* @return
*/
private static String getMD5(String str) {
try {
// 生成一個MD5加密計算摘要
MessageDigest md = MessageDigest.getInstance("MD5");
// 計算md5函數
md.update(str.getBytes());
return byteArrayToHexString(md.digest());
} catch (Exception e) {
throw new RuntimeException("MD5加密出現錯誤");
}
}
/**
* 獲取HmacSha256
* @param message
* @param key
* @return
*/
private static String getHmacSha256(String message,String key){
String outPut= null;
try{
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(),"HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] bytes = sha256_HMAC.doFinal(message.getBytes());
outPut = byteArrayToHexString(bytes);
}catch (Exception e){
throw new RuntimeException("HmacSHA256加密出現錯誤");
}
return outPut;
}
/**
* byte數組轉16進制字符串
* @param b
* @return
*/
private static String byteArrayToHexString(byte[] b) {
StringBuilder sb = new StringBuilder();
String stmp;
for (int n = 0; b != null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1)
sb.append('0');
sb.append(stmp);
}
return sb.toString().toLowerCase();
}
}
來源:oschina
鏈接:https://my.oschina.net/fellowtraveler/blog/4781077
總結
以上是生活随笔為你收集整理的java paysign_微信支付签名算法java版本-其他地方都可通用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java i数据类型_数据类型 I
- 下一篇: java公网对讲_【对讲机的那点事】选择