SpringBoot接入支付宝支付功能(沙箱操作)

官网给出的例子,跑到自己本地如下图:

在这里插入图片描述

一、前期准备

  • 进入开放平台,沙箱环境,登录,一开始需要填写基本信息
  • 下载支付宝开放平台开发助手,生成密钥需要用到
    在这里插入图片描述
  • 配置参数
    • 保留appId 和 支付宝网关,后面我们会用到
      在这里插入图片描述

    • 生成密钥(打开我们下载的开发助手), 保留公钥和私钥
      在这里插入图片描述

    • 将公钥配置到我们的沙箱环境中,保留最后的支付宝公钥,后面我们会用到
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

二、项目应用

  1. 后台代码
  • 编写 AlipayConfig.java 类,里面设计的参数,我们前一步都获取到了,填写到对应位置就可以了
/**
 * @author zte
 * @since 2021/1/28 15:10
 */
public class AlipayConfig {
    
    

    /**
     * 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
     */
    public static String APP_ID = "";

    /**
     * 商户私钥,您的PKCS8格式RSA2私钥,这些就是我们刚才设置的
     */
    public static String MERCHANT_PRIVATE_KEY = "";

    /**
     * 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。,这些就是我们刚才设置的
     */
    public static String ALIPAY_PUBLIC_KEY = "";

    /**
     * 异步通知,再这里我们设计自己的后台代码
     */
    public static String notify_url = "https://www.baidu.com";

    /**
     * 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
     */
    public static String return_url = "https://www.baidu.com";

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

    /**
     *  字符编码格式
     */
    public static String CHARSET = "utf-8";

    /**
     * 支付宝网关
     */
    public static String GATEWAYURL = "";

    /**
     * 支付宝网关
     */
    public static String LOG_PATH = "C:\\";


//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

    /**
     * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
     * @param sWord 要写入日志里的文本内容
     */
    public static void logResult(String sWord) {
    
    
        FileWriter writer = null;
        try {
    
    
            writer = new FileWriter(LOG_PATH + "alipay_log_" + System.currentTimeMillis()+".txt");
            writer.write(sWord);
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            if (writer != null) {
    
    
                try {
    
    
                    writer.close();
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
        }
    }
}

  • controller 层代码
/**
 * @author zte
 * @since 2021/1/28 15:16
 */
@Controller
@RequestMapping("zfbPay")
public class AlipayController {
    
    

    private String prefix = "pay/";

    @Autowired
    private AlipayService alipayService;

    @RequestMapping("index")
    public String index(){
    
    
        return prefix + "index";
    }

    /**
     * web 订单支付 (支付demo)
     * @param WIDout_trade_no 商户订单号
     * @param WIDsubject 订单名称
     * @param WIDtotal_amount 付款金额 (实际应用中不能使用Integer , 这里仅是为了方便测试)
     * @param WIDbody 商品描述
     * @return
     * @throws Exception
     */
    @PostMapping("getPagePay")
    public String getPagePay(Model model , @RequestParam(value = "WIDout_trade_no") String WIDout_trade_no
            , @RequestParam(value = "WIDsubject") String WIDsubject
            , @RequestParam(value = "WIDtotal_amount") Integer WIDtotal_amount
            , @RequestParam(value = "WIDbody") String WIDbody ) throws Exception{
    
    
        // 模仿数据库,从后台调数据
        String pay = alipayService.webPagePay(WIDout_trade_no, WIDtotal_amount, WIDsubject);
        model.addAttribute("formContent" , pay);
        return prefix + "alipay.trade.page.pay";
    }

    /**
     * app 订单支付
     */
    @GetMapping("getAppPagePay")
    public String getAppPagePay(Model model) throws Exception{
    
    
        // 模仿数据库,从后台调数据
        String outTradeNo = "131233";
        Integer totalAmount = 1000;
        String subject = "天猫超市012";

        String pay = alipayService.appPagePay(outTradeNo, totalAmount, subject);
		model.addAttribute("formContent",pay);
        return prefix + "alipay.trade.page.pay";
    }

    /**
     * 交易查询
     */
    @PostMapping("aipayQuery")
    public AjaxResult alipayQuery() throws Exception{
    
    
        // 调取支付订单号
        String outTradeNo = "13123";

        String query = alipayService.query(outTradeNo);

        Object json = JSONObject.toJSON(query);

        return AjaxResult.success(json);
    }

    /**
     * 退款
     * @throws AlipayApiException
     */
    @GetMapping("alipayRefund")
    public AjaxResult alipayRefund(
            @RequestParam("outTradeNo")String outTradeNo,
            @RequestParam(value = "outRequestNo", required = false)String outRequestNo,
            @RequestParam(value = "refundAmount", required = false)Integer refundAmount
    ) throws AlipayApiException{
    
    

       // 调取数据
        //String outTradeNo = "15382028806591197";
        String refundReason = "用户不想购买";
        //refundAmount = 1;
        //outRequestNo = "22";

        String refund = alipayService.refund(outTradeNo, refundReason, refundAmount, outRequestNo);

        System.out.println(refund);

        return AjaxResult.success(refund);
    }

    /**
     * 退款查询
     * @throws AlipayApiException
     */
    @PostMapping("refundQuery")
    public AjaxResult refundQuery() throws AlipayApiException {
    
    

        // 调取数据
        String outTradeNo = "13123";
        String outRequestNo = "2";

        String refund = alipayService.refundQuery(outTradeNo, outRequestNo);

        return AjaxResult.success(refund);

    }

    /**
     * 交易关闭
     * @throws AlipayApiException
     */
    @PostMapping("alipayclose")
    public AjaxResult alipaycolse() throws AlipayApiException{
    
    

        // 调取数据
        String outTradeNo = "13123";

        String close = alipayService.close(outTradeNo);

        return AjaxResult.success(close);
    }
}

  • Service层代码
/**
 * @author zte
 * @since 2021/1/28 15:14
 */
public interface AlipayService {
    
    

    /**
     * web端订单支付
     * @param outTradeNo    订单编号(唯一)
     * @param totalAmount   订单价格
     * @param subject       商品名称
     */
    String webPagePay(String outTradeNo,Integer totalAmount,String subject) throws Exception;

    /**
     * app端订单支付
     * @param outTradeNo    订单编号
     * @param totalAmount   订单价格
     * @param subject       商品名称
     */
    String appPagePay(String outTradeNo,Integer totalAmount,String subject) throws Exception;

    /**
     * 退款
     * @param outTradeNo    订单编号
     * @param refundReason  退款原因
     * @param refundAmount  退款金额
     * @param outRequestNo  标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
     */
    String refund(String outTradeNo,String refundReason,Integer refundAmount,String outRequestNo) throws AlipayApiException;

    /**
     * 交易查询
     * @param outTradeNo 订单编号(唯一)
     */
    String query(String outTradeNo) throws AlipayApiException;

    /**
     * 交易关闭
     * @param outTradeNo(订单编号,唯一)
     */
    String close(String outTradeNo) throws AlipayApiException;

    /**
     * 退款查询
     * @param outTradeNo 订单编号(唯一)
     * @param outRequestNo 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
     */
    String refundQuery(String outTradeNo,String outRequestNo) throws AlipayApiException;

}
  • impl层代码
/**
 * @author zte
 * @since 2021/1/28 15:15
 */
@Service
public class AlipayServiceImpl implements AlipayService {
    
    

    // 调取支付宝接口 web端支付
    DefaultAlipayClient alipayClient = new DefaultAlipayClient(
            AlipayConfig.GATEWAYURL, AlipayConfig.APP_ID, AlipayConfig.MERCHANT_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGN_TYPE);

    // 调取支付宝接口app端支付
    AlipayClient alipayClients = new DefaultAlipayClient(
            AlipayConfig.GATEWAYURL, AlipayConfig.APP_ID, AlipayConfig.MERCHANT_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGN_TYPE);


    @Override
    public String webPagePay(String outTradeNo, Integer totalAmount, String subject) throws Exception {
    
    

        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        // 同步通知,支付完成后,支付成功页面
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        // 异步通知,支付完成后,需要进行的异步处理
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

        alipayRequest.setBizContent("{\"out_trade_no\":\""+ outTradeNo +"\","
                + "\"total_amount\":\""+ totalAmount +"\","
                + "\"subject\":\""+ subject +"\","
                + "\"body\":\"商品名称\","
                + "\"timeout_express\":\"90m\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        //转换格式
        String result = alipayClient.pageExecute(alipayRequest).getBody().replace('\"','\'').replace('\n',' ');
        return result;
    }

    @Override
    public String refund(String outTradeNo,String refundReason,Integer refundAmount,String outRequestNo) throws AlipayApiException {
    
    
        AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();

        // 调取接口
        alipayRequest.setBizContent("{\"out_trade_no\":\""+ outTradeNo +"\","
                + "\"refund_amount\":\""+ refundAmount +"\","
                + "\"refund_reason\":\""+ refundReason +"\","
                + "\"out_request_no\":\""+ outRequestNo +"\"}");
        String result = alipayClient.execute(alipayRequest).getBody();
        return result;
    }

    @Override
    public String query(String outTradeNo) throws AlipayApiException {
    
    
        AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
        //请求接口
        alipayRequest.setBizContent("{\"out_trade_no\":\""+ outTradeNo +"\","+"\"trade_no\":\""+ "" +"\"}");
        //转换格式
        String result = alipayClient.execute(alipayRequest).getBody();
        return result;
    }

    @Override
    public String close(String outTradeNo) throws AlipayApiException {
    
    
        AlipayTradeCloseRequest alipayRequest = new AlipayTradeCloseRequest();

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

        String result = alipayClient.execute(alipayRequest).getBody();

        return result;
    }

    @Override
    public String refundQuery(String outTradeNo , String outRequestNo) throws AlipayApiException {
    
    
        AlipayTradeFastpayRefundQueryRequest alipayRequest = new AlipayTradeFastpayRefundQueryRequest();

        // 请求接口
        alipayRequest.setBizContent("{\"out_trade_no\":\""+ outTradeNo +"\","
                +"\"out_request_no\":\""+ outRequestNo +"\"}");

        // 格式转换
        String result = alipayClient.execute(alipayRequest).getBody();

        return result;
    }

    @Override
    public String appPagePay(String outTradeNo, Integer totalAmount, String subject) throws Exception {
    
    
        AlipayTradeWapPayRequest alipayRequest=new AlipayTradeWapPayRequest();

        // 同步通知,支付完成后,支付成功页面
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        // 异步通知,支付完成后,需要进行的异步处理
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

        //销售产品码(固定)
        String productCode="QUICK_WAP_WAY";

        // 进行赋值 
        AlipayTradeWapPayModel wapPayModel=new AlipayTradeWapPayModel();
        wapPayModel.setOutTradeNo(outTradeNo);
        wapPayModel.setSubject(subject);
        wapPayModel.setTotalAmount(totalAmount.toString());
        wapPayModel.setBody("商品名称");
        wapPayModel.setTimeoutExpress("2m");
        wapPayModel.setProductCode(productCode);
        alipayRequest.setBizModel(wapPayModel);

        // 格式转换
        String result = alipayClients.pageExecute(alipayRequest).getBody().replace('\"','\'').replace('\n',' ');
        return result;
    }
}
  1. 前台代码
  • index.html 首页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>支付宝电脑网站支付</title>
    <style>
        * {
     
     
            margin: 0;
            padding: 0;
        }

        ul, ol {
     
     
            list-style: none;
        }

        body {
     
     
            font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande",
            sans-serif;
        }

        .tab-head {
     
     
            margin-left: 120px;
            margin-bottom: 10px;
        }

        .tab-content {
     
     
            clear: left;
            display: none;
        }

        h2 {
     
     
            border-bottom: solid #02aaf1 2px;
            width: 200px;
            height: 25px;
            margin: 0;
            float: left;
            text-align: center;
            font-size: 16px;
        }

        .selected {
     
     
            color: #FFFFFF;
            background-color: #02aaf1;
        }

        .show {
     
     
            clear: left;
            display: block;
        }

        .hidden {
     
     
            display: none;
        }

        .new-btn-login-sp {
     
     
            padding: 1px;
            display: inline-block;
            width: 75%;
        }

        .new-btn-login {
     
     
            background-color: #02aaf1;
            color: #FFFFFF;
            font-weight: bold;
            border: none;
            width: 100%;
            height: 30px;
            border-radius: 5px;
            font-size: 16px;
        }

        #main {
     
     
            width: 100%;
            margin: 0 auto;
            font-size: 14px;
        }

        .red-star {
     
     
            color: #f00;
            width: 10px;
            display: inline-block;
        }

        .null-star {
     
     
            color: #fff;
        }

        .content {
     
     
            margin-top: 5px;
        }

        .content dt {
     
     
            width: 100px;
            display: inline-block;
            float: left;
            margin-left: 20px;
            color: #666;
            font-size: 13px;
            margin-top: 8px;
        }

        .content dd {
     
     
            margin-left: 120px;
            margin-bottom: 5px;
        }

        .content dd input {
     
     
            width: 85%;
            height: 28px;
            border: 0;
            -webkit-border-radius: 0;
            -webkit-appearance: none;
        }

        #foot {
     
     
            margin-top: 10px;
            position: absolute;
            bottom: 15px;
            width: 100%;
        }

        .foot-ul {
     
     
            width: 100%;
        }

        .foot-ul li {
     
     
            width: 100%;
            text-align: center;
            color: #666;
        }

        .note-help {
     
     
            color: #999999;
            font-size: 12px;
            line-height: 130%;
            margin-top: 5px;
            width: 100%;
            display: block;
        }

        #btn-dd {
     
     
            margin: 20px;
            text-align: center;
        }

        .foot-ul {
     
     
            width: 100%;
        }

        .one_line {
     
     
            display: block;
            height: 1px;
            border: 0;
            border-top: 1px solid #eeeeee;
            width: 100%;
            margin-left: 20px;
        }

        .am-header {
     
     
            display: -webkit-box;
            display: -ms-flexbox;
            display: box;
            width: 100%;
            position: relative;
            padding: 7px 0;
            -webkit-box-sizing: border-box;
            -ms-box-sizing: border-box;
            box-sizing: border-box;
            background: #1D222D;
            height: 50px;
            text-align: center;
            -webkit-box-pack: center;
            -ms-flex-pack: center;
            box-pack: center;
            -webkit-box-align: center;
            -ms-flex-align: center;
            box-align: center;
        }

        .am-header h1 {
     
     
            -webkit-box-flex: 1;
            -ms-flex: 1;
            box-flex: 1;
            line-height: 18px;
            text-align: center;
            font-size: 18px;
            font-weight: 300;
            color: #fff;
        }
    </style>
</head>

<body text=#000000 bgColor="#ffffff" leftMargin=0 topMargin=4>
<header class="am-header">
    <h1>支付宝电脑网站支付体验入口页</h1>
</header>
    <div id="main">
        <div id="tabhead" class="tab-head">
            <h2 id="tab1" class="selected" name="tab">付 款</h2>
            <h2 id="tab2" name="tab">交 易 查 询</h2>
            <h2 id="tab3" name="tab">退 款</h2>
            <h2 id="tab4" name="tab">退 款 查 询</h2>
            <h2 id="tab5" name="tab">交 易 关 闭</h2>
        </div>
        <form name=alipayment action="/zfbPay/getPagePay" method=post
              target="_blank">
             <!--将action改为 /zfbPay/getAppPagePay 便是APP支付-->
            <div id="body1" class="show" name="divcontent">
                <dl class="content">
                    <dt>商户订单号 :</dt>
                    <dd>
                        <input id="WIDout_trade_no" name="WIDout_trade_no" />
                    </dd>
                    <hr class="one_line">
                    <dt>订单名称 :</dt>
                    <dd>
                        <input id="WIDsubject" name="WIDsubject" />
                    </dd>
                    <hr class="one_line">
                    <dt>付款金额 :</dt>
                    <dd>
                        <input id="WIDtotal_amount" name="WIDtotal_amount" />
                    </dd>
                    <hr class="one_line">
                    <dt>商品描述:</dt>
                    <dd>
                        <input id="WIDbody" name="WIDbody" />
                    </dd>
                    <hr class="one_line">
                    <dt></dt>
                    <dd id="btn-dd">
                            <span class="new-btn-login-sp">
                                <button class="new-btn-login" type="submit"
                                        style="text-align: center;">付 款</button>
                            </span> <span class="note-help">如果您点击“付款”按钮,即表示您同意该次的执行操作。</span>
                    </dd>
                </dl>
            </div>
        </form>
        <form name=tradequery action="#" method=post
              target="_blank">
            <div id="body2" class="tab-content" name="divcontent">
                <dl class="content">
                    <dt>商户订单号 :</dt>
                    <dd>
                        <input id="WIDTQout_trade_no" name="WIDTQout_trade_no" />
                    </dd>
                    <hr class="one_line">
                    <dt>支付宝交易号 :</dt>
                    <dd>
                        <input id="WIDTQtrade_no" name="WIDTQtrade_no" />
                    </dd>
                    <hr class="one_line">
                    <dt></dt>
                    <dd id="btn-dd">
                            <span class="new-btn-login-sp">
                                <button class="new-btn-login" type="submit"
                                        style="text-align: center;">交 易 查 询</button>
                            </span> <span class="note-help">商户订单号与支付宝交易号二选一,如果您点击“交易查询”按钮,即表示您同意该次的执行操作。</span>
                    </dd>
                </dl>
            </div>
        </form>
        <form name=traderefund action="#" method=post
              target="_blank">
            <div id="body3" class="tab-content" name="divcontent">
                <dl class="content">
                    <dt>商户订单号 :</dt>
                    <dd>
                        <input id="WIDTRout_trade_no" name="WIDTRout_trade_no" />
                    </dd>
                    <hr class="one_line">
                    <dt>支付宝交易号 :</dt>
                    <dd>
                        <input id="WIDTRtrade_no" name="WIDTRtrade_no" />
                    </dd>
                    <hr class="one_line">
                    <dt>退款金额 :</dt>
                    <dd>
                        <input id="WIDTRrefund_amount" name="WIDTRrefund_amount" />
                    </dd>
                    <hr class="one_line">
                    <dt>退款原因 :</dt>
                    <dd>
                        <input id="WIDTRrefund_reason" name="WIDTRrefund_reason" />
                    </dd>
                    <hr class="one_line">
                    <dt>退款请求号 :</dt>
                    <dd>
                        <input id="WIDTRout_request_no" name="WIDTRout_request_no" />
                    </dd>
                    <hr class="one_line">
                    <dt></dt>
                    <dd id="btn-dd">
                            <span class="new-btn-login-sp">
                                <button class="new-btn-login" type="submit"
                                        style="text-align: center;">退 款</button>
                            </span> <span class="note-help">商户订单号与支付宝交易号二选一,如果您点击“退款”按钮,即表示您同意该次的执行操作。</span>
                    </dd>
                </dl>
            </div>
        </form>
        <form name=traderefundquery
              action="#" method=post
              target="_blank">
            <div id="body4" class="tab-content" name="divcontent">
                <dl class="content">
                    <dt>商户订单号 :</dt>
                    <dd>
                        <input id="WIDRQout_trade_no" name="WIDRQout_trade_no" />
                    </dd>
                    <hr class="one_line">
                    <dt>支付宝交易号 :</dt>
                    <dd>
                        <input id="WIDRQtrade_no" name="WIDRQtrade_no" />
                    </dd>
                    <hr class="one_line">
                    <dt>退款请求号 :</dt>
                    <dd>
                        <input id="WIDRQout_request_no" name="WIDRQout_request_no" />
                    </dd>
                    <hr class="one_line">
                    <dt></dt>
                    <dd id="btn-dd">
                            <span class="new-btn-login-sp">
                                <button class="new-btn-login" type="submit"
                                        style="text-align: center;">退 款 查 询</button>
                            </span> <span class="note-help">商户订单号与支付宝交易号二选一,如果您点击“退款查询”按钮,即表示您同意该次的执行操作。</span>
                    </dd>
                </dl>
            </div>
        </form>
        <form name=tradeclose action="#" method=post
              target="_blank">
            <div id="body5" class="tab-content" name="divcontent">
                <dl class="content">
                    <dt>商户订单号 :</dt>
                    <dd>
                        <input id="WIDTCout_trade_no" name="WIDTCout_trade_no" />
                    </dd>
                    <hr class="one_line">
                    <dt>支付宝交易号 :</dt>
                    <dd>
                        <input id="WIDTCtrade_no" name="WIDTCtrade_no" />
                    </dd>
                    <hr class="one_line">
                    <dt></dt>
                    <dd id="btn-dd">
                            <span class="new-btn-login-sp">
                                <button class="new-btn-login" type="submit"
                                        style="text-align: center;">交 易 关 闭</button>
                            </span> <span class="note-help">商户订单号与支付宝交易号二选一,如果您点击“交易关闭”按钮,即表示您同意该次的执行操作。</span>
                    </dd>
                </dl>
            </div>
        </form>
        <div id="foot">
            <ul class="foot-ul">
                <li>支付宝版权所有 2015-2018 ALIPAY.COM</li>
            </ul>
        </div>
    </div>
</body>
<script language="javascript">
    var tabs = document.getElementsByName('tab');
    var contents = document.getElementsByName('divcontent');

    (function changeTab(tab) {
     
     
        for(var i = 0, len = tabs.length; i < len; i++) {
     
     
            tabs[i].onmouseover = showTab;
        }
    })();

    function showTab() {
     
     
        for(var i = 0, len = tabs.length; i < len; i++) {
     
     
            if(tabs[i] === this) {
     
     
                tabs[i].className = 'selected';
                contents[i].className = 'show';
            } else {
     
     
                tabs[i].className = '';
                contents[i].className = 'tab-content';
            }
        }
    }

    function GetDateNow() {
     
     
        var vNow = new Date();
        var sNow = "";
        sNow += String(vNow.getFullYear());
        sNow += String(vNow.getMonth() + 1);
        sNow += String(vNow.getDate());
        sNow += String(vNow.getHours());
        sNow += String(vNow.getMinutes());
        sNow += String(vNow.getSeconds());
        sNow += String(vNow.getMilliseconds());
        document.getElementById("WIDout_trade_no").value =  sNow;
        document.getElementById("WIDsubject").value = "测试";
        document.getElementById("WIDtotal_amount").value = "0.01";
    }
    GetDateNow();
</script>

</html>
  • 点击支付后,跳转页面
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head>
    <meta charset="UTF-8">
    <title>付款</title>
</head>
<body th:utext="${formContent}">
</body>
</html>
  1. 效果图
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • app 端支付效果
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 最后我们发现,沙箱环境下余额已发生了变化
    在这里插入图片描述

最后跳到我们指定的页面。

猜你喜欢

转载自blog.csdn.net/qq_44922113/article/details/113339036