大海话语 2021-12-18 14:51 采纳率: 87.6%
浏览 103
已结题

我在App用支付宝支付后,回调路径支付宝反馈是正确的,但是部署在服务器上,是有错误或异常的

我在App用支付宝支付后,写了一个回调。跟支付宝技术客服,确认路径是对的。就是他们那里显示的是一个500。
那么,我用了下postMan测试,给写定了值,直接写死的值 可以跑通,但是,在服务器上就不行了。我不知道这是路径有问题吗?还是说设置的得到的值还有什么问题。一直没有弄通呀。。 或者是公钥的问题。回调的公钥我就是用的支付的。
下面是代码 回调的

/**
     * @Function: App支付成功 支付宝异步通知回调
     */
    @ApiOperation(value = "支付宝异步通知回调")
    @ResponseBody
    @PostMapping("/notify")
    public void asyncNotification(HttpServletRequest request) {
        //获取支付宝POST过来反馈信息
        Map<String, String> params = new HashMap<String, String>();
        Map requestParams = request.getParameterMap();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
            String name = (String) iter.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] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用。
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }
        //切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
        //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
        boolean signVerified = false;//初始化,必须要有一个值,不然为null,然后,下面if (signVerified) {}就会空指针报错
        try {
            signVerified = AlipaySignature.rsaCheckV1(params, aliPayProjectInit.publicKey, "utf-8", "RSA2");
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        //返回状态存入redis中
        // 对验签进行处理
       /* 实际验证过程建议商户务必添加以下校验:
    1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
    2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
    3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
    4、验证app_id是否为该商户本身。
    */
        PrintWriter out = null;//PrintWriter 直接在网页显示字符
        if (signVerified) {//验证成功

            String out_trade_no = null;  //商户订单号
            String trade_no = null;      //支付宝交易号
            String trade_status = null;  //交易状态
            try {
                //商户订单号(我们自己生成的,由支付宝校验,支付成功后,返回给我们的)
                out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
                //支付宝交易号
                trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
                //交易状态
                trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            // 支付金额
            String totalAmount = request.getParameter("total_amount");
            // 支付时间
            String payDate = request.getParameter("gmt_payment");

            GOrder gOrder = new GOrder();
            gOrder.setOutTradeNo(out_trade_no); //商户订单号
            gOrder.setTotalAmount(totalAmount); // 支付金额
            gOrder.setTradeNo(trade_no);        //支付宝交易号
            gOrder.setGmtPayment(payDate);      // 支付时间
            gOrder.setPayStatus(1);             //支付状态
            gOrder.setTradeStatus(trade_status);

            GOrder gOrderOrg = payService.selectGOrder(out_trade_no);
            //在支付后,如果outTradeNo对得上号 就去更新状态
            if ("".equals(gOrderOrg) || gOrderOrg != null) {
                payService.updateGOrder(gOrder);
            }
            payService.updateGOrder(gOrder);//去更新

            if (trade_status.equals("TRADE_FINISHED")) {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //如果有做过处理,不执行商户的业务程序

                //注意:
                //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
            } else if (trade_status.equals("TRADE_SUCCESS")) {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //如果有做过处理,不执行商户的业务程序

                //注意:
                //付款完成后,支付宝系统发送该交易状态通知

            }

            out.println("success");
        } else {//验证失败
            out.println("fail");
        }

    }

  • 写回答

3条回答 默认 最新

  • togolife 2021-12-18 18:06
    关注

    它们请求返回500,以及你放到服务器上就不行,那应该是服务器的配置问题。内部调用失败,还没有调用到这个接口?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月27日
  • 已采纳回答 12月19日
  • 赞助了问题酬金 12月18日
  • 修改了问题 12月18日
  • 展开全部

悬赏问题

  • ¥15 求帮我调试一下freefem代码
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图