微信支付一 :公众号支付2 notify_url 回调

/**
     * 该链接是通过【统一下单API】中提交的参数notify_url设置,如果链接无法访问,商户将无法接收到微信通知。
     * 通知url必须为直接可访问的url,不能携带参数。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”
     * 
     * 支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
     * 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。
     * (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)
     * 注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
     * 推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
     * 特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,防止数据泄漏导致出现“假通知”,造成资金损失。
     * 
     * @throws Exception
     * 
     * @throws Exception
     * 
     * @throws Exception
     */
    public String PaySult() throws Exception {


        String resXml = "";
        Map backxml = new HashMap();


        InputStream inStream;
        try {
            inStream = request.getInputStream();


            ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = inStream.read(buffer)) != -1) {
                outSteam.write(buffer, 0, len);
            }
            logger.error("微信支付----付款成功----");
            outSteam.close();
            inStream.close();
            String result = new String(outSteam.toByteArray(), "utf-8");// 获取微信调用我们notify_url的返回信息
            logger.error("微信支付----result----=" + result);
            Map map = Xmlunit.xml2map(result, false);


            if (map.get("result_code").toString().equalsIgnoreCase("SUCCESS")) {
                logger.error("微信支付----返回成功");
                if (verifyWeixinNotify(map)) {
                    // 订单处理 操作 orderconroller 的回写操作?
                    logger.error("微信支付----验证签名成功");
                    // backxml.put("return_code", "");
                    // backxml.put("return_msg", "");
                    // // 告诉微信服务器,我收到信息了,不要在调用回调action了
                    // strbackxml = pay.ArrayToXml(backxml);
                    // response.getWriter().write(strbackxml);
                    // logger.error("微信支付 ~~~~~~~~~~~~~~~~执行完毕?backxml=" +
                    // strbackxml);


                    // ====================================================================
                    // 通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.
                    resXml = "" + ""
                            + "" + " ";


                    // 处理业务 -修改订单支付状态
                    logger.error("微信支付回调:修改的订单=" + map.get("out_trade_no"));
                    int editres = Wechat_Order.execute("UPDATE wechat_order SET paystatus =? WHERE orderno=?",
                            new Object[] { EnumPayStatus.Paybackok.getValue(), map.get("out_trade_no") });
                    if (editres > 0) {
                        logger.error("微信支付回调:修改订单支付状态成功");
                    } else {
                        logger.error("微信支付回调:修改订单支付状态失败");
                    }


                }
                // ------------------------------
                // 处理业务完毕
                // ------------------------------
                BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
                out.write(resXml.getBytes());
                out.flush();
                out.close();
            }
            // else {
            // logger.info("支付失败,错误信息:" + map.get("err_code"));
            // resXml = "" + ""
            // + "" + " ";
            // }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            logger.error("支付回调发布异常:" + e);
            e.printStackTrace();
        }
        return resXml;
    }


    /**
     * 验证签名
     * 
     * @param map
     * @return
     */
    public boolean verifyWeixinNotify(Map map) {
        SortedMap parameterMap = new TreeMap();
        String sign = (String) map.get("sign");
        for (Object keyValue : map.keySet()) {
            if (!keyValue.toString().equals("sign")) {
                parameterMap.put(keyValue.toString(), map.get(keyValue).toString());
            }
        }
        String createSign = pay.getSign(parameterMap);
        if (createSign.equals(sign)) {
            return true;
        } else {
            logger.error("微信支付  ~~~~~~~~~~~~~~~~验证签名失败");
            return false;
        }


    }

你可能感兴趣的:(微信开发-JAVA)