java生成微信Sign签名

绿林寻猫
2021-12-08 / 0 评论 / 166 阅读 / 正在检测是否收录...

目录

 

Sign签名生成方法工具类

工具类


Sign签名生成方法工具类


import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;

/**
 * 微信工具类
 * @Author: LiuYong
 * @Date:2019/12/11 11:06
 * @Description: TODO 微信工具类
 */
public class WeChatTool {
    private static Logger logger = Logger.getLogger(WeChatTool.class.getName());
    /**签名类型*/
    public static final String MD5="MD5";
    public static final String HMACSHA256="HMACSHA256";


    public static void main(String[] args) {
        Map<String,Object> map = new HashMap<>();
        map.put("appid","wxd930ea5d5a258f4f");
        map.put("auth_code","123456");
        map.put("body","test");
        map.put("device_info","123");
        map.put("mch_id","1900000109");
        System.out.println(getSign(map,WeChatConstants.KEY,WeChatTool.HMACSHA256));
    }

    /**
     * Sign签名生成方法
     * @Author LiuYong
     * @Date 2019/12/11 11:13
     * @Description TODO Sign签名生成方法
     * @param map 自定义参数
     * @param key 商户KEY
     * @param type 签名类型
     * @return 
     **/
    public static String getSign(Map<String,Object> map,String key,String type){
        StringBuilder sb = new StringBuilder();
        String result =null;
        try{
            ArrayList<String> list = new ArrayList<String>();
            for(Map.Entry<String,Object> entry:map.entrySet()){
                if(entry.getValue()!=""){
                    list.add(entry.getKey() + "=" + entry.getValue() + "&");
                }
            }
            int size = list.size();
            String [] arrayToSort = list.toArray(new String[size]);
            Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
            for(int i = 0; i < size; i ++) {
                sb.append(arrayToSort[i]);
            }
            sb.append("key=" + key);
            result = sb.toString();
            if(type.equals(MD5)){
                result=MD5(result);
            }else if(type.equals(HMACSHA256)){
                result=HMACSHA256(result,key);
            }
        }catch (Exception e){
            logger.info("ERROR com.slf.utils.utils.wechat.WeChatTool.getSign :"+e.getMessage());
            return null;
        }
        return result;
    }


    /**
     * 生成 MD5
     * @Author LiuYong
     * @Date 2019/12/11 17:08
     * @Description TODO 生成 MD5
     * @param  data 待处理数据
     * @return 加密结果
     **/
    public static String MD5(String data) {
        StringBuilder sb = new StringBuilder();
        try{
            java.security.MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] array = md.digest(data.getBytes("UTF-8"));
            for (byte item : array) {
                sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
            }
        }catch (Exception e){
            logger.info("ERROR com.slf.utils.utils.wechat.WeChatTool.MD5 :"+e.getMessage());
            return null;
        }
        return sb.toString().toUpperCase();
    }

    /**
     * 生成 HMACSHA256
     * @Author LiuYong
     * @Date 2019/12/11 17:00
     * @Description TODO 生成 HMACSHA256
     * @param data 待处理数据
     * @param key 密钥
     * @return 加密结果
     **/
    public static String HMACSHA256(String data, String key)  {
        StringBuilder sb = new StringBuilder();
        try{
            Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
            SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
            sha256_HMAC.init(secret_key);
            byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
            for (byte item : array) {
                sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
            }
        }catch (Exception e){
            logger.info("ERROR com.slf.utils.utils.wechat.WeChatTool.HMACSHA256 :"+e.getMessage());
            return null;
        }
        return sb.toString().toUpperCase();
    }

}

工具类


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.security.MessageDigest;

/**
 * Md5加密方法
 * @Author LiuYong
 * @Date 2019/12/11  11:17
 * @Description TODO Md5加密方法
 **/
public class Md5Utils
{
    private static final Logger log = LoggerFactory.getLogger(Md5Utils.class);

    private static byte[] md5(String s)
    {
        MessageDigest algorithm;
        try
        {
            algorithm = MessageDigest.getInstance("MD5");
            algorithm.reset();
            algorithm.update(s.getBytes("UTF-8"));
            byte[] messageDigest = algorithm.digest();
            return messageDigest;
        }
        catch (Exception e)
        {
            log.error("MD5 Error...", e);
        }
        return null;
    }

    private static final String toHex(byte hash[])
    {
        if (hash == null)
        {
            return null;
        }
        StringBuffer buf = new StringBuffer(hash.length * 2);
        int i;

        for (i = 0; i < hash.length; i++)
        {
            if ((hash[i] & 0xff) < 0x10)
            {
                buf.append("0");
            }
            buf.append(Long.toString(hash[i] & 0xff, 16));
        }
        return buf.toString();
    }

    public static String hash(String s)
    {
        try
        {
            return new String(toHex(md5(s)).getBytes("UTF-8"), "UTF-8");
        }
        catch (Exception e)
        {
            log.error("not supported charset...{}", e);
            return s;
        }
    }
}

 

 

 

 

 

 

 

 

 

0

评论 (0)

取消