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

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

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

签名算法 MD5签名方式与HMAC-SHA256 java版_第1张图片

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 ObjectToMapUtil(Object obj) {
        Map map = new HashMap();
        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 sortMapByKey(Map map) {
        if (map == null || map.isEmpty()) {
            return null;
        }
        Map sortMap = new TreeMap(
                new MapKeyComparator());
        sortMap.putAll(map);
        return sortMap;
    }

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

class MapKeyComparator implements Comparator {

    @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);

 

你可能感兴趣的:(java)