1.獲得隨機字符串
2.獲取本機ip
3.對象轉xml'
4.xml轉map
5.H5Order轉map
6.微信二次簽名
7.簽名算法
8.byte數組轉hexString
9.md5加密
10.hex數值
package com.yqs.pay.util;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.UUID;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import com.dev.util.time.TimeUtil;
import com.thoughtworks.xstream.XStream;
import com.yqs.pay.constant.Constant;
import com.yqs.pay.entity.H5Order;
public class WechatUtil {
private static XStream xstream = new XStream();
/** 獲取本機IP地址*/
public static String getIpAddr() {
try {
return InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
return null;
}
}
/** 獲取隨機字符串 */
public static String getNnoceStr(){
try{
return UUID.randomUUID().toString().replace("-", "");
}catch(Exception e){
e.printStackTrace();
return null;
}
}
/**對象轉XML格式字符串*/
public static String objToXML(Object obj){
try{
xstream.alias("xml",obj.getClass());
return xstream.toXML(obj).replace("__", "_");
}catch(Exception ex){
ex.printStackTrace();
return null;
}
}
/**XML格式字符串轉map*/
@SuppressWarnings("unchecked")
public static Map<String,String> xmlToMap(String xmlStr){
Map<String, String> map = null;
try{
map = new HashMap<String, String>();
Document document = DocumentHelper.parseText(xmlStr);
Element root = document.getRootElement();
List<Element> elementList = root.elements();
for (Element e : elementList)
map.put(e.getName(), e.getText());
}catch(Exception ex){
ex.printStackTrace();
return null;
}
return map;
}
/**
* 創建微信預賬單簽名
* @param order
* @return
*/
public static String getWechatH5OrderSign(H5Order order){
SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();
parameters.put("appid", order.getAppid());
parameters.put("mch_id", order.getMch_id());
parameters.put("nonce_str", order.getNonce_str());
parameters.put("body", order.getBody());
parameters.put("out_trade_no", order.getOut_trade_no());
parameters.put("total_fee",order.getTotal_fee()+"");
parameters.put("spbill_create_ip", order.getSpbill_create_ip());
parameters.put("notify_url", order.getNotify_url());
parameters.put("trade_type", order.getTrade_type());
if(order.getOpenid()!=null&&order.getOpenid().trim().length()!=0){
parameters.put("openid", order.getOpenid());
return WechatUtil.createSign(parameters,order.getOpenid());
}
return WechatUtil.createSign(parameters,null);
}
public static SortedMap<Object,Object> getWechatOrderClientInfo(String appid,String mch_id,String prepayID){
SortedMap<Object,Object> parameters = null;
if(prepayID == null || prepayID.trim().length() == 0){
return parameters;
}
parameters = new TreeMap<Object,Object>();
parameters.put("appid",appid);
parameters.put("partnerid",mch_id);
parameters.put("prepayid", prepayID);
parameters.put("package", "Sign=WXPay");
parameters.put("noncestr", WechatUtil.getNnoceStr());
parameters.put("timestamp", TimeUtil.getNowLong()/1000+"");
String sign = WechatUtil.createSign(parameters,null);
parameters.put("sign", sign);
parameters.remove("package");
parameters.put("package1", "Sign=WXPay");
return parameters;
}
public static SortedMap<Object,Object> getWechatOrderH5Info(String appid,String mch_id,String prepayID){
SortedMap<Object,Object> parameters = null;
if(prepayID == null || prepayID.trim().length() == 0){
return parameters;
}
parameters = new TreeMap<Object,Object>();
parameters.put("appId", appid);
parameters.put("timeStamp", TimeUtil.getNowLong().toString());
parameters.put("nonceStr", WechatUtil.getNnoceStr());
parameters.put("package", "prepay_id="+prepayID);
parameters.put("signType", "MD5");
String sign = WechatUtil.createSign(parameters,"openid");
parameters.put("sign", sign);
parameters.remove("package");
parameters.put("package1", "prepay_id="+prepayID);
return parameters;
}
/**
* 微信支付簽名算法sign
* @param characterEncoding
* @param parameters
* @return
*/
@SuppressWarnings("rawtypes")
public static String createSign(SortedMap<Object,Object> parameters,String openid){
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();//所有參與傳參的參數按照accsii排序(升序)
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
if(null != v && !"".equals(v)
&& !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
if(openid==null)
sb.append("key=" + Constant.key);
else
sb.append("key=" + Constant.ApiKey);
String sign = WechatUtil.MD5Encode(sb.toString(), Constant.characterEncoding).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" };
}