Android微信支付,通知回撥方法
阿新 • • 發佈:2019-01-07
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次通知)。