SpringBoot实现支付宝沙箱支付及退款

一、在支付宝开放平台申请开通研发服务(需要实名认证),并根据官方文档生成公钥私钥,可参考这篇博客
二、springboot中集成支付宝沙箱支付

  1. 引入alipay的sdk依赖
<!--支付宝sdk依赖-->
<dependency>
     <groupId>com.alipay.sdk</groupId>
     <artifactId>alipay-sdk-java</artifactId>
     <version>3.1.0</version>
 </dependency>
  1. 编写配置文件。
package com.alipay.config;

public class AlipayConfig {

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

    // 商户私钥
    public static  String merchant_private_key = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCINPCa++wN4rtYoWj/QWCSRw55yOXYx1YCzmzGiWDpKq7onueLVEXu43BtvRdQyX4zW4aUUrqYgzkcFbuhpEUP1Ev+yN530BjUBZOJEx3cGd8Yw1QQtClnxhApq5YJDpbcEUl1AVe5ykXhd9clmXzx107UL9DLoUG1Au0NW9pNkarHsnWi+f/Y00K9EjP8wWYTQNslHwlzdj59BA+gWy18MkPKyy9cm1uB001zuEIF6iR6HaJ/pZJVScL+r8CKiOKco9J8h9gKVAtW7s1xJ1bFfxGKRgUaLWdL3ErAAZ7nRnRS1Ih9QhD625AyW2ZycLO4wH3tn78scwePBICeuN9/AgMBAAECggEAA7hecf07f02YDF2sPnyMpLIoJQ9lp7waD02QDwQlj3jI+jWM4XNVzaaMpZKqllxKhCCV1mtECXJcFvZI/6s676m+waC+4sreQrw8QVwyTpauT0DWhPZGwzzXqCu1l128pRobxYRZ3ws1SWk6iR5eGUTmNElyDH3FC6qeyuSdW8z6bHx55UGZ6XGhU/3kRca6E3CRuOuTrCfncqnal/qOiLK7U53ujym+5aOkAERMepmeQ/jnftoR6VvxZDS86ZIW+SZ9McG6IR44b2i+/V+AXDT9crSVAPIvFEn6Q4AMwSGcfqr3VnJWN3B7tcRT+DwSwoYJnl2YY9V80x/rNP5f0QKBgQDXxaLsBaNu65d7dXC9z3Koom/dRb/duHDejfXl1G1wohBNOtsjKrK8VYTSACpxRageK6I6eMz0C8q3InbbmB8KbVc9vGW7WHbsavjjEuls8xCRSIvvlGiig3Z8l1FlLphqd6HJTVarhhp6VI2ZzaW4EWjo6S9c4QmyjQ04OLcMHQKBgQChmdDXdDimzUNkFIrTwebuVB7pox5xRmE/h+WnGmxgkd8HGjKrEq/6gXe49jp5GKDdLSKGqs42QKZpXzUEFJgapzleFT1NMxnS48hhDhUMeUg4yruOS9HsMBOieHJn49GPZNuBfOi6J2zTwcRl4JFZGe1xfdRjO/uv4Pc8QSsvSwKBgEsYfNh6KeRb2E/eksts3LH2PsqbEOjA3X+HltJTeXde4B+Q4V2+6ZAEj4JrDlp37Mf7Va3WBzbUt8u/EfDhY8REQ723yQxIALPNkyuslFMX0WdPAWzzkOsmp+E65Ng7PE6prkQaR5TQynxS2ylxWkDSxllxdstzguWCk9xCWOq9AoGAAsqRXOdZAyiQfW4NZ9L1ljBFyGtU30gD7gD+6n/+VzytyYWeUm4kNAOAeeVm5SiTvr5E1mak4TMErNVEKSnh5rP0vbdIM8kqLQZaM7L2khyWLsTxsGeG3LmH3UqPT1QUDpIDaJ0rt+tuacnzBn92gz97ZnZx8LTciBEutA+8GzkCgYB+dRYBexBKvB5X1k4nP2ICub2Jjx5DC/cCspsjK/tjceTDzNFl8gbi03XRHjfHDSd+TR5nhHkYqvEIgqBMNUqL3fy4Giv5frgJyYdElbNYZyXJjlPcDGA4Uz4juSjjyOUKZZn7PAHu/hujtP1JUBfaTBvdZp+OKXvE2SNtavlG8Q==";

    // 支付宝公钥
    public static  String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA72i7PdKclEwKdsXgtDvK3EIh6yf1IlNJB2plo0/Wu5xh+MET6630CdLwACWO/OmwYBZ5bFH1Hb/sh4puUd/G39dfR+IJcL9/NjUaUcRmS+Iwpn7FLMHyDegPW/K3gZLDsdq8ZJKu6ce5iZCcNiOGLbSYksffCzwa457FpA9Y5xhDiarLY+SFDuUlcVd6KZd06yg1ZAUjieQiRZCjiVsN1RQZgQz0pqug22dsRrJyH53vVFsbrtdGkd7OMQJMR3NvPn20T70dybSGXmpd1S38od4ImRjTDIjl6AhxMClfxXtbYwMssAz+stV86XFCp/fTS+UmzQ/NkNx5+tmimhIYdwIDAQAB";

    // 服务器异步通知页面路径
    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";
}
  1. 支付实现:
    支付请求接口
   @RequestMapping("pay")
    public void toPay(HttpServletResponse response, HttpServletRequest request) throws IOException, AlipayApiException {
        orderService.pay(response,request);
    }

实现类:

   @Override
    public void pay(HttpServletResponse response, HttpServletRequest request) throws AlipayApiException, IOException{
        // 设置编码格式
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        // 初始化AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gateway, AlipayConfig.app_id, AlipayConfig.merchant_private_key,
                AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
        //设置请求参数
        AlipayTradePagePayRequest aliPayRequest = new AlipayTradePagePayRequest();
        aliPayRequest.setReturnUrl(AlipayConfig.return_url);
        aliPayRequest.setNotifyUrl(AlipayConfig.notify_url);

        //商户订单号,后台可以写一个工具类生成一个订单号,必填
        String order_number = new String("20200524");
        //付款金额,从前台获取,必填
        String total_amount = new String("198");
        //订单名称/标题,可自定义
        String subject = new String("支付宝沙箱测试");
        aliPayRequest.setBizContent("{\"out_trade_no\":\"" + order_number + "\","
                + "\"total_amount\":\"" + total_amount + "\","
                + "\"subject\":\"" + subject + "\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        //请求
        String result = alipayClient.pageExecute(aliPayRequest).getBody();
        //输出
        out.println(result);//以下写自己的订单代码
        logger.info("返回结果={}",result);
    }

测试:浏览器输入:localhost:8888/pay
在这里插入图片描述
使用沙箱app扫码支付,支付成功,5秒后跳转到回调地址(这里回调地址设置的是百度的地址)
在这里插入图片描述
4. 退款
退款请求接口:

 @RequestMapping("refund")
    public void toRefund(HttpServletResponse response, HttpSession session) throws IOException, AlipayApiException {
        orderService.refund(response,session);
    }

实现类:

    /**
     * 退款
     * @param response
     * @param session
     * @throws IOException
     * @throws AlipayApiException
     */
    @Override
    public void refund(HttpServletResponse response, HttpSession session) throws IOException, AlipayApiException {
        // 设置编码格式
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gateway, AlipayConfig.app_id, AlipayConfig.merchant_private_key,
                AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
        //设置请求参数
        AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
        //商户订单号,必填
        String out_trade_no = new String("20200524");
        //需要退款的金额,该金额不能大于订单金额,必填
        String refund_amount = new String("198");
        //标识一次退款请求,同一笔交易多次退款需要保证唯一。如需部分退款,则此参数必传;不传该参数则代表全额退款
        String out_request_no = new String(UUID.randomUUID().toString());
        // 字符转义很重要
        alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
                + "\"refund_amount\":\""+ refund_amount +"\","
                + "\"out_request_no\":\""+ out_request_no +"\"}");
        //请求
        String result = alipayClient.execute(alipayRequest).getBody();
        //输出
        out.println(result);//以下写自己的订单退款代码
        logger.info("返回结果={}",result);
    }

测试:
浏览器输入:http:localhost:8888/refund
在这里插入图片描述
返回结果中,返回的消息为success说明退款成功。

以上就是参照网上的文章实现的支付宝沙箱支付及测试的例子。目前只接触了这么一种模拟支付的方式,还有许多支付方式,如微信支付等,有待学习~

供参考文章:
https://blog.csdn.net/weixin_43710551/article/details/90370890
https://blog.csdn.net/nimazhao/article/details/100770090
https://www.jb51.net/article/168251.htm
https://blog.csdn.net/lovely960823/article/details/106028837
https://blog.csdn.net/weixin_43416686/article/details/102942852
https://blog.csdn.net/qq_34827263/article/details/81906222
https://blog.csdn.net/mugua_1252377669/article/details/78269835
https://blog.csdn.net/weixin_43416686/article/details/102942852

猜你喜欢

转载自blog.csdn.net/username666/article/details/106312242