JAVA 后端微信支付(附代码)

之前做微信支付,在网上找了好多教程感觉都不太详细。下面是本人做完支付功能后的一个小结。后面会有微信退款详细步骤

 

1.统一下单

参考官方API:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

2.准备工作

首先需要在微信商户平台申请 账户参数 appid、mch_id、key、secret等参数。具体申请步骤这里不再赘述

3.发起微信支付

	@RequestMapping(value="/wxPay", method = RequestMethod.POST)
	public void wxPay(HttpServletRequest request,HttpServletResponse response,String orderNo,String token) throws Exception{	
		
		System.out.println("开始支付");
		System.out.println("请求参数orderNo:"+orderNo+"token:"+token);
		String appid = WeixinUtil.appid;                                           
		String mch_id = WeixinUtil.mch_id;                                         
		String mch_key = WeixinUtil.mch_key;                                       
		//jsapi接口初始化                                                          
		RequestHandler requestHandler=new RequestHandler(request, response);       
		XMLHelper xh;                                                              
		requestHandler.init();                                                     
		requestHandler.init(appid, mch_key);                                       
		GoodsOrder goodsOrder=orderService.getOrderByNo(orderNo);     
		if(goodsOrder.getOrderStatus() == OrderStatus.ORDER_PAY_NO){
			System.out.println("根据订单查询金额:"+goodsOrder);
			Double amount=goodsOrder.getPayAmount();             
			String totalFee=BigDecimal.valueOf(amount).multiply(new BigDecimal(100)).setScale(0,BigDecimal.ROUND_HALF_UP) + "";
			//随机字符串
			String noncestr = Sha1Util.getNonceStr();
			//时间串
			String timestamp = Sha1Util.getTimeStamp();
			//回调地址,需要改成自己的
			String notify=WebUtils.getServerPath(request)+"/vue/wx/notify.ohtml";
			System.out.println("回调地址:"+notify);
			//===============
			//已支付接口参数
			//===============
			requestHandler.setParameter("appid", appid);  //公众号	必填
			requestHandler.setParameter("mch_id", mch_id);  //商户号	必填
			requestHandler.setParameter("nonce_str", noncestr);  //随机字符串	必填
			requestHandler.setParameter("body", "商品订单");  //商品描述	必填
			requestHandler.setParameter("out_trade_no", orderNo);  //商户系统内部的订单号 必填
			requestHandler.setParameter("total_fee", totalFee);  //订单总金额,单位为分不能带小数点	必填
			requestHandler.setParameter("spbill_create_ip", "116.226.20.188");  //订单生成的机器IP	必填
//			requestHandler.setParameter("spbill_create_ip", "101.229.233.216");  //订单生成的机器IP	必填
			requestHandler.setParameter("notify_url", notify);  //接收支付成功通必填
			requestHandler.setParameter("trade_type", "JSAPI");  //支付类型	必填
			requestHandler.setParameter("openid", token);  //用户唯一标识(trade_type为JSAPI时必填)
			//参数转换为xml格式
			String xmlParams=requestHandler.getRequestURL();
			//预支付提交地址
			String url="https://api.mch.weixin.qq.com/pay/unifiedorder";
			//预支付请求
			String json=HttpRequestHelper.postData(url, xmlParams, "utf-8");
			System.out.println("参数信息"+json);
			//转换为xml
			xh=new XMLHelper(json,"UTF-8");
			
			// 将解析结果存储在HashMap中
	        Map map = PayUtil.doXMLParse(json);
	        String return_code = (String) map.get("return_code");//返回状态码
	        System.out.println("return_code的值是"+return_code);	       
	        
			//预支付id
			String prepay_id = xh.readByName("prepay_id");
			//获取package包
			String packageValue = "prepay_id="+prepay_id;
			//微信支付参数
			SortedMap<String, String> signParams = new TreeMap<String, String>();
			signParams.put("appId", appid);
			signParams.put("nonceStr", noncestr);
			signParams.put("package", packageValue);
			signParams.put("timeStamp", timestamp);
			signParams.put("signType", "MD5");
			//生成支付签名
			String sign = requestHandler.createSign(signParams);
			//增加非参与签名的额外参数
			signParams.put("paySign", sign);
			StringBuffer sb = new StringBuffer();
			sb.append("{");
			sb.append("\"appId\":\"");sb.append(appid);sb.append("\",");
			sb.append("\"timeStamp\":\"");sb.append(timestamp);sb.append("\",");
			sb.append("\"nonceStr\":\"");sb.append(noncestr);sb.append("\",");
			sb.append("\"package\":\"");sb.append(packageValue);sb.append("\",");
			sb.append("\"signType\":\"");sb.append("MD5");sb.append("\",");
			sb.append("\"paySign\":\"");sb.append(sign);sb.append("\"");
			sb.append("}");
			System.out.println("前台输出"+sb.toString());
			WebUtils.toPageJson(response, sb.toString());
		}
	}

4.支付回调

@SuppressWarnings({ "static-access", "unused" })
	@RequestMapping(value="/notify.ohtml",method = RequestMethod.POST)
    public void notify(HttpServletRequest request,HttpServletResponse response ) throws Exception
    {
		System.out.println("支付回调");

		//解析xml
		InputStream a=request.getInputStream();
		BufferedReader reader = new BufferedReader(new InputStreamReader(a,"UTF-8"));    
		StringBuilder sb = new StringBuilder();    
		String line = null;    
		while ((line = reader.readLine()) != null) {    
			sb.append(line);    
		}
		//xml帮助类
		XMLHelper xh=new XMLHelper(sb.toString(),"UTF-8");
		System.out.println("返回的参数:"+sb.toString());
		//订单号
		String orderNo = xh.readByName("out_trade_no");
		String tradeNo = xh.readByName("transaction_id");
		String totalFee = xh.readByName("total_fee");
		//状态码
		String resultCode = xh.readByName("result_code");
		String sign = xh.readByName("sign");
		ResponseHandler rsh=new ResponseHandler();
		String mySign=rsh.createSign(rsh.parseXml(sb.toString()));
		
		System.out.println("订单号:"+orderNo+",状态码:"+resultCode+",sign签名:"+sign+",mySign签名"+mySign);
		if(resultCode.equals("SUCCESS")&&sign.equals(mySign)){
			System.out.println("进成功判断了");
			BigDecimal amount=(new BigDecimal(totalFee)).divide(new BigDecimal("100")).setScale(2,BigDecimal.ROUND_HALF_UP);//微信支付的单位是分 转化为元 保留两位小数
			WebUtils.toPageText(response, "success");
			
			//更改订单状态,修改支付时间
			long payTime = new Date().getTime();
			Map<String,Object> map = new HashMap<String,Object>();
			map.put("orderNo", orderNo);
			map.put("orderStatus", 4);
			map.put("payTime", payTime);
			map.put("tradeNo", tradeNo);
			goodsOrderManageService.updateOrderStatusByOrderNo(map);
		}else{
			System.out.println("进失败判断了");
			WebUtils.toPageText(response, "fail");
		}
    }

下面是所用到的工具类

package com.hhz.basic.util.weixin;



import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hhz.basic.util.common.XMLHelper;



/*
 '微信支付服务器签名支付请求请求类
 '============================================================================
 'api说明:
 'init(app_id, app_secret, partner_key, app_key);
 '初始化函数,默认给一些参数赋值,如cmdno,date等。
 'setKey(key_)'设置商户密钥
 'getLasterrCode(),获取最后错误号
 'GetToken();获取Token
 'getTokenReal();Token过期后实时获取Token
 'createMd5Sign(signParams);生成Md5签名
 'genPackage(packageParams);获取package包
 'createSHA1Sign(signParams);创建签名SHA1
 'sendPrepay(packageParams);提交预支付
 'getDebugInfo(),获取debug信息
 '============================================================================
 '*/
public class RequestHandler {
	/** Token获取网关地址地址 */
	private String tokenUrl;
	/** 预支付网关url地址 */
	private String gateUrl;
	/** 查询支付通知网关URL */
	private String notifyUrl;
	/** 商户参数 */
	private String appid;
	private String appkey;
	private String partnerkey;
	private String appsecret;
	private String key;
	/** 请求的参数 */
	private SortedMap parameters;
	/** Token */
	private String Token;
	private String charset;
	/** debug信息 */
	private String debugInfo;
	private String last_errcode;

	private HttpServletRequest request;

	private HttpServletResponse response;

	/**
	 * 初始构造函数。
	 * 
	 * @return
	 */
	public RequestHandler(HttpServletRequest request,
			HttpServletResponse response) {
		this.last_errcode = "0";
		this.request = request;
		this.response = response;
		this.charset = "UTF-8";
		this.parameters = new TreeMap();
		
	}

	/**
	 * 初始化函数。
	 */
	public void init(String app_id, String app_secret) {
		this.last_errcode = "0";
		this.Token = "token_";
		this.debugInfo = "";
		this.appid = app_id;
		this.appsecret = app_secret;
	}

	public void init() {
	}

	/**
	 * 获取最后错误号
	 */
	public String getLasterrCode() {
		return last_errcode;
	}

	/**
	 *获取入口地址,不包含参数值
	 */
	public String getGateUrl() {
		return gateUrl;
	}

	/**
	 * 获取参数值
	 * 
	 * @param parameter
	 *            参数名称
	 * @return String
	 */
	public String getParameter(String parameter) {
		String s = (String) this.parameters.get(parameter);
		return (null == s) ? "" : s;
	}
	
	public void setParameter(String parameter, String parameterValue) {
        String v = "";
        if(null != parameterValue) {
            v = parameterValue.trim();
        }
        this.parameters.put(parameter, v);
    }
	
	/**
	 * @Description:组装微信预支付xml参数
	 * @return
	 * @throws UnsupportedEncodingException     
	 * @return String   返回类型
	 * @author Qiu
	 */
	public String getRequestURL() throws UnsupportedEncodingException {        
        createSign();        
        StringBuffer sb = new StringBuffer();
        sb.append("<xml>");
        String enc = TenpayUtil.getCharacterEncoding(this.request, this.response);
        Set es = this.parameters.entrySet();
        Iterator it = es.iterator();
        while(it.hasNext()) {
            Map.Entry entry = (Map.Entry)it.next();
            String k = (String)entry.getKey();
            String v = (String)entry.getValue();
            if ("attach".equalsIgnoreCase(k)||"body".equalsIgnoreCase(k)||"sign".equalsIgnoreCase(k)) {
                sb.append("<"+k+">"+"<![CDATA["+v+"]]></"+k+">");
            }else {
                sb.append("<"+k+">"+v+"</"+k+">");
            }
        }
        sb.append("</xml>");
        return sb.toString();
    }

	protected void createSign() {
        StringBuffer sb = new StringBuffer();
        Set es = this.parameters.entrySet();
        Iterator it = es.iterator();
        while(it.hasNext()) {
            Map.Entry entry = (Map.Entry)it.next();
            String k = (String)entry.getKey();
            String v = (String)entry.getValue();
            if(null != v && !"".equals(v)
                    && !"sign".equals(k) && !"key".equals(k)) {
                sb.append(k + "=" + v + "&");
            }
        }
        sb.append("key=" + this.getKey()); //自己的API密钥      
        String enc = TenpayUtil.getCharacterEncoding(this.request, this.response);
        String sign = MD5Util.MD5Encode(sb.toString(), enc).toUpperCase();
        this.setParameter("sign", sign);              
    }
	
	 //设置密钥
	
	public void setKey(String key) {
		this.partnerkey = key;
	}
	//设置微信密钥
	public void  setAppKey(String key){
		this.appkey = key;
	}
	
	// 特殊字符处理
	public String UrlEncode(String src) throws UnsupportedEncodingException {
		return URLEncoder.encode(src, this.charset).replace("+", "%20");
	}

	/**
	 * 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
	 */
	public String  createSign(SortedMap<String, String> packageParams) {
		StringBuffer sb = new StringBuffer();
		Set es = packageParams.entrySet();
		Iterator it = es.iterator();
		while (it.hasNext()) {
			Map.Entry entry = (Map.Entry) it.next();
			String k = (String) entry.getKey();
			String v = (String) entry.getValue();
			if (null != v && !"".equals(v) && !"sign".equals(k)
					&& !"key".equals(k)) {
				sb.append(k + "=" + v + "&");
			}
		}
		sb.append("key=" + this.getKey());
		String sign = MD5Util.MD5Encode(sb.toString(), this.charset).toUpperCase(); //进行MD5运算,再将得到得字符串转化为大写
		return sign;

	}

	
	public static SortedMap<String, String> parseXml(String xml) 
	throws Exception {
	    // 解析结果存储在HashMap
		SortedMap<String, String> m=new TreeMap<String,String>();
		XMLHelper xh=new XMLHelper(xml.toString(),"UTF-8");
		Map<String,String> map=xh.readXMLMapByName("xml");
		for(String k : map.keySet()){
			m.put(k,map.get(k));
		}
	 
	    return m;
	}

    //输出XML
	   public String parseXML() {
		   StringBuffer sb = new StringBuffer();
	       sb.append("<xml>");
	       Set es = this.parameters.entrySet();
	       Iterator it = es.iterator();
	       while(it.hasNext()) {
				Map.Entry entry = (Map.Entry)it.next();
				String k = (String)entry.getKey();
				String v = (String)entry.getValue();
				if(null != v && !"".equals(v) && !"appkey".equals(k)) {
					
					sb.append("<" + k +">" + getParameter(k) + "</" + k + ">\n");
				}
			}
	       sb.append("</xml>");
			return sb.toString();
		}

	/**
	 * 设置debug信息
	 */
	protected void setDebugInfo(String debugInfo) {
		this.debugInfo = debugInfo;
	}
	public void setPartnerkey(String partnerkey) {
		this.partnerkey = partnerkey;
	}
	public String getDebugInfo() {
		return debugInfo;
	}
	public String getKey() {
		return appsecret;
	}

}

XML解析工具

package com.hhz.basic.util.common;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
 * xml解析工具类
 * @author Enjoy
 * @since 2011.12.17
 */
public class XMLHelper {
	DocumentBuilderFactory factory = null;   
    DocumentBuilder builder =null;
    Document document = null;
    Element element = null;
    
	public XMLHelper(String xmlStr){
		factory = DocumentBuilderFactory.newInstance();   
		try {
		builder = factory.newDocumentBuilder();
		document = builder.parse(new ByteArrayInputStream((xmlStr.getBytes("GBK"))));   
		element = document.getDocumentElement();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public XMLHelper(String xmlStr,String encode){
		factory = DocumentBuilderFactory.newInstance();   
		try {
		builder = factory.newDocumentBuilder();
		document = builder.parse(new ByteArrayInputStream((xmlStr.getBytes(encode))));   
		element = document.getDocumentElement();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 解析xml返回所需key下的所有元素的文本值(只有一个名字为key的元素)
	 * @param key element的标签名
	 * @return key元素的所有子集元素的文本值
	 */
	public Map<String,String> readXMLText(String key){
		Map<String,String> map = new HashMap<String,String>();
		NodeList recordNodes = element.getElementsByTagName(key);
		NodeList childNodes = null;
		 Node node = null;
		 node = recordNodes.item(0);
		 childNodes = node.getChildNodes();//得到子元素
		 map = new HashMap<String,String>();
		 for(int j=0;j<childNodes.getLength();j++){
			 if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){//必须是element类型的
				 map.put(childNodes.item(j).getNodeName(), childNodes.item(j).getFirstChild() == null ? "" :childNodes.item(j).getFirstChild().getNodeValue());
			 }
		 }
		 return map;
	}
	/**
	 * 解析xml
	 * @param key element的标签名
	 * @return key元素的所有子集元素的文本值
	 */
	public String readXMLByName(String key){
		return element.getFirstChild().getNodeValue();
	}
	/**
	 * 解析xml 获得最低
	 * @param key element的标签名
	 * @return key元素的所有子集元素的文本值
	 */
	public String readByName(String key){
		NodeList recordNodes = element.getElementsByTagName(key);
		String xmlText=recordNodes.item(0).getFirstChild().getNodeValue();
		 return xmlText;
	}
	/**
	 * 解析xml
	 * @param key element的标签名
	 * @return key元素的所有子集元素的文本值
	 */
	public Map<String,String> readXMLMapByName(String key){
		NodeList list=element.getChildNodes();
		Map<String,String> map=new HashMap<String,String>();
		 for(int i=0;i<list.getLength();i++){
			 if(list.item(i)==null||list.item(i).getFirstChild()==null){
				 continue;
			 }else{
				 map.put(list.item(i).getNodeName(),list.item(i).getFirstChild().getNodeValue());
			 }
		}
		 return map;
	}
	/**
	 * 解析xml返回所需xml下所有元素的列表(有多个名字为key的元素)
	 * @param key element的标签名
	 * @return key元素的所有子集元素的文本值集合
	 */
	public List<Map<String,String>> readXMLList(String key){
		List<Map<String,String>> list = new ArrayList<Map<String,String>>();
		Map<String,String> map = null;
		
		NodeList recordNodes = element.getElementsByTagName(key);
		NodeList childNodes = null;
		 Node node = null;
		 for(int i=0;i<recordNodes.getLength();i++){
			 node = recordNodes.item(i);
			 childNodes = node.getChildNodes();//得到子元素
			 map = new HashMap<String,String>();
			 for(int j=0;j<childNodes.getLength();j++){
				 if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){//必须是element类型的
					 map.put(childNodes.item(j).getNodeName(), childNodes.item(j).getFirstChild() == null ? "" :childNodes.item(j).getFirstChild().getNodeValue());
				 }
			 }
			 list.add(map);
		 }
		 return list;
	}
	public static void main(String[] arg){
		
		StringBuffer sb = new StringBuffer();
	String xml="<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg><appid><![CDATA[wxd88ec4864ec6b776]]></appid><mch_id><![CDATA[1244143202]]></mch_id><nonce_str><![CDATA[LLuqI6C2zr8sVsMF]]></nonce_str><sign><![CDATA[C10BABFB3025CBB6C861ED7050CF26E0]]></sign><result_code><![CDATA[SUCCESS]]></result_code><transaction_id><![CDATA[1004920996201506130247214508]]></transaction_id><out_trade_no><![CDATA[ZY20150613222200001]]></out_trade_no><out_refund_no><![CDATA[201506132223181434205398974]]></out_refund_no><refund_id><![CDATA[2004920996201506130009713926]]></refund_id><refund_channel><![CDATA[]]></refund_channel><refund_fee>301</refund_fee><coupon_refund_fee>0</coupon_refund_fee><total_fee>301</total_fee><coupon_refund_count>0</coupon_refund_count><cash_refund_fee>301</cash_refund_fee></xml>";
	XMLHelper x=new XMLHelper(xml);
	System.out.println(x.readByName("return_code"));
	Map<String,String> map = x.readXMLMapByName("xml");
		for(String k : map.keySet()){
			System.out.println(k+"-"+map.get(k));
		}
		
		
//		String xml="<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+
//		"<response>"+
//		  "<a>1002</a>"+
//		  "<b>身份信息错误</b>"+
//		  "<c>true</c>"+
//		 "</response>";
//		XMLHelper xh=new XMLHelper(xml.toString(),"UTF-8");
//		System.out.println(xh.readXMLByName("c"));
	}
}

PayUtil

package com.hhz.utils.weixin;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.SignatureException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.codec.digest.DigestUtils;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilderFactory;

public class PayUtil {

    /**
     * 签名字符串
     * @param //text需要签名的字符串
     * @param key 密钥
     * @param //input_charset编码格式
     * @return 签名结果
     */
    public static String sign(String text, String key, String input_charset) {
        text = text + "&key=" + key;
        return DigestUtils.md5Hex(getContentBytes(text, input_charset));
    }
    /**
     * 签名字符串
     *  @param //text需要签名的字符串
     * @param sign 签名结果
     * @param //key密钥
     * @param input_charset 编码格式
     * @return 签名结果
     */
    public static boolean verify(String text, String sign, String key, String input_charset) {
        text = text + key;
        String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset));
        if (mysign.equals(sign)) {
            return true;
        } else {
            return false;
        }
    }
    /**
     * @param content
     * @param charset
     * @return
     * @throws SignatureException
     * @throws UnsupportedEncodingException
     */
    public static byte[] getContentBytes(String content, String charset) {
        if (charset == null || "".equals(charset)) {
            return content.getBytes();
        }
        try {
            return content.getBytes(charset);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
        }
    }

    private static boolean isValidChar(char ch) {
        if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
            return true;
        if ((ch >= 0x4e00 && ch <= 0x7fff) || (ch >= 0x8000 && ch <= 0x952f))
            return true;// 简体中文汉字编码
        return false;
    }
    /**
     * 除去数组中的空值和签名参数
     * @param sArray 签名参数组
     * @return 去掉空值与签名参数后的新签名参数组
     */
    public static Map<String, String> paraFilter(Map<String, String> sArray) {
        Map<String, String> result = new HashMap<String, String>();
        if (sArray == null || sArray.size() <= 0) {
            return result;
        }
        for (String key : sArray.keySet()) {
            String value = sArray.get(key);
            if (value == null || value.equals("") || key.equalsIgnoreCase("sign")
                    || key.equalsIgnoreCase("sign_type")) {
                continue;
            }
            result.put(key, value);
        }
        return result;
    }
    /**
     * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
     * @param params 需要排序并参与字符拼接的参数组
     * @return 拼接后字符串
     */
    public static String createLinkString(Map<String, String> params) {
        List<String> keys = new ArrayList<String>(params.keySet());
        Collections.sort(keys);
        String prestr = "";
        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            String value = params.get(key);
            if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符
                prestr = prestr + key + "=" + value;
            } else {
                prestr = prestr + key + "=" + value + "&";
            }
        }
        return prestr;
    }
    /**
     *
     * @param //requestUrl请求地址
     * @param //requestMethod请求方法
     * @param //outputStr参数
     */
    public static String httpRequest(String requestUrl,String requestMethod,String outputStr){
        // 创建SSLContext
        StringBuffer buffer = null;
        try{
            URL url = new URL(requestUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod(requestMethod);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.connect();
            //往服务器端写内容
            if(null !=outputStr){
                OutputStream os=conn.getOutputStream();
                os.write(outputStr.getBytes("utf-8"));
                os.close();
            }
            // 读取服务器端返回的内容
            InputStream is = conn.getInputStream();
            InputStreamReader isr = new InputStreamReader(is, "utf-8");
            BufferedReader br = new BufferedReader(isr);
            buffer = new StringBuffer();
            String line = null;
            while ((line = br.readLine()) != null) {
                buffer.append(line);
            }
            br.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        return buffer.toString();
    }
    public static String urlEncodeUTF8(String source){
        String result=source;
        try {
            result=java.net.URLEncoder.encode(source, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。
     * @param strxml
     * @return
     * @throws JDOMException
     * @throws IOException
     */
    public static Map doXMLParse(String strxml) throws Exception {
        if(null == strxml || "".equals(strxml)) {
            return null;
        }
        /*=============  !!!!注意,修复了微信官方反馈的漏洞,更新于2018-10-16  ===========*/
        try {
            Map<String, String> data = new HashMap<String, String>();
            // TODO 在这里更换
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
            documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
            documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
            documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
            //documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
            documentBuilderFactory.setXIncludeAware(false);
            documentBuilderFactory.setExpandEntityReferences(false);

            InputStream stream = new ByteArrayInputStream(strxml.getBytes("UTF-8"));
            org.w3c.dom.Document doc = documentBuilderFactory.newDocumentBuilder().parse(stream);
            doc.getDocumentElement().normalize();
            NodeList nodeList = doc.getDocumentElement().getChildNodes();
            for (int idx = 0; idx < nodeList.getLength(); ++idx) {
                Node node = nodeList.item(idx);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    org.w3c.dom.Element element = (org.w3c.dom.Element) node;
                    data.put(element.getNodeName(), element.getTextContent());
                }
            }
            try {
                stream.close();
            } catch (Exception ex) {
                // do nothing
            }
            return data;
        } catch (Exception ex) {
            throw ex;
        }
    }
    /**
     * 获取子结点的xml
     * @param children
     * @return String
     */
    public static String getChildrenText(List children) {
        StringBuffer sb = new StringBuffer();
        if(!children.isEmpty()) {
            Iterator it = children.iterator();
            while(it.hasNext()) {
                Element e = (Element) it.next();
                String name = e.getName();
                String value = e.getTextNormalize();
                List list = e.getChildren();
                sb.append("<" + name + ">");
                if(!list.isEmpty()) {
                    sb.append(getChildrenText(list));
                }
                sb.append(value);
                sb.append("</" + name + ">");
            }
        }

        return sb.toString();
    }
    public static InputStream String2Inputstream(String str) {
        return new ByteArrayInputStream(str.getBytes());
    }


}

WebUtil

package com.hhz.basic.util.common;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * request response封装
 * @version 2016/06/09
 *
 */
public class WebUtils{
	// 从session里取值
	
	public static Object getSessionAttribute(HttpServletRequest request, String name)
	{
		HttpSession session = request.getSession(false);
		return ((session != null) ? session.getAttribute(name) : null);
	}
	// 把值放入session 
	public static void removeSessionAttribute(HttpServletRequest request, String name)
	{
		request.getSession().removeAttribute(name);
	}
	// 把值放入session 
	public static void clearSessionAttribute(HttpServletRequest request)
	  {
		request.getSession().invalidate();
	  }
	// 把值放入session 
	 public static void setSessionAttribute(HttpServletRequest request, String name, Object value)
	  {
	    if (value != null) {
	    	request.getSession().setAttribute(name, value);
	    }
	    else {
	    	HttpSession session = request.getSession(false);
	      	if (session != null)
	        session.removeAttribute(name);
	    }
	  }
	 
	 /**
	 * 操作成功时给页面发出提示信息(ajax)
	 * @param mes 消息
	 * @param response
	 * @throws IOException
	 */
	public static void toPageJsonSuccess(String mes , HttpServletResponse response){
		try {
			WebUtils.toPageJsonMessage(1, mes, response);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 操作错误时给页面发出提示信息(ajax)
	 * @param mes 消息
	 * @param response
	 * @throws IOException
	 */
	public static void toPageJsonFailed(String mes , HttpServletResponse response){
		try {
			WebUtils.toPageJsonMessage(-1, mes, response);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	 /**
	 * 未登录
	 * @param mes 消息
	 * @param response
	 * @throws IOException
	 */
	public static void toPageJsonNoLogin(String mes , HttpServletResponse response){
		try {
			WebUtils.toPageJsonMessage(98, mes, response);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 无权限
	 * @param mes 消息
	 * @param response
	 * @throws IOException
	 */
	public static void toPageJsonNoAuth(String mes , HttpServletResponse response){
		try {
			WebUtils.toPageJsonMessage(99, mes, response);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 未登录
	 * @param result 1成功 其他失败
	 * @param mes 消息
	 * @param response
	 * @throws IOException
	 */
	public static void toPageJsonMessage(int result , String mes , HttpServletResponse response) throws IOException{
		StringBuffer sb = new StringBuffer();
		sb.append("{");
		sb.append("\"result\":\""+result+"\",");
		sb.append("\"mes\":\""+mes+"\"");
		sb.append("}");
		response.setContentType("application/json; charset=utf-8");
		PrintWriter out = response.getWriter();
		out.write(sb.toString());
		out.flush();
		out.close();
	}
		
		
	 //向前台输出
	 public static void toPageJson(HttpServletResponse response,String message){
		 try {
			 response.setContentType("application/json; charset=utf-8");//
			 PrintWriter out = response.getWriter();
			 out.print(message);
			 out.flush();
			 out.close();
		 } catch (IOException e) {
			 // TODO Auto-generated catch block
			 e.printStackTrace();
		 }
	 }
	 //向前台输出
	 public static void toPageXml(HttpServletResponse response,String message){
		 try {
			 response.setContentType("application/xml; charset=utf-8");//
			 PrintWriter out = response.getWriter();
			 out.print(message);
			 out.flush();
			 out.close();
		 } catch (IOException e) {
			 // TODO Auto-generated catch block
			 e.printStackTrace();
		 }
	 }
	 //向前台输出
	 public static void toPageText(HttpServletResponse response,String message){
		 try {
			 response.setContentType("text/html; charset=utf-8");//
			 PrintWriter out = response.getWriter();
			 out.print(message);
			 out.flush();
			 out.close();
		 } catch (IOException e) {
			 // TODO Auto-generated catch block
			 e.printStackTrace();
		 }
	 }
	 //向前台输出
	 public static void toPageTextPlain(HttpServletResponse response,String message){
		try {
			response.setContentType("text/plain; charset=utf-8");//
			PrintWriter out = response.getWriter();
			out.print(message);
			out.flush();
			out.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	 }
	 public static String InputStreamToString(InputStream a){
			StringBuilder sb = new StringBuilder();    
			String line = null;   
			try {
				BufferedReader reader = new BufferedReader(new InputStreamReader(a,"UTF-8"));    
				 line = null;    
				while ((line = reader.readLine()) != null) {    
					sb.append(line);    
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			return sb.toString();
	 }
	 //根据0和1 判断true和false
	 public static boolean intToBoolean(int i)
		 {
			 return i==1?true:false;
		 }
	 /**
	  * @Description: 获取服务器路径
	  * @author cc
	  * @param request
	  * @return
	  * @date 2015年6月10日
	  */
	 public static String getServerPath(HttpServletRequest request){
		 	String path = request.getContextPath();
			String basePath = request.getScheme()+"://"+request.getServerName();
			if(80!=request.getServerPort()){
				basePath+=":"+request.getServerPort();
			}
			basePath+=path;
			return basePath;
	 }
	 /**
	  * 获取Cookies的值
	  */
	 public static String getCookies(HttpServletRequest request,String name){
		 // 获取request里面的cookie cookie里面存值方式也是 键值对的方式 
		 String result="";
		 Cookie[] cookie = request.getCookies();
		 if(cookie==null) return "";
		 for (int i = 0; i < cookie.length; i++) {
			 Cookie cook = cookie[i];
			 if(cook.getName().equals(name)){ //获取键 
				 result=cook.getValue().toString();
			 }
		 } 
		 return result;
	 }
	 public static String getRequestUrl(HttpServletRequest request){
			String url=WebUtils.getServerPath(request)+request.getServletPath();
			if(request.getQueryString()!=null){
				 url += "?"+request.getQueryString();//完整url  加上参数
			}
			return url;
	 }
	 /**
	  * 设置Cookies的值
	  */
	 public static void setCookies(HttpServletResponse response,String name,String value){
		 	Cookie cookie = new Cookie(name,value);
			cookie.setMaxAge(30*24*60*60);//设置1年有效期
			//设置路径,这个路径即该工程下都可以访问该cookie 如果不设置路径,那么只有设置该cookie路径及其子路径可以访问
			cookie.setPath("/");
			response.addCookie(cookie);
	 }
	 public static boolean isInApp(HttpServletRequest request){
		 String referer=request.getHeader("referer");
		 String from=request.getParameter("from");
		 if(referer!=null&&from==null){
			 return true;
		 }else{
			 return false;
		 }
	 }
	 public static boolean isWeixin(HttpServletRequest request){
		 String ua = request.getHeader("user-agent")
		          .toLowerCase();
		      if (ua.indexOf("micromessenger") > 0) {// 是微信浏览器
		        return true;
		      }else{
		    	return false;
		      }
	 }
	 }

到此,微信支付后端完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值