#752 修复微信支付拉取支付评价的接口(limit不参与签名)

This commit is contained in:
Binary Wang
2018-09-09 12:10:15 +08:00
parent cc6dd65671
commit df8dcb003c
13 changed files with 236 additions and 128 deletions

View File

@@ -1,5 +1,18 @@
package com.github.binarywang.wxpay.util;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.result.BaseWxPayResult;
import com.github.binarywang.wxpay.constant.WxPayConstants.SignType;
@@ -7,12 +20,6 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.*;
/**
* <pre>
@@ -25,7 +32,7 @@ import java.util.*;
@Slf4j
public class SignUtils {
/**
* 请参考并使用 {@link #createSign(Object, String, String, boolean)}.
* 请参考并使用 {@link #createSign(Object, String, String, String[])}.
*/
@Deprecated
public static String createSign(Object xmlBean, String signKey) {
@@ -33,45 +40,43 @@ public class SignUtils {
}
/**
* 请参考并使用 {@link #createSign(Map, String, String, boolean)}.
* 请参考并使用 {@link #createSign(Map, String, String, String[])} .
*/
@Deprecated
public static String createSign(Map<String, String> params, String signKey) {
return createSign(params, null, signKey, false);
return createSign(params, null, signKey, new String[0]);
}
/**
* 微信支付签名算法(详见:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3).
*
* @param xmlBean Bean里的属性如果存在XML注解则使用其作为key否则使用变量名
* @param signType 签名类型如果为空则默认为MD5
* @param signKey 签名Key
* @param isIgnoreSignType 签名时是否忽略signType
* @param xmlBean Bean里的属性如果存在XML注解则使用其作为key否则使用变量名
* @param signType 签名类型如果为空则默认为MD5
* @param signKey 签名Key
* @param ignoredParams 签名时需要忽略的特殊参数
* @return 签名字符串
*/
public static String createSign(Object xmlBean, String signType, String signKey, boolean isIgnoreSignType) {
return createSign(xmlBean2Map(xmlBean), signType, signKey, isIgnoreSignType);
public static String createSign(Object xmlBean, String signType, String signKey, String[] ignoredParams) {
return createSign(xmlBean2Map(xmlBean), signType, signKey, ignoredParams);
}
/**
* 微信支付签名算法(详见:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3).
*
* @param params 参数信息
* @param signType 签名类型如果为空则默认为MD5
* @param signKey 签名Key
* @param ignoreSignType 签名时是否忽略signType
* @param params 参数信息
* @param signType 签名类型如果为空则默认为MD5
* @param signKey 签名Key
* @param ignoredParams 签名时需要忽略的特殊参数
* @return 签名字符串
*/
public static String createSign(Map<String, String> params, String signType, String signKey, boolean ignoreSignType) {
public static String createSign(Map<String, String> params, String signType, String signKey, String[] ignoredParams) {
SortedMap<String, String> sortedMap = new TreeMap<>(params);
StringBuilder toSign = new StringBuilder();
for (String key : sortedMap.keySet()) {
String value = params.get(key);
boolean shouldSign = false;
if (ignoreSignType && "sign_type".equals(key)) {
shouldSign = false;
} else if (StringUtils.isNotEmpty(value)
if (StringUtils.isNotEmpty(value) && !ArrayUtils.contains(ignoredParams, key)
&& !Lists.newArrayList("sign", "key", "xmlString", "xmlDoc", "couponList").contains(key)) {
shouldSign = true;
}
@@ -110,12 +115,12 @@ public class SignUtils {
* @return true - 签名校验成功false - 签名校验失败
*/
public static boolean checkSign(Map<String, String> params, String signType, String signKey) {
String sign = createSign(params, signType, signKey, false);
String sign = createSign(params, signType, signKey, new String[0]);
return sign.equals(params.get("sign"));
}
/**
* 将bean按照@XStreamAlias标识的字符串内容生成以之为key的map对象
* 将bean按照@XStreamAlias标识的字符串内容生成以之为key的map对象.
*
* @param bean 包含@XStreamAlias的xml bean对象
* @return map对象