支付宝支付整合SpringBoot(沙箱环境)

目录

1.如何查看沙箱账号?请往下看

2.沙箱环境整合SpringBoot开发


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

1.如何查看沙箱账号?请往下看

1.访问支付宝开放平台:https://open.alipay.com/

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

3.点击进入控制台

4.滑到最底下点击进入沙箱

支付宝支付整合SpringBoot(沙箱环境)_第1张图片

5.自此完成沙箱账号信息的查看,下面讲进入主题,如何整合SpringBoot进行支付开发

2.沙箱环境整合SpringBoot开发

 1.1.创建Spring Boot项目

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

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

 
        
        
            org.springframework.boot
            spring-boot-starter-web
            2.5.4
        
  

2.导入依赖

 
        
        
            mysql
            mysql-connector-java
            8.0.26
        
        
            org.projectlombok
            lombok
            1.18.24
        
        
            com.alipay.sdk
            alipay-sdk-java
            3.0.0
        
        
        
            com.alibaba
            fastjson
            1.2.78
        
        
        
            org.slf4j
            slf4j-api
            1.7.32
        

        
        
            org.json
            json
            20210307
        
    

3.配置应用程序

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

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

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

支付宝支付整合SpringBoot(沙箱环境)_第2张图片

所以应用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 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 params 支付结果通知参数
     * @return 处理结果
     */
    public String notify(Map params) {
        try {
            boolean verifyResult = AlipaySignature.rsaCheckV1(params, publicKey, "UTF-8", "RSA2");
            if (verifyResult) {
                // 验证通过,处理支付结果
                String tradeStatus = params.get("trade_status");
                if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)) {
                    // 支付成功,更新订单状态
                    String orderId = params.get("out_trade_no");
                    // TODO 更新订单状态
                    return "success";
                } else {
                    // 支付失败,不做处理
                    return "failure";
                }
            } else {
                // 验证失败,不做处理
                return "failure";
            }
        } catch (AlipayApiException e) {
            throw new RuntimeException("支付宝支付结果通知处理失败", e);
        }
    }
}

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

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

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

 5.5.创建支付控制器

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

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

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

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

    /**
     * 支付完成后跳转回商户网站的地址
     * @param params 支付结果参数
     * @return 跳转页面
     */
    @GetMapping("/return")
    public String returnUrl(@RequestParam Map params) {
        // TODO 处理支付完成后跳转回商户网站的地址
        return "redirect:/";
    }
}

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

 6.测试支付功能

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

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

添加一个支付按钮




    
    Title


订单号:
订单名称:
付款金额:
商品描述:

你可能感兴趣的:(springBoot整合,spring,java,后端)