1. 程式人生 > >解析微信支付回撥資料

解析微信支付回撥資料

工作中的程式碼收藏

//解析方法
 private NotifyVO parseWechatPayReq(HttpServletRequest request){
        StringBuffer sb = new StringBuffer();
        String s;
        Map<String, String> m = Maps.newHashMap();
        Map<String, String> packageParams;
        Iterator it;

        //以下的邏輯過於繁瑣,待之後優化
        try {
            InputStream inputStream = request.getInputStream();
            try (BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, PayConstants.DEFAULT_ALIPAY_CHARSET))) {
                while ((s = in.readLine()) != null) {
                    sb.append(s);
                }
                in.close();
            }
            inputStream.close();
        }catch (Exception e){
            logger.error( "" , e);
            return null;
        }

        // sb.append("<xml
>
<appid><![CDATA[wx781f4bed3533eae2]]></appid><bank_type><![CDATA[CFT]]></bank_type><cash_fee><![CDATA[1]]></cash_fee><fee_type><![CDATA[CNY]]></fee_type><is_subscribe><![CDATA[N]]></is_subscribe><mch_id><![CDATA[1486513082]]>
</mch_id><nonce_str><![CDATA[a5f1bb06fcec45f8af9273a21b81f94d]]></nonce_str><openid><![CDATA[ol9JYxEnSoPxTo0QefMzgaP_XQhs]]></openid><out_trade_no><![CDATA[PY20170811200344]]></out_trade_no><result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code><sign><![CDATA[8C2065C450699051424A5823342E6D5B]]></sign><time_end><![CDATA[20170811200404]]></time_end><total_fee>1</total_fee><trade_type><![CDATA[APP]]></trade_type><transaction_id><![CDATA[4000822001201708115713282477]]></transaction_id></xml>"); logger.info("====================jsapi支付回掉引數:" + sb.toString()); //解析xml成map m = XMLUtil.doXMLParse(sb.toString()); //過濾空 設定 TreeMap packageParams = new TreeMap<String, String>(); it = m.keySet().iterator(); while (it.hasNext()) { String parameter = (String) it.next(); String parameterValue = m.get(parameter); String v = ""; if (null != parameterValue) { v = parameterValue.trim(); } packageParams.put(parameter, v); } String sign = packageParams.get("sign"); packageParams.remove("sign"); if (!makeH5Sign(packageParams).equals(sign)) { //驗籤失敗 return null; } NotifyVO notifyVO = new NotifyVO(); if (packageParams.get("return_code").equals("SUCCESS") && packageParams.get("result_code").equals("SUCCESS")) { //交易成功 notifyVO.setTrade_status("1"); String out_trade_no = packageParams.get("out_trade_no"); notifyVO.setTrade_no(packageParams.get("transaction_id"));//微信支付訂單號 notifyVO.setOut_trade_no(out_trade_no);//商戶訂單號 - 票友訂單號 String total_fee = packageParams.get("total_fee"); String fee = (Integer.parseInt(total_fee) / 100.0)+""; notifyVO.setTotal_fee(fee); }else{ notifyVO.setTrade_status("0"); } notifyVO.setDetail_json(JSON.toJSONString(packageParams)); return notifyVO; } //簽名 public String makeH5Sign(Map<String, String> paramsMap) { List<String> sorParams = new ArrayList<>(); for (Map.Entry<String, String> me : paramsMap.entrySet()) { sorParams.add(me.getKey()); } Collections.sort(sorParams); // Arrays.sort(params);//按字典順序排列 //按照引數名ASCII字典序排序 StringBuilder combineParams = new StringBuilder(); for (String param : sorParams) { combineParams.append(param).append("=").append(paramsMap.get(param)).append("&"); } combineParams.delete(combineParams.length() - 1, combineParams.length()); //拼接API金鑰: StringBuilder combineKey = new StringBuilder(); combineKey.append(combineParams.toString()).append("&key=").append(PayConstants.JSAPI_PAY_MCH_SECRET); //Make Sign String sign = MD5Util.MD5(combineKey.toString()); return sign; }

xmlUtil


import com.google.common.collect.Maps;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

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

/**
 * @Description: XMLUtil
 * @Author: lin.shi
 * @CreateTime: 2017-08-10 16:47
 */
public class XMLUtil {

    /**
     * 解析xml,返回第一級元素鍵值對。如果第一級元素有子節點,則此節點的值是子節點的xml資料。
     *
     * @param strxml
     * @return
     * @throws IOException
     */
    public static Map doXMLParse(String strxml) {
        Document document = null;
        try {
            document = DocumentHelper.parseText(strxml);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        Element rootElement = document.getRootElement();
        @SuppressWarnings("unchecked")
        List<org.dom4j.Element> elements = rootElement.elements();
        Map<String, String> map = Maps.newHashMap();
        for (org.dom4j.Element element : elements) {
            map.put(element.getName(), element.getText());
        }
        return map;
    }


}