对javabean字符串排序sign加密

本文介绍了一个用于生成统一订单签名的实用工具类,该工具通过MD5加密算法,对对象的属性进行排序并创建签名,适用于支付网关等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.wwb;

 

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.Comparator;

import java.util.HashMap;

import java.util.Map;

import java.util.TreeMap;

 

import org.apache.commons.codec.digest.DigestUtils;

import org.apache.commons.lang.StringUtils;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

/**

* Created by wangwenbo on 2018/5/24.

*/

/* 签名验证相关utilS */

public class SignUtils {

 

private static final Logger logger = LoggerFactory.getLogger(SignUtils.class);

 

private SignUtils() {

throw new IllegalAccessError("Utility class");

}

 

/**

* 将所有参数,按照属性名字符串顺序排序,返回加密后的sign值,去除可能包含的sign字段

*/

public static String createUnifiedOrderSign(Object param, String appKey) {

StringBuilder sign = new StringBuilder();

Map<String, String> map = getSortMap(param);

 

sign.append(appKey);

 

for (Map.Entry<String, String> entry : map.entrySet()) {

if (StringUtils.isNotBlank(entry.getValue())) {

sign.append(entry.getKey()).append(entry.getValue());

}

}

sign.append(appKey);

 

logger.info("加密字符串为:" + sign.toString());

System.out.println("加密字符串为:" + sign.toString());

String ans = DigestUtils.md5Hex(sign.toString()).toLowerCase();

logger.info("加密结果:" + ans);

return ans;

 

}

 

/**

* 获取排序后的类属性及值

*

* @param object

* @return

* @throws Exception

*/

private static Map<String, String> getSortMap(Object object) {

Field[] fields = object.getClass().getDeclaredFields();

Map<String, String> map = new HashMap<String, String>();

 

for (Field field : fields) {

String name = field.getName();

String methodName = "get" + name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase());

Method getter = null;

try {

getter = object.getClass().getMethod(methodName);

} catch (NoSuchMethodException e) {

logger.error("字段" + methodName + "get方法不存在", e);

}

// 调用getter方法获取属性值

String value = null;

 

if (getter != null) {

try {

value = (String) getter.invoke(object);

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvocationTargetException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

 

if (value != null) {

map.put(name, value);

}

}

 

Map<String, String> sortMap = new TreeMap<String, String>(new Comparator<String>() {

public int compare(String o1, String o2) {

return o1.compareTo(o2);

}

});

sortMap.putAll(map);

 

return sortMap;

}

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值