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

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

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

核心流程

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

代碼實(shí)現(xiàn)示例(電腦網(wǎng)站支付)

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. 實(shí)體類和Mapper

// 訂單實(shí)體
@Data
public class Order {
    private Long id;
    private String orderNo;   // 商戶訂單號(hào)
    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. 支付服務(wù)類

@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ù)庫(kù)
        
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setReturnUrl(returnUrl);
        request.setNotifyUrl(notifyUrl);
        
        // 構(gòu)造業(yè)務(wù)參數(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"); // 電腦網(wǎng)站支付
        
        request.setBizContent(bizContent.toString());
        
        return alipayClient.pageExecute(request).getBody();
    }

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

        // 2. 驗(yàn)證交易狀態(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); // 返回支付頁(yè)面表單
    }

    // 支付寶異步通知(需公網(wǎng)可訪問(wèn))
    @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"; // 通知支付寶處理結(jié)果
    }

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

    // 解析請(qǐng)求參數(shù)
    private Map<String, String> parseRequestParams(HttpServletRequest request) {
        // 轉(zhuǎn)換參數(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

關(guān)鍵流程說(shuō)明

  • 生成商戶訂單

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

    • 使用 AlipayTradePagePayRequest 構(gòu)建請(qǐng)求
    • 關(guān)鍵參數(shù):訂單號(hào)、金額、支付標(biāo)題、回調(diào)地址
  • 接收異步通知

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

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

    • 訂單超時(shí)關(guān)閉:定時(shí)任務(wù)掃描未支付訂單
    • 支付結(jié)果查詢:通過(guò) trade_no 調(diào)用支付寶查詢接口
    • 退款功能:使用 AlipayTradeRefundRequest

提示:實(shí)際開(kāi)發(fā)中需要:

替換為正式支付寶賬戶

配置公網(wǎng)可訪問(wèn)的域名

添加完整的錯(cuò)誤處理

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

    Spring gateway + Oauth2實(shí)現(xiàn)單點(diǎn)登錄及詳細(xì)配置

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

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

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

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

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

    SpringBoot增強(qiáng)Controller方法@ControllerAdvice注解的使用詳解

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

    Java中獲取年份月份的幾種常見(jiàn)方法

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

    解決logback的日志文件路徑問(wèn)題

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

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

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

最新評(píng)論

湄潭县| 库伦旗| 卓资县| 得荣县| 凤山市| 新民市| 元朗区| 策勒县| 沙田区| 万源市| 上蔡县| 新巴尔虎右旗| 白城市| 界首市| 房产| 鞍山市| 江川县| 垫江县| 洮南市| 大新县| 开化县| 曲阳县| 财经| 吉安市| 泰顺县| 西吉县| 霍邱县| 中山市| 马公市| 兰西县| 梅州市| 南皮县| 绥化市| 驻马店市| 昌吉市| 黄冈市| 三河市| 安乡县| 南溪县| 栾城县| 阿尔山市|