你以为你以为的就是你以为的吗?记一次服务器点对点通知的联调过程

公司两个系统。

我们的A系统要给B系统上送业务签约单申请。B系统接收数据后,异步处理,签约完成会主动发送通知给我们的A系统。

接口文档里说明了,通过http协议的post请求来发送异步通知,报文是json格式字符串。

我们A系统定义restful的http接口。

【题外话】@RequestBody注解:@RequestBody接收的参数是来自requestBody中,即请求体。适用于http post请求。请求端通过HttpEntity传递参数,并在请求头中声明数据的类型Content-Type,SpringMVC通过使用 HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。

@RestController
@Slf4j
public class TaxNotifyController {

    @Reference
    private TaxNotifyService taxNotifyService;

    /**
     *
     * @param notifyVO
     * @return
     */
    @PostMapping("/ayncNotify")
    @UnAuthToken
    public String ayncNotify(@RequestBody NotifyVO notifyVO){
        log.info("收到回调----异步回调----异步通知----回调通知:{}", JSON.toJSONString(notifyVO));
        String respText = taxNotifyService.ayncNotify(notifyVO);
        log.info("回调----异步回调----异步通知----回调通知 回写内容:{}",respText);
        return respText;
    }
}

QA在测试过程中,发现我方一直收不到对方的回调。有对方日志截图为证。

查看我们A系统的log。并没有发现“收到回调----异步回调----异步通知----回调通知”这样的log。

难道是B系统到我们A系统的网络不通?双方都是测试环境呀!还是去找运维确认吧。

[[email protected] logs]# curl http://192.168.40.84:8802/ent-boot/ayncNotify
{"code":"ERROR","message":"Request method ‘GET‘ not supported"}

因为需要POST,所以curl接收到这个错误。但至少证明这2个系统间的网络是没问题的。

再次确认我方log。发现蛛丝马迹:

2019-12-13 11:07:01.894 [http-nio-8802-exec-9] INFO  com.emaxcard.car.filter.CrosXssFilter:40 - CrosXssFilter.......orignal url:/ent-boot/ayncNotify,ParameterMap:{}
2019-12-13 11:07:01.895 [http-nio-8802-exec-9] WARN  o.s.w.s.m.support.DefaultHandlerExceptionResolver:197 - Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type ‘text/xml;charset=UTF-8‘ not supported]
2019-12-13 11:07:01.895 [http-nio-8802-exec-9] INFO  com.emaxcard.car.filter.CrosXssFilter:44 - CrosXssFilter..........doFilter url:/ent-boot/ayncNotify,ParameterMap:{}

莫非,对方给的content-type是text/xml??

找B系统的开发同学,经查代码里HttpUtil,果然,指定的content-type是text/xml。 如下图。我们知道,springmvc默认接收数据的格式是json方式序列化的。你指定成xml格式,显然springmvc在反序列化成NotifyVO对象时会抛出异常。自然,就不会执行这个action方法了,所以,我们没看到那条“收到回调----异步回调----异步通知----回调通知”log。

【题外话】关于springmvc的messageconverter设置,可以查看spirng-web.jar里的RestTemplate.java源码。

Line122:jsonbPresent = ClassUtils.isPresent("javax.json.bind.Jsonb", classLoader);

接着说,我们让这位开发同学改成 application/json 后,问题得以解决。

ButButBut,下午,QA在测试付款单的回调的时候,同样的问题又出现了,我们接收不到请求报文。一看log,又是text/xml搞的鬼。B系统的这个付款回调是另一个同学开发的。考虑到目前已经有外部商户接入B系统,他们不准备改了。

不改就不改吧,B系统他们不改,只好我们A系统改了。话说回来,即便他们现在不改,日后有其他商户对接联调时,也难免会出现类似的问题。那,就是以后的事儿了。

我们怎么改呢?那就不直接从RequestBody里接收NotfiyVO对象了,改成接收String字符串。然后,在方法里来做判断和反序列化。改后的代码为:

    @PostMapping("/ayncNotify")
    @UnAuthToken
    public String ayncNotify(@RequestBody String notifyStr){
        log.info("收到回调----异步回调----异步通知----回调通知:{}", notifyStr);
        if(StringUtils.isBlank(notifyStr)){
            log.info("回调通知为空");
            return "ERROR-回调通知请求参数为空";
        }
        NotifyVO notifyVO = JSON.parseObject(notifyStr,NotifyVO.class);
        log.info("回调转换NotifyVo:{}",notifyVO);
        String respText = taxNotifyService.ayncNotify(notifyVO);
        log.info("回调----异步回调----异步通知----回调通知 回写内容:{}",respText);
        return respText;
    }

THE END.

下午得知,一同学在对接付款接口时,当付款接口返回受理失败时,他把付款单的付款结果改成了失败。这可要不得呀!付款结果一定要通过付款查询接口来查。查询返回付款成功,则付款成功;查询返回付款失败,则付款失败;对于查询到的其他结果,保守起见,都视为付款中即可,然后由人工来干预。技术人员千万别自作主张,把某些不明确的结果定为付款失败。万一出现重复付款,那就尴尬了。我在2016年那时刚开始做聚合支付时,是有这样的惨痛经历的。

? Stay Hungry,Stay Foolish.

原文地址:https://www.cnblogs.com/buguge/p/12035854.html

时间: 2024-10-09 13:29:20

你以为你以为的就是你以为的吗?记一次服务器点对点通知的联调过程的相关文章

windows安装TortoiseGit详细使用教程【基础篇】

环境:win8.1 64bit 安装准备: 首先你得安装windows下的git msysgit1.9.5 安装版本控制器客户端tortoisegit  tortoisegit1.8.12.0 [32和64别下载错,不习惯英文的朋友,也可以下个语言包] 一.安装图解: 先安装GIT[一路默认即可] 安装好git以后,右键,会发现菜单多了几项关于GIT的选项 2.安装tortoisegit[一路默认即可] 安装好以后,右键,会发现菜单多了几项关于tortoisegit的选项 到此,安装算完成了,相

iScroll5 API速查随记

版本 针对iScroll的优化.为了达到更高的性能,iScroll分为了多个版本.你可以选择最适合你的版本.目前我们有以下版本: iscroll.js,这个版本是常规应用的脚本.它包含大多数常用的功能,有很高的性能和很小的体积. iscroll-lite.js,精简版本.它不支持快速跳跃,滚动条,鼠标滚轮,快捷键绑定.但如果你所需要的是滚动(特别是在移动平台) iScroll 精简版 是又小又快的解决方案. iscroll-probe.js,探查当前滚动位置是一个要求很高的任务,这就是为什么我决

记一次MySQL找回用户数据

事情经过 有天,我们公司外区的一个销售C说他8月3号以前的工作流记录找不到了.问清缘由,原来是更新了微信号(我们公司的工作流是基于企业微信开发的).经过分析,微信号和流程数据并没什么关系,所以初步得出结论:本来只需要更新微信号的,结果我们公司的流程系统管理员把用户先删除,再创建了新的用户. 解决过程 1.首先想到的是直接从定时备份数据里面找回原来的用户ID,结果发现系统只备份了十天的记录,而工作流系统上显示销售C只有8月3号以后的流程记录,距今已经40多天,从自动备份的数据里已经无法恢复. 2.

聚焦新相亲时代:女孩在京有五六套房哭着想嫁富2代

2017-09-20 07:31:00 来源: 中国青年报(北京)        举报 6984 分享到: 易信 微信 QQ空间 微博 更多 用微信扫码二维码 分享至好友和朋友圈 T + - (原标题:中青报聚焦新相亲时代:2亿人及其背后家庭组成的"擂台") 石家庄某相亲角.视觉中国 资料 平均算下来,每一分钟里,国内有22对新人拿着户口本走向民政局,进入婚姻生活:同时,8对夫妻在另外一个窗口签下离婚协议. 根据民政部公布的数字,中国的结婚率和离婚率曲线渐渐逼近一个闭合的大于号.婚姻的

linux下Nginx配置文件(nginx.conf)配置设置详解(windows用phpstudy集成)

linux备份nginx.conf文件举例: cp /usr/local/nginx/nginx.conf /usr/local/nginx/nginx.conf-20171111(日期) 在进程列表里 面找master进程,它的编号就是主进程号. ps -ef | grep nginx 查看进程 cat /usr/local/nginx/nginx.pid 每次修改完nginx文件都要重新加载配置文件linux命令: /usr/local/nginx -t //验证配置文件是否合法 若ngin

Day5 - 常用模块学习

本节大纲: 模块介绍(模块导入方法) time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configparser hashlib subprocess logging模块 re正则表达式 模块,用一堆代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又

js跨域

第一次写博客,好紧张,不知道能写成啥样,哈哈哈. 自己的一知片解,有错请多多指教,嘻嘻嘻. 一.何为跨域? 只要协议.域名.端口后任何一个不同,就是跨域. 举个例子: http://www.example.com 协议不同 https://www.example.com http://www.example.com 域名不同 http://www.test.com http://www.example.com 端口不同 http://www.example.com:81 注意:ip相同,域名不同

Unity 崩溃问题解决方法——之一

友情提示:工作随记,不喜勿喷 注意:文艺青年可以略过,暴力青年欢迎采纳 Library文件夹 Unity每次编译都会生成这个东西,不用担心丢失的问题.所以,干掉他! 选中 + Delete   或者  选中 + Shift  + Delete 网上看了很多方法,就觉得这个简单,粗暴,是我喜欢的类型. 优点:上面说了 缺点:如果工程过大,重新编译时间会比较长.(但是对于查Log日志来说,相对快点)

06 Theory of Generalization

若H的断点为k,即k个数据点不能被H给shatter,那么k+1个数据点也不能被H给shatter,即k+1也是H的断点. 如果给定的样本数N是大于等于k的,易得mH(N)<2N,且随着N的增大,小得越来越多. 当断点为k时,记最大可能的成长函数mH(N)为bound函数,记为B(N,k).------只和N.k有关 注意比较,发现bound函数比起成长函数消除了H. 如果无断点,自然没有B(N,k)什么事: 如果断点为k, 那么mH(N)是给定H下,可能的最大假设类数: B(N,k)是不限H下

三支一扶成绩什么时候出来?

三支一扶考试成绩是各位考生在参加了三支一扶考试之后关注的第一件事,那么在三支一扶考试之后到底三支一扶成绩什么时候出来[gwy.kaoshib.com/szyf/cjcx/52863.html]呢?今天小编就为大家介绍一下. 三支一扶成绩什么时候出来这个问题使参加完考试之后的一个重大问题,三支一扶成绩一般会在考试进行的半个月之后进行考试成绩的发布,但是也有一些省份会在考试结束之后的第二天发布此次的考试成绩. 因为三支一扶考试不是统一进行考试,考试时间不一样,当然三支一扶成绩什么时候出来的时间也就不