SpringBoot集成支付宝新版Alipay Easy SDK

本文介绍如何在SpringBoot项目中集成支付宝支付功能,包括配置新版SDK、实现支付与退款流程及同步异步通知处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备

支付宝新版SDK AlipayEasy 2.0.2
SpringBoot 2.3.3.RELEASE
Vue2

进入支付宝开发平台,使用支付宝公钥证书方式,6个文件参考支付宝文档弄下来
在这里插入图片描述

pom.xml

<!--pom.xml  支付宝sdk -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-easysdk</artifactId>
    <version>2.0.2</version>
</dependency>

yml

在这里插入图片描述
controller就不写了

AliPaySvrvice


@Slf4j
@Service
public class Service_AilPay {

    @Resource
    private OmsOrderServiceImpl orderService;

    @Value("${alipay.ali_return_url}")
    private String ali_return_url; //支付成功同步接口
    @Value("${alipay.ali_notify_url}")
    private String ali_notify_url; //支付成功异步接口


    //支付
    public String Alipay(FinalParma finalParma, int isMobile) {
        try {
            if (isMobile == 1) {
                // quitUrl参数是手机网站支付用于在H5页面收银台中添加返回按钮的, 我没测试所以置空
                AlipayTradeWapPayResponse response = Factory.Payment.Wap()
                        .pay(finalParma.getSubject(), finalParma.getOut_trade_no(), finalParma.getTotal_amount(), "", ali_return_url);
                if (ResponseChecker.success(response)) {
                    System.out.println("调用手机支付成功");
                    return response.body;
                } else {
                    System.out.println("调用手机支付失败");
                }
            } else {
                //optional是添加穿透域回传参数
                AlipayTradePagePayResponse response = Factory.Payment.Page()
                        .optional("passback_params",finalPar.getPassback_params())
                        .pay(finalPar.getSubject(), finalPar.getOut_trade_no(), finalPar.getTotal_amount(), ali_return_url);
                        
                if (ResponseChecker.success(response)) {
                    System.out.println("调用电脑支付成功");
                    return response.body;
                } else {
                    System.out.println("调用电脑支付失败");
                }
            }
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        return null;
    }

    //支付成功异步通知
    public String ali_notify(HttpServletRequest request) {
        try {
            Map<String, String> params = getAllRequestParam(request);
            if (!Factory.Payment.Common().verifyNotify(params)) {
                System.out.println("校验失败");
                return "fail";
            }
            String trade_status = params.get("trade_status");

            if (trade_status.equals("TRADE_SUCCESS")) {
                String order_ids = URLDecoder.decode(params.get("passback_params"), StandardCharsets.UTF_8);
                System.out.println("支付成功:" + trade_status);
                String[] idArr = order_ids.split(",");
                List<OmsOrder> orders = orderService.GetOrder(idArr, "", "",-1,-1,"");
                for (OmsOrder order : orders) {
                    if (order.getOrder_status() == 0) {
                        //TODO
                        order.setPayment_time(TimeUtil.StringDataToLocalDateTime(params.get("gmt_payment")));
                        orderService.UpdateOrder(order);
                    }
                }
                return "success";
            }
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        return "fail";
    }

    //支付宝退款
    public String ali_refund(OmsOrder order) {
        try {
            AlipayTradeRefundResponse response = Factory.Payment.Common()
                    .refund(order.getOut_trade_no(), order.getPay_amount().toString());
            if (ResponseChecker.success(response)) {
                System.out.println("调用退款成功");
                //TODO
                return response.httpBody;
            } else {
                System.out.println("调用退款失败");
            }
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }
        return null;
    }

    //得到请求的参数
    private Map<String, String> getAllRequestParam(final HttpServletRequest request) {
        Map<String, String> res = new HashMap<>();
        Enumeration<?> temp = request.getParameterNames();
        while (temp.hasMoreElements()) {
            String en = (String) temp.nextElement();
            String value = request.getParameter(en);
            res.put(en, value);
        }
        return res;
    }
}

在这里插入图片描述

AliConfig

/**
 * 支付宝新版sdk配置
 */
@Configuration
public class Config_Ali {

    @Value("${alipay.protocol}")
    private String protocol;
    
    @Value("${alipay.gatewayHost}")
    private String gatewayHost;
    
    @Value("${alipay.appId}")
    private String appId;
    
    @Value("${alipay.app_private_key}")
    private String app_private_key; //应用私钥
    @Value("${alipay.mer_cert_path}")
    private String mer_cert_path; //应用公钥证书
    @Value("${alipay.ali_cert_path}")
    private String ali_cert_path; //支付宝公钥证书
    @Value("${alipay.ali_root_cert_path}")
    private String ali_root_cert_path; //支付宝根证书
    @Value("${alipay.ali_notify_url}")
    private String ali_notify_url; //支付成功异步接口


    @Bean
    public Config ConfigAli() throws Exception {
        Config config = new Config();
        config.protocol = protocol;
        config.gatewayHost = gatewayHost;
        config.signType = "RSA2";
        config.appId = appId;

        config.merchantPrivateKey = ReadTXTUtil.readTxt(new ClassPathResource(app_private_key).getInputStream());
        config.merchantCertPath = new ClassPathResource(mer_cert_path).getPath();
        config.alipayCertPath = new ClassPathResource(ali_cert_path).getPath();
        config.alipayRootCertPath = new ClassPathResource(ali_root_cert_path).getPath();
        config.notifyUrl = ali_notify_url;
        Factory.setOptions(config);
        return config;
    }
}


//=============== controller 支付成功同步接口 ======================================//
    @ApiOperation("支付宝付款后同步跳转返回")
    @RequestMapping("/ali_return_url")
    public String ali_return_url(HttpServletRequest request) {
        return "<html>\n" +
              "<head>\n" +
              "</head>\n" +
              "<body>\n" +
              "<div style=\"display: flex\">\n" +
              "    <b style=\"margin: 100px auto;color: red;font-size: 50px;\"> 支付成功:"+request.getParameter("total_amount") +"元 </b>\n" +
              "</div>\n" +
              "</body>\n" +
              "</html>";
    }
进支付宝开放平台,红框就是设置那个支付成功异步回调接口,下面的用不到
保证外网能直接访问你这个接口;可以用内网穿透工具

在这里插入图片描述

Vue,请求支付方法

6.

Vue调用支付宝返回的表单去支付

在这里插入图片描述
只测试了支付方法

<think>好的,用户想了解如何在Spring Boot中集成支付宝APP支付的沙箱环境配置和使用方法。首先,我需要回忆一下相关的步骤和注意事项。根据用户提供的引用内容,特别是引用[4],里面提到了支付宝沙箱的配置参数,比如app_id、私钥、公钥和网关地址等。这些信息是关键,必须正确配置才能成功集成。 首先,用户需要注册蚂蚁金服开放平台的开发者账号,并进入沙箱环境。这是前提条件,因为沙箱环境允许在没有营业执照的情况下进行测试。接下来,生成RSA2密钥对,这一步可能对开发者来说有点复杂,需要详细说明如何生成私钥和配置公钥到支付宝平台。 然后,在Spring Boot项目中添加支付宝SDK依赖,比如使用Alipay Easy SDK。配置文件中需要正确设置app_id、私钥、公钥、网关地址、通知URL等。这里要确保私钥的格式正确,并且通知URL能够被外网访问,可能需要用到内网穿透工具,比如ngrok。 接下来,编写支付接口的控制器,处理下单请求,生成支付表单,并处理支付宝的异步通知。异步通知部分需要验证签名,确保请求的合法性,这点很重要,否则可能会有安全风险。同时,同步跳转的处理也不能忽视,用于用户支付完成后跳转回应用页面。 用户可能遇到的问题包括密钥配置错误、通知URL无法访问、签名验证失败等。需要提醒用户检查这些关键点,并参考支付宝的官方文档进行调试。另外,测试时使用沙箱版支付宝APP扫码支付,确保账户和金额都是沙箱环境下的测试数据。 最后,生成相关问题,帮助用户进一步了解性能优化、支付结果处理和正式环境迁移等内容。需要确保回答结构清晰,步骤详细,并且引用正确的参考资料,比如用户提供的引用[1]到[4]中的相关信息。</think>### Spring Boot集成支付宝APP支付沙箱环境配置教程 #### 一、前期准备 1. **注册开发者账号** - 访问[蚂蚁金服开放平台](https://open.alipay.com/),使用支付宝账号注册开发者账号[^1] - 在「沙箱环境」模块创建测试应用,获取APPID、商户私钥、支付宝公钥等关键信息[^4] 2. **密钥生成** ```bash openssl genpkey -algorithm RSA -out private_key.pem openssl rsa -pubout -in private_key.pty -out public_key.pem ``` 将公钥配置到支付宝开放平台「应用公钥」字段 #### 二、项目配置 1. **添加依赖** ```xml <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-easysdk</artifactId> <version>2.3.0</version> </dependency> ``` 2. **application.yml配置** ```yaml alipay: app_id: 202100xxxxxxx app_private_key: "MIIEvQIBADANBgkq..." alipay_public_key: "MIIBIjANBgkq..." notify_url: https://your-domain.com/notify return_url: https://your-domain.com/return gateway_url: https://openapi-sandbox.dl.alipaydev.com/gateway.do sign_type: RSA2 charset: utf-8 ``` #### 三、核心代码实现 1. **支付服务类** ```java @Service public class AlipayService { @Value("${alipay.app_id}") private String appId; public String createOrder(String orderNo, BigDecimal amount) { Factory.setOptions(getOptions()); try { Payment payment = Factory.Payment.Common() .asyncNotify(notifyUrl) .create("APP支付", orderNo, amount.toString(), "http://your-return-url"); return payment.getBody(); } catch (Exception e) { throw new RuntimeException("创建支付失败"); } } private Config getOptions() { Config config = new Config(); config.protocol = "https"; config.gatewayHost = "openapi-sandbox.dl.alipaydev.com"; config.signType = "RSA2"; config.appId = this.appId; // 配置私钥与公钥 return config; } } ``` 2. **支付回调处理** ```java @PostMapping("/notify") public String paymentNotify(HttpServletRequest request) { Map<String, String> params = parseRequestParams(request); try { boolean verifyResult = Factory.Payment.Common().verifyNotify(params); if (verifyResult) { // 处理订单逻辑 return "success"; } } catch (Exception e) { log.error("支付通知验证失败", e); } return "failure"; } ``` #### 四、测试流程 1. 使用沙箱版支付宝APP扫码测试 2. 在沙箱账户充值测试资金 3. 检查异步通知接收状态 4. 验证订单状态同步更新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值