微信公众号JSAPI支付接口及回调业务处理

/**
     * 官微-客服订单在线支付接口(微信内部支付)
     *
     * @param request
     * @param response
     */
    @SuppressWarnings("unchecked")
    @ResponseBody
    @RequestMapping(value = "/unvalidate/erpOrderPay", method = RequestMethod.POST)
    public Map<String, Object> erpOrderPay(HttpServletRequest request, HttpServletResponse response) throws Exception {
        logger.info("erpOrderPay start");
        Map<String, Object> resultMap = new HashMap<String, Object>();
        // 获取订单编号
        String number = request.getParameter("number");
        // 获取支付金额
        String amount = request.getParameter("amount");

        // 获取订单信息
        ErpOrderBase erpOrderBase = erpOrderBaseService.getByNumber(number);
        if (null == erpOrderBase) {
            resultMap.put("success", false);
            resultMap.put("code", "1");
            resultMap.put("body", null);
            resultMap.put("msg", "订单信息不存在");
            return resultMap;
        }

        // 判断支付状态,防止重复支付
        // 订单状态 0:未支付 1:已支付 2:已支付订金
        if (erpOrderBase.getStatus() == 1) {
            resultMap.put("success", false);
            resultMap.put("code", "3");
            resultMap.put("body", null);
            resultMap.put("msg", "请勿重复支付");
            return resultMap;
        }

        // 判断支付金额
        int price100 = new BigDecimal(amount).multiply(new BigDecimal(100)).intValue();
        if (price100 <= 0) {
            resultMap.put("success", false);
            resultMap.put("code", "2");
            resultMap.put("body", null);
            resultMap.put("msg", "支付金额错误");
            return resultMap;
        }

        // 设置回调地址
        String notify_url = "对应的回调地址";

        //用订单编号+随机时间戳,生成唯一订单号
        String numberCurrent = number + "_" +System.currentTimeMillis();

        Map<String, String> parameters = new HashMap<String, String>();
        parameters.put("appid", ConfigUtil.WAP_APPID);// 公众账号ID
        parameters.put("mch_id", ConfigUtil.WAP_MCH_ID);//商户号
        parameters.put("nonce_str", WXPayUtil.generateNonceStr());// 随机字符串
        parameters.put("body", "延保订单在线支付");// 商品描述
        parameters.put("out_trade_no", numberCurrent); // 订单号
        parameters.put("fee_type", "CNY");// 金额类型
        parameters.put("total_fee", String.valueOf(price100));// 标价金额
        parameters.put("spbill_create_ip", CommonUtil.getIpAddress(request));// 终端IP
        parameters.put("notify_url", notify_url);// 回调地址
        parameters.put("sign_type", "MD5");// 签名方式
        parameters.put("trade_type", "JSAPI");// 交易类型
        // openid需要获取
        String openid = request.getParameter("openid");
        parameters.put("openid", openid);// 用户标识
//        parameters.put("openid", "ojdHFs0ZZTgrxpc2Fb090To_6MkI");// 测试-写死
        // 设置签名
        logger.info("得到的集合是-----------" + parameters.toString());
        String sign = WXPayUtil.generateSignature(parameters, ConfigUtil.WAP_API_KEY);
        parameters.put("sign", sign);
        // 封装请求参数结束
        String requestXML = WXPayUtil.mapToXml(parameters);
        logger.info("requestXML:" + requestXML);
        // 调用统一下单接口
        String result = PayCommonUtil.httpsRequest(ConfigUtil.UNIFIED_ORDER_URL, "POST", requestXML);
        logger.info("\n" + result);
        // 预支付id
        String prepay_id = "";
        try {
            /** 统一下单接口返回正常的 ,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay **/
            Map<String, String> map = WXPayUtil.xmlToMap(result);
            String resultCode = map.get("result_code");
            if ("FAIL".equals(resultCode)) {
                resultMap.put("success", false);
                resultMap.put("code", "201");
                resultMap.put("body", null);
                resultMap.put("msg", "微信支付失败");
                return resultMap;
            }
            logger.info(" map " + map.toString());
            String returnCode = map.get("return_code");
            if (returnCode.equals("SUCCESS") && resultCode.equals("SUCCESS")) {
                prepay_id = (String) map.get("prepay_id");

            } else {
                resultMap.put("success", false);
                resultMap.put("code", "200");// 请求成功
                resultMap.put("body", null);
                resultMap.put("msg", "微信支付失败");
                return resultMap;
            }

            //重新生成签名
            Map<String, String> backMap = new HashMap<String, String>();
            backMap.put("appId", ConfigUtil.WAP_APPID);
            backMap.put("timeStamp",WXPayUtil.getCurrentTimestamp() + "");
            backMap.put("nonceStr", WXPayUtil.generateNonceStr());
            backMap.put("package","prepay_id="+prepay_id);
            backMap.put("signType","MD5");
            String paySign = null;
            try {
                paySign = WXPayUtil.generateSignature(backMap, ConfigUtil.WAP_API_KEY);
                backMap.put("paySign",paySign);
            } catch (Exception e) {
                e.printStackTrace();
            }

            resultMap.put("success", true);
            resultMap.put("code", "200"); // 请求成功
            resultMap.put("body", backMap); // 返回前端参数
            resultMap.put("msg", null);

        } catch (JDOMException e) {
            resultMap.put("success", false);
            resultMap.put("code", "500");// 请求失败
            resultMap.put("body", null);
            resultMap.put("msg", "微信支付失败,请重试");
            logger.error(e.toString());
        } catch (IOException e) {
            resultMap.put("success", false);
            resultMap.put("code", "500");// 请求失败
            resultMap.put("body", null);
            resultMap.put("msg", "微信支付失败,请重试");
            logger.error(e.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultMap;
    }

    /**
     * 微信异步通知,回调地址,处理业务
     *
     * (客服订单在线支付)
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    @ResponseBody
    @RequestMapping(value = "/unvalidate/erpOrderNotify", method = RequestMethod.POST)
    public void erpOrderNotify(HttpServletRequest request, HttpServletResponse response)
            throws IOException, JDOMException, ApplicationException {
        logger.info("erpOrderNotify start");
        // 读取参数
        InputStream inputStream;
        StringBuffer sb = new StringBuffer();
        inputStream = request.getInputStream();
        String s;
        BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
        while ((s = in.readLine()) != null) {
            sb.append(s);
        }
        in.close();
        inputStream.close();
        // 解析xml成map
        Map<String, String> m = new HashMap<String, String>();
        m = XMLUtil.doXMLParse(sb.toString());
        for (Object keyValue : m.keySet()) {
            logger.info(keyValue + "=" + m.get(keyValue));
        }
        // 过滤空 设置 TreeMap
        SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
        Iterator 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 resXml = "";
        if (PayCommonUtil.isTenpayWapSign("UTF-8", packageParams)) {
            if ("SUCCESS".equals((String) packageParams.get("result_code"))) {
                // 这里是支付成功
                /**
                 * // 执行自己的业务逻辑
                 */
               

                resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
                        + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
                logger.info("订单已成功处理");

            } else {
                logger.info("支付失败,错误信息:" + packageParams.get("err_code"));
                resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
                        + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
            }
        }else {
            resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
                    + "<return_msg><![CDATA[通知签名验证失败]]></return_msg>" + "</xml> ";
            logger.info("通知签名验证失败");
        }
        // ------------------------------
        // 处理业务完毕
        // ------------------------------
        BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
        out.write(resXml.getBytes());
        out.flush();
        out.close();
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值