springboot integrates Alipay (sandbox)

1. Log in to Alipay Sandbox

Login – Alipay

Click on the console

Scroll to the bottom and click on the sandbox

Click to view the public key mode and copy

Copy the public and private keys and write the configuration class

#ID
alipay.appId=9021. . .
# Public key
alipay.alipayPublicKey. . .
# Private key
alipay.privateKey. . .

# Callback address?# https://www.baidu.com/
alipay.notifyUrl=http://127.0.0.1:8081/paySuccess

alipay.returnUrl=http://127.0.0.1:8081/paySuccess

alipay.charset=UTF-8

alipay.signType=RSA2
# Response address
alipay.gatewayUrl=https://openapi-sandbox.dl.alipaydev.com/gateway.do

alipay.logPath="F:\alipay\log"

Required jar packages

 <!--
                Personal version pitfalls:
                If you do not add this dependency, when in the configuration class
                When using @ConfigurationProperties(prefix = "aliyun") annotation,
                My version of spring boot will prompt that there is a problem -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>joda-time</groupId>
                <artifactId>joda-time</artifactId>
                <version>2.10.1</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.3.0</version>
            </dependency>
            <dependency>
                <groupId>com.mysql</groupId>
                <artifactId>mysql-connector-j</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.31</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>aliyun-java-sdk-core</artifactId>
                <version>4.3.3</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.74</version>
            </dependency>
            <dependency>
                <groupId>com.alipay.sdk</groupId>
                <artifactId>alipay-sdk-java</artifactId>
                <version>4.22.110.ALL</version>
            </dependency>

Write configuration class

AliPay:

package com.cskt.springboot_aliyun.baen;

import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.cskt.springboot_aliyun.config.AliPayConfig;
import com.cskt.springboot_aliyun.domian.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author 26846
 */
@Component
public class AliPay {

    @Autowired
    private AliPayConfig aliPayConfig;

    public String pay(Order order) throws AlipayApiException {
        //payment gateway
        String serverUrl = aliPayConfig.getGatewayUrl();
        //AppId
        String appId = aliPayConfig.getAppId();
        // User key (private key), that is, RSA2 private key in PKCS8 format
        String privateKey = aliPayConfig.getPrivateKey();
        //Format to json format
        String format = "json";
        //coding
        String charset = aliPayConfig.getCharset();
        //Alipay public key, which corresponds to the Alipay public key under Appid
        String alipayPublicKey = aliPayConfig.getAlipayPublicKey();
        //Signature method
        String signType = aliPayConfig.getSignType();
        //Page jump synchronization notification page path
        String returnUrl = aliPayConfig.getReturnUrl();
        //Server asynchronous notification page path
        String notifyUrl = aliPayConfig.getNotifyUrl();

        //1. Get the initialized AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(
                serverUrl, appId, privateKey, format, charset, alipayPublicKey, signType);
        //2. Set request parameters
        AlipayTradePagePayRequest alipayTradePagePayRequest = new AlipayTradePagePayRequest();
        // Page jump synchronization notification page path
        alipayTradePagePayRequest.setReturnUrl(returnUrl);
        alipayTradePagePayRequest.setNotifyUrl(notifyUrl);
        //Encapsulation parameters (json format)
        alipayTradePagePayRequest.setBizContent(JSON.toJSONString(order));

        // 3. Request Alipay for payment and obtain the payment result
        String body = alipayClient.pageExecute(alipayTradePagePayRequest).getBody();
        //Replace the information
        return body;
    }
}

AliPayConfig:

package com.cskt.springboot_aliyun.config;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

/**
 * @author 26846
 */
@Configuration
@PropertySource(value = "classpath:application-alipay.properties")
@ConfigurationProperties(prefix = "alipay") //Prefix
@Data
public class AliPayConfig {
    private String appId;
    private String privateKey;
    private String alipayPublicKey;
    private String notifyUrl;
    private String returnUrl;
    private String charset;
    private String signType;
    private String gatewayUrl;
}

service layer:

interface:

/**
     * Alipay payment interface
     */
    String aliPay(Order order) throws AlipayApiException;

    /**
     * Query order information
     * @return
     */
    List<Order> orderAll();

    /**
     * Add order information
     * @param order
     * @return
     */
    int orderAdd(Order order);
    /**
     * Modify order status
     */
    int revise(String out_trade_no);

Implementation class:

package com.cskt.springboot_aliyun.service.impl;

import com.alipay.api.AlipayApiException;

import com.cskt.springboot_aliyun.baen.AliPay;
import com.cskt.springboot_aliyun.domian.Order;
import com.cskt.springboot_aliyun.mapper.OrderMapper;
import com.cskt.springboot_aliyun.service.AliPayService;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 26846
 * @date 2023/3/23 10:47
 */
@Service
public class AliPayServiceImpl implements AliPayService {

    @Autowired
    private AliPay aliPay;
    @Autowired
    private OrderMapper orderMapper;

    @Override
    public String aliPay(Order order) throws AlipayApiException {
        System.out.println("order----service--:" + order);
        return aliPay.pay(order);
    }

    /**
     * search information
     * @return
     */
    @Override
    public List<Order> orderAll() {
        return orderMapper.orderAll();
    }

    @Override
    public int orderAdd(Order order) {
        return orderMapper.orderAdd(order);
    }

    @Override
    public int revise(String out_trade_no) {
        return orderMapper.revise(out_trade_no);
    }
}

Control layer:

package com.cskt.springboot_aliyun.controller;

import com.alipay.api.AlipayApiException;

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.cskt.springboot_aliyun.domian.Order;
import com.cskt.springboot_aliyun.service.AliPayService;
import com.cskt.springboot_aliyun.service.impl.AliPayServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

@RestController
public class AliPayController {

    @Autowired
    private AliPayService aliPayService;
    @Autowired
    private AliPayServiceImpl aliPay;
    /**
     * Enter the payment homepage
     * @return
     */
    @GetMapping("/")
    public ModelAndView index(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("testAliPay");
        return modelAndView;
    }
    /**
     * Submit Order
     * @param outTradeNo
     * @param subject
     * @param totalAmount
     * @return
     * @throws AlipayApiException
     */
    @PostMapping("/order/alipay")
    public String aliPay(String outTradeNo,String subject,
                         String totalAmount) throws AlipayApiException {
        System.out.println("--------Enter and submit payment----------");
        Order order = new Order();
        order.setOut_trade_no(outTradeNo);
        order.setSubject(subject);
        order.setTotal_amount(totalAmount);
        order.setState("Payment successful");
        System.out.println("order-----:" + order);
        if (order.getOut_trade_no()!=null){
            int i = aliPay.orderAdd(order);
        }
        return aliPayService.aliPay(order);
    }
    /**
     * search information
     */
    @GetMapping("/paySuccess")
    public ModelAndView All(){
        //If the payment is successful, the order will be added to the database
        //If you cancel payment, you also need to add an order to the database, cancel order-status
        //Order query can find out the order status information
        ModelAndView modelAndView = new ModelAndView();
        List<Order> orders = aliPay.orderAll();
        modelAndView.addObject("ordersList",orders);
        modelAndView.setViewName("success");
        return modelAndView;
    }
    /**
     *Refund orders
     * @param outTradeNo
     * @param subject
     * @return
     * @throws AlipayApiException
     */
        @GetMapping("/refund")
    public ModelAndView refund( String outTradeNo, String subject) {
        System.out.println("--------Enter to submit refund----------");
        //The gateway and appid of Alipay sandbox environment
        String gateway = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
        String appId = "9021000129651143";
        //Apply private key and Alipay public key
        // Merchant private key, your RSA2 private key in PKCS8 format
        String merchant_private_key="MIIEvQIBADANBgkqhkiG9w0BAQEFAAASCBKcwggSjAgEAAoIBAQCWjBTeJqomgK19q8x17V2CpovMIz/kXf4ejack43RLvG4 + DCzKAtDrBLd62WbqXvj5A5pLBOveBQH/I8PxTDOZCJfh3R1f 2Qjz19vavhujf76nSowpaNWL9IAd29pAE2RuM3w4brCktkB7TMnfPv + kowcWIf5h2SFabC6l1tPh7l5XBvwz9A6qEJW + Rflc81WvqAvUBKJWZ1VEmH2oiy1eeLnm6ZV2Boop3YjZrNCs0qvfKcK G6kRXZCuDDCkosHfYJwaMc8a8Bn6HbB3iRuaHuBfMCcbfe6Zb9zx5DbE5PsLazNX2a + 0TfpUZGMemr3L52Q3UfW6hlTPtKCdeS0YlAgMBAAECggEAJuUiLxMGOtRb/m/4by9YTX0B + UfSJgoysWofmOQ7 E6YnRViX6ck4eL/LN64bbMoEwTExF9i5p67biTOQWDM70Xnq46vg/vZv3bATWTxsn51NgKM9 + yTepz4QK6a1iIB6Hg6nNV1DvgpoNnLsZQU9vydvmURHGLikaVwx4R7TtzccSzkPaAgnqGI/69yf ZQoU9au5NebfilGYhBSUQrr/b1Wj0mBX1UAg14Z + Cz9AOjG6of2HnvQ4sNSQskdKCyh2QD + MfdzSAffY3YCiFpo3XnMpoFp4qrVSCNFh99/ccucTsVg9mhTXGfSWnZ0ZiFUDJUVjFzm + goArS3IcUnl SsQKBgQDgIzq3ScvqoxCSH27Z/AZ9c/lGznsjQBn6yiiam6/ZdYDZlZLRL + b8cHzYDAjQRpK2iLms3gDc7fX8o/ orsuYkwP108uuJ28SQlQbY96R75okiKR + 5dKR1CVMkYzcsv7mGg5OeqEa50un + ffH/e9DnTzqN4L5E7cNR0jier + 4v/wKBgQCr8sOzwLyOdYYG6i/LG9Z/k8mjbqUsVhajoV4pdMS OPDqn5GrAUZ1QhsSyOnrij/MUTmRT4i + flEotExS06TQT8QjW4qEYjCqK3WMon/DD4kdzniKVSrJ4xkg/YGDx5Yo3UJJvkw1qLwv2L + 4BuFj1lohcFHPINZ + 4cTckdifJ2wKBgD6heYHIDEQnhrTeN bKR2xppMsnXXs9N1TSgEtKJGI1SaUvjoN/1W71EjY4tZrUUU2DQOdoVOvaBRBBxnbFiTy8MAocQbkLad0XTbtNn971rgPxbs3K2JlJR5bqwQrWtaWEuGSznZsP8LMihVuMGLSzFld4ZY/GM4txVOt8 U2CDvAoGAZs/HOGmb1MpskyHf5eAFR08El9YGqRXof3pzJPKOvEVDBTRMqCWknIuYfMD + zQ0pWRDuaEGsHAy8tWrdTLbLzsimcmYb0OOuZE2vhpDrkxRviLAbGY0KXbChblOgY8LN + /kPNeuFb + IlktRhyWGCv4V8j yIjgKifkdcQE5sae1UCgYEA2UL67oEe3cvDCKoQZeu28ieinRxPuqK + 4f3eVQuR81rnvoN7RHcmTLWnd3Zjl8H4SnWBrODWRDX7UjTobchMsYDG33Wxxk3iX02V0QuwJM9uFd2mrGBD42wK0sESQVz/r bp88FVAcX5Or2U + 0X + ex0CKhX36NBOSRrxJyB6LxZg=" ;

        // Alipay public key, view address: https://openhome.alipay.com/platform/keyManage.htm corresponding to the Alipay public key under APPID.
        String alipay_public_key ="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoNhWdNjR75qo3F/FnTyCEEDnmoUy7TX2Si0L0vMURfbdDAKtg7q8kO2GZnEANluqED2yf6zdXc0soiuSfMSN3GC + 8nVRmBpx VJvVTXs8dkxdqEByWSS8qFB + tE2eYtd7A8D0EWzYeZZHVc5PZaqGsUz9QeFqgW/XGpgLokAzzb0rVQKq8o5cQ0HxvRcVZoHOr6/WZlPSko31MXzzr2mhH6aci + I3ofdrDexwwOC6qM4zt7U sz7gTtgU0dzu5pwvNrF + yCpcjPX2d6nAz78OMi8K8xHQYdYL5d34ecbrfjt1bq3j4zFJIRr54xdOjFIjKBC/Ye2Gp3joRvoFW8qRnuwIDAQAB";
        //Create AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(gateway, appId, merchant_private_key, "json", "UTF-8", alipay_public_key, "RSA2");

        //Create a refund request
        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
        request.setBizContent("{" +
                ""out_trade_no":"" + outTradeNo + ""," + // Merchant order number
                ""refund_amount":"" + subject + ""," + // Refund amount
                ""refund_reason":"No reason"," + // Reason for refund
                ""out_request_no":"your_out_request_no"" + // Refund request number, guaranteed to be unique
                "}");

        try {
            //Send a refund request and get the response
            AlipayTradeRefundResponse response = alipayClient.execute(request);
            System.out.println(response.getOutTradeNo());
            // Determine whether the refund is successful
            if(response.isSuccess()){
                int revise = aliPay.revise(outTradeNo);
                if (revise>0){
                    System.out.println("Refund successful");
                }
            } else {
                System.out.println("Refund failed: " + response.getSubMsg());
            }
        } catch (AlipayApiException e) {
            System.out.println("Refund request exception: " + e.getErrMsg());
        }
        ModelAndView modelAndView = new ModelAndView();
        List<Order> orders = aliPay.orderAll();
        modelAndView.addObject("ordersList",orders);
        modelAndView.setViewName("success");
        return modelAndView;
    }
}

Entity class:

package com.cskt.springboot_aliyun.domian;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

/**
 * @author 26846
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true) //chain
public class Order {
    /**
     * Merchant order number
     */
    private String out_trade_no;
    /**
     * Order name
     */
    private String subject;
    /**
     * Payment amount
     */
    private String total_amount;
    /**
     * state
     */
    private String state;
    /**
     * Timeout parameter
     */
    private String timeout_express = "10m";
    /**
     * Product number
     */
    private String product_code = "FAST_INSTANT_TRADE_PAY";
}

Project structure:

The knowledge points of the article match the official knowledge files, and you can further learn related knowledge. Java Skill TreeHomepageOverview 137704 people are learning the system