对接过微信的小朋友都知道,微信接口都是需要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);