SpringBoot实现用支付宝(支付、查询、退款(附源码))

SpringBoot继承支付宝(支付、查询、退款)

首先推荐个视频给各位先熟悉熟悉,怎么将支付宝的给你的老版demo运行起来

https://www.bilibili.com/video/BV1Ft41167fk?p=11&t=149

怎么从eclipse到IDEA中的SpringBoot工程?

前提:看看项目的工程结构和包名。
在这里插入图片描述
在这里插入图片描述
第一步:导入依赖

 <!--支付宝sdk依赖-->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>3.1.0</version>
        </dependency>

如果你觉得我的依赖版本低了,那么你可以查看最新依赖查看地方(就是你是人类认证有点麻烦):

在这里插入图片描述

第二步:配置AlipayConfig文件

注意:如果这里的配置什么的,你不懂什么意思,请将最前面的视频链接看一遍。

import org.springframework.context.annotation.Configuration;

@Configuration
public class AlipayConfig {

    // AppId
    public static String app_id = "2021000117611220";

    // 商户私钥  由于开源密钥,导致恶意破环所以自行申请
    public static  String merchant_private_key = "**********";

    // 支付宝公钥
    public static  String alipay_public_key = "********";

    // 服务器异步通知页面路径
    public static  String notify_url = "http://www.baidu.com";

    // 页面跳转同步通知页面路径,回调地址
    public static  String return_url = "http://www.baidu.com";

    // 字符编码格式
    public static  String charset = "UTF-8";

    // 数据格式
    public static  String format = "json";

    // 签名方式
    public static  String sign_type = "RSA2";

    // 支付宝网关
    public static String gateway = "https://openapi.alipaydev.com/gateway.do";
}

其实这里的配置文件就是那个demo里面的,请看下面:

在这里插入图片描述

所以弄懂我这个先得把demo里面的东西弄懂即可。

第三步:写Service层中的PayService类(支付)

@Service
public class PayService {

    public Object pay() throws Exception {

        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(
                AlipayConfig.gateway,
                AlipayConfig.app_id,
                AlipayConfig.merchant_private_key,
                "json",
                AlipayConfig.charset,
                AlipayConfig.alipay_public_key,
                AlipayConfig.sign_type
        );
        //设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

        //商户订单号,商户网站订单系统中唯一订单号,必填
        String out_trade_no = new String("WIDout_trade_no");
        //付款金额,必填
        String total_amount = new String("11.5");
        //订单名称,必填
        String subject = new String("测试专用");
        //商品描述,可空
        String body = new String("专为测试而生");

        alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
                + "\"total_amount\":\""+ total_amount +"\","
                + "\"subject\":\""+ subject +"\","
                + "\"body\":\""+ body +"\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        //请求
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        return result;
    }
}

然而这个PayService也就跟demo里面jsp中的代码一样,请看下面
在这里插入图片描述

其他几个查询、退款啥的都可以从支付宝提供的demo中找,所以下面就不详细阐述了。

其他几个类附代码:

QueryService类(查询订单)

@Service
public class QueryService {

    public Object query() throws AlipayApiException {
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(
                AlipayConfig.gateway,
                AlipayConfig.app_id,
                AlipayConfig.merchant_private_key,
                "json",
                AlipayConfig.charset,
                AlipayConfig.alipay_public_key,
                AlipayConfig.sign_type
        );

        //设置请求参数
        AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();

        //商户订单号,后台可以写一个工具类生成一个订单号,必填
        String out_trade_no = new String("20210210210655");
        //支付宝交易号,后台可以写一个工具类生成一个订单号,必填
        String trade_no  = new String("2021021022001468560501398476");

        alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","+"\"trade_no\":\""+ trade_no +"\"}");

        //请求
        String result = alipayClient.execute(alipayRequest).getBody();

        //输出
        System.out.println(result);
        System.out.println("查询成功");
        return result;
    }
}

RefundQueryService类(退款查询)

@Service
public class RefundQueryService {
    public Object refundQuery() throws AlipayApiException {
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(
                AlipayConfig.gateway,
                AlipayConfig.app_id,
                AlipayConfig.merchant_private_key,
                "json",
                AlipayConfig.charset,
                AlipayConfig.alipay_public_key,
                AlipayConfig.sign_type
        );

        //设置请求参数
        AlipayTradeFastpayRefundQueryRequest alipayRequest = new AlipayTradeFastpayRefundQueryRequest();

        //商户订单号,后台可以写一个工具类生成一个订单号,必填
        String out_trade_no = new String("20210210211025");
        //支付宝交易号,后台可以写一个工具类生成一个订单号,必填
        String trade_no  = new String("2021021022001468560501398642");

        //请求退款接口时,传入的退款请求号,如果在退款请求时未传入,则该值为创建交易时的外部交易号,必填
        String out_request_no = new String("WIDRQout_request_no");

        alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
                +"\"trade_no\":\""+ trade_no +"\","
                +"\"out_request_no\":\""+ out_request_no +"\"}");

        //请求
        String result = alipayClient.execute(alipayRequest).getBody();
        //输出
        System.out.println(result);
        System.out.println("查询退余额成功");
        return result;
    }
}

RefundService类(退款)

@Service
public class RefundService {

    public Object refund() throws AlipayApiException {
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(
                AlipayConfig.gateway,
                AlipayConfig.app_id,
                AlipayConfig.merchant_private_key,
                "json",
                AlipayConfig.charset,
                AlipayConfig.alipay_public_key,
                AlipayConfig.sign_type
        );
        //设置请求参数
        AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();

        //商户订单号,后台可以写一个工具类生成一个订单号,必填
        String out_trade_no = new String("20210210211025");
        //支付宝交易号,后台可以写一个工具类生成一个订单号,必填
        String trade_no  = new String("2021021022001468560501398642");
        //付款金额,从前台获取,必填
        String refund_amount = new String("10.50");
        //订单名称/标题,可自定义
        String subject = new String("支付宝沙箱测试");
        alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
                + "\"trade_no\":\""+ trade_no +"\","
                + "\"refund_amount\":\""+ refund_amount +"\"}");

        //请求
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        //输出
        System.out.println("result:"+result);
        //
        System.out.println("退款成功");
        return result;
    }
}

Controller层

@RestController
@RequestMapping(value = "/pay")
@AllArgsConstructor
@CrossOrigin
public class PayController {

    @Autowired
    private PayService payService;

    @Autowired
    private RefundService refundService;

    @Autowired
    private QueryService queryService;

    @Autowired
    private RefundQueryService refundQueryService;

    /**
     * 下单支付
     */
    @GetMapping(value = "/confirm", produces = {"text/html;charset=UTF-8"})
    public Object pay() throws Exception {
        //这个接口其实应该是post方式的,但是我这里图方便,直接以get方式访问,
        //且返回格式是text/html,这样前端页面就能直接显示支付宝返回的html片段
        //真实场景下由post方式请求,返回code、msg、data那种格式的标准结构,让前端拿到data里的
        //html片段之后自行加载
        System.out.println("执行了支付");
        return payService.pay();
    }

    /**
     * 下单退款
     */
    @GetMapping(value = "/refund", produces = {"text/html;charset=UTF-8"})
    public Object refund() throws Exception {
        //这个接口其实应该是post方式的,但是我这里图方便,直接以get方式访问,
        //且返回格式是text/html,这样前端页面就能直接显示支付宝返回的html片段
        //真实场景下由post方式请求,返回code、msg、data那种格式的标准结构,让前端拿到data里的
        //html片段之后自行加载
        System.out.println("执行了退款");
        return refundService.refund();
    }

    /**
     * 下单查询
     */
    @GetMapping(value = "/query", produces = {"text/html;charset=UTF-8"})
    public Object query() throws Exception {
        //这个接口其实应该是post方式的,但是我这里图方便,直接以get方式访问,
        //且返回格式是text/html,这样前端页面就能直接显示支付宝返回的html片段
        //真实场景下由post方式请求,返回code、msg、data那种格式的标准结构,让前端拿到data里的
        //html片段之后自行加载
        System.out.println("执行了查询");
        return queryService.query();
    }

    /**
     * 退款查询
     */
    @GetMapping(value = "/refundquery", produces = {"text/html;charset=UTF-8"})
    public Object refundQuery() throws Exception {
        //这个接口其实应该是post方式的,但是我这里图方便,直接以get方式访问,
        //且返回格式是text/html,这样前端页面就能直接显示支付宝返回的html片段
        //真实场景下由post方式请求,返回code、msg、data那种格式的标准结构,让前端拿到data里的
        //html片段之后自行加载
        System.out.println("执行了退款查询");
        return refundQueryService.refundQuery();
    }
}

静态资源里面的html为:

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>确认订单</title>
</head>
<body>
<div>
    您的订单信息如下,请确认无误后支付:<br />
    xxxxxxxxxx省略订单信息xxxxxxxxxx

    <form enctype="multipart/form-data" action="/pay/confirm" method="get">
        <button type="submit">确认支付</button>
    </form>
</div>
</body>
</html>

indexQuery.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>确认查询</title>
</head>
<body>
<div>
    您的订单信息如下,请确认无误后查询:<br />
    xxxxxxxxxx省略订单信息xxxxxxxxxx

    <form enctype="multipart/form-data" action="/pay/query" method="get">
        <button type="submit">确认查询</button>
    </form>
</div>
</body>
</html>

indexRefund.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>确认订单</title>
</head>
<body>
<div>
    您的订单信息如下,请确认无误后退款:<br />
    xxxxxxxxxx省略订单信息xxxxxxxxxx

    <form enctype="multipart/form-data" action="/pay/refund" method="get">
        <button type="submit">确认退款</button>
    </form>
</div>
</body>
</html>

indexRefundQuery.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>确认查询</title>
</head>
<body>
<div>
    您的订单信息如下,请确认无误后查询:<br />
    xxxxxxxxxx省略订单信息xxxxxxxxxx

    <form enctype="multipart/form-data" action="/pay/refundquery" method="get">
        <button type="submit">确认退款信息查询</button>
    </form>
</div>
</body>
</html>

切记:因为我的数据都是写死的,所以界面就没怎么写了,大家可以根据自己的项目需求,对前端进行优化。

专栏里面还有一些支付宝踩坑集像什么:网站被钓鱼、界面显示不出等问题的解释,大家如果出现类似问题可以去看看。

运行结果

这里就演示一下支付成功的界面了。
支付工具用沙盒,看看那个视频了解多一点即可。
在这里插入图片描述说明一下最后跳转成功的页面是,配置文件里面同步通知,我直接写为了百度的网址。你们可以根据需求编写。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值