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>";

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

支付结果通知

Java 微信支付通知处理思路相关推荐

  1. java微信支付v3系列——1.微信支付准备工作

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  2. java微信支付v3系列——8.微信支付之退款成功回调

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  3. java微信支付v3系列——5.微信支付成功回调

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  4. java微信支付v3系列——3.订单创建准备操作

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  5. Java微信支付-支付成功异步回调验签

    接上一篇Java微信支付-统一下单API,本篇在上篇文章的基础上讲述调用统一下单API用户支付成功之后微信异步回调通知 下文中所需配置.类都在以请查看以上链接内容. 在调用微信支付-统一下单API时, ...

  6. php内部通知机制,PHP_浅析PHP微信支付通知的处理方式,通知机制的实现,官方只有文 - phpStudy...

    浅析PHP微信支付通知的处理方式 通知机制的实现,官方只有文档没有demo代码,对没搞过的人来说,需要花大量时间来做测试. 从文档上说的来看,微信每次通知过来的数据,结构比较复杂,是一个多段数据,除了 ...

  7. Java 微信支付之APP支付服务端 (一)

    Java 微信支付之APP支付服务端 (一) 如图所示,这是服务端要集成的所有微信接口.至于在开放平台申请就不做赘述了.主要流程,1.下单,2.异步通知,3.查询. 一.微信统一下单请求交易 /*** ...

  8. java 微信支付实现

    一.业务需求 实现app微信支付,后端需要做生成预支付单,响应支付结果 二.业务流程 查看官方文档 https://pay.weixin.qq.com/wiki/doc/api/app/app.php ...

  9. java微信支付代码_Java微信支付之服务号支付代码示例

    Java微信支付之服务号支付实现,网上的java微信支付sdk和Demo基本上是水的,看着头疼所以我决心自己开始写Java微信支付之公众号支付,多的不说见下面源码,为了方便使用我分别用了两个Servl ...

最新文章

  1. 重新编号_武汉黄陂公交线路PW、PG、PZ……分不清?别急,就要重新编号啦
  2. 【关注】人类的智力是如何发展起来的?《自然》发布三大科学假说
  3. 推荐:介绍一个UndoFramework
  4. [Android Traffic] 使用缓存来避免重复的下载
  5. 云数据库MongoDB全面支持3.4版本,支持多存储引擎
  6. 快速入门人工智能,这波福利不能错过!
  7. 安装eclipse的JRebel6.4.3的插件
  8. 左右布局图文排版设计灵感案例
  9. Windows修改hosts
  10. 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(3月21日)...
  11. 基于极限学习机的自编码器(ELM-AE)
  12. 新增收货地址html,客户收货地址列表、添加地址、选择地址
  13. python爬虫设计背景_Python网络爬虫(增量式爬虫)
  14. Ant Design Vue表格序号递增问题
  15. Quartus-II入门(全加器)
  16. 图神经网络(GNN)必读论文及最新进展跟踪
  17. 可水解盐类pH值的计算
  18. 什么是苏黎士投机定律(Zurich Axiom)
  19. 第四代语言计算机语言,第四代程序设计语言是什么程序语言
  20. 【C】一些简单的编程

热门文章

  1. easyexcel导出(冻结固定标题行、自定义合并导出)
  2. C语言 数组在定义时长度不能用变量
  3. Docker Hub的使用方法
  4. 实验室里密码锁的开发——你了解运算符吗(三)
  5. 功能测试提测前必 做的几件事!
  6. Packet Tracer 配置PAP双向认证
  7. 【运维篇】resize2fs命令 – 调整文件系统大小
  8. C++写算法|A+B问题
  9. 论文阅读——Recurrent U-Net for Resource-Constrained Segmentation
  10. 判断多个时间段中,是否重叠的时间