最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2023年12月04日 11:14:49   作者:Wen先森  
這篇文章主要為大家介紹了Java實(shí)現(xiàn)微信支付的簽名算法實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

簽名算法

簽名生成的通用步驟如下:

第一步,設(shè)所有發(fā)送或者接收到的數(shù)據(jù)為集合M

將集合M內(nèi)非空參數(shù)值的參數(shù)按照參數(shù)名ASCII碼從小到大排序(字典序),使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特別注意重要規(guī)則

參數(shù)名ASCII碼從小到大排序(字典序);

如果參數(shù)的值為空不參與簽名;

參數(shù)名區(qū)分大小寫(xiě);

驗(yàn)證調(diào)用返回或微信主動(dòng)通知簽名時(shí),傳送的sign參數(shù)不參與簽名,將生成的簽名與該sign值作校驗(yàn)。

微信接口可能增加字段,驗(yàn)證簽名時(shí)必須支持增加的擴(kuò)展字段

第二步,在stringA最后拼接上key得到stringSignTemp字符串

并對(duì)stringSignTemp進(jìn)行MD5運(yùn)算,再將得到的字符串所有字符轉(zhuǎn)換為大寫(xiě),得到sign值signValue。

注意:密鑰的長(zhǎng)度為32個(gè)字節(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 鍵值對(duì)的格式(即 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);
        //對(duì)參數(shù)名稱進(jìn)行排序
        Collections.sort(paramNames);
        //把參數(shù)轉(zhuǎn)化成url鍵值對(duì)格式并返回
        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)換為大寫(xiě)字符
        String sign = toMd5(sbkey.toString()).toUpperCase();
        return sign;
    }
    /**
     * 對(duì)字符串進(jìn)行MD5加密
     *
     * @param str 需要加密的字符串
     * @return 小寫(xiě)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("驗(yàn)簽成功");
                return true;
            }
        } catch (Exception e) {
            log.info("驗(yàn)簽異常");
            e.printStackTrace();
        }
        log.info("驗(yàn)簽失敗");
        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加密并全部大寫(xiě)
        System.out.println("簽名內(nèi)容:"+signValue);
        // 驗(yàn)簽
        checkSign(sign, map, key);
    }
}

以上就是Java實(shí)現(xiàn)微信支付的簽名算法示例的詳細(xì)內(nèi)容,更多關(guān)于Java微信支付簽名算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java基礎(chǔ)之Unsafe內(nèi)存操作不安全類(lèi)詳解

    Java基礎(chǔ)之Unsafe內(nèi)存操作不安全類(lèi)詳解

    Java是面向?qū)ο笳Z(yǔ)言,在使用Java編程時(shí),大多數(shù)情況下都不會(huì)直接操作內(nèi)存,而且Java也不提倡直接操作內(nèi)存,但是Java中到底有沒(méi)有可以直接操作內(nèi)存的工具類(lèi)呢?有!Java中提供Unsafe類(lèi)可以用來(lái)來(lái)直接操作內(nèi)存,文中詳細(xì)介紹了Unsafe內(nèi)存操作不安全類(lèi),需要的朋友可以參考下
    2021-06-06
  • Java中的CAS(Compare-And-Swap)操作示例詳解

    Java中的CAS(Compare-And-Swap)操作示例詳解

    CAS是一種原子操作,用于在多線程環(huán)境中實(shí)現(xiàn)無(wú)鎖(lock-free)的線程安全編程,下面通過(guò)本文給大家介紹Java中的CAS(Compare-And-Swap)操作示例詳解,感興趣的朋友一起看看吧
    2025-06-06
  • java如何獲取用戶登錄ip、瀏覽器信息、SessionId

    java如何獲取用戶登錄ip、瀏覽器信息、SessionId

    這篇文章主要介紹了java如何獲取用戶登錄ip、瀏覽器信息、SessionId,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java?-jar/-cp啟動(dòng)添加外部的依賴包方式

    java?-jar/-cp啟動(dòng)添加外部的依賴包方式

    這篇文章主要介紹了java?-jar/-cp啟動(dòng)添加外部的依賴包方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java函數(shù)式編程(八):字符串及方法引用

    Java函數(shù)式編程(八):字符串及方法引用

    這篇文章主要介紹了Java函數(shù)式編程(八):字符串及方法引用,本文是系列文章的第8篇,其它文章請(qǐng)參閱本文底部的相關(guān)文章,需要的朋友可以參考下
    2014-09-09
  • SpringBoot中@RestControllerAdvice @ExceptionHandler異常統(tǒng)一處理類(lèi)失效原因分析

    SpringBoot中@RestControllerAdvice @ExceptionHandler異常統(tǒng)一處

    這篇文章主要介紹了SpringBoot中@RestControllerAdvice @ExceptionHandler異常統(tǒng)一處理類(lèi)失效原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java詳細(xì)分析梳理垃圾回收機(jī)制

    Java詳細(xì)分析梳理垃圾回收機(jī)制

    垃圾回收,顧名思義,便是將已經(jīng)分配出去的,但卻不再使用的內(nèi)存回收回來(lái),以便能夠再次分配。在?Java?虛擬機(jī)的語(yǔ)境下,垃圾指的是死亡的對(duì)象所占據(jù)的堆空間
    2022-04-04
  • 詳解SpringBoot接收參數(shù)的五種形式

    詳解SpringBoot接收參數(shù)的五種形式

    在Spring Boot中,接收參數(shù)可以通過(guò)多種方式實(shí)現(xiàn),本文給大家介紹了SpringBoot接收參數(shù)的五種形式,并通過(guò)代碼和圖文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • Feign?請(qǐng)求動(dòng)態(tài)URL方式

    Feign?請(qǐng)求動(dòng)態(tài)URL方式

    這篇文章主要介紹了Feign?請(qǐng)求動(dòng)態(tài)URL方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 解析探秘fescar分布式事務(wù)實(shí)現(xiàn)原理

    解析探秘fescar分布式事務(wù)實(shí)現(xiàn)原理

    這篇文章主要為大家解析探秘fescar分布式事務(wù)的實(shí)現(xiàn)原理,fescar的txc模型實(shí)現(xiàn)非常有研究的價(jià)值,所以今天我們來(lái)好好翻一翻fescar項(xiàng)目的代碼
    2022-02-02

最新評(píng)論

红安县| 榕江县| 香港 | 易门县| 郸城县| 汉沽区| 九台市| 昌都县| 穆棱市| 股票| 集贤县| 荥经县| 抚宁县| 辛集市| 固镇县| 澄江县| 宝鸡市| 黑山县| 南丰县| 靖远县| 普兰店市| 武定县| 怀远县| 长泰县| 龙泉市| 佳木斯市| 台东县| 石家庄市| 扎鲁特旗| 怀来县| 宜兰市| 嵊泗县| 布拖县| 汝城县| 兴文县| 长治县| 渝中区| 临沭县| 乌鲁木齐市| 丘北县| 隆林|