解析微信支付回调数据

工作中的代码收藏

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

猜你喜欢

转载自blog.csdn.net/qq_28114645/article/details/80496932