最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot+MyBatis集成支付寶支付流程

 更新時間:2025年06月06日 09:36:41   作者:yuren_xia  
本文主要介紹了SpringBoot+MyBatis集成支付寶支付流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

核心流程

  • 商戶系統(tǒng)生成訂單
  • 調用支付寶創(chuàng)建預支付訂單
  • 用戶跳轉支付寶完成支付
  • 支付寶異步通知支付結果
  • 商戶處理支付結果更新訂單狀態(tài)
  • 支付寶同步跳轉回商戶頁面

代碼實現(xiàn)示例(電腦網站支付)

1. 添加依賴

<!-- pom.xml -->
<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- MyBatis & MySQL -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.2</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    
    <!-- 支付寶SDK -->
    <dependency>
        <groupId>com.alipay.sdk</groupId>
        <artifactId>alipay-sdk-java</artifactId>
        <version>4.35.0.ALL</version>
    </dependency>
    
    <!-- Lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

2. 支付寶配置類

@Configuration
public class AlipayConfig {

    @Value("${alipay.app_id}")
    private String appId;
    
    @Value("${alipay.merchant_private_key}")
    private String merchantPrivateKey;
    
    @Value("${alipay.alipay_public_key}")
    private String alipayPublicKey;
    
    @Value("${alipay.notify_url}")
    private String notifyUrl;
    
    @Value("${alipay.return_url}")
    private String returnUrl;
    
    @Value("${alipay.gateway_url}")
    private String gatewayUrl;
    
    @Value("${alipay.sign_type}")
    private String signType;
    
    @Value("${alipay.charset}")
    private String charset;

    @Bean
    public AlipayClient alipayClient() {
        return new DefaultAlipayClient(
            gatewayUrl,
            appId,
            merchantPrivateKey,
            "json",
            charset,
            alipayPublicKey,
            signType
        );
    }
}

3. 實體類和Mapper

// 訂單實體
@Data
public class Order {
    private Long id;
    private String orderNo;   // 商戶訂單號
    private BigDecimal amount;// 支付金額
    private Integer status;   // 0-待支付, 1-已支付
    private LocalDateTime createTime;
}

// MyBatis Mapper
@Mapper
public interface OrderMapper {
    @Insert("INSERT INTO orders(order_no, amount, status, create_time) " +
            "VALUES(#{orderNo}, #{amount}, 0, NOW())")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(Order order);
    
    @Update("UPDATE orders SET status = #{status} WHERE order_no = #{orderNo}")
    void updateStatus(@Param("orderNo") String orderNo, @Param("status") int status);
}

4. 支付服務類

@Service
public class PayService {

    @Autowired private AlipayClient alipayClient;
    @Autowired private OrderMapper orderMapper;
    @Value("${alipay.return_url}") private String returnUrl;
    @Value("${alipay.notify_url}") private String notifyUrl;

    // 創(chuàng)建支付訂單
    public String createPayOrder(Order order) throws AlipayApiException {
        orderMapper.insert(order); // 保存訂單到數(shù)據(jù)庫
        
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setReturnUrl(returnUrl);
        request.setNotifyUrl(notifyUrl);
        
        // 構造業(yè)務參數(shù)
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", order.getOrderNo());
        bizContent.put("total_amount", order.getAmount());
        bizContent.put("subject", "商品支付");
        bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY"); // 電腦網站支付
        
        request.setBizContent(bizContent.toString());
        
        return alipayClient.pageExecute(request).getBody();
    }

    // 處理異步通知
    public boolean handleNotify(Map<String, String> params) throws AlipayApiException {
        // 1. 驗證簽名
        boolean signVerified = AlipaySignature.rsaCheckV1(
                params,
                alipayPublicKey,  // 注入支付寶公鑰
                charset,
                signType
        );
        
        if (!signVerified) return false;

        // 2. 驗證交易狀態(tài)
        String tradeStatus = params.get("trade_status");
        if (!"TRADE_SUCCESS".equals(tradeStatus)) return false;

        // 3. 更新訂單狀態(tài)
        String orderNo = params.get("out_trade_no");
        orderMapper.updateStatus(orderNo, 1); // 更新為已支付
        
        return true;
    }
}

5. 控制器

@RestController
@RequestMapping("/pay")
public class PayController {

    @Autowired private PayService payService;

    // 創(chuàng)建支付訂單
    @PostMapping("/create")
    public String createOrder(@RequestParam BigDecimal amount) 
        throws AlipayApiException {
        
        Order order = new Order();
        order.setOrderNo(UUID.randomUUID().toString().replace("-", ""));
        order.setAmount(amount);
        
        return payService.createPayOrder(order); // 返回支付頁面表單
    }

    // 支付寶異步通知(需公網可訪問)
    @PostMapping("/notify")
    public String alipayNotify(HttpServletRequest request) 
        throws UnsupportedEncodingException, AlipayApiException {
        
        Map<String, String> params = parseRequestParams(request);
        boolean success = payService.handleNotify(params);
        return success ? "success" : "failure"; // 通知支付寶處理結果
    }

    // 支付寶同步跳轉
    @GetMapping("/return")
    public String alipayReturn(HttpServletRequest request) {
        // 簡單展示支付結果(實際需要驗簽和狀態(tài)檢查)
        return "支付完成!訂單號:" + request.getParameter("out_trade_no");
    }

    // 解析請求參數(shù)
    private Map<String, String> parseRequestParams(HttpServletRequest request) {
        // 轉換參數(shù)Map(參考支付寶示例代碼)
    }
}

6. 配置文件

# application.properties
# 支付寶配置
alipay.app_id=2021000123456789
alipay.merchant_private_key=MIIEvQIBADANB...
alipay.alipay_public_key=MIIBIjANBgkq...
alipay.notify_url=http://your-domain.com/pay/notify
alipay.return_url=http://your-domain.com/pay/return
alipay.gateway_url=https://openapi.alipay.com/gateway.do
alipay.sign_type=RSA2
alipay.charset=UTF-8

# MySQL配置
spring.datasource.url=jdbc:mysql://localhost:3306/alipay_demo
spring.datasource.username=root
spring.datasource.password=123456

關鍵流程說明

  • 生成商戶訂單

    • 生成唯一訂單號(推薦雪花算法)
    • 保存訂單到數(shù)據(jù)庫(狀態(tài)=待支付)
  • 調用支付寶接口

    • 使用 AlipayTradePagePayRequest 構建請求
    • 關鍵參數(shù):訂單號、金額、支付標題、回調地址
  • 接收異步通知

    • 必須驗證簽名(防止偽造請求)
    • 檢查 trade_status 是否為 TRADE_SUCCESS
    • 更新訂單狀態(tài)(注意處理冪等性)
  • 安全注意事項

    • 支付金額需與訂單金額比對(防止金額篡改)
    • 敏感操作記錄日志
    • 異步通知處理需要保證冪等性
  • 擴展功能

    • 訂單超時關閉:定時任務掃描未支付訂單
    • 支付結果查詢:通過 trade_no 調用支付寶查詢接口
    • 退款功能:使用 AlipayTradeRefundRequest

提示:實際開發(fā)中需要:

替換為正式支付寶賬戶

配置公網可訪問的域名

添加完整的錯誤處理

實現(xiàn)參數(shù)解析工具方法

添加數(shù)據(jù)庫事務管理

到此這篇關于SpringBoot+MyBatis集成支付寶支付流程的文章就介紹到這了,更多相關SpringBoot MyBatis 支付寶支付內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • 細談java同步之JMM(Java Memory Model)

    細談java同步之JMM(Java Memory Model)

    Java內存模型是在硬件內存模型上的更高層的抽象,它屏蔽了各種硬件和操作系統(tǒng)訪問的差異性,保證了Java程序在各種平臺下對內存的訪問都能達到一致的效果。下面我們來一起學習下JMM
    2019-05-05
  • Java五子棋簡單實現(xiàn)代碼舉例

    Java五子棋簡單實現(xiàn)代碼舉例

    Java五子棋游戲是一種經典的兩人對戰(zhàn)棋類游戲,它基于簡單的規(guī)則,即任何一方的棋子在棋盤上形成連續(xù)的五個,無論是橫、豎還是斜線,都將獲勝,這篇文章主要介紹了Java五子棋實現(xiàn)的相關資料,需要的朋友可以參考下
    2024-10-10
  • SpringBoot監(jiān)控API請求耗時的6中解決解決方案

    SpringBoot監(jiān)控API請求耗時的6中解決解決方案

    本文介紹SpringBoot中記錄API請求耗時的6種方案,包括手動埋點、AOP切面、攔截器、Filter、事件監(jiān)聽、Micrometer+Prometheus,具有一定的參考價值,感興趣的可以了解一下
    2025-07-07
  • Spring gateway + Oauth2實現(xiàn)單點登錄及詳細配置

    Spring gateway + Oauth2實現(xiàn)單點登錄及詳細配置

    gateway是基于 WebFlux的響應式編程框架,所以在使用securityConfig時采用的注解是@EnableWebFluxSecurity,接下來通過本文給大家介紹Spring gateway + Oauth2實現(xiàn)單點登錄及詳細配置,感興趣的朋友一起看看吧
    2021-09-09
  • Java獲取上月份最后一天日期8位的示例代碼

    Java獲取上月份最后一天日期8位的示例代碼

    這篇文章主要介紹了Java獲取上月份最后一天日期8位,需要的朋友可以參考下
    2022-09-09
  • static關鍵字有何魔法?竟讓Spring Boot搞出那么多靜態(tài)內部類(推薦)

    static關鍵字有何魔法?竟讓Spring Boot搞出那么多靜態(tài)內部類(推薦)

    這篇文章主要介紹了static關鍵字有何魔法?竟讓Spring Boot搞出那么多靜態(tài)內部類,本文通過實例代碼圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot增強Controller方法@ControllerAdvice注解的使用詳解

    SpringBoot增強Controller方法@ControllerAdvice注解的使用詳解

    這篇文章主要介紹了SpringBoot增強Controller方法@ControllerAdvice注解的使用詳解,@ControllerAdvice,是Spring3.2提供的新注解,它是一個Controller增強器,可對controller進行增強處理,需要的朋友可以參考下
    2023-10-10
  • Java中獲取年份月份的幾種常見方法

    Java中獲取年份月份的幾種常見方法

    這篇文章主要給大家介紹了關于Java中獲取年份月份的幾種常見方法,在開發(fā)應用程序時,經常需要獲取當前的年、月、日,并以特定格式進行展示或處理,需要的朋友可以參考下
    2023-09-09
  • 解決logback的日志文件路徑問題

    解決logback的日志文件路徑問題

    這篇文章主要介紹了解決logback的日志文件路徑問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • springmvc實現(xiàn)跨服務器文件上傳功能

    springmvc實現(xiàn)跨服務器文件上傳功能

    這篇文章主要為大家詳細介紹了springmvc實現(xiàn)跨服務器文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08

最新評論

嘉祥县| 雅安市| 平舆县| 海丰县| 治多县| 呼和浩特市| 江安县| 临高县| 宜宾市| 平远县| 德保县| 岑溪市| 桂东县| 双峰县| 毕节市| 桃江县| 内乡县| 宝山区| 卢湾区| 兴和县| 囊谦县| 连州市| 建阳市| 黄骅市| 高台县| 新竹县| 乐业县| 泰州市| 碌曲县| 汤阴县| 饶阳县| 遵义市| 资溪县| 浦江县| 遂平县| 成安县| 洪泽县| 班玛县| 大埔区| 宜都市| 商洛市|