收藏
回答

微信支付成功后,支持成功通知调用成功,但是读取字节流的内容为1,与官网文档中描述不一致?

系统是基于spring boot 开发

1、支付成功回调地址处理逻辑 调用parseXml 函数进行字节流转为xml的处理

/**
 * 异步通知
 */
@RequestMapping(value = "/wxPay/payNotify", method = {RequestMethod.POST, RequestMethod.GET})
@ResponseBody
public String payNotify(HttpServletRequest request) throws Exception {
    
    Map<String, String> tt = parseXml(request); 

    String xmlMsg = HttpKit.readData(request);
    log.info("支付通知=" + xmlMsg);
    Map<String, String> params = WxPayKit.xmlToMap(xmlMsg);

    String returnCode = params.get("return_code");

    // 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态
    // 注意此处签名方式需与统一下单的签名类型一致
    if (WxPayKit.verifyNotify(params, WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey(), SignType.HMACSHA256)) {
        if (WxPayKit.codeIsOk(returnCode)) {
            // 更新订单信息
            // 发送通知等
            Map<String, String> xml = new HashMap<String, String>(2);
            xml.put("return_code", "SUCCESS");
            xml.put("return_msg", "OK");
            return WxPayKit.toXml(xml);
        }
    }
    return null;
}



2、parseXml 函数处理逻辑,

/**
 * 回调request 参数解析为map格式
 *
 * @param request
 * @return
 * @throws Exception Map<String,String>
 */
@SuppressWarnings("unchecked")
public static Map<String, String> parseXml(HttpServletRequest request)
        throws Exception {

    // 解析结果存储在HashMap
    Map<String, String> map = new HashMap<String, String>();
    InputStream inputStream = request.getInputStream();
    // 读取输入流
    SAXReader reader = new SAXReader();
    Document document = reader.read(inputStream);
    // 得到xml根元素
    Element root = document.getRootElement();
    // 得到根元素的所有子节点
    List<Element> elementList = root.elements();
    // 遍历所有子节点
    for (Element e : elementList)
        map.put(e.getName(), e.getText());
    // 释放资源
    inputStream.close();
    inputStream = null;
    return map;
}



3、错误栈内容


2020-09-14 14:26:01.469 ERROR 15150 --- [  XNIO-1 task-1] o.s.c.l.e.BladeRestExceptionTranslator   : 服务器异常


org.dom4j.DocumentException: Error on line 1 of document  : 前言中不允许有内容。
	at org.dom4j.io.SAXReader.read(SAXReader.java:462)
	at org.dom4j.io.SAXReader.read(SAXReader.java:325)
	at com.topsee.mall.controller.order.PayController.parseXml(PayController.java:299)
	at com.topsee.mall.controller.order.PayController.payNotify(PayController.java:257)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:893)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:798)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)


4、调试分析

获取到的字节流为1,对应ASCII 为49,与官网描述的返回不一样,

文档描述的返回内容



回答关注问题邀请回答
收藏

4 个回答

  • 一个情绪稳定的程序员
    一个情绪稳定的程序员
    2023-06-15

    我也碰到这个报错,怎么解决微信支付返回数据呢

    2023-06-15
    有用
    回复
  • 54孝东
    54孝东
    2023-05-14

    遇到相同的问题,交易单号: 4200001846202305143555439729

    2023-05-14
    有用
    回复
  • 张水水
    张水水
    2021-04-22

    遇到跟上面的问题一样的,是什么原因啊 交易单号4200001038202104227542208346

    2021-04-22
    有用
    回复
  • 微信支付技术助手8
    微信支付技术助手8
    2020-09-14

    你好,麻烦提供一下微信订单号。进行核实。

    2020-09-14
    有用
    回复 4
    • Seaven
      Seaven
      2020-09-14
      4200000679202009144811734534
      2020-09-14
      回复
    • 微信支付技术助手8
      微信支付技术助手8
      2020-09-14回复Seaven
      回调数据正常,麻烦检查本地解析部分代码
      2020-09-14
      回复
    • 微信支付技术助手8
      微信支付技术助手8
      2020-09-15回复Seaven
      经查询,提供的微信订单回调正常返回。具体数据已通过私信方式发送。麻烦查收。
      2020-09-15
      回复
    • 张水水
      张水水
      2021-04-22回复微信支付技术助手8
      遇到跟上面的问题一样的,是什么原因啊 交易单号4200001038202104227542208346
      2021-04-22
      回复
登录 后发表内容
问题标签