2023最新之 教你如何使用Springboot集成支付宝沙箱支付(支持回调- 亲测有效)

简介: 2023最新之 教你如何使用Springboot集成支付宝沙箱支付

1、进入支付宝开放平台

https://openhome.alipay.com/

2、进入沙箱

3bbbbbe481794f938ebeb29dc5c54537.png

2.1 点击启用公钥

4d4674f42fed4088ac107f14957e598a.png

点击查看:

9c4dc6c419a647acaaba77a68b3299e8.png

3、Java集成沙箱支付

3.1  在pom.xml文件中添加依赖

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

db555a2bbc3146ecbb1663bec777ddaa.png

3.2 在 application.yml 文件中配置

alipay:
  appId:
  appPrivateKey:
  alipayPublicKey:
  notifyUrl: 

3.3 alipay的java配置:AplipayConfig.java

package com.shijiu.config;
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
 * @Author 
 * @Date Created in  2023/5/5 15:06
 * @DESCRIPTION:
 * @Version V1.0
 */
@Data
@Component
//读取yml文件中alipay 开头的配置
@ConfigurationProperties(prefix = "alipay")
public class AliPayConfig {
   private String appId;
   private String appPrivateKey;
   private String alipayPublicKey;
   private String notifyUrl;
   @PostConstruct
   public void init() {
      // 设置参数(全局只需设置一次)
      Config config = new Config();
      config.protocol = "https";
      config.gatewayHost = "openapi.alipaydev.com";
      config.signType = "RSA2";
      config.appId = this.appId;
      config.merchantPrivateKey = this.appPrivateKey;
      config.alipayPublicKey = this.alipayPublicKey;
      config.notifyUrl = this.notifyUrl;
      Factory.setOptions(config);
      System.out.println("=======支付宝SDK初始化成功=======");
   }
}

3.4   **注意:在拦截器里面加上 忽略alipay接口的配置,这很重要!**

34b963a757a54deeb2951d66c411e3b9.png

3.5 新建一个AliPayController.java

package com.shijiu.controller;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import com.shijiu.common.Result;
import com.shijiu.config.AliPayConfig;
import com.shijiu.dao.mapper.ShopOrderMapper;
import com.shijiu.pojo.AliPay;
import com.shijiu.pojo.ShopOrder;
import org.joda.time.DateTime;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.net.URLEncoder;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.easysdk.factory.Factory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * @Author 
 * @Date Created in  2023/5/5 15:23
 * @DESCRIPTION:
 * @Version V1.0
 */
@RestController
@RequestMapping("alipay")
@Transactional(rollbackFor = Exception.class)
public class AliPayController {
   @Resource
   AliPayConfig aliPayConfig;
   @Resource
   private ShopOrderMapper shopOrderMapper;
   private static final String GATEWAY_URL ="https://openapi.alipaydev.com/gateway.do";
   private static final String FORMAT ="JSON";
   private static final String CHARSET ="utf-8";
   private static final String SIGN_TYPE ="RSA2";
   @GetMapping("/pay") // &subject=xxx&traceNo=xxx&totalAmount=xxx
   public void pay(AliPay aliPay, HttpServletResponse httpResponse) throws Exception {
      AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, aliPayConfig.getAppId(),
              aliPayConfig.getAppPrivateKey(), FORMAT, CHARSET, aliPayConfig.getAlipayPublicKey(), SIGN_TYPE);
      AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
      request.setNotifyUrl(aliPayConfig.getNotifyUrl());
      request.setBizContent("{\"out_trade_no\":\"" + aliPay.getTraceNo() + "\","
              + "\"total_amount\":\"" + aliPay.getTotalAmount() + "\","
              + "\"subject\":\"" + aliPay.getSubject() + "\","
              + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
      String form = "";
      try {
         // 调用SDK生成表单
         form = alipayClient.pageExecute(request).getBody();
      } catch (AlipayApiException e) {
         e.printStackTrace();
      }
      httpResponse.setContentType("text/html;charset=" + CHARSET);
      // 直接将完整的表单html输出到页面
      httpResponse.getWriter().write(form);
      httpResponse.getWriter().flush();
      httpResponse.getWriter().close();
   }
   @PostMapping("/notify")  // 注意这里必须是POST接口
   public String payNotify(HttpServletRequest request) throws Exception {
      if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) {
         System.out.println("=========支付宝异步回调========");
         Map<String, String> params = new HashMap<>();
         Map<String, String[]> requestParams = request.getParameterMap();
         for (String name : requestParams.keySet()) {
            params.put(name, request.getParameter(name));
            // System.out.println(name + " = " + request.getParameter(name));
         }
         String tradeNo = params.get("out_trade_no");
         String gmtPayment = params.get("gmt_payment");
         String alipayTradeNo = params.get("trade_no");
         // 支付宝验签
         if (Factory.Payment.Common().verifyNotify(params)) {
            // 验签通过
            System.out.println("交易名称: " + params.get("subject"));
            System.out.println("交易状态: " + params.get("trade_status"));
            System.out.println("支付宝交易凭证号: " + params.get("trade_no"));
            System.out.println("商户订单号: " + params.get("out_trade_no"));
            System.out.println("交易金额: " + params.get("total_amount"));
            System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
            System.out.println("买家付款时间: " + params.get("gmt_payment"));
            System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));
            // 更新订单未已支付
            ShopOrder order = new ShopOrder();
            order.setId(tradeNo);
            order.setStatus("1");
            Date payTime = DateUtil.parse(gmtPayment, "yyyy-MM-dd HH:mm:ss");
            order.setZhhifuTime(payTime);
            shopOrderMapper.updateById(order);
         }
      }
      return "success";
   }
}

3.6 新建  AliPay.java 参数

package com.shijiu.pojo;
import lombok.Data;
/**
 * @Author 
 * @Date Created in  2023/5/5 15:26
 * @DESCRIPTION:
 * @Version V1.0
 */
@Data
public class AliPay {
   private String traceNo;
   private double totalAmount;
   private String subject;
   private String alipayTraceNo;
}

前端vue 代码:(重点)

    handleEdit(row) {
      this.$confirm('确认支付?, 是否继续?', '删除打卡信息?', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        window.open(`http://localhost:8888/alipay/pay?subject=${row.orderName}&traceNo=${row.id}&totalAmount=${row.prince}`)
        this.$message.success('付款成功')
        this.load()
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消付款'
        })
        this.load()
      })
    },

3.7 接口测试

然后我们访问URL进行测试,测试的url格式:

http://localhost:8888/alipay/pay?subject=测试商品&traceNo= 666&totalAmount=1000

a4c6901efa6b4244869a863f92412954.png

aaa4025456e446868fe2e45a123f80df.png

3.8 内网穿透:https://natapp.cn/

配置免费的隧道,端口:8888:(你项目中的地址端口号

3116858741ac4d1cb8fcdb7a6b1a1379.png

bcfc01e31481425da8c727b889debbb4.png

3.9 新建文本文档 (启动内网穿透工具):

内容为下列内容。修改格式为 .bat

f91a76a13f314955a0b06487281091ce.png

10a5e2a3d7a140c188764184be12195a.png

每次启动回调地址都不同!!!

89e7cca91f5a4522b5a28853da9fd907.png

3.10  回调地址:(如果一次不行,就多重新启动start.bat ,并更新yml文件中的回调地址

43089ca065e9482aa0f46b9fdecaf074.png

触发回调函数:

dc6b4ca3fd484ecb9f3d79d63ace88b0.png看下方的:

b485030c2f8347428ec5395da39c132c.png

3.11 支付结果:(示例:227)

a6967d428e7849bb8b0d31c314d8affe.png

已支付

4c35ea29b6ad4a75a9ee2ee5b057d9c6.png

学习来源:

Springboot集成支付宝沙箱支付_哔哩哔哩_bilibili

大坑!集成支付宝沙箱支付!文档:https://blog.csdn.net/xqnode/article/details/124457790, 视频播放量 16884、弹幕量 103、点赞数 390、投硬币枚数 400、收藏人数 517、转发人数 72, 视频作者 程序员青戈, 作者简介 毕设私聊Q:1938976892,相关视频:支付宝沙箱支付快速集成版,沙箱支付宝项目实战教学 SpringBoot + Vue前后端分离项目整合沙箱支付宝完成支付功能,黑马程序员Java在线支付教程,深度学习掌握Java(微信支付+支付宝支付等)常用支付方式,从0开始带你手撸一套SpringBoot+Vue后台管理系统(2022年最新版),计算机毕业设计轻松搞定支付宝沙箱支付配置,8分钟学完springboot+vue前后分离的增删改查,springboot实现支付宝沙箱付款和退款功能,【尚硅谷】微信支付&支付宝支付,一套搞定Java在线支付开发教程,【java毕业设计】springboot vue校园二手闲置物品交易平台源码和论文 含支付宝沙箱支付功能,支付宝在线支付接入视频教程-Java版

https://www.bilibili.com/video/BV1KS4y1w7yE/?spm_id_from=333.999.0.0&vd_source=419fe38ebae639bb2494d02c5fe95313



目录
相关文章
|
23天前
|
消息中间件 Java Kafka
Springboot集成高低版本kafka
Springboot集成高低版本kafka
|
29天前
|
NoSQL Java Redis
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
354 0
|
2月前
|
NoSQL Java Redis
SpringBoot集成Redis
SpringBoot集成Redis
464 0
|
2月前
|
NoSQL Java Redis
小白版的springboot中集成mqtt服务(超级无敌详细),实现不了掐我头!!!
小白版的springboot中集成mqtt服务(超级无敌详细),实现不了掐我头!!!
294 1
|
2月前
|
XML Java 关系型数据库
【SpringBoot系列】SpringBoot集成Fast Mybatis
【SpringBoot系列】SpringBoot集成Fast Mybatis
|
4天前
|
前端开发 Java 应用服务中间件
从零手写实现 tomcat-08-tomcat 如何与 springboot 集成?
本文探讨了Spring Boot如何实现像普通Java程序一样通过main方法启动,关键在于Spring Boot的自动配置、内嵌Servlet容器(如Tomcat)以及`SpringApplication`类。Spring与Tomcat集成有两种方式:独立模式和嵌入式模式,两者通过Servlet规范、Spring MVC协同工作。Spring和Tomcat的生命周期同步涉及启动、运行和关闭阶段,通过事件和监听器实现。文章鼓励读者从实现Tomcat中学习资源管理和生命周期管理。此外,推荐了Netty权威指南系列文章,并提到了一个名为mini-cat的简易Tomcat实现项目。
|
1天前
|
前端开发 定位技术 API
【Flutter前端技术开发专栏】Flutter中的第三方服务集成(如支付、地图等)
【4月更文挑战第30天】本文介绍了在Flutter中集成第三方服务,如支付和地图,以增强应用功能和用户体验。开发者可通过官方或社区插件集成服务,关注服务选择、API调用、错误处理和用户体验。支付集成涉及选择服务、获取API密钥、引入插件、调用API及处理结果。地图集成则需选择地图服务、获取API密钥、初始化地图并添加交互功能。集成时注意选择稳定插件、阅读文档、处理异常、优化性能和遵循安全规范。随着Flutter生态发展,更多第三方服务将可供选择。
【Flutter前端技术开发专栏】Flutter中的第三方服务集成(如支付、地图等)
|
6天前
|
Java Docker 容器
SpringBoot项目集成XXL-job
SpringBoot项目集成XXL-job
|
8天前
|
Java 关系型数据库 数据库
【SpringBoot系列】微服务集成Flyway
【4月更文挑战第7天】SpringBoot微服务集成Flyway
【SpringBoot系列】微服务集成Flyway
|
16天前
|
安全 API 数据安全/隐私保护
Django与第三方服务的集成:支付、邮件等
【4月更文挑战第15天】本文介绍了Django集成支付服务和邮件服务的方法。对于支付服务,包括选择支付网关(如支付宝、微信支付、Stripe)、安装Django库、配置参数、创建支付视图及处理支付结果。而对于邮件服务,涉及配置邮件服务器、使用`django.core.mail`发送邮件,以及集成SendGrid等第三方服务以增强邮件功能。集成这些服务能丰富Django应用功能,同时要注意安全性与可靠性。