XnMatrix 微信小程序教程 微信直播 unity null bootstrap后台管理系统 swift视频教程 基于bootstrap的框架 arraylist删除指定元素 webform开发教程 mysql自连接 python模块 mysql建表 pythonassert函数 python取随机数 python基础知识 java环境 java在线教程 java中的string java中new php连接mssql 运行时错误1004 allowoverride 0x0000004e 简体中文语言包 骁龙435 黑白照片一键变彩色 两表关联查询 摩斯密码在线翻译 惠普战99 蜘蛛皮肤 抠图教程 360越狱版 死从天降成就 nastran 起义任务线 快递电子面单打印软件 画图3d 字体模糊 方正兰亭大黑简体
当前位置: 首页 > 学习教程  > 编程语言

SpringBoot实现用支付宝(支付、查询、退款(超详细))

2021/2/13 20:03:33 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

SpringBoot继承支付宝(支付、查询、退款) 首先推荐个视频给各位先熟悉熟悉,怎么将支付宝的给你的老版demo运行起来 https://www.bilibili.com/video/BV1Ft41167fk?p11&t149 怎么从eclipse到IDEA中的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文件

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

public class AlipayConfig {

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

    // 商户私钥
    public static  String merchant_private_key = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCv7xoq96nGOq47YEGQ+R3B9hMszzpWjQvDy1tfyjBGKw1S4gN61mK5T8pBcLyPdSKZxMWCbx+rQLOOb5lhFkFOwqRAW4KxY891MXbc3Trx8RJeYSi/sR5pj0FKU3V9fLsCRylTXGqhlpV4N7HcKwCn+G6U9K8akEpd2+sfYN4TbLeF+Yh/G0TJDR+pTAM28xZa9+vhBP1Zfk4zl4Z6gniQm+gtxnGX20bm7gJvlVzwHVgFPOsWwelWM/iO+UzbCfSGgcVQZ3nvCv567gJlYfU++nfdTQzpFEduYCuyas2ZxDQb1GZ9ExBqFxnsJffTyPbUFJ2scW6/dPveF4BF5NdPAgMBAAECggEABKLZXq5+E9IyCzCDKc3Wwei5IqInWGaJG9S9CK4sTX0O8dMw4kjJ+zYmD0loPqOIkOLFjaVeAUZINQWt1ggfGnM4ntWKgSAvNFhkWHef+QYwRLpst3h0Y7W5s7q1SuRBjVLQvPifericIbnd/v5HGyYJy/UStDF/NC/6Zy5HS92zNHuMw0SRDaaSUB3lX5qanztl0nvDTBtd2yDHtYYLTss3SS61VnPf5h6G5ut+3j+DRycS1vEOJUqWscvDU6Yj8XFGy6M+oRpj+ifvjg6Xst2dkagnqh/YgukE9VZXPSCs+VeMKzvT3ULahIX7d8Z51HZY+/MP6sPJS4n+ukomuQKBgQD7DcSuXeLw3QTuf+q8baHOsHlhrTDMeJ4CuYjROILL+pwypuPVF295GsVFU9XsUyOKAZUZk1nzIyUMhgpPmZUYHVhnm9CONEORk+mehNzX/tqGcx2iy3pjOFIaWZR2iIcB2GmJjeAmtJ5v8/1cGiC9Oupsef4E0R0agzs0WxP5owKBgQCzZnRodhv3sDN7UyamxJPNsZtKCOcMlJXjC/k8/ryyihAAxUrkEyQnoM/Lka7efhYwC+ePZhJFAi4zkysBfk+2+Cy9ei3ufpfUlcxAmTKVjGsucmEGdgVqQDRU44o18RXARNKNEZb00DH9OJD3XqZbQa4z0j1590gCqMngQdjeZQKBgF9L+aWqk9OUQiP6QHNoNiyMBndSU5y6CFjGbq3kgpnFNndvrDoeHD1fMRTA3wpHAM2JDjzYFyPY6l5XnyBaDyNJOF6T4dWo9yESgXKfwmjnH7I7jjtWe82f+mJwMI/SAVVs/ZquVTC8DQw4FKtaa6UI8SVeJVNUwXRn7hhQnkN7AoGBALIdyv3cJjBpNPQAvqNdERJsgC2lYSDQdXCTdsXkdR0ejnz1ZUHE72SY+Ta4UdJ9hTH239U0FneFjrGOMGivLB4RkPoe0HO2JLDgeYa5k8t/OvtGfKaZjw7K6CpQL+0Wi+31ZsbA7AvsmXU8MFIqGykHsRmqZ3cs2MYrJyQMvHExAoGBAN0KiizRGAA1EwkAd47yFxMZQxG/1miiBgiCb/K5dRVfXkCBpHsBfEgSbHXI8UeXJuEtQTei97ANEjWuAo0kKtY8iRMPalcjtH5/PTc+n6Yk/4XJ3opHyIwJ6eQNVAUUOla2LiOU7Rc6g12agQD+i0BNH76MXj5XH3u+tdTF2W/x";

    // 支付宝公钥
    public static  String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArMfU8PA29JmykhIQynJpx47fea7OgD048vvEF/0Gk2DC0WuqN5rNyQErxOG2UPwRkrjSr3na6VBz3dR+W40TFCNWw3n+H2d+VqD50wBYVYNRlhd8TpQYWRSvPsqFoZOvb3CxuHQCxy9W9ijC3jB/db26NxbyKDnf4YLzdvR17v2PcYmJGLRBL6yDSSyWTqaUzoaegBMqtL+qsPKDRtoDToMNnHTC6BveQJlg6HL5JMHUL43Jj62FYLczO57bPGmjceEW6x3vIk0CgAJcoupYwnAsYhY8QSeZkJL1UhoLtu7mKhnWwX0Bn6tfU8bj3Ea6wxRSTb+NyCYhZi5ilulT+QIDAQAB";

    // 服务器异步通知页面路径
    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>

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

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


本文链接: http://www.dtmao.cc/news_show_700377.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?