解析微信支付回调数据

工作中的代码收藏

//解析方法
 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;
    }


}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳十三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值