- /**
- * 该链接是通过【统一下单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<String, String> backxml = new HashMap<String, String>();
- 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<Object, Object> 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", "<![CDATA[SUCCESS]]>");
- // backxml.put("return_msg", "<![CDATA[OK]]>");
- // // 告诉微信服务器,我收到信息了,不要在调用回调action了
- // strbackxml = pay.ArrayToXml(backxml);
- // response.getWriter().write(strbackxml);
- // logger.error("微信支付 ~~~~~~~~~~~~~~~~执行完毕?backxml=" +
- // strbackxml);
- // ====================================================================
- // 通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.
- resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
- + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
- // 处理业务 -修改订单支付状态
- 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 = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
- // + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
- // }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- logger.error("支付回调发布异常:" + e);
- e.printStackTrace();
- }
- return resXml;
- }
- /**
- * 验证签名
- *
- * @param map
- * @return
- */
- public boolean verifyWeixinNotify(Map<Object, Object> map) {
- SortedMap<String, String> parameterMap = new TreeMap<String, String>();
- 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;
- }
- }
转载出处:https://blog.youkuaiyun.com/qq_26101151/article/details/53433380