欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實現(xiàn)微信支付的簽名算法示例

 更新時間:2023年12月04日 11:14:49   作者:Wen先森  
這篇文章主要為大家介紹了Java實現(xiàn)微信支付的簽名算法實現(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)文章

  • Spring中的Context你真的懂了嗎

    Spring中的Context你真的懂了嗎

    這篇文章主要給大家介紹了關(guān)于Spring中Context的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • nacos在liunx系統(tǒng)中啟動成功瀏覽器卻訪問不了的解決方法

    nacos在liunx系統(tǒng)中啟動成功瀏覽器卻訪問不了的解決方法

    在linux下搭建nacos,現(xiàn)在想要啟動,訪問nacos頁面,訪問不了,所以本文小編將給大家介紹nacos在liunx系統(tǒng)中啟動成功,瀏覽器卻訪問不了?全面的解決辦法,需要的朋友可以參考下
    2023-09-09
  • Spring?Data?JPA關(guān)系映射@OneToOne實例解析

    Spring?Data?JPA關(guān)系映射@OneToOne實例解析

    這篇文章主要為大家介紹了Spring?Data?JPA關(guān)系映射@OneToOne實例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Java使用jacob將微軟office中word、excel、ppt轉(zhuǎn)成pdf

    Java使用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)過程詳解

    這篇文章主要介紹了基于visualvm監(jiān)控類實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • @RereshScope刷新的原理詳解

    @RereshScope刷新的原理詳解

    在配合配置中心修改配置讓應用自動刷新配置時,我們要在需要感知配置變化的bean上面加上@RereshScope。如果我們不加上這注解,那么有可能無法完成配置自動刷新。本文就來和大家講講@RereshScope刷新的原理,需要的可以參考一下
    2022-12-12
  • Java下載安裝和環(huán)境變量配置圖文教程

    Java下載安裝和環(huán)境變量配置圖文教程

    這篇文章主要為大家詳細介紹了Java下載安裝和環(huán)境變量配置圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 淺談java中HashMap鍵的比較方式

    淺談java中HashMap鍵的比較方式

    今天帶大家了解一下java中HashMap鍵的比較方式,文中有非常詳細的解釋說明及代碼示例,對正在學習java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Spring Boot整合RabbitMQ實例(Topic模式)

    Spring Boot整合RabbitMQ實例(Topic模式)

    Topic Exchange 轉(zhuǎn)發(fā)消息主要是根據(jù)通配符。接下來通過本文給大家分享Spring Boot整合RabbitMQ實例(Topic模式),需要的朋友參考下吧
    2017-04-04
  • java如何調(diào)用Groovy腳本

    java如何調(diào)用Groovy腳本

    這篇文章主要介紹了java如何調(diào)用Groovy腳本問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論