Springboot支付宝沙箱支付---完整详细步骤

这篇具有很好参考价值的文章主要介绍了Springboot支付宝沙箱支付---完整详细步骤。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

不经常看消息和评论,代码和数据库已上传至gitee 项目源码

1、进入支付宝开发平台—沙箱环境

沙箱环境-支付宝文档中心

1.1、进入个人沙箱环境

点击进入沙箱环境并用支付宝登陆
Springboot支付宝沙箱支付---完整详细步骤
沙箱管理界面如图所示

  • appid,支付宝网关,自定义密钥等
    Springboot支付宝沙箱支付---完整详细步骤

  • 这里是沙箱支付宝(虚拟)的账号和密码,可以用来支付
    Springboot支付宝沙箱支付---完整详细步骤

1.2、接下来进行几个密钥的生成

点击进入密钥工具
点击生成
Springboot支付宝沙箱支付---完整详细步骤

这时我们拿到两个密钥,将它们保存,这两个密钥很重要

  • 应用私钥
  • 应用公钥

1.3、拿到两个密钥后,进行自定义密钥配置

进入最开始的沙箱管理界面,点击自定义密钥,点击设置(查看),我们选择的是RSA2密钥
Springboot支付宝沙箱支付---完整详细步骤
选择“公钥”这一选项
Springboot支付宝沙箱支付---完整详细步骤
将上一步骤生成的应用公钥填进来,会得到支付宝公钥这另一个密钥,记住并保存这个支付宝公钥
Springboot支付宝沙箱支付---完整详细步骤

1.4、至此,我们沙箱环境的配置和基本参数都已经获取到。

2、项目端的代码配置

2.1、首先导入支付宝支付的依赖到pom.xml中

这里我用的是springboot+maven+themyleaf项目

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

2.2、创建支付的Controller类

  • 将从Controller中进入支付宝支付,需完成支付宝提供的接口
  • 创建PayController类,有如下代码

创建Controller类后,首先设置如下私有属性

  • APP_ID (appId,从沙箱管理页面获得)
  • APP_PRIVATE_KEY (应用私钥,最开始在密钥工具生成而来)
  • ALIPAY_PUBLIC_KEY (支付宝公钥,上一步骤获得)
  • GATEWAY_URL (支付宝网关地址,在开发平台沙箱管理页面中获得)
  • SIGN_TYPE (签名类型)
  • NOTIFY_URL (异步回调地址,须是公网IP,后面再解释)
  • RETURN_URL (同步回调地址,可以是私网IP)
@Controller
public class PayController {
    @Autowired
    DonaItemService donaItemService;
    @Autowired
    DonaService donaService;
    //appid
    private final String APP_ID = "2021000119625133";
    //应用私钥
    private final String APP_PRIVATE_KEY = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCDA1Y0+IjB/z4sIhJA0sgEaNGXV9+8t0fUMhrbjHjW88tz8d7jR8ev1aFMmyDKy/cSnlsoNDLwx71GCLiNQENYTvqdcsrYLMvQkmeIYT1OWcPYSl65P0TQRDBhakVdAIXvnts7KJ/nCROGMy8qrBG8ilSlNaOkiuXgp1OPIqLe2dCkrJp1spOJ3Wfq9uyqJO5xrgx6tby3MVPLu/nJ2PtzXt62Kpcj/S9Xxxk9FXOw8cwGDStMPU471VKpEP4kMnjfpUpB9/FfQ6oDfokIaq9dehN9xSitAD6p5cFct7oG94DHai5a+ST6X+OfTv03oE2DuA7ejaJn6cDGSB4IYmZRuDGdicqmPmLEHt3Kq79+EPxBYKUcWI4zQPXlA06Kcgb8HrJntjC836svSUrewWaG32g5MlJB8e1Z+1yL75E6k6R4rBJiVW2MC5VW+p/nQiY3FLfRq4a8V+VJ9uXM1h7L8TbOHtCAQKBgQDCSljMB8VnLFMKHOrcHCZNtjnDHsRYJQYEgNhhvwx2xUIgZNhzpiDmUSwR4TOaqF+Eg5bLfC+sQboANXpP5YUyt/rqUWqQ1fmEV5US9cfiYOi5rfjETK0RAJZaqAVZ0b0PAOMoQpNSbiQKBgHtAnpTuE0QFby+7hDsnTz+qC9dyQQWH3cBOn4RQzo1DUxvyQpZjAy0Oqn/F5x6RGMQU6SrirdUQbGWcANOpp9/L3YGHUrUjlT5Ehx2nPO//yTZSTWKM+p6+XALn1DGZbTChnL/5aEZsg5R4f55wL6RYezRzhq+w4wMixTQDyFLZ";
    private final String CHARSET = "UTF-8";
    // 支付宝公钥
    private final String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3CPgueDLkfB66s9ZsEUwyUbmkRknTFVyuBG4PkKI93OTOVC457ijEKknRYi8eKYo4Wl+75KxYO+tTr1u3XQZmjtjlqbty50DmxRCgEqJKYEu6CD+r1vi+2SXOUKnCJzsE8vHojS+Vk5oGbZYnX6Esw2TVeiCkmQ814CBwIDAQAB";
    //这是沙箱接口路径,正式路径为https://openapi.alipay.com/gateway.do
    private final String GATEWAY_URL ="https://openapi.alipaydev.com/gateway.do";
    private final String FORMAT = "JSON";
    //签名方式
    private final String SIGN_TYPE = "RSA2";
    //支付宝异步通知路径,付款完毕后会异步调用本项目的方法,必须为公网地址
    private final String NOTIFY_URL = "http://127.0.0.1/notifyUrl";
    //支付宝同步通知路径,也就是当付款完毕后跳转本项目的页面,可以不是公网地址
    private final String RETURN_URL = "http://localhost:8080/returnUrl";
}

2.3、在Controller类中创建点击支付跳转支付宝页面的方法

   //必须加ResponseBody注解,否则spring会寻找thymeleaf页面
    @ResponseBody
    @RequestMapping("/pay/alipay")
    public String alipay(HttpSession session,Model model,
                         @RequestParam("dona_money") float dona_money,
                        @RequestParam("dona_id") int dona_id) throws AlipayApiException {
        //把dona_id项目id 放在session中
        session.setAttribute("dona_id",dona_id);

        //生成订单号(支付宝的要求?)
        String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        String user = UUID.randomUUID().toString().replace("-","").toUpperCase();

        String OrderNum = time+user;

        //调用封装好的方法(给支付宝接口发送请求)
        return sendRequestToAlipay(OrderNum,dona_money,"ghjk");
    }
        /*
    参数1:订单号
    参数2:订单金额
    参数3:订单名称
     */
     //支付宝官方提供的接口
    private String sendRequestToAlipay(String outTradeNo,Float totalAmount,String subject) throws AlipayApiException {
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL,APP_ID,APP_PRIVATE_KEY,FORMAT,CHARSET,ALIPAY_PUBLIC_KEY,SIGN_TYPE);

        //设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(RETURN_URL);
        alipayRequest.setNotifyUrl(NOTIFY_URL);

        //商品描述(可空)
        String body="";
        alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\","
                        + "\"total_amount\":\"" + totalAmount + "\","
                        + "\"subject\":\"" + subject + "\","
                        + "\"body\":\"" + body + "\","
                        + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        //请求
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        return result;
    }

解释,在前端页面点击支付后,将跳转Controller的==alipay()==方法

  • alipay 方法会接收一些前端的参数
  • alipay方法中再调用sendRequestToAlipay方法,sendRequestToAlipay方法中有支付宝官方给出的接口,只需在其中提供一些参数(支付宝严格规定的参数)

Springboot支付宝沙箱支付---完整详细步骤

sendRequestToAlipay方法
  • 除了需要提供之前设置好的私有属性(URL,公钥,私钥,网关等等)外,还需要提供的参数
  • outTradeNo,订单号,必须为String64位,不能为空且不能重复
  • totalAmount,支付金额,不能为空
  • subject,订单名称,不能为空
  • body,商品描述,可以为空

上面三个必填参数很重要且必须遵守支付宝的规定,在扫码支付的时候能看到且有用

Springboot支付宝沙箱支付---完整详细步骤

跳转支付宝方法设置完毕,可以进行测试,首先我们在前端form表单中填入url访问刚刚写的controller方法

图示使用thymeleaf模板引擎
Springboot支付宝沙箱支付---完整详细步骤

  • 设置完毕后,启动项目,点击提交表单


该页面访问的是支付宝官方提供的页面,至此沙箱支付已经完成了一半,接下来还要写return()方法使我们完成支付后有响应和页面跳转。

2.4、登陆支付宝沙箱账号

由于是沙箱环境,是虚拟的,所以上面那个支付宝扫码不能用真的支付宝去扫,而是需要下载一个沙箱支付宝APP
Springboot支付宝沙箱支付---完整详细步骤
扫码进行下载

下载完成后的登陆账号密码,也是沙箱环境的账号和密码,同时支付时使用的密码也在其中
Springboot支付宝沙箱支付---完整详细步骤

2.5、写支付完成后同步回调的方法

  • 扫码(或输入密码)支付完成后,支付宝会自动调用我们之前设置好的RETURN_URL(其实是本机调用),所以这个地址可以是私网地址

Springboot支付宝沙箱支付---完整详细步骤

  • 如图所示,RETURN_URL的值为http://localhost:8080/returnUrl,所以我们在项目中完成这个方法的书写,让其调用
  • 同样,还是在Controller中完成
@RequestMapping("/returnUrl")
    public String returnUrlMethod(HttpServletRequest request,HttpSession session,Model model) throws AlipayApiException, UnsupportedEncodingException {
        System.out.println("=================================同步回调=====================================");

        // 获取支付宝GET过来反馈信息
        Map<String, String> params = new HashMap<String, String>();
        Map<String, String[]> requestParams = request.getParameterMap();
        for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
            }
            // 乱码解决,这段代码在出现乱码时使用
            valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }

        System.out.println(params);//查看参数都有哪些
        //验证签名(支付宝公钥)
        boolean signVerified = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE); // 调用SDK验证签名
        //验证签名通过
        if(signVerified){
            // 商户订单号
            String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");

            // 支付宝交易流水号
            String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");

            // 付款金额
            float money = Float.parseFloat(new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8"));

            System.out.println("商户订单号="+out_trade_no);
            System.out.println("支付宝交易号="+trade_no);
            System.out.println("付款金额="+money);

            //在这里编写自己的业务代码(对数据库的操作)
			/*
			################################
			*/
            //跳转到提示页面(成功或者失败的提示页面)
            model.addAttribute("flag",1);
            model.addAttribute("msg","支持");
            return "common/payTips";
        }else{
            //跳转到提示页面(成功或者失败的提示页面)
            model.addAttribute("flag",0);
            model.addAttribute("msg","支持");
            return "common/payTips";
        }
    }
  • 图示框住的部分代码都是支付宝官方给出的一些回调操作,所以最好不要进行更改,个别参数的名称可以更改

Springboot支付宝沙箱支付---完整详细步骤
Springboot支付宝沙箱支付---完整详细步骤

  • 对数据库进行操作的代码可以在该方法中进行,也可以在异步回调方法中进行
  • 最后返回部分我返回的是thymeleaf页面,如果想直接返回String字符串或者其他类型数据库,可以在方法前面加上@ResponseBody注解

2.6、异步回调方法

  • 上面为支付宝同步调用处理,但是官方建议应在异步调用方法中处理付款成功后的操作,但因异步调用的路径必须为公网地址,支付宝才可以发送请求给我们,故这里不写异步调用的方法了,需要注意的是,异步调用为post请求,且传递来的参数会多一些,但基本与同步调用的操作一致

  • 异步回调方法必须为公网IP,因为这个URL地址是支付宝官方来调用我们本机的,是我们完成支付操作后,支付宝需要进行一些金额的处理(与银行对接)所以需要几秒的时间,当支付宝处理完成后异步的调用我们的notify方法(一般在这个方法中进行数据库的操作),这个过程异步进行,所以用户一般感觉不到(用户感觉到的是同步调用的方法)。

  • 设置公网IP有两种方案,1、内网穿透,2、将项目部署到服务器,这里就不说了

Springboot支付宝沙箱支付---完整详细步骤

  • 如图为支付宝官方调用的图解
    Springboot支付宝沙箱支付---完整详细步骤

源码

这是一个比较老的基于springboot+thymeleaf的项目

项目源码文章来源地址https://www.toymoban.com/news/detail-424665.html

到了这里,关于Springboot支付宝沙箱支付---完整详细步骤的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot集成沙箱支付

    支付宝沙箱支付( Alipay Sandbox Payment )是支付宝提供的一个模拟支付环境,用于开发和测试支付宝支付功能的开发者工具。在真实的支付宝环境中进行支付开发和测试可能涉及真实资金和真实用户账户,而沙箱环境则提供了一个安全、隔离的环境,使开发者能够模拟支付过程

    2024年02月03日
    浏览(31)
  • SpringBoot项目(支付宝整合)——springboot整合支付宝沙箱支付 & 从极简实现到IOC改进

    1.springboot整合支付宝沙箱支付; 2.准备工作:沙箱api,内网穿透; 3.极简实现理解支付,异步回调等; 4.按照spring依赖注入的思想改造基础demo; https://gitee.com/pet365/springboot-alipay 支付宝开放平台 (alipay.com) 支付参数 natapp.cn官网 启动和配置 订单ID,需要唯一;价格;物品名称(

    2024年02月11日
    浏览(29)
  • 支付宝沙箱支付详细教程(IDEA版)—2023最新版

    😇作者介绍:一个有梦想、有理想、有目标的,且渴望能够学有所成的追梦人。 🎆学习格言:不读书的人,思想就会停止。——狄德罗 ⛪️个人主页:进入博主主页 🗼专栏系列:无 🌼欢迎小伙伴们访问到博主的文章内容,在浏览阅读过程发现需要纠正的地方,烦请指出,

    2024年02月10日
    浏览(41)
  • 支付宝沙箱环境+SpringBoot+内网穿透整合开发

    目录 1.查看沙箱账号 2.内网穿透 3.沙箱环境整合SpringBoot开发 下面我将以实际案例详细介绍如何使用沙箱环境进行支付宝支付对接的开发 1.查看沙箱账号  首先什么是沙箱账号? 沙箱账号是指在支付宝沙箱环境中创建的测试账户,用于模拟真实的支付流程。在开发和测试过程

    2023年04月15日
    浏览(31)
  • 07_SpringBoot 对接支付宝完成扫码支付,完整流程梳理!

    需求:系统A对接支付宝,实现支持用户扫码支付 对接的API文档: https://open.alipay.com/api 可选的支付方式有: 扫码付 :出示付款码或者用户扫码付款 APP支付 :在APP中唤起支付宝 手机网站支付 :在移动端网页中唤起支付宝 App 或支付宝网页 电脑网站支付 :在PC端唤起支付宝

    2024年04月16日
    浏览(32)
  • 保姆级教程:SpringBoot 对接支付宝完成扫码支付,完整流程梳理!

    1、支付方式选择 2、交互流程 3、1. 对接准备 2.加密解密 + 签名验签 3.沙箱环境 4、内网穿透 5、二维码 6、下单 7、异步通知回调 8、查询支付结果 9、退款 10、通用版SDK 需求:系统A对接支付宝,实现支持用户扫码支付 对接的API文档: https://open.alipay.com/api 可选的支付方式有:

    2024年04月11日
    浏览(33)
  • 支付宝手机网站支付接入(沙箱环境)

    参考阿里云文档:https://docs.open.alipay.com/203/105285/ 手机网站支付产品包含两类API: 页面跳转类:需要从前端页面以Form表单的形式发起请求,浏览器会自动跳转至支付宝的相关页面(一般是收银台或签约页面),用户在该页面完成相关业务操作后再回跳到商户指定页面。例如本

    2024年02月08日
    浏览(31)
  • 使用natapp进行支付宝沙箱支付的回调

    支付宝沙箱支付要想处理支付成功后的逻辑,就必须进行支付回调,那么对于本地开发的我们,如何进行回调测试呢,今天就给大家带来一个解决方法,使用natapp工具来进行回调 使用NATAPP:官网地址 先下载工具,下载完之后可能没有config.ini文件,需要自己加上 config.ini 先注

    2024年04月10日
    浏览(35)
  • spring boot支付宝沙箱环境测试支付功能

    目录 一、安装支付宝支付demo 二、配置demo信息 三、配置回调地址和异步地址 四、内网穿透 (一)简介 (二)使用场景 (三)内网穿透的几个常用软件 (四)使用natapp 选择Java版本,下载后是一个eclipse项目 SDK Demo 获取 - 支付宝文档中心 (alipay.com) 导入ideal参考:IDEA导入Ec

    2024年01月17日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包