java整合支付宝遇到的坑及解决方法

实在是不知道是我代码写的不对还是支付宝本身就有的坑,整合的时候碰到的问题简直就是俄罗斯套娃;

1.这个回调地址存放的值应该是放在params里的,不知道是因为什么原因我一直取的为空,,,,,

请添加图片描述
这个是请求的参数(按理来说应该可以拿到的);

2.这个传输协议的Content-Type原来正常应该都是穿的json格式的数据,但是支付宝的不太一样,他是这个(application/x-www-form-urlencoded; text/html; charset=utf-8),所以传的值是text文本的,不是json。。。。

3.使用支付宝验签的时候,使用的是支付宝公钥,不是应用公钥。。。。

4.请求的参数要使用URLDecoder来转译。。。不然会验签失败

就这么些个错误愣是改了两天,才找出来的,慢慢解决掉的,不知道有没有人跟我一样悲催的

    @RequestMapping(value = "/alipay/callback")
    @ApiOperation(value = "支付宝回调地址", notes = "支付宝支付回调")
    public String paymentAlipayCallback(HttpServletRequest request) {
        logger.error("1.开始执行回调方法:");
        try {
            //获取body里的信息使用二进制获取
            BufferedReader br = null;
            StringBuilder sb = new StringBuilder("");
            try {
                br = request.getReader();
                String str;
                while ((str = br.readLine()) != null) {
                    sb.append(str);
                }
                br.close();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (null != br) {
                    try {
                        br.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            Map<String, String> params = new HashMap<>();

            String toJSONString = sb.toString();

            //将url转map
            String[] param = toJSONString.split("&");
            for (String s : param) {
                String[] p = s.split("=");
                if (p.length == 2) {

                    String decode = URLDecoder.decode(p[1], "UTF-8");
                    params.put(p[0],decode);
                }
            }

            boolean checkV1 = AlipaySignature.rsaCheckV1(params, PMaliPublicKey, CHARSET, SIGN_TYPE);
            if (!checkV1) {
                logger.error("验签异常 -> AlipaySignature error");
                return "failure";
            }

            String appId = params.get("app_id"); // 支付宝appid

            if (!pMaliAppId.equals(appId)) {
                logger.error("appid错误 -> app_id error. request: {}, response: {} ", pMaliAppId, appId);
                return "failure";
            }
            // 交易状态 TRADE_CLOSED交易关闭 TRADE_FINISHED交易完结 TRADE_SUCCESS支付成功 WAIT_BUYER_PAY交易创建
            String tradeStatus = params.get("trade_status");
            if (NOTIFY_TRADE_STATUS_SUCCESS.equals(tradeStatus) || NOTIFY_TRADE_STATUS_FINISHED.equals(tradeStatus)) {
                MealOrders mealOrders = mealOrdersService.getByParamNo(params.get("out_trade_no"));// 订单号
                // 订单号
                if (mealOrders == null) {
                    logger.error("支付宝回调编号错误找不到相应的编号 -> out_trade_no error. out_trade_no: {} ", params.get("out_trade_no"));
                    return "failure";
                }
                //支付金额
                if (mealOrders.getPaymentPrice().compareTo(new BigDecimal(params.get("total_amount"))) != 0) {
                    logger.error("支付宝支付金额与应付金额不等 -> total_amount error. total_amount: {} ", params.get("total_amount"));
                    return "failure";
                }

                // 付款回调,处理后续付款逻辑
                mealOrdersService.paySuccess(mealOrders);
                return "success";
            }
            return "failure";
        } catch (Exception ex) {
            ex.printStackTrace();
            logger.error("支付宝支付状态异常:{}", ex);
            return "failure";
        }
    }

参考链接:
https://www.cnblogs.com/panxuejun/p/6550131.html(decode转译)
https://blog.csdn.net/mengxianhua/article/details/9961843(url转map)
https://blog.csdn.net/chai1230/article/details/105674244(获取post方法里的body信息)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值