请问下支付宝扫码付款成功回调接口没反应是什么问题

白白了白呀白 2019-03-01 12:56:30
我有设置异步回调的地址,调用支付宝扫码的接口生成二维码链接 然后转化成二维码图片,手机沙箱扫了之后支付成功后,后台日志没有显示回调接口相关的信息,订单状态也没有改变,这是什么问题呢?用的支付宝沙箱环境做的测试
...全文
3624 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
t5399468 2019-03-18
  • 打赏
  • 举报
回复
如果排除掉代码没有问题的话,再检查公钥,记住是支付宝公钥 不是应用公钥
t5399468 2019-03-18
  • 打赏
  • 举报
回复
可以检查生成订单的封装方法,签名是否为RSA2,签证签名你也敢取消 不想活了吧
亲爱的Joe 2019-03-06
  • 打赏
  • 举报
回复
我没做过没用过可以被邀请么?
两个可能:
1.支付操作一般不会只有一个即时回调,除了即时回调外一定还有一个异步机制来返回消息给用户,即时回调失败时,几分钟后异步再回调,如果再失败,几个小时后再回调.
2.你自己打印回调信息的时候除了问题。

我觉得一出问题可能性不大,一般都会直接回调成功。所以,仔细检查你自己回调部分的代码
小鱼编程 2019-03-04
  • 打赏
  • 举报
回复
回调URL是不是有错,或者有什么访问限制
  • 打赏
  • 举报
回复
引用 7 楼 qq389203946的回复:
[quote=引用 6 楼 大隐藏于寺 的回复:] [quote=引用 3 楼 qq389203946 的回复:] [quote=引用 1 楼 qybao 的回复:] 你的回调URL是不是有错,或者有什么访问限制?
引用 2 楼 大隐藏于寺 的回复:
就像二楼说的是不是有访问限制,比如系统做了登录拦截,回调的接口未做匿名访问处理.或者接口地址不是公网的ip,未做内网穿透,无法访问.
回调地址应该没错,对了几遍了 我回调地址跟扫码支付的方法是在同一个接口类里的 扫码支付能请求进来 我回调应该也能请求到才对,系统并未有什么登陆拦截,另外你说的匿名访问处理是指的什么呢? 我项目是部署在外网服务器上的[/quote] 如果没有拦截登录,也就不用管匿名访问了.[/quote] 已经解决了自己粗心大意了 现在回调能进入了 但是不知道为什么会验签失败接收参数 验签这步是用的官方的demo的,验签需要的参数我改成自己沙箱的了。。不知道为什么验签返回的结果一直是false。我里面代码是如果验签成功另起一个线程做订单的更改,另外按原来执行的不管验签结果是fasle还是true我都给支付宝返回success,不知道是否合理[/quote] 如果只是测试,可以把验签这一步先取消,直接返回success
  • 打赏
  • 举报
回复
引用 楼主 qq389203946的回复:
我有设置异步回调的地址,调用支付宝扫码的接口生成二维码链接 然后转化成二维码图片,手机沙箱扫了之后支付成功后,后台日志没有显示回调接口相关的信息,订单状态也没有改变,这是什么问题呢?用的支付宝沙箱环境做的测试
调用的接口有问题。。。。你是pc端再用吗?
极客诗人 2019-03-04
  • 打赏
  • 举报
回复
异步通知用postman测试一下 看是否能正常访问

验签这一块如果只是用来测试页面直接打印success就行
boai2222 2019-03-02
  • 打赏
  • 举报
回复
应该是签名格式不对
白白了白呀白 2019-03-02
  • 打赏
  • 举报
回复
我是按照支付宝文档demo的形式用map形式写好对应参数,然后直接调用支付包的接口方法就行了,好像都帮我们封装好了。微信我是需要自己把参数生成个签名,支付宝好像不用我处理,然后回调验签和之前的代码也是官方的demo里的
seagate_ok 2019-03-02
  • 打赏
  • 举报
回复
长知识了,冒个泡
qq_33825461 2019-03-02
  • 打赏
  • 举报
回复
这个支付宝还有那么麻烦吗?
weixin_37749641 2019-03-02
  • 打赏
  • 举报
回复
弄了半天还是不行 不知道哪里出了问题
湖桥雨到时 2019-03-02
  • 打赏
  • 举报
回复
长知识了,冒个泡
youyou_1969 2019-03-02
  • 打赏
  • 举报
回复
长知识了,冒个泡
qybao 2019-03-01
  • 打赏
  • 举报
回复
签名逻辑不对吧。签名是用key1=value1&key2=value2...这样的请求参数的格式的,看你的代码并不符合啊。
白白了白呀白 2019-03-01
  • 打赏
  • 举报
回复
引用 10 楼 大隐藏于寺 的回复:
[quote=引用 7 楼 qq389203946 的回复:] [quote=引用 6 楼 大隐藏于寺 的回复:] [quote=引用 3 楼 qq389203946 的回复:] [quote=引用 1 楼 qybao 的回复:] 你的回调URL是不是有错,或者有什么访问限制?
引用 2 楼 大隐藏于寺 的回复:
就像二楼说的是不是有访问限制,比如系统做了登录拦截,回调的接口未做匿名访问处理.或者接口地址不是公网的ip,未做内网穿透,无法访问.
回调地址应该没错,对了几遍了 我回调地址跟扫码支付的方法是在同一个接口类里的 扫码支付能请求进来 我回调应该也能请求到才对,系统并未有什么登陆拦截,另外你说的匿名访问处理是指的什么呢? 我项目是部署在外网服务器上的[/quote] 如果没有拦截登录,也就不用管匿名访问了.[/quote] 已经解决了自己粗心大意了 现在回调能进入了 但是不知道为什么会验签失败接收参数 验签这步是用的官方的demo的,验签需要的参数我改成自己沙箱的了。。不知道为什么验签返回的结果一直是false。我里面代码是如果验签成功另起一个线程做订单的更改,另外按原来执行的不管验签结果是fasle还是true我都给支付宝返回success,不知道是否合理[/quote] 才看到这个回复,你看下是否需要先Base64解码,然后再验签.一般这种异步通知都有次数限制,比如说几小时内只通知几次,最多通知几次,所以可以验签失败了,可以不用返回success,后续会通知.[/quote] 谢谢 我再调调,有问题再请教你
大隐藏于寺 2019-03-01
  • 打赏
  • 举报
回复
引用 7 楼 qq389203946 的回复:
[quote=引用 6 楼 大隐藏于寺 的回复:] [quote=引用 3 楼 qq389203946 的回复:] [quote=引用 1 楼 qybao 的回复:] 你的回调URL是不是有错,或者有什么访问限制?
引用 2 楼 大隐藏于寺 的回复:
就像二楼说的是不是有访问限制,比如系统做了登录拦截,回调的接口未做匿名访问处理.或者接口地址不是公网的ip,未做内网穿透,无法访问.
回调地址应该没错,对了几遍了 我回调地址跟扫码支付的方法是在同一个接口类里的 扫码支付能请求进来 我回调应该也能请求到才对,系统并未有什么登陆拦截,另外你说的匿名访问处理是指的什么呢? 我项目是部署在外网服务器上的[/quote] 如果没有拦截登录,也就不用管匿名访问了.[/quote] 已经解决了自己粗心大意了 现在回调能进入了 但是不知道为什么会验签失败接收参数 验签这步是用的官方的demo的,验签需要的参数我改成自己沙箱的了。。不知道为什么验签返回的结果一直是false。我里面代码是如果验签成功另起一个线程做订单的更改,另外按原来执行的不管验签结果是fasle还是true我都给支付宝返回success,不知道是否合理[/quote] 才看到这个回复,你看下是否需要先Base64解码,然后再验签.一般这种异步通知都有次数限制,比如说几小时内只通知几次,最多通知几次,所以可以验签失败了,可以不用返回success,后续会通知.
大隐藏于寺 2019-03-01
  • 打赏
  • 举报
回复
项目部署在外网上并且无登录拦截,用postman模拟下能否直接请求到,如果能访问到,要考虑是不是支付宝没有回调这个接口
白白了白呀白 2019-03-01
  • 打赏
  • 举报
回复
引用 6 楼 大隐藏于寺 的回复:
[quote=引用 3 楼 qq389203946 的回复:] [quote=引用 1 楼 qybao 的回复:] 你的回调URL是不是有错,或者有什么访问限制?
引用 2 楼 大隐藏于寺 的回复:
就像二楼说的是不是有访问限制,比如系统做了登录拦截,回调的接口未做匿名访问处理.或者接口地址不是公网的ip,未做内网穿透,无法访问.
回调地址应该没错,对了几遍了 我回调地址跟扫码支付的方法是在同一个接口类里的 扫码支付能请求进来 我回调应该也能请求到才对,系统并未有什么登陆拦截,另外你说的匿名访问处理是指的什么呢? 我项目是部署在外网服务器上的[/quote] 如果没有拦截登录,也就不用管匿名访问了.[/quote] 这是我回调的代码 能否帮我看下有什么问题吗 谢谢

public void aliPayNotify(HttpServletResponse response, HttpServletRequest request) {
        logger.info("==========comming进入支付宝回调处理==========");
        Map<String, String> params = new HashMap<>();
        Map requestParams = request.getParameterMap();
        for (Iterator iterator = requestParams.keySet().iterator(); iterator.hasNext(); ) {
            String name = (String) iterator.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用。
            try {
                valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            params.put(name, valueStr);
            logger.info("========== " + valueStr + "===========");
        }
        try {
            boolean flag = AlipaySignature.rsaCheckV1(params, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.CHARSET, "RSA2");
            logger.info("========支付宝回验证结果:  " + flag);
            String orderNo = request.getParameter("out_trade_no");
            //交易状态
            String tradeStatus = request.getParameter("trade_status");
            //验证成功
            if (flag) {
                logger.info("=========支付宝回调签名认证成功=========");
                //验证支付宝通知的参数是否正确
                this.check(params);
                // 另起线程处理业务
                executorService.execute(new Runnable() {
                    @Override
                    public void run() {
                        // 支付成功
                        if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)) {
                            //修改订单状态
                            WaterOrder waterOrder = waterOrderService.loadByOrderNo(orderNo);
                            if (1 == waterOrder.getStatus()) {
                                waterOrder.setStatus(0);
                                waterOrderService.save(waterOrder);
                                System.out.println("支付宝订单支付回调成功!");
                            } else {
                                System.out.println("支付宝订单支付回调异常,订单状态不对!");
                            }
                        } else {
                            logger.error("=========没有处理支付宝回调,支付宝交易状态:{}, params:{}", tradeStatus, params);
                        }
                        //是二维码支付的删除二维码图片
                        File file = new File(UrlConfigUtil.LOCAL_UPLOAD_URL + "qrcode", orderNo + ".png");
                        if (file.exists()) {
                            file.delete();
                        }
                    }
                });
                
            }
            // 如果签名验证正确,立即返回success,后续业务另起线程单独处理
            // 业务处理失败,可查看日志进行补偿,跟支付宝已经没多大关系。
            response.getWriter().write("success");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
白白了白呀白 2019-03-01
  • 打赏
  • 举报
回复
引用 6 楼 大隐藏于寺 的回复:
[quote=引用 3 楼 qq389203946 的回复:] [quote=引用 1 楼 qybao 的回复:] 你的回调URL是不是有错,或者有什么访问限制?
引用 2 楼 大隐藏于寺 的回复:
就像二楼说的是不是有访问限制,比如系统做了登录拦截,回调的接口未做匿名访问处理.或者接口地址不是公网的ip,未做内网穿透,无法访问.
回调地址应该没错,对了几遍了 我回调地址跟扫码支付的方法是在同一个接口类里的 扫码支付能请求进来 我回调应该也能请求到才对,系统并未有什么登陆拦截,另外你说的匿名访问处理是指的什么呢? 我项目是部署在外网服务器上的[/quote] 如果没有拦截登录,也就不用管匿名访问了.[/quote] 已经解决了自己粗心大意了 现在回调能进入了 但是不知道为什么会验签失败接收参数 验签这步是用的官方的demo的,验签需要的参数我改成自己沙箱的了。。不知道为什么验签返回的结果一直是false。我里面代码是如果验签成功另起一个线程做订单的更改,另外按原来执行的不管验签结果是fasle还是true我都给支付宝返回success,不知道是否合理
加载更多回复(6)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧