parent
94f2a489e0
commit
9e4740027f
@ -0,0 +1,203 @@ |
|||||||
|
package com.hai.common.utils; |
||||||
|
|
||||||
|
import com.google.common.collect.Maps; |
||||||
|
import com.thoughtworks.xstream.XStream; |
||||||
|
import com.thoughtworks.xstream.io.naming.NoNameCoder; |
||||||
|
import com.thoughtworks.xstream.io.xml.XppDriver; |
||||||
|
import net.sf.cglib.beans.BeanMap; |
||||||
|
|
||||||
|
import javax.crypto.Mac; |
||||||
|
import javax.crypto.spec.SecretKeySpec; |
||||||
|
import java.security.MessageDigest; |
||||||
|
import java.security.SecureRandom; |
||||||
|
import java.util.*; |
||||||
|
|
||||||
|
public class WxUtils { |
||||||
|
|
||||||
|
private static final Random RANDOM = new SecureRandom(); |
||||||
|
|
||||||
|
private static final String SYMBOLS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 生成签名 |
||||||
|
* |
||||||
|
* @param signMaps |
||||||
|
* @return |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static String generateSign(SortedMap<String, String> signMaps, String mchKey) { |
||||||
|
StringBuffer sb = new StringBuffer(); |
||||||
|
|
||||||
|
// 字典序
|
||||||
|
for (Map.Entry signMap : signMaps.entrySet()) { |
||||||
|
String key = (String) signMap.getKey(); |
||||||
|
String value = (String) signMap.getValue(); |
||||||
|
|
||||||
|
// 为空不参与签名、参数名区分大小写
|
||||||
|
if (null != value && !"".equals(value) && !"sign".equals(key) && !"key".equals(key)) { |
||||||
|
sb.append(key).append("=").append(value).append("&"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// 拼接key
|
||||||
|
sb.append("key=").append(mchKey); |
||||||
|
// MD5加密
|
||||||
|
String sign = MD5Encode(sb.toString(), "UTF-8").toUpperCase(); |
||||||
|
return sign; |
||||||
|
} |
||||||
|
|
||||||
|
public static String generateSignSHA256(SortedMap<String, String> signMaps,String mchKey)throws Exception{ |
||||||
|
StringBuffer sb = new StringBuffer(); |
||||||
|
|
||||||
|
// 字典序
|
||||||
|
for (Map.Entry signMap : signMaps.entrySet()) { |
||||||
|
String key = (String) signMap.getKey(); |
||||||
|
String value = (String) signMap.getValue(); |
||||||
|
|
||||||
|
// 为空不参与签名、参数名区分大小写
|
||||||
|
if (null != value && !"".equals(value) && !"sign".equals(key) && !"key".equals(key)) { |
||||||
|
sb.append(key).append("=").append(value).append("&"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// 拼接key
|
||||||
|
sb.append("key=").append(mchKey); |
||||||
|
// MD5加密
|
||||||
|
String sign = HMACSHA256(sb.toString(), mchKey).toUpperCase(); |
||||||
|
return sign; |
||||||
|
} |
||||||
|
|
||||||
|
private static String byteArrayToHexString(byte b[]) { |
||||||
|
StringBuffer resultSb = new StringBuffer(); |
||||||
|
for (int i = 0; i < b.length; i++) |
||||||
|
resultSb.append(byteToHexString(b[i])); |
||||||
|
|
||||||
|
return resultSb.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
private static String byteToHexString(byte b) { |
||||||
|
int n = b; |
||||||
|
if (n < 0) |
||||||
|
n += 256; |
||||||
|
int d1 = n / 16; |
||||||
|
int d2 = n % 16; |
||||||
|
return hexDigits[d1] + hexDigits[d2]; |
||||||
|
} |
||||||
|
|
||||||
|
public static String MD5Encode(String origin, String charsetname) { |
||||||
|
String resultString = null; |
||||||
|
try { |
||||||
|
resultString = new String(origin); |
||||||
|
MessageDigest md = MessageDigest.getInstance("MD5"); |
||||||
|
if (charsetname == null || "".equals(charsetname)) |
||||||
|
resultString = byteArrayToHexString(md.digest(resultString |
||||||
|
.getBytes())); |
||||||
|
else |
||||||
|
resultString = byteArrayToHexString(md.digest(resultString |
||||||
|
.getBytes(charsetname))); |
||||||
|
} catch (Exception exception) { |
||||||
|
} |
||||||
|
return resultString; |
||||||
|
} |
||||||
|
|
||||||
|
private static final String[] hexDigits = { "0", "1", "2", "3", "4", "5", |
||||||
|
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private static HashMap<String, String> sortAsc(Map<String, String> map) { |
||||||
|
HashMap<String, String> tempMap = new LinkedHashMap<String, String>(); |
||||||
|
List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(map.entrySet()); |
||||||
|
//排序
|
||||||
|
infoIds.sort(new Comparator<Map.Entry<String, String>>() { |
||||||
|
@Override |
||||||
|
public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) { |
||||||
|
return o1.getKey().compareTo(o2.getKey()); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
for (int i = 0; i < infoIds.size(); i++) { |
||||||
|
Map.Entry<String, String> item = infoIds.get(i); |
||||||
|
tempMap.put(item.getKey(), item.getValue()); |
||||||
|
} |
||||||
|
return tempMap; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 生成 HMACSHA256 |
||||||
|
* @param data 待处理数据 |
||||||
|
* @param key 密钥 |
||||||
|
* @return 加密结果 |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static String HMACSHA256(String data, String key) throws Exception { |
||||||
|
String hash = ""; |
||||||
|
try { |
||||||
|
Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); |
||||||
|
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256"); |
||||||
|
sha256_HMAC.init(secret_key); |
||||||
|
byte[] bytes = sha256_HMAC.doFinal(data.getBytes()); |
||||||
|
hash = byteArrayToHexString(bytes); |
||||||
|
} catch (Exception e) { |
||||||
|
System.out.println("Error HmacSHA256 ===========" + e.getMessage()); |
||||||
|
} |
||||||
|
return hash.toUpperCase(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取随机字符串 Nonce Str |
||||||
|
* |
||||||
|
* @return String 随机字符串 |
||||||
|
*/ |
||||||
|
public static String makeNonStr() { |
||||||
|
char[] nonceChars = new char[32]; |
||||||
|
for (int index = 0; index < nonceChars.length; ++index) { |
||||||
|
nonceChars[index] = SYMBOLS.charAt(RANDOM.nextInt(SYMBOLS.length())); |
||||||
|
} |
||||||
|
return new String(nonceChars); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 拼接签名数据 |
||||||
|
* |
||||||
|
*/ |
||||||
|
public static String makeSign(BeanMap beanMap, String mchKey, String signType)throws Exception { |
||||||
|
SortedMap<String, String> signMaps = Maps.newTreeMap(); |
||||||
|
|
||||||
|
for (Object key : beanMap.keySet()) { |
||||||
|
Object value = beanMap.get(key); |
||||||
|
|
||||||
|
// 排除空数据
|
||||||
|
if (value == null) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
signMaps.put(key + "", String.valueOf(value)); |
||||||
|
} |
||||||
|
if(signType.equals("MD5")) { |
||||||
|
// 生成签名
|
||||||
|
return generateSign(signMaps, mchKey); |
||||||
|
}else if(signType.equals("SHA256")){ |
||||||
|
return generateSignSHA256(signMaps, mchKey); |
||||||
|
}else{ |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 数据转换为xml格式 |
||||||
|
* |
||||||
|
* @param object |
||||||
|
* @param obj |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String truncateDataToXML(Class<?> object, Object obj) { |
||||||
|
XStream xStream = new XStream(new XppDriver(new NoNameCoder())); |
||||||
|
xStream.alias("xml", object); |
||||||
|
return xStream.toXML(obj); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,162 @@ |
|||||||
|
package com.hai.model; |
||||||
|
|
||||||
|
/** |
||||||
|
* 分账请求类 |
||||||
|
*/ |
||||||
|
public class WxSharingOrderRequestModel { |
||||||
|
|
||||||
|
/** |
||||||
|
* 服务商商户号 |
||||||
|
*/ |
||||||
|
private String mch_id; |
||||||
|
|
||||||
|
/** |
||||||
|
* 子商户号 |
||||||
|
*/ |
||||||
|
private String sub_mch_id; |
||||||
|
|
||||||
|
/** |
||||||
|
* 服务商appid |
||||||
|
*/ |
||||||
|
private String appid; |
||||||
|
|
||||||
|
/** |
||||||
|
* 子商户appid |
||||||
|
*/ |
||||||
|
private String sub_appid; |
||||||
|
|
||||||
|
/** |
||||||
|
* 随机字符串 |
||||||
|
*/ |
||||||
|
private String nonce_str; |
||||||
|
|
||||||
|
/** |
||||||
|
* 签名 |
||||||
|
*/ |
||||||
|
private String sign; |
||||||
|
/** |
||||||
|
* 签名类型(只支持HMAC-SHA256) |
||||||
|
*/ |
||||||
|
private String sign_type; |
||||||
|
|
||||||
|
/** |
||||||
|
* 微信订单号 |
||||||
|
*/ |
||||||
|
private String transaction_id; |
||||||
|
|
||||||
|
/** |
||||||
|
* 商家订单号 |
||||||
|
*/ |
||||||
|
private String out_trade_no; |
||||||
|
|
||||||
|
/** |
||||||
|
* 商户分账单号(同一个单号多次提交只算一次) |
||||||
|
*/ |
||||||
|
private String out_order_no; |
||||||
|
|
||||||
|
/** |
||||||
|
* 商户分账金额(小于等于订单金额*(1-手续费)*最大分账比例) |
||||||
|
*/ |
||||||
|
private Integer amount; |
||||||
|
|
||||||
|
/** |
||||||
|
* 分账接收方列表(单次分账不能即是支付商户又是接收商户,多次分账没有限制) |
||||||
|
*/ |
||||||
|
private String receivers; |
||||||
|
|
||||||
|
public String getMch_id() { |
||||||
|
return mch_id; |
||||||
|
} |
||||||
|
|
||||||
|
public void setMch_id(String mch_id) { |
||||||
|
this.mch_id = mch_id; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSub_mch_id() { |
||||||
|
return sub_mch_id; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSub_mch_id(String sub_mch_id) { |
||||||
|
this.sub_mch_id = sub_mch_id; |
||||||
|
} |
||||||
|
|
||||||
|
public String getAppid() { |
||||||
|
return appid; |
||||||
|
} |
||||||
|
|
||||||
|
public void setAppid(String appid) { |
||||||
|
this.appid = appid; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSub_appid() { |
||||||
|
return sub_appid; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSub_appid(String sub_appid) { |
||||||
|
this.sub_appid = sub_appid; |
||||||
|
} |
||||||
|
|
||||||
|
public String getNonce_str() { |
||||||
|
return nonce_str; |
||||||
|
} |
||||||
|
|
||||||
|
public void setNonce_str(String nonce_str) { |
||||||
|
this.nonce_str = nonce_str; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSign() { |
||||||
|
return sign; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSign(String sign) { |
||||||
|
this.sign = sign; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSign_type() { |
||||||
|
return sign_type; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSign_type(String sign_type) { |
||||||
|
this.sign_type = sign_type; |
||||||
|
} |
||||||
|
|
||||||
|
public String getTransaction_id() { |
||||||
|
return transaction_id; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTransaction_id(String transaction_id) { |
||||||
|
this.transaction_id = transaction_id; |
||||||
|
} |
||||||
|
|
||||||
|
public String getOut_trade_no() { |
||||||
|
return out_trade_no; |
||||||
|
} |
||||||
|
|
||||||
|
public void setOut_trade_no(String out_trade_no) { |
||||||
|
this.out_trade_no = out_trade_no; |
||||||
|
} |
||||||
|
|
||||||
|
public String getOut_order_no() { |
||||||
|
return out_order_no; |
||||||
|
} |
||||||
|
|
||||||
|
public void setOut_order_no(String out_order_no) { |
||||||
|
this.out_order_no = out_order_no; |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getAmount() { |
||||||
|
return amount; |
||||||
|
} |
||||||
|
|
||||||
|
public void setAmount(Integer amount) { |
||||||
|
this.amount = amount; |
||||||
|
} |
||||||
|
|
||||||
|
public String getReceivers() { |
||||||
|
return receivers; |
||||||
|
} |
||||||
|
|
||||||
|
public void setReceivers(String receivers) { |
||||||
|
this.receivers = receivers; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,147 @@ |
|||||||
|
package com.hai.model; |
||||||
|
|
||||||
|
// 分账返回
|
||||||
|
public class WxSharingOrderResp { |
||||||
|
|
||||||
|
//返回状态码,通信标识,SUCCESS/FAIL
|
||||||
|
private String return_code; |
||||||
|
//返回信息,通信标识OK
|
||||||
|
private String return_msg; |
||||||
|
//业务结果,交易标识,SUCCESS/FAIL
|
||||||
|
private String result_code; |
||||||
|
//错误代码
|
||||||
|
private String err_code; |
||||||
|
//错误代码描述
|
||||||
|
private String err_code_des; |
||||||
|
//商户号
|
||||||
|
private String mch_id; |
||||||
|
//子商户号
|
||||||
|
private String sub_mch_id; |
||||||
|
//公众账号id
|
||||||
|
private String appid; |
||||||
|
|
||||||
|
private String sub_appid; |
||||||
|
|
||||||
|
//随机字符串
|
||||||
|
private String nonce_str; |
||||||
|
//签名
|
||||||
|
private String sign; |
||||||
|
//微信支付订单号
|
||||||
|
private String transaction_id; |
||||||
|
//商户分账单号(商户订单号)
|
||||||
|
private String out_order_no; |
||||||
|
//商户分账单号
|
||||||
|
private String order_id; |
||||||
|
|
||||||
|
public String getReturn_code() { |
||||||
|
return return_code; |
||||||
|
} |
||||||
|
|
||||||
|
public void setReturn_code(String return_code) { |
||||||
|
this.return_code = return_code; |
||||||
|
} |
||||||
|
|
||||||
|
public String getReturn_msg() { |
||||||
|
return return_msg; |
||||||
|
} |
||||||
|
|
||||||
|
public void setReturn_msg(String return_msg) { |
||||||
|
this.return_msg = return_msg; |
||||||
|
} |
||||||
|
|
||||||
|
public String getResult_code() { |
||||||
|
return result_code; |
||||||
|
} |
||||||
|
|
||||||
|
public void setResult_code(String result_code) { |
||||||
|
this.result_code = result_code; |
||||||
|
} |
||||||
|
|
||||||
|
public String getErr_code() { |
||||||
|
return err_code; |
||||||
|
} |
||||||
|
|
||||||
|
public void setErr_code(String err_code) { |
||||||
|
this.err_code = err_code; |
||||||
|
} |
||||||
|
|
||||||
|
public String getErr_code_des() { |
||||||
|
return err_code_des; |
||||||
|
} |
||||||
|
|
||||||
|
public void setErr_code_des(String err_code_des) { |
||||||
|
this.err_code_des = err_code_des; |
||||||
|
} |
||||||
|
|
||||||
|
public String getMch_id() { |
||||||
|
return mch_id; |
||||||
|
} |
||||||
|
|
||||||
|
public void setMch_id(String mch_id) { |
||||||
|
this.mch_id = mch_id; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSub_mch_id() { |
||||||
|
return sub_mch_id; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSub_mch_id(String sub_mch_id) { |
||||||
|
this.sub_mch_id = sub_mch_id; |
||||||
|
} |
||||||
|
|
||||||
|
public String getAppid() { |
||||||
|
return appid; |
||||||
|
} |
||||||
|
|
||||||
|
public void setAppid(String appid) { |
||||||
|
this.appid = appid; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSub_appid() { |
||||||
|
return sub_appid; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSub_appid(String sub_appid) { |
||||||
|
this.sub_appid = sub_appid; |
||||||
|
} |
||||||
|
|
||||||
|
public String getNonce_str() { |
||||||
|
return nonce_str; |
||||||
|
} |
||||||
|
|
||||||
|
public void setNonce_str(String nonce_str) { |
||||||
|
this.nonce_str = nonce_str; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSign() { |
||||||
|
return sign; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSign(String sign) { |
||||||
|
this.sign = sign; |
||||||
|
} |
||||||
|
|
||||||
|
public String getTransaction_id() { |
||||||
|
return transaction_id; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTransaction_id(String transaction_id) { |
||||||
|
this.transaction_id = transaction_id; |
||||||
|
} |
||||||
|
|
||||||
|
public String getOut_order_no() { |
||||||
|
return out_order_no; |
||||||
|
} |
||||||
|
|
||||||
|
public void setOut_order_no(String out_order_no) { |
||||||
|
this.out_order_no = out_order_no; |
||||||
|
} |
||||||
|
|
||||||
|
public String getOrder_id() { |
||||||
|
return order_id; |
||||||
|
} |
||||||
|
|
||||||
|
public void setOrder_id(String order_id) { |
||||||
|
this.order_id = order_id; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,71 @@ |
|||||||
|
package com.hai.model; |
||||||
|
|
||||||
|
/** |
||||||
|
* 分账接收方 |
||||||
|
*/ |
||||||
|
public class WxSharingReceiversVO { |
||||||
|
/** |
||||||
|
* 分账接收方类型 |
||||||
|
*/ |
||||||
|
private String type; |
||||||
|
|
||||||
|
/** |
||||||
|
* 分账接收方帐号 |
||||||
|
*/ |
||||||
|
private String account; |
||||||
|
|
||||||
|
/** |
||||||
|
* 分账金额 |
||||||
|
*/ |
||||||
|
private Integer amount; |
||||||
|
|
||||||
|
/** |
||||||
|
* 分账描述 |
||||||
|
*/ |
||||||
|
private String description; |
||||||
|
|
||||||
|
/** |
||||||
|
* 与分账方的关系类型 |
||||||
|
*/ |
||||||
|
private String relation_type; |
||||||
|
|
||||||
|
public String getType() { |
||||||
|
return type; |
||||||
|
} |
||||||
|
|
||||||
|
public void setType(String type) { |
||||||
|
this.type = type; |
||||||
|
} |
||||||
|
|
||||||
|
public String getAccount() { |
||||||
|
return account; |
||||||
|
} |
||||||
|
|
||||||
|
public void setAccount(String account) { |
||||||
|
this.account = account; |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getAmount() { |
||||||
|
return amount; |
||||||
|
} |
||||||
|
|
||||||
|
public void setAmount(Integer amount) { |
||||||
|
this.amount = amount; |
||||||
|
} |
||||||
|
|
||||||
|
public String getDescription() { |
||||||
|
return description; |
||||||
|
} |
||||||
|
|
||||||
|
public void setDescription(String description) { |
||||||
|
this.description = description; |
||||||
|
} |
||||||
|
|
||||||
|
public String getRelation_type() { |
||||||
|
return relation_type; |
||||||
|
} |
||||||
|
|
||||||
|
public void setRelation_type(String relation_type) { |
||||||
|
this.relation_type = relation_type; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue