签名算法 MD5签名方式与HMAC-SHA256 java版

对接过微信的小朋友都知道,微信接口都是需要sign的,在最新的APIv3版中,签名类型它又变了,哈哈,如图,废话不多说,直接上图。

官方文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_3

java版代码

package com.wsw.sdk.utils;

import java.lang.reflect.Field;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class MapUtils
{
    public static Map<String, String> ObjectToMapUtil(Object obj) {
        Map<String, String> map = new HashMap<String, String>();
        try {
            Field[] fields = obj.getClass().getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                if("sign".equals(fields[i].getName())){
                    continue;
                }
                Field declaredField = obj.getClass().getDeclaredField(fields[i].getName());
                declaredField.setAccessible(true);
                Object valueObj = null;
                String valueStr = null;
                if((valueObj=declaredField.get(obj))!=null
                        && StringUtils.isNotBlank(valueStr = valueObj.toString())){
                    map.put(fields[i].getName(), valueStr);
                }
            }
        }catch (Exception e){
        }
        return map;
    }


    public static Map<String, String> sortMapByKey(Map<String, String> map) {
        if (map == null || map.isEmpty()) {
            return null;
        }
        Map<String, String> sortMap = new TreeMap<String, String>(
                new MapKeyComparator());
        sortMap.putAll(map);
        return sortMap;
    }

    public static String getObjectMD5Sign(Object in, String key) {
        Map<String, String> map = MapUtils.ObjectToMapUtil(in);
        Map<String, String> sortMap = MapUtils.sortMapByKey(map);
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, String> entry : sortMap.entrySet()) {
            sb.append(entry.getKey() + "=" + entry.getValue() + "&");
        }
        sb.append("key=" + key);
        return Md5Utils.getMD5(sb.toString());
    }

    public static String getObjectHMACSHA256Sign(Object in, String key) {
        Map<String, String> map = MapUtils.ObjectToMapUtil(in);
        Map<String, String> sortMap = MapUtils.sortMapByKey(map);
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, String> entry : sortMap.entrySet()) {
            sb.append(entry.getKey() + "=" + entry.getValue() + "&");
        }
        sb.append("key=" + key);
        return HMACSHA256Utils.sha256_HMAC(sb.toString(),key);
    }
}

class MapKeyComparator implements Comparator<String> {

    @Override
    public int compare(String str1, String str2) {
        return str1.compareTo(str2);
    }
}

调用示例:

MD5:objec为待加签内容,mch_key为商户API密钥

      //生成签名
        String sign = MapUtils.getObjectMD5Sign(object,mch_key);

HMAC-SHA256签名方式:objec为待加签内容,APIv3密钥

        //生成签名
        String sign = MapUtils.getObjectHMACSHA256Sign(object,mch_key);
发布了4 篇原创文章 · 获赞 10 · 访问量 206

猜你喜欢

转载自blog.csdn.net/w1170384758/article/details/105393913
今日推荐