1. 程式人生 > >Android微信支付,通知回撥方法

Android微信支付,通知回撥方法

import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.xml.sax.InputSource;

import com.tenpay.ResponseHandler;
import com.tenpay.util.TenpayUtil;



/**
 * 微信回撥Servlet
 *
 */
public class WXPayRspServlet extends HttpServlet {

	private static final long serialVersionUID = -3523419191502630036L;
	private final static Logger log = Logger.getLogger(<span style="font-family: Arial, Helvetica, sans-serif;">WXPayRspServlet</span><span style="font-family: Arial, Helvetica, sans-serif;">.class);</span>
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		ServletInputStream in = req.getInputStream();
		ResponseHandler resHandler = new ResponseHandler(req, resp);
		String resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[報文為空]]></return_msg>" + "</xml> ";
		try{
			int size = req.getContentLength(); 
			byte[] bdata = new byte[size];
			in.read(bdata);
			String xmlstring = new String(bdata,TenpayUtil.getCharacterEncoding(req, resp));
			log.info("****** back data xml *******\n");
			log.info(xmlstring);
			if(!StringUtils.isEmpty(xmlstring)){
				Map paramMap = parseXmlToMap(xmlstring);
				/*
				 	WxPayResult wpr = new WxPayResult();
					wpr.setAppid(m.get("appid").toString());
					wpr.setBankType(m.get("bank_type").toString());
					wpr.setCashFee(m.get("cash_fee").toString());
					wpr.setFeeType(m.get("fee_type").toString());
					wpr.setIsSubscribe(m.get("is_subscribe").toString());
					wpr.setMchId(m.get("mch_id").toString());
					wpr.setNonceStr(m.get("nonce_str").toString());
					wpr.setOpenid(m.get("openid").toString());
					wpr.setOutTradeNo(m.get("out_trade_no").toString());
					wpr.setResultCode(m.get("result_code").toString());
					wpr.setReturnCode(m.get("return_code").toString());
					wpr.setSign(m.get("sign").toString());
					wpr.setTimeEnd(m.get("time_end").toString());
					wpr.setTotalFee(m.get("total_fee").toString());
					wpr.setTradeType(m.get("trade_type").toString());
					wpr.setTransactionId(m.get("transaction_id").toString());
				 */
				String result_code = paramMap.get("result_code").toString();
				
				if("SUCCESS".equals(result_code.toUpperCase())){
					//根據自身業務編寫程式碼
				}
			}else{
				resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[報文為空]]></return_msg>" + "</xml> ";
				log.error("微信返回報文為空");
			}
			
		}catch(Exception e){
			log.error(e.getMessage(), e);
			e.printStackTrace();
		}
		log.info(resXml);
		resHandler.sendToCFT(resXml);
		
	}

	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
	
	private Map parseXmlToMap(String xml) {
		Map retMap = new HashMap();
		try {
			StringReader read = new StringReader(xml);
			// 建立新的輸入源SAX 解析器將使用 InputSource 物件來確定如何讀取 XML 輸入
			InputSource source = new InputSource(read);
			// 建立一個新的SAXBuilder
			SAXBuilder sb = new SAXBuilder();
			// 通過輸入源構造一個Document
			org.jdom.Document doc =  sb.build(source);
			Element root = (Element) doc.getRootElement();// 指向根節點
			List<Element> es = root.getChildren();
			if (es != null && es.size() != 0) {
				for (Element element : es) {
					retMap.put(element.getName(), element.getValue());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return retMap;
	}
}

tenpay的方法如下:

	public void sendToCFT(String msg) throws IOException {
		String strHtml = msg;
		PrintWriter out = this.getHttpServletResponse().getWriter();
		out.println(strHtml);
		out.flush();
		out.close();

	}

其中:
<span style="white-space:pre">	</span>WxPayResult wpr = new WxPayResult();

註解部分為微信返回的資訊。

sendToCFT方法為響應微信方法,即<pre name="code" class="java"><return_code><![CDATA[SUCCESS]]></return_code>
是告訴微信已經可以了,不用再發通知(微信一般會發4次通知)。