Java實現(xiàn)微信支付的簽名算法示例
簽名算法
簽名生成的通用步驟如下:
第一步,設(shè)所有發(fā)送或者接收到的數(shù)據(jù)為集合M
將集合M內(nèi)非空參數(shù)值的參數(shù)按照參數(shù)名ASCII碼從小到大排序(字典序),使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特別注意重要規(guī)則
參數(shù)名ASCII碼從小到大排序(字典序);
如果參數(shù)的值為空不參與簽名;
參數(shù)名區(qū)分大小寫;
驗證調(diào)用返回或微信主動通知簽名時,傳送的sign參數(shù)不參與簽名,將生成的簽名與該sign值作校驗。
微信接口可能增加字段,驗證簽名時必須支持增加的擴展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串
并對stringSignTemp進行MD5運算,再將得到的字符串所有字符轉(zhuǎn)換為大寫,得到sign值signValue。
注意:密鑰的長度為32個字節(jié)
import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; /** * @author Wen先森 * @version 1.0 * @date 2022/8/25 11:07 */ @Slf4j public class SignatureUntils { public static final String KEY="0de034fa56cf0ce676570d571de2705b"; /** * 處理要簽名的數(shù)據(jù) * 1. 獲取參數(shù)content,content為json字符串 * 2. 轉(zhuǎn)換參數(shù)成URL 鍵值對的格式(即 key1=value1&key2=value2…) * 3. 返回整理好的待簽名數(shù)據(jù) */ private static String handleStr(Map<String,?> paramsMap){ //轉(zhuǎn)成map //獲取參數(shù)名稱轉(zhuǎn)成List集合 Set<String> keySet = paramsMap.keySet(); List<String> paramNames = new ArrayList<String>(keySet); //對參數(shù)名稱進行排序 Collections.sort(paramNames); //把參數(shù)轉(zhuǎn)化成url鍵值對格式并返回 StringBuilder paramNameValue = new StringBuilder(); for (String paramName : paramNames ) { if("sign".equals(paramName) || ObjectUtils.isEmpty(paramsMap.get(paramName))) { continue; }else{ paramNameValue.append(paramName).append("=").append(paramsMap.get(paramName)).append("&"); } } // paramNameValue.deleteCharAt(paramNameValue.length()-1); return paramNameValue.toString(); } /** * 生成簽名; * * @param params * @return */ static public String signForInspiry(Map<String,?> params, String key) { //先排序 String str = handleStr(params); StringBuffer sbkey = new StringBuffer(str); sbkey = sbkey.append("key=" + key); //MD5加密,結(jié)果轉(zhuǎn)換為大寫字符 String sign = toMd5(sbkey.toString()).toUpperCase(); return sign; } /** * 對字符串進行MD5加密 * * @param str 需要加密的字符串 * @return 小寫MD5字符串 32位 */ public static String toMd5(String str) { String re = null; byte encrypt[]; try { byte[] tem = str.getBytes(); MessageDigest md5 = MessageDigest.getInstance("md5"); md5.reset(); md5.update(tem); encrypt = md5.digest(); StringBuilder sb = new StringBuilder(); for (byte t : encrypt) { String s = Integer.toHexString(t & 0xFF); if (s.length() == 1) { s = "0" + s; } sb.append(s); } re = sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return re; } public static boolean checkSign(String sign,Map<String,?> params,String key){ try { String signValue = signForInspiry(params, key); if (StringUtils.endsWithIgnoreCase(signValue,sign)){ log.info("驗簽成功"); return true; } } catch (Exception e) { log.info("驗簽異常"); e.printStackTrace(); } log.info("驗簽失敗"); return false; } public static void main(String[] args) { String sign="81AA2B818EAD40FE2D8E7E3242C14577"; String key="0de034fa56cf0ce676570d571de2705b"; Map<String,Object> map = new HashMap<>(); map.put("deviceSn","000SD50030180000001"); map.put("timestamp","1661759090226"); map.put("sign",sign); map.put("orderNo","HMP2208310000584428263559179"); // 需要簽名參數(shù) System.out.println("簽名參數(shù):"+map); String sortPram = handleStr(map); // 排序后和去掉sign參數(shù)之后 System.out.println("排序后參數(shù):"+sortPram); String signValue = signForInspiry(map, "0de034fa56cf0ce676570d571de2705b"); // MD5加密并全部大寫 System.out.println("簽名內(nèi)容:"+signValue); // 驗簽 checkSign(sign, map, key); } }
以上就是Java實現(xiàn)微信支付的簽名算法示例的詳細內(nèi)容,更多關(guān)于Java微信支付簽名算法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
nacos在liunx系統(tǒng)中啟動成功瀏覽器卻訪問不了的解決方法
在linux下搭建nacos,現(xiàn)在想要啟動,訪問nacos頁面,訪問不了,所以本文小編將給大家介紹nacos在liunx系統(tǒng)中啟動成功,瀏覽器卻訪問不了?全面的解決辦法,需要的朋友可以參考下2023-09-09Spring?Data?JPA關(guān)系映射@OneToOne實例解析
這篇文章主要為大家介紹了Spring?Data?JPA關(guān)系映射@OneToOne實例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08Java使用jacob將微軟office中word、excel、ppt轉(zhuǎn)成pdf
這篇文章主要為大家詳細介紹了Java使用jacob將微軟office中word、excel、ppt轉(zhuǎn)成pdf,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12基于visualvm監(jiān)控類實現(xiàn)過程詳解
這篇文章主要介紹了基于visualvm監(jiān)控類實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09Spring Boot整合RabbitMQ實例(Topic模式)
Topic Exchange 轉(zhuǎn)發(fā)消息主要是根據(jù)通配符。接下來通過本文給大家分享Spring Boot整合RabbitMQ實例(Topic模式),需要的朋友參考下吧2017-04-04