/**

* 微信支付实现

*

* @author: Sun

* @create: 2019-10-10 17:54

* @version: v1.0

*/

@Service

@Slf4j

public class WxPayServiceImpl implements WxPayService {

@Autowired

private MyWxPayConfig myWxPayConfig;

@Autowired

private WxDecodeUtil wxDecodeUtil;

/**

* 微信响应字段

*/

private static final String RETURN_CODE = "return_code";

@Override

public String refundAsyncNotify(HttpServletRequest httpServletRequest) {

String returnXmlMessage = null;

String notifyXmlData = null;

try {

notifyXmlData = readXmlFromStream(httpServletRequest);

Map notifyMapData = WXPayUtil.xmlToMap(notifyXmlData);

log.info("[refundAsyncNotify] [xml转换为map数据成功] [notifyMapData:{}]", notifyMapData);

if (WXPayConstants.SUCCESS.equals(notifyMapData.get(RETURN_CODE))) {

// 获得加密信息

String reqInfo = notifyMapData.get("req_info");

// 进行AES解密 获取req_info中包含的相关信息(解密失败会抛出异常)

String refundDecryptedData = wxDecodeUtil.decryptData(reqInfo);

Map reqInfoMap = WXPayUtil.xmlToMap(refundDecryptedData);

log.info("[refundAsyncNotify] [reqInfo解密成功] [reqInfoMap:{}]", reqInfoMap);

// TODO 订单退款成功后相关业务逻辑...

// 组装返回给微信的xml数据

returnXmlMessage = setReturnXml(WXPayConstants.SUCCESS, "OK");

log.info("[refundAsyncNotify] [out_trade_no:{}] [out_refund_no:{}] [退款异步消息处理成功:{}]",

reqInfoMap.get("out_trade_no"), reqInfoMap.get("out_refund_no"), returnXmlMessage);

} else {

returnXmlMessage = setReturnXml(WXPayConstants.FAIL, "return_code不为success");

}

} catch (IOException e) {

log.error("[refundAsyncNotify] [读取微信服务器返回流中xml数据时发生异常:{}] ", ExceptionUtils.getStackTrace(e));

returnXmlMessage = setReturnXml(WXPayConstants.FAIL, "An exception occurred while reading the WeChat server returning xml data in the stream.");

} catch (Exception e) {

log.error("[refundAsyncNotify [处理异常]] [xml数据:{}] [异常:{}] ", notifyXmlData, ExceptionUtils.getStackTrace(e));

returnXmlMessage = setReturnXml(WXPayConstants.FAIL, "Refund successful, exception occurred during asynchronous notification processing.");

log.warn("[refundAsyncNotify] [退款异步消息处理失败:{}]", returnXmlMessage);

}

return returnXmlMessage;

}

/**

* 设置返回给微信服务器的xml信息

*

* @param returnCode

* @param returnMsg

* @return

*/

private String setReturnXml(String returnCode, String returnMsg) {

return "+ returnCode + "]]>+ returnMsg + "]]>";

}

/**

* 从流中读取微信返回的xml数据

*

* @param httpServletRequest

* @return

* @throws IOException

*/

private String readXmlFromStream(HttpServletRequest httpServletRequest) throws IOException {

InputStream inputStream = httpServletRequest.getInputStream();

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

final StringBuffer sb = new StringBuffer();

String line = null;

try {

while ((line = bufferedReader.readLine()) != null) {

sb.append(line);

}

} finally {

bufferedReader.close();

inputStream.close();

}

return sb.toString();

}

}

微信支付回调 java_Java微信支付-退款成功异步回调验签相关推荐

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

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

  2. 支付宝支付成功异步回调验签以及注意事项(附源码)

    文章目录 1. 吐槽: 2. 要注意的点: 3. 导入方法(上代码) 1. 吐槽: 做微信支付的时候抽时间去看了支付宝支付,发现支付宝支付好简单,有官方给的SDK直接调用就OK,但是真正做起来才发现实 ...

  3. 项目对接支付宝支付,内网穿透实现监听支付宝的支付成功异步回调通知

    调试的话使用支付宝的沙箱环境来进行调试 调试的时候因为是本地调试,没有上线的域名,无法被支付宝的异步回调请求所打到,这种情况下可以使用内网穿透来进行解决 内网穿透步骤: 内网穿透的几个常用软件 1.n ...

  4. php支付宝退款签名出错,支付宝-验签出错, 未配置对应签名算法的公钥或者证书...

    在对接支付接口-单笔转账到支付宝账户时,一直返回40003错误"验签出错, 未配置对应签名算法的公钥或者证书" 查看sdk AopClient.php 文件,加密类型 signTy ...

  5. Android --- 微信支付时出现错误:错误的签名,验签失败,return_code=FAIL

    一般出现签名错误 1.第一个就要检查自己写的字段和开发文档中的字段是否一致 2.第二检查自己的签名(sign)是否有错误,小编的错误就是出现在这里,签名时使用的 key 是 API 密钥(商户中心查看 ...

  6. 微信jssdk开发 java_Java微信公众平台开发(十三)--微信JSSDK中Config配置

    前端开发工程师和关注前端开发的开发者们在2015年中肯定被腾讯的JSSDk引爆过,搞APP的.搞前端的甚至是是搞后端的都跑过来凑热闹,一时之间也把微信JSSDK捧得特别牛逼,但是在我们的技术眼里它的实 ...

  7. 微信字 签到 java_java微信签到功能实现:java做的一个简易的微信签到系统

    java微信签到功能实现,现在微信签到功能很流行,这个签到功能帮助微信用户更好的管理自己的微信公众号,那你想知道java微信签到功能如何实现呢,今天小编就特意为大家分享一个关于java微信签到功能实现 ...

  8. 微信高级接口 java_java微信开发高级接口----群发功能

    在做微信高级接口开发中,或许总会碰到很多神奇的错误码,而这些错误码在官方文档中还是找不到原因,因此贴出自己开发过程中用的一些demo,希望能够给一些小伙伴指点迷津.{"errcode&quo ...

  9. 微信自定义菜单java_Java微信公众平台开发(九)--微信自定义菜单的创建实现

    自定义菜单这个功能在我们普通的编辑模式下是可以直接在后台编辑的,但是一旦我们进入开发模式之后我们的自定义菜单就需要自己用代码实现,所以对于刚开始接触的人来说可能存在一定的疑惑,这里我说下平时我们在开发 ...

最新文章

  1. Win10年度更新开发必备:VS2015 Update 3正式版下载汇总
  2. NLP预训练之路——从word2vec, ELMo到BERT
  3. Python reduce / map / filter 函数区别 - Python零基础入门教程
  4. IBM 前面板显示信息提示
  5. win10和linux双系统分区大小,win10与Linux双系统分区问题
  6. Android开发人员得让短信应用程序准备好迎接巧克力棒
  7. SONY α系列(A6000A7)数码微单相机APP破解免付费安装教程
  8. 学习电商的第一个业务,发票管理,发票作废(发票作废为重)
  9. 博观而约取,厚积而薄发
  10. IELTS11 Test2 laws are needed to make people recycle more of their waste
  11. 微信Windows客户端版本无法打开小程序问题的解决
  12. 【计算机网络】第九章:无线网络
  13. STM32蓝牙控制循迹避障小车——2.循迹模块
  14. UDP通讯之字节流与protobuf转换(C++版)
  15. 机器学习中的特征缩放(feature scaling)浅谈
  16. HTML网页设计基础——电商团购悬浮框
  17. ps 中取消网格线的吸附功能,其实是对齐功能
  18. 数据通信网络基础(一)
  19. linux数据泄露,Linux Kernel 5.9.1 及更早版本发现数据泄露和特权升级漏洞,需尽快升级...
  20. Session攻击手段(会话劫持/固定)及其安全防御措施

热门文章

  1. C++--CListCtrl使用技巧的摘抄
  2. 智能调温需要哪些计算机知识,智能温控仪调节及使用【图解】
  3. mycat实现mysql大表自动水平扩展
  4. js两大神兽之“闭包“
  5. 带了一个实习生程序员,这波操作搞得我人都傻了,手把手教你写
  6. 万众期待!西班牙人宣布武磊周三亮相
  7. 多种智能机器人服务北京冬奥
  8. android p 华为手机多少钱,Android P正式发布,华为四款机型将吃上第一口“馅饼”...
  9. 操作系统实验 C语言实现仿写简易文件系统 北XX大 NXXT
  10. 单机存储引擎到mysql的思考二