Java 微信支付通知处理思路
一、前言
在做微信支付时,根据微信文档可知,支付完成后,微信会把相关支付结果及用户信息通过数据流的形式发送给商户,商户需要接收处理,并按文档规范返回应答。那么该如何处理微信支付通知呢?
二、解决思路
1、读取微信通知 , 处理通知 , 根据结果,返回对应的应答情况。
2、notify2 方法,处理微信通知:
@RequestMapping(value = {"/notify2"})@ResponseBodypublic String notify2(HttpServletRequest request) throws IOException {// 1、读取微信通知 --- xml 格式字符串BufferedReader reader = request.getReader();String line ; StringBuilder sb = new StringBuilder();while((line = reader.readLine()) != null) {sb.append(line);}logger.debug("accept wechat pay return message , {}" , sb.toString());// 2、xml字符串 转换为 map对象Map<String, Object> map = XmlUtil.xmlToMap(sb.toString());// 3、尝试从缓存中获取,判断是否已经接收过通知String out_trade_no = map.get("out_trade_no") == null ?"":map.get("out_trade_no").toString();Object cache = WechatCacheUtils.get(WechatConstant.NOTIFY_CACHE_PREFIX.concat(out_trade_no));if(null != cache) {logger.debug("from cache time ,{} , cache ",DateUtils.getDate("yyyyMMddHHmmss") ,cache);@SuppressWarnings("unchecked")Map<String, Object> cacheMap = (Map<String, Object>)cache;if(WechatConstant.PAY_STATUS_SUCCESS.equals(cacheMap.get("result_code")) && WechatConstant.PAY_STATUS_SUCCESS.equals(cacheMap.get("return_code"))){return WechatConstant.NOTIFY_SUCCESS; }}if(WechatConstant.PAY_STATUS_SUCCESS.equals(map.get("result_code")) && WechatConstant.PAY_STATUS_SUCCESS.equals(map.get("return_code"))){// 4、 支付成功通知,存储到数据库中WechatPayNotify wechatPayNotify = new WechatPayNotify();wechatPayNotify.mapToBean(map);try {wechatPayNotifyService.save(wechatPayNotify);} catch (Exception e) {logger.error(e.getMessage());}// 存入到缓存中WechatCacheUtils.put(WechatConstant.NOTIFY_CACHE_PREFIX.concat(out_trade_no), map);// 5、成功处理后,同步返回给微信参数return WechatConstant.NOTIFY_SUCCESS;}logger.error("nofity error , {}" , sb.toString());// 5、若处理失败,返回为微信的参数return WechatConstant.NOTIFY_FAIL;}
3、成功返回给微信的参数
/*** 微信支付,通知----成功结果*/public static String NOTIFY_SUCCESS = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
4、失败返回为微信的参数
/*** 微信支付,通知--- 失败结果*/public static String NOTIFY_FAIL = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml>";
参考资料:支付回调和查单实现指引
支付结果通知