支付宝沙箱环境+SpringBoot+内网穿透整合开发

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

目录

1.查看沙箱账号

2.内网穿透

3.沙箱环境整合SpringBoot开发


下面我将以实际案例详细介绍如何使用沙箱环境进行支付宝支付对接的开发

1.查看沙箱账号

 首先什么是沙箱账号?

沙箱账号是指在支付宝沙箱环境中创建的测试账户,用于模拟真实的支付流程。在开发和测试过程中,使用沙箱账号可以避免真实账户数据的泄露和风险,同时可以进行多种测试场景和交易模拟,以保证应用程序的稳定性和可靠性。

支付宝沙箱环境中的测试账户和真实账户一样,可以进行支付、退款、查询等操作。开发人员可以通过创建和使用沙箱账号,进行多种测试和调试,以保证应用程序的正确性和稳定性。同时,沙箱账号的创建和使用是免费的,不需要任何费用。

需要注意的是,沙箱账号只能在支付宝沙箱环境中使用,不能在生产环境中使用。在将应用程序上线之前,需要使用真实账户进行测试和验证。

1.登录支付宝开放平台:https://open.alipay.com/platform/home.htm

支付宝沙箱环境+SpringBoot+内网穿透整合开发

 2.点击登录,系统会弹出一个二维码进行扫描登录,当然也可以使用账号密码进行登录

3.点击进入控制台

支付宝沙箱环境+SpringBoot+内网穿透整合开发

4.开发工具推荐中选择使用沙箱环境

支付宝沙箱环境+SpringBoot+内网穿透整合开发

5.自此完成沙箱账号信息的查看

支付宝沙箱环境+SpringBoot+内网穿透整合开发

2.内网穿透

获取方式:电脑应用商店搜索花生壳

网页端申请配置:

1.需要进行实名认证否则用不了

2.需要花6元买个域名映射

支付宝沙箱环境+SpringBoot+内网穿透整合开发

 3.将ip和端口换成刚刚申请的域名,填入回调地址处,用于后续的支付宝系统回调接口

支付宝沙箱环境+SpringBoot+内网穿透整合开发

客户端:开启自定义映射

支付宝沙箱环境+SpringBoot+内网穿透整合开发

下面将进入主题,如何整合SpringBoot进行支付开发

3.沙箱环境整合SpringBoot开发

 1.1.创建Spring Boot项目

可以使用Spring Initializr快速创建一个新项目也可以在maven创建的基础上加上相关的依赖

如果您是maven创建的项目请加如下依赖:

 <dependencies>
        <!-- Spring Boot starter dependencies -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.5.4</version>
        </dependency>
  </dependencies>

如果是基于Spring Initializr快速创建一个SpringBoot项目则导入如下依赖:

2.导入依赖

 <dependencies>
        <!-- Other dependencies -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>3.0.0</version>
        </dependency>
        <!-- Fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>
        <!-- slf4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.32</version>
        </dependency>

        <!-- JSON -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20210307</version>
        </dependency>
    </dependencies>

3.配置应用程序

在application.yml文件中,我们需要添加支付宝支付的相关配置。

# 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号,在沙箱应用中获取
appId: 
# 商户私钥,您的PKCS8格式RSA2私钥,通过开发助手生成的应用私钥
privateKey: 
# 支付宝公钥,在沙箱应用获取,通过应用公钥生成支付宝公钥
publicKey: 
# 服务器异步通知页面路径需http://格式的完整路径,不能加?id=123这类自定义参数
notifyUrl: https://7*****.zicp.fun/alipay/notify
# 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数
returnUrl: https://7*****.zicp.fun/alipay/success
# 支付宝网关,在沙箱应用中获取
gatewayUrl: 

 下面就上面的参数进行说明

支付宝沙箱环境+SpringBoot+内网穿透整合开发

所以应用ID、应用私钥和支付宝公钥可以在支付宝开放平台上获取。gateway-url是支付宝支付接口的地址,return-url和notify-url是支付完成后跳转的地址和支付结果通知地址。

4.创建支付服务

接下来,创建一个支付服务类,用于处理支付请求和支付结果通知。在创建支付服务之前,我要先创建一个AlipayClient对象,用于调用支付宝支付接口。

@Configuration
public class AlipayConfig {
  //获取配置文件中的配置信息
    //应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
    @Value("${appId}")
    private String appId;

    //商户私钥 您的PKCS8格式RSA2私钥
    @Value("${privateKey}")
    private String privateKey;

    //支付宝公钥
    @Value("${publicKey}")
    private String publicKey;

    //支付宝网关
    @Value("${gatewayUrl}")
    private String gatewayUrl;

 @Bean
    public AlipayClient alipayClient() {
        return new DefaultAlipayClient(gatewayUrl, appId, privateKey, "json", "UTF-8", publicKey, "RSA2");
    }
}

再创建一个支付服务,用于处理支付请求和支付结果通知。

@Service
public class AlipayService {
    @Autowired
    private AlipayClient alipayClient;

      //服务器异步通知页面路径
    @Value("${notifyUrl}")
    private String notifyUrl;

    //页面跳转同步通知页面路径
    @Value("${returnUrl}")
    private String returnUrl;

    /**
     * 发起支付请求
     * @param order 订单信息
     * @return 支付页面HTML代码
     */
    public String pay(Order order) {
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setReturnUrl(returnUrl);
        request.setNotifyUrl(notifyUrl);

        Map<String, Object> params = new HashMap<>();
        params.put("out_trade_no", order.getOrderId());
        params.put("total_amount", order.getTotalAmount());
        params.put("subject", order.getSubject());
        params.put("body", order.getBody());
        params.put("product_code", "FAST_INSTANT_TRADE_PAY");

        request.setBizContent(JSON.toJSONString(params));

        try {
            AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
            return response.getBody();
        } catch (AlipayApiException e) {
            throw new RuntimeException("支付宝支付失败", e);
        }
    }

    /**
     * 处理支付结果通知
     *
     * @param request 支付结果通知参数
     * @return 处理结果
     */
    public String notify(HttpServletRequest request) throws AlipayApiException {
           log.info("异步回调");
        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 = iter.next();
            String[] values = requestParams.get(name);
            StringBuilder valueStr = new StringBuilder();
            for (int i = 0; i < values.length; i++) {
                valueStr.append((i == values.length - 1) ? values[i] : values[i] + ",");
            }
            params.put(name, valueStr.toString());
        }

        log.info("请求参数的传入:" + params);
        String tradeStatus = params.get("trade_status");
        log.info("tradeStatus:" + tradeStatus);
        String outTradeNo = params.get("out_trade_no");
        log.info("outTradeNo:" + outTradeNo);
        String totalAmount = params.get("total_amount");
        log.info("totalAmount:" + totalAmount);
//
//        // 从数据库中查询订单信息
//        Order order = orderService.findByOutTradeNo(outTradeNo);

        // 验证通知是否来自支付宝服务器
        if (!AlipaySignature.rsaCheckV1(params, publicKey, charset, signType)) {
            return "fail";
        }

        // 验证交易状态和订单金额等信息
//            if (!"TRADE_SUCCESS".equals(tradeStatus) || !totalAmount.equals(order.getTotalAmount().toString())) {
        if (!"TRADE_SUCCESS".equals(tradeStatus)) {
            return "fail";
        }

        // 根据交易状态进行业务处理
        switch (tradeStatus) {
            case "TRADE_SUCCESS":
                // 更新订单状态、发货等操作
                break;
            case "TRADE_CLOSED":
                // 订单关闭处理
                break;
            default:
                // 其他状态处理
                break;
        }

        return "success";
        }

    public String success(HttpServletRequest request) throws AlipayApiException, UnsupportedEncodingException {
        log.info("=================同步回调======================");
        // 获取支付宝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);
        }
        log.info("支付宝平台同步回调传入的参数:" + params);
        //验证签名(支付宝公钥)
        boolean signVerified = AlipaySignature.rsaCheckV1(params, publicKey, charset, signType); // 调用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"));

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

            //在这里编写自己的业务代码(对数据库的操作)
			/*
			################################
			*/
            //跳转到提示页面(成功或者失败的提示页面)
            return "交易成功!";
        } else {
            //跳转到提示页面(成功或者失败的提示页面)
            return "交易失败!";
        }
    }
}

在AlipayService类中,我们使用@Autowired注解注入AlipayClient对象,并使用@Value注解注入支付宝支付的相关配置。

pay方法用于发起支付请求,首先创建一个AlipayTradePagePayRequest对象,设置returnUrl和notifyUrl,然后将订单信息封装成一个Map对象调用alipayClient的pageExecute方法发起支付请求,并返回支付页面的HTML代码。

notify方法用于处理支付结果通知,首先使用AlipaySignature.rsaCheckV1方法验证支付结果通知的签名,然后根据支付结果更新订单状态。

success方法也是如此,但是开发中用notify异步处理效率更高一些。

 5.5.创建支付控制器

创建一个支付控制器,用于处理支付请求和支付结果通知。

@Controller
@RequestMapping("/alipay")
public class AlipayController {
    @Autowired
    private AlipayService alipayService;

    /**
     * 发起支付请求
     * @param order 订单信息
     * @return 支付页面HTML代码
     */
    @RequestMapping("/pay")
    @ResponseBody
    public String pay(Order order) {
        return alipayService.pay(order);
    }

     /**
     * 处理支付结果通知
     * @param request 支付结果通知参数
     * @return 处理结果
     */
    @PostMapping("/notify")
    @ResponseBody
    public String notify(@RequestParam HttpServletRequest request) throws AlipayApiException {
        return alipayService.notify(request);
    }

    /**
     * 支付完成后跳转回商户网站的地址
     *
     * @return 跳转页面
     */
    @RequestMapping("/success")
    @ResponseBody
    public String success(HttpServletRequest request) throws UnsupportedEncodingException, AlipayApiException {
        return alipayService.success(request);
    }
//根据自己的实际业务选择是同步处理还是异步处理
}

在AlipayController类中,我们使用@Autowired注解注入AlipayService对象,并创建pay、notify和returnUrl三个方法,分别用于处理支付请求、支付结果通知和支付完成后跳转回商户网站的地址。 

        这里需要注意的是,只有当方法的返回值类型为voidString时,才需要使用@ResponseBody注解。如果方法的返回值类型为其他类型(如对象、集合等),Spring MVC会自动将其转换为JSON或XML格式的数据并返回给客户端,无需使用@ResponseBody注解。

 6.测试支付功能

现在,我们已经完成了支付宝支付的整合,可以通过调用支付控制器中的pay方法发起支付请求,并在支付完成后处理支付结果通知和支付完成后跳转回商户网站的地址。

可以通过Postman等工具模拟支付请求,或者在网站上添加一个支付按钮,点击按钮后跳转到支付页面完成支付。

在网站上面添加一个支付按钮

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/alipay/pay" method="post">
    订单号:<input type="text" name="out_trade_no" required><br/>
    订单名称:<input type="text" name="subject" required><br/>
    付款金额:<input type="text" name="total_amount" required><br/>
    商品描述:<input type="text" name="body"><br/>
    <input type="submit" value="下单"> <input type="reset" value="重置">
</form>

</body>
</html>

浏览器地址栏输入:http://localhost:8081/

支付宝沙箱环境+SpringBoot+内网穿透整合开发输入支付账号和支付密码即可完成支付

支付宝沙箱环境+SpringBoot+内网穿透整合开发

                     支付宝沙箱环境+SpringBoot+内网穿透整合开发完美收官!

                                          有任何问题随时私信我!文章来源地址https://www.toymoban.com/news/detail-413674.html

到了这里,关于支付宝沙箱环境+SpringBoot+内网穿透整合开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 支付宝沙箱环境配置结合内网穿透实现远程调试Java SDK接口

    1.测试环境 Maven Spring boot Jdk 1.8 2.本地配置 获取支付宝支付Java SDK,maven项目可以选择maven版本,普通java项目可以在GitHub下载,这里以maven为例 SDK下载地址:https://doc.open.alipay.com/docs/doc.htm?treeId=193articleId=103419docType=1 选择最新版的SDK版本 复制maven坐标,导入spring boot项目pom 文件里面

    2024年02月04日
    浏览(40)
  • 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日
    浏览(27)
  • Spring Boot 整合支付宝实现在线支付方案(沙箱环境)

    TIP:对于许多个人开发者而言,实现支付宝支付功能在以往往往意味着需要跨越复杂的商业流程。这涉及到拥有自己的网站及其备案,以及提交营业执照等一系列文档。但现在,支付宝开放平台带来了突破性的便利——通过沙箱环境,个人仅需拥有支付宝账号,就能够测试并

    2024年01月16日
    浏览(34)
  • springboot实现支付宝支付(沙箱环境)

    进入支付宝控制台:https://open.alipay.com/develop/manage 找到沙箱 这里可以看到 应用id 可以看到 应用私钥 和 支付宝公钥 ,获取这三后就可以开始敲代码了 依赖: 在resources/templates目录下创建一个pay.html文件,用于展示支付宝支付页面。 创建同步通知页面 在resources/templates目录下创建

    2024年02月08日
    浏览(26)
  • Java开发者必备:支付宝沙箱环境支付远程调试指南

    🔥 博客主页 : 小羊失眠啦. 🔖 系列专栏 : C语言 、 Linux 、 Cpolar ❤️ 感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 在沙箱环境调试支付SDK的时候,往往沙箱环境部署在本地

    2024年02月08日
    浏览(35)
  • SpringBoot+支付宝支付(沙箱)

    easy支付官方文档: 工具 | 网页移动应用 通用版文档: 通用版 | 网页移动应用 有基础的可以直接看文档自己搭建,官方文档写的很详细。 支付宝沙箱配置 1、注册支付宝开发者账户,进入开发者控制台 (有支付宝账户的直接支付宝扫码登入即可) 支付宝开放平台   htt

    2024年02月06日
    浏览(32)
  • springboot整合pi支付开发

    pi支付流程图: 使用Pi SDK功能发起支付 由 Pi SDK 自动调用的回调函数(让您的应用服务器知道它需要发出批准 API 请求) 从您的应用程序服务器到 Pi 服务器的 API 请求以批准付款(让 Pi 服务器知道您知道此付款) Pi浏览器向用户显示付款详细信息页面,我们正在等待用户签署

    2024年02月07日
    浏览(24)
  • 支付宝手机网站支付接入(沙箱环境)

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

    2024年02月08日
    浏览(25)
  • Springboot支付宝沙箱支付---完整详细步骤

    不经常看消息和评论,代码和数据库已上传至gitee 项目源码 沙箱环境-支付宝文档中心 1.1、进入个人沙箱环境 点击进入沙箱环境并用支付宝登陆 沙箱管理界面如图所示 appid,支付宝网关,自定义密钥等 这里是沙箱支付宝(虚拟)的账号和密码,可以用来支付 1.2、接下来进行

    2023年04月25日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包