公众号支付2 notify_url 回调

  1. /** 
  2.      * 该链接是通过【统一下单API】中提交的参数notify_url设置,如果链接无法访问,商户将无法接收到微信通知。 
  3.      * 通知url必须为直接可访问的url,不能携带参数。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action” 
  4.      *  
  5.      * 支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。 
  6.      * 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 
  7.      * (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒) 
  8.      * 注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。 
  9.      * 推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。 
  10.      * 特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,防止数据泄漏导致出现“假通知”,造成资金损失。 
  11.      *  
  12.      * @throws Exception 
  13.      *  
  14.      * @throws Exception 
  15.      *  
  16.      * @throws Exception 
  17.      */  
  18.     public String PaySult() throws Exception {  
  19.   
  20.   
  21.         String resXml = "";  
  22.         Map<String, String> backxml = new HashMap<String, String>();  
  23.   
  24.   
  25.         InputStream inStream;  
  26.         try {  
  27.             inStream = request.getInputStream();  
  28.   
  29.   
  30.             ByteArrayOutputStream outSteam = new ByteArrayOutputStream();  
  31.             byte[] buffer = new byte[1024];  
  32.             int len = 0;  
  33.             while ((len = inStream.read(buffer)) != -1) {  
  34.                 outSteam.write(buffer, 0, len);  
  35.             }  
  36.             logger.error("微信支付----付款成功----");  
  37.             outSteam.close();  
  38.             inStream.close();  
  39.             String result = new String(outSteam.toByteArray(), "utf-8");// 获取微信调用我们notify_url的返回信息  
  40.             logger.error("微信支付----result----=" + result);  
  41.             Map<Object, Object> map = Xmlunit.xml2map(result, false);  
  42.   
  43.   
  44.             if (map.get("result_code").toString().equalsIgnoreCase("SUCCESS")) {  
  45.                 logger.error("微信支付----返回成功");  
  46.                 if (verifyWeixinNotify(map)) {  
  47.                     // 订单处理 操作 orderconroller 的回写操作?  
  48.                     logger.error("微信支付----验证签名成功");  
  49.                     // backxml.put("return_code", "<![CDATA[SUCCESS]]>");  
  50.                     // backxml.put("return_msg", "<![CDATA[OK]]>");  
  51.                     // // 告诉微信服务器,我收到信息了,不要在调用回调action了  
  52.                     // strbackxml = pay.ArrayToXml(backxml);  
  53.                     // response.getWriter().write(strbackxml);  
  54.                     // logger.error("微信支付 ~~~~~~~~~~~~~~~~执行完毕?backxml=" +  
  55.                     // strbackxml);  
  56.   
  57.   
  58.                     // ====================================================================  
  59.                     // 通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.  
  60.                     resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"  
  61.                             + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";  
  62.   
  63.   
  64.                     // 处理业务 -修改订单支付状态  
  65.                     logger.error("微信支付回调:修改的订单=" + map.get("out_trade_no"));  
  66.                     int editres = Wechat_Order.execute("UPDATE wechat_order SET paystatus =? WHERE orderno=?",  
  67.                             new Object[] { EnumPayStatus.Paybackok.getValue(), map.get("out_trade_no") });  
  68.                     if (editres > 0) {  
  69.                         logger.error("微信支付回调:修改订单支付状态成功");  
  70.                     } else {  
  71.                         logger.error("微信支付回调:修改订单支付状态失败");  
  72.                     }  
  73.   
  74.   
  75.                 }  
  76.                 // ------------------------------  
  77.                 // 处理业务完毕  
  78.                 // ------------------------------  
  79.                 BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());  
  80.                 out.write(resXml.getBytes());  
  81.                 out.flush();  
  82.                 out.close();  
  83.             }  
  84.             // else {  
  85.             // logger.info("支付失败,错误信息:" + map.get("err_code"));  
  86.             // resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"  
  87.             // + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";  
  88.             // }  
  89.         } catch (IOException e) {  
  90.             // TODO Auto-generated catch block  
  91.             logger.error("支付回调发布异常:" + e);  
  92.             e.printStackTrace();  
  93.         }  
  94.         return resXml;  
  95.     }  
  96.   
  97.   
  98.     /** 
  99.      * 验证签名 
  100.      *  
  101.      * @param map 
  102.      * @return 
  103.      */  
  104.     public boolean verifyWeixinNotify(Map<Object, Object> map) {  
  105.         SortedMap<String, String> parameterMap = new TreeMap<String, String>();  
  106.         String sign = (String) map.get("sign");  
  107.         for (Object keyValue : map.keySet()) {  
  108.             if (!keyValue.toString().equals("sign")) {  
  109.                 parameterMap.put(keyValue.toString(), map.get(keyValue).toString());  
  110.             }  
  111.         }  
  112.         String createSign = pay.getSign(parameterMap);  
  113.         if (createSign.equals(sign)) {  
  114.             return true;  
  115.         } else {  
  116.             logger.error("微信支付  ~~~~~~~~~~~~~~~~验证签名失败");  
  117.             return false;  
  118.         }  
  119.   
  120.   
  121.     }  

转载出处:https://blog.youkuaiyun.com/qq_26101151/article/details/53433380

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值