Java集成支付宝沙箱支付,详细教程(SpringBoot完整版)

2023-09-21 15:12:40

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、开发前准备?

easy支付官方文档:https://opendocs.alipay.com/open/009ys9

通用版文档:https://opendocs.alipay.com/open/02np94

支付宝沙箱的配置:
注册支付宝开发者账户,进入开发者控制台

沙箱快捷入口:
https://open.alipay.com/develop/sandbox/app

在这里插入图片描述
沙箱的界面:

在这里插入图片描述

二、使用步骤

1、引入库

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-easysdk</artifactId>
    <version>2.2.2</version>
</dependency>

2、配置在 application.yml 里面进行配置:

#阿里沙箱支付配置
alipay:
  #签名算法
  signType: 
  #应用ID
  appId: 
  #应用私钥
  appPrivateKey:
  #支付宝公钥
  publicKey: 
  #回调地址
  notifyUrl: 

3、alipay的java配置:AplipayConfig.java

/**
 * @author :Mr.ZJW
 * @date :Created 2023/9/20 17:40
 * @description:alipay沙箱环境配置
 */
@Slf4j
@Data
@Component
@ConfigurationProperties(prefix = "alipay")
public class AlipayConfig {

    /**
     * appId
     */
    private String appId;

    /**
     * 私钥
     */
    private String appPrivateKey;

    /**
     * 公钥
     */
    private String publicKey;

    /**
     * 回调地址
     */
    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;  //应用id
        config.merchantPrivateKey = this.appPrivateKey;    应用私钥
        config.alipayPublicKey = this.publicKey;    //支付宝公钥
        config.notifyUrl = this.notifyUrl;  //回调地址
        Factory.setOptions(config);
        log.info("支付宝配置初始化完成");
    }

}

4、支付接口

import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import com.google.common.collect.Maps;
import com.jowell.common.exception.base.BaseException;
import com.jowell.common.response.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
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.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * @author :Mr.ZJW
 * @date :Created 2023/9/20 17:53
 * @description:支付controller
 */
@Slf4j
@RequestMapping("/alipay")
@Controller
@ResponseBody
public class TestAlipayController {

    /**
     * 支付接口
     *
     * @param subject     名称
     * @param outTradeNo  订单号
     * @param totalAmount 金额
     * @return /
     */
    @GetMapping("/pay")
    public String pay(String subject, String outTradeNo, String totalAmount) {
        AlipayTradePagePayResponse response;
        try {
            response = Factory.Payment.Page().pay(subject, outTradeNo, totalAmount, "");
        } catch (Exception e) {
            log.error("支付宝付款调用失败,原因:" + e.getMessage());
            throw new BaseException("网络异常,请刷新后重试");
        }
        return response.getBody();
    }

接口测试:
访问URL进行测试,测试的url格式:http://localhost:10000/alipay/pay?subject=支付测试&outTradeNo=D239211000000&totalAmount=1

效果:
在这里插入图片描述
进行用买家账号密码登录:
在这里插入图片描述
输入支付密码进行支付:
在这里插入图片描述

支付成功:
在这里插入图片描述

4、回调接口

回调接口要有一个外网域名,这里可以使用花生壳以及我分享过的一遍文章:
文章链接:https://blog.csdn.net/javaeEEse/article/details/117983797?spm=1001.2014.3001.5502

在这里插入图片描述
把这个域名复制到配置文件里的回调地址上。

回调完整代码:

    /**
     * 支付宝回调
     */
    @PostMapping("/notify")
    public Result<String> notify(HttpServletRequest request) {
        log.info("支付宝回调成功");
        //校验是否成功
        if ("TRADE_SUCCESS".equals(request.getParameter("trade_status"))) {
            //#解析回调数据
            Map<String, String> params = Maps.newHashMap();
            Map<String, String[]> requestParams = request.getParameterMap();
            for (String name : requestParams.keySet()) {
                params.put(name, request.getParameter(name));
            }
            //订单号
            String tradeNo = params.get("out_trade_no");
            //支付金额
            String gmtPayment = params.get("gmt_payment");
            //支付宝交易凭证号
            String alipayTradeNo = params.get("trade_no");
            //#支付宝验签,防止不法分子伪造请求
            try {
                Boolean flag = Factory.Payment.Common().verifyNotify(params);
                if (Boolean.TRUE.equals(flag)) {
                    log.info("交易名称: " + params.get("subject"));
                    log.info("交易状态: " + params.get("trade_status"));
                    log.info("支付宝交易凭证号: " + params.get("trade_no"));
                    log.info("商户订单号: " + params.get("out_trade_no"));
                    log.info("交易金额: " + params.get("total_amount"));
                    log.info("买家在支付宝唯一id: " + params.get("buyer_id"));
                    log.info("买家付款时间: " + params.get("gmt_payment"));
                    log.info("买家付款金额: " + params.get("buyer_pay_amount"));
                } else {
                    log.error("异步通知验签失败");
                    return Result.error("fail");
                }

            } catch (Exception e) {
                log.error("异步发生异常{}", e.getMessage());
                return Result.error("fail");
            }
            //#进行一些业务逻辑,如更新订单等操作
        }
        return Result.success();
    }
更多推荐

虚拟线上发布会带来颠覆性新体验,3D虚拟场景直播迸发品牌新动能

虚拟线上发布会是近年来在数字化营销领域备受关注的形式,而随着虚拟现实技术的不断进步,3D虚拟场景直播更成为了品牌宣传、推广的新选择。可以说,虚拟线上发布会正在以其颠覆性的新体验,为品牌带来全新的活力。1.突破时空限制,拓展潜在用户与传统的线下发布会相比,虚拟线上发布会通过互联网举办,不受地域和时间限制,让所有对品牌或者

Dokcer搭建Apache Guacamole堡垒机

一、什么是堡垒机“堡垒机”这个词通常指的是“堡垒机器”(BastionHost)的简称。堡垒机是一种计算机系统或网络设备,用于增强计算机网络的安全性。它在网络中充当一个重要的安全关口,通过限制对内部网络的访问,帮助保护敏感数据和资源免受未经授权的访问和攻击。堡垒机的主要功能访问控制:堡垒机允许管理员配置哪些用户或系统可

JavaWeb之Listener监听器

文章目录1.什么是监听器?2.监听器有什么用?3.Servlet规范中提供了哪些监听器?3.1jakarta.servlet包下2.2jakarta.servlet.http包下4.实现一个监听器的步骤1.什么是监听器?(1)监听器是Servlet规范中的一员。就像Filter一样。Filter也是Servlet规范中

洛谷刷题入门篇:顺序结构

链接如下:https://www.luogu.com.cn/training/100#problems一、Hello,World!题目链接:https://www.luogu.com.cn/problem/B2002题目描述编写一个能够输出Hello,World!的程序。提示:使用英文标点符号;Hello,World!

华为OD机考算法题:垃圾信息拦截

目录题目部分解读与分析代码实现题目部分题目垃圾信息拦截难度难题目说明大众对垃圾短信深恶痛绝,希望能对垃圾短信发送者进行识别,为此,很多软件增加了垃圾短信识别机制。经分析,发现正常用户的短信通常具备交互性,而垃圾短信往往都是大量单向的短信,按照如下规则进行垃圾短信识别:本题中,发送者A符合以下条件之一的,则认为A是垃圾短

SVN的基本使用

一、SVN介绍SVN(Subversion)是一个开源的版本控制系统,它专门用于管理文件和目录的变更。SVN提供了一种集中式的版本控制方案,其中有一个中央仓库存储所有文件的历史记录和变更。SVN使用方式相对简单,可以通过命令工具或可视化客户端进行操作,下面主要是SVN客户端的操作方式二、安装客户端软件进入官网下载tor

基于 MATLAB 的电力系统动态分析研究【IEEE9、IEEE68系节点】

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果2.1IEEE9节点2.2IEEE68节点🎉3参考文献🌈4Matlab代码、数据、文章💥1概述

什么是云计算中的资源调度,解释资源调度的挑战和算法

1、什么是云计算中的资源调度,解释资源调度的挑战和算法。在云计算中,资源调度(ResourceScheduling)指的是如何在不同类型的资源(例如计算资源、存储资源、网络资源等)之间合理地分配和调度资源,以实现高效的资源管理和任务执行。资源调度的目标是提高系统的可用性、可靠性和性能。然而,资源调度面临着一些挑战。首先

敏捷开发工具:提升软件研发效率的重要利器

在当今的软件开发领域,敏捷开发方法越来越受到推崇。敏捷开发的核心是灵活应对需求变化,以快速迭代的方式不断优化产品。为了助力敏捷开发的实施,各种敏捷开发工具应运而生。本文将介绍几种常用的敏捷开发工具,阐述其特点、应用场景及优缺点,最后对敏捷开发工具的重要性进行总结。一、敏捷开发工具介绍Leangoo领歌:Leangoo领

什么是Selenium?使用Selenium进行自动化测试!

你知道什么是Selenium吗?你知道为什么要使用它吗?答案就在本文中,很高兴能够与你共飧。自动化测试正席卷全球,Selenium认证是业界最抢手的技能之一。什么是Selenium?Selenium是一种开源工具,用于在Web浏览器上执行自动化测试(使用任何Web浏览器进行Web应用程序测试)。等等,先别激动,让我再次

【详细图文】Windows下安装RustRover和配置Rust环境

前言Rust已经火了挺长时间了,连微软的Windows内核都用它来重新改写,可想而知其厉害之处。之前有看过Rust的教程,但一直没有去尝试。今天看到JetBrains出了Rust专用的IDE:RustRover。作为JetBrains的粉丝,决定进行一次部署实践。本文是从工具安装和环境部署到HelloWorld,作为一

热文推荐