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

来源:互联网 发布:淘宝上aj正品店铺 编辑:程序博客网 时间:2024/05/21 08:05
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>@Overrideprotected 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);// 创建一个新的SAXBuilderSAXBuilder sb = new SAXBuilder();// 通过输入源构造一个Documentorg.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次通知)。


0 0