日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java paysign_微信支付签名算法java版本-其他地方都可通用

發布時間:2025/4/16 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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版本-其他地方都可通用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。