编程知识 cdmana.com

Java 微信支付通知处理思路

                            Java 微信支付通知处理思路

一、前言

在做微信支付时,根据微信文档可知,支付完成后,微信会把相关支付结果及用户信息通过数据流的形式发送给商户,商户需要接收处理,并按文档规范返回应答。那么该如何处理微信支付通知呢?

 

二、解决思路

1、读取微信通知 , 处理通知 , 根据结果,返回对应的应答情况。

2、notify2 方法,处理微信通知:

	@RequestMapping(value = {"/notify2"})
	@ResponseBody
	public 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>";

 

 

 

参考资料:支付回调和查单实现指引

         支付结果通知

 

 

版权声明
本文为[HaHa_Sir]所创,转载请带上原文链接,感谢
https://thinkcode.blog.csdn.net/article/details/109074212

Scroll to Top