记录微信支付回调body体为空时Spring GateWay报错

639 阅读2分钟

我正在参加「掘金·启航计划」

1. 背景

最近自己的SpringCloud项目接入了微信支付,那么当然也少不了spring GateWay这一个网关层了。接入他的原因是为了拆分流量。纯属就是技术上的要求,需要网关帮助应用减少项目。在调试微信支付的时候,大家应该都知道,用户支付以后微信会回调你填写的回调接口,以便通知商家用户完成了支付,可以继续处理对应的业务了。本来在不接入Spring GateWay的时候可以正常回调,但是用到了网关以后发现就回调失败了。

2. 案件复现

可以看到我写了一个post接口当做微信的回调接口,这个接口比较特殊的是他不是传统的json格式交互。而是以参数的形式将对应参数和值传给我们。

在测试过程中发现一直没有调用我的接口,由于是网关层去分发的调用哪个runtime。网关层的日志一直打印404。很显然就是没有找到我的接口。那么为什么呢会这样呢?一般来说就是spring GateWay的路由有问题。

3. 解决方案

解决方案:当识别到路径为特定路径时,直接转发到对应的runtime上处理即可解决。

    1. 自定义RoutesConfig文件
    2. 重新定一个RouteLocator的bean

代码的代码如下:

@Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            // 解决POST请求,BODY内容体为空,抛404错误。。
            .route(r -> r.method(HttpMethod.POST).or().method(HttpMethod.GET).and()
                .path("/xxx/jsapi/refundTransaction", "/xxx/app/refundTransaction",
                    "/xxx/jsapi/transaction", "/xxx/app/transaction", "/xxx/alipay/transaction")
                .uri("lb://xxxx-xxx-runtime"))
            .build();
    }

什么意思呢?

我们自定义个route,当请求方法是POST或者是GET时,并且路径跟我们想要的路径一直时。我们转发到自定义的runtime上。实现接口的调用。

4. 思考

在接入对应新的技术时,可能会配上一些以前没有见过的问题。要自己尝试着去百度、去翻资料解决。可以多尝试,试错的成本花费了时间,但是总会有收获的。并且把对应的记录下来。