微信支付簽名處理類

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" };  
	
}

發佈了39 篇原創文章 · 獲贊 9 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章