记一次支付宝H5证书方式支付、回调、及退款

导入依赖:

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.33.1.ALL</version>
</dependency>

1、支付宝H5支付

 public void payH5(HttpServletRequest request, HttpServletResponse response,String orderSn) throws Exception{
        AlipayConfig alipayConfig = new AlipayConfig();
//设置网关地址
        alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
//设置应用ID
        alipayConfig.setAppId("");
//设置应用私钥
        alipayConfig.setPrivateKey(APP_PRIVATE_KEY);
//设置请求格式,固定值json
        alipayConfig.setFormat("json");
//设置字符集
        alipayConfig.setCharset("UTF-8");
//设置签名类型
        alipayConfig.setSignType("RSA2");
//设置应用公钥证书路径,项目路径
        alipayConfig.setAppCertPath("src/main/resources/appCertPublicKey_2021003135656021.crt");
//设置支付宝公钥证书路径
        alipayConfig.setAlipayPublicCertPath("src/main/resources/alipayCertPublicKey_RSA2.crt");
//设置支付宝根证书路径
        alipayConfig.setRootCertPath("src/main/resources/alipayRootCert.crt");
//构造client
        AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
//        Orders orders=ordersMapper.findByOrderSn(orderSn);
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", orderSn);
        bizContent.put("subject", "orderId");
        bizContent.put("product_code", "QUICK_WAP_WAY");
        bizContent.put("total_amount", "0.01");

//        请求响应返回对象:AlipayTradeWapPayResponse

        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
        //跳转链接
        alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
        //回调地址
        alipayRequest.setNotifyUrl("http://********/ali/pay/call");//在公共参数中设置回跳和通知地址
        alipayRequest.setBizContent(bizContent.toString());//填充业务参数
        String form="";
        try {
            form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        response.setContentType("text/html;charset=" + "UTF-8");
        response.getWriter().write(form);//直接将完整的表单html输出到页面
        System.out.println("-----------------------------"+form);
        response.getWriter().flush();
        response.getWriter().close();

    }

2、支付宝回调

    public String  call(HttpServletRequest request, HttpServletResponse response) throws Exception {
        Map<String, String> params = convertRequestParamsToMap(request); // 将异步通知中收到的待验证所有参数都存放到map中
        String paramsJson = JSONUtil.toJsonStr(params);
        logger.info("支付宝回调参数,{}", paramsJson);
        try {
            // 调用SDK验证签名,注意这里是支付宝公钥(*既不是私钥,也不是应用公钥)
            boolean signVerified = AlipaySignature.rsaCertCheckV1(params, "src/main/resources/alipayCertPublicKey_RSA2.crt", "UTF-8", "RSA2");
            if (signVerified) {
                logger.info("支付宝回调签名认证成功");
                //验签通过 获取交易状态
                String tradeStatus = params.get("trade_status");
                //只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。
                if (tradeStatus.equals("TRADE_SUCCESS") ||tradeStatus.equals("TRADE_FINISHED")) {
                    System.out.println("********************************处理业务逻辑**************************************************************");
                    //TODO 处理自身业务逻辑
                    cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(paramsJson);
                    String bankOrderNo = jsonObject.get("trade_no").toString();
                    String orderSn = jsonObject.get("out_trade_no").toString();
                    String amount = jsonObject.get("total_amount").toString();
//                    String id = jsonObject.get("subject").toString();
//                    Integer orderId = Integer.parseInt(id);
//                    System.out.println("主订单ID----"+orderId);
                    System.out.println(orderSn);

                    //TODO 操作自身业务逻辑


                    // 如果签名验证正确,立即返回success,后续业务另起线程单独处理
                    // 业务处理失败,可查看日志进行补偿,跟支付宝已经没多大关系。
                    System.out.println("************************************************处理业务逻辑结束********************************************");
                    return "success";
                }else {
                    return "failure";
                }
            } else {
                logger.info("支付宝回调签名认证失败,signVerified=false, paramsJson:{}", paramsJson);
                return "failure";
            }
        } catch (AlipayApiException e) {
            logger.error("支付宝回调签名认证失败,paramsJson:{},errorMsg:{}", paramsJson, e.getMessage());
            return "failure";
        }
    }

3、支付宝证书退款

@GetMapping("/refoundMoney")
    public Result refoundMoney(@RequestParam String orderSn) throws AlipayApiException, JDOMException, IOException {
        //获得初始化的AlipayClient
//        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfigs.gatewayUrl, AlipayConfigs.APP_ID,
//                AlipayConfigs.APP_PRIVATE_KEY, "json", AlipayConfigs.CHARSET, AlipayConfigs.ALIPAY_PUBLIC_KEY, AlipayConfigs.sign_type);
        AlipayConfig alipayConfig = new AlipayConfig();
//设置网关地址
        alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
//设置应用ID
        alipayConfig.setAppId("");
//设置应用私钥
        alipayConfig.setPrivateKey(APP_PRIVATE_KEY);
//设置请求格式,固定值json
        alipayConfig.setFormat("json");
//设置字符集
        alipayConfig.setCharset("UTF-8");
//设置签名类型
        alipayConfig.setSignType("RSA2");
//设置应用公钥证书路径
        alipayConfig.setAppCertPath("src/main/resources/appCertPublicKey_2021003135656021.crt");
//        alipayConfig.setAppCertPath("/home/cert/appCertPublicKey_2021003135656021.crt");
//设置支付宝公钥证书路径
        alipayConfig.setAlipayPublicCertPath("src/main/resources/alipayCertPublicKey_RSA2.crt");
//        alipayConfig.setAlipayPublicCertPath("/home/cert/alipayCertPublicKey_RSA2.crt");
//设置支付宝根证书路径
//        alipayConfig.setRootCertPath("/home/cert/alipayRootCert.crt");
        alipayConfig.setRootCertPath("src/main/resources/alipayRootCert.crt");
//构造client
        AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
//        Refund refunds=refundMapper.findBySn(refundSn);
        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
        Orders orders=orderMapper.findByOrderSn(orderSn);
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", orderSn);   //都使用商户订单号,不适用支付宝的(不知道为什么使用支付宝的会错)
        bizContent.put("refund_amount", orders.getPayAmount());
        bizContent.put("refund_reason", "买错了我要退钱");

        request.setBizContent(bizContent.toString());
        AlipayTradeRefundResponse response = alipayClient.certificateExecute(request);
        if(response.isSuccess()){
            System.out.println("调用成功------返回参数:"+response.getBody());

            JSONObject jsonObject= JSON.parseObject(response.getBody());
            System.out.println("--------------------------------------------map"+jsonObject);
            JSONObject jsonObject1= (JSONObject) jsonObject.get("alipay_trade_refund_response");
            System.out.println("------------------------------------"+jsonObject1);
            String tradeNo=jsonObject1.getString("trade_no");
            System.out.println("-------------------------------trade_no"+tradeNo);
//            System.out.println("--------------------------------------------"+map.get("alipay_trade_refund_response"));

            return Result.success();
        } else {
//            System.out.println("调用失败");

            return Result.fail("退款失败");
        }
    }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值