国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn)

這篇具有很好參考價(jià)值的文章主要介紹了SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

引出


1.springboot整合支付寶沙箱支付;
2.準(zhǔn)備工作:沙箱api,內(nèi)網(wǎng)穿透;
3.極簡實(shí)現(xiàn)理解支付,異步回調(diào)等;
4.按照spring依賴注入的思想改造基礎(chǔ)demo;

git代碼倉庫

https://gitee.com/pet365/springboot-alipay

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

準(zhǔn)備工作

支付寶沙箱api

支付寶開放平臺 (alipay.com)

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

支付參數(shù)

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

內(nèi)網(wǎng)穿透 natapp.cn

natapp.cn官網(wǎng)

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

啟動(dòng)和配置

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

springboot整合—極簡實(shí)現(xiàn)版

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

1.導(dǎo)包+配置文件

<!--        支付寶相關(guān)-->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.34.0.ALL</version>
        </dependency>
server:
  port: 9090


# 日志需要配置一下 @Slf4j
logging:
  level:
    com.tianju.alipay: debug

2.controller層代碼

訂單ID,需要唯一;價(jià)格;物品名稱(支付主題)

http://localhost:9090/api/ali/pay?orderId=202307302321&price=12.56&subject=iPhone

用戶名:flrnht7304@sandbox.com

密碼:111111

AliPayController.java文件

package com.tianju.alipay.controller;


import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 支付寶的支付接口
 * 用戶名:flrnht7304@sandbox.com
 * 密碼:111111
 */

// http://localhost:9090/api/ali/pay?orderId=202307302321&price=12.56&subject=iPhone
@RestController
@RequestMapping("/api/ali")
@Slf4j // tips:如果用debug記得在application.yml文件中配置一下日志級別
public class AliPayController {


    String alipayPublicKey = "";

    @GetMapping("/pay")
    public void payOrder(String orderId, String price, String subject, HttpServletResponse httpResponse) throws AlipayApiException, IOException {
        // 1.準(zhǔn)備需要的參數(shù),私匙,支付公匙,appid,沙箱支付平臺的url
        String privateKey = "";
        String alipayPublicKey = "";
        String appId = "9021000123613164";
        String serverUrl = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";

        // 2.把需要配置的參數(shù)set進(jìn)AlipayConfig類中
        com.alipay.api.AlipayConfig alipayConfig = new com.alipay.api.AlipayConfig();
        alipayConfig.setServerUrl(serverUrl);
        alipayConfig.setAppId(appId);
        alipayConfig.setPrivateKey(privateKey);
        alipayConfig.setFormat("json");
        alipayConfig.setAlipayPublicKey(alipayPublicKey);
        alipayConfig.setCharset("UTF8");
        alipayConfig.setSignType("RSA2");

        // 3.創(chuàng)建支付寶的默認(rèn)的客戶端
        AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);

        // 4.準(zhǔn)備支付的參數(shù),包括需要支付的訂單的id,價(jià)格,物品名稱,
        AlipayTradePagePayModel model = new AlipayTradePagePayModel();
//        model.setOutTradeNo("2023073022083620");
        model.setOutTradeNo(orderId); // 需要支付的訂單id,自定義的訂單id,不能重復(fù),唯一,已經(jīng)支付的無法繼續(xù)支付
        model.setTotalAmount(price); // 需要支付的錢 model.setTotalAmount("88.88");
        model.setSubject(subject); // 要支付的物品,比如 model.setSubject("Iphone6 16G");
        model.setProductCode("FAST_INSTANT_TRADE_PAY");

        // 5.創(chuàng)建支付的請求,把上面的準(zhǔn)備支付的參數(shù)進(jìn)行set
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setBizModel(model);

        /**
         * 設(shè)置支付寶異步回調(diào),這個(gè)需要用內(nèi)網(wǎng)穿透
         */
        request.setNotifyUrl("http://uw7ayu.natappfree.cc/api/ali/notify");

        /**
         * 設(shè)置支付寶支付成功返回的頁面
         * 這里讓支付成功直接回到static下的一個(gè)靜態(tài)頁面中
         */
        request.setReturnUrl("http://localhost:9090/aliPayReturn.html");

        // 6.調(diào)用ali客戶端alipayClient,用客戶端執(zhí)行請求,獲取響應(yīng),獲取.getBody(),拿到form表單
        // 執(zhí)行請求,拿到響應(yīng)的結(jié)果,返回給瀏覽器
        String form = "";
        try {
            form = alipayClient.pageExecute(request).getBody(); // 調(diào)用SDK生成表單
            log.debug(">>>>>>getAliPayFrom");
            System.out.println("getAliPayFrom");
            System.out.println(form);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }

        // 表單數(shù)據(jù)作為響應(yīng)返回給前端,顯示前端頁面
        /**
         * <form name="punchout_form" method="post" action="https://openapi-sandbox.dl.alipaydev.com/gateway.do?charset=UTF8&method=alipay.trade.page.pay&sign=ZSYIysQXMlJK6q%2B%2BQVJVhKi3qtHBaXTMmh4%2Fi7Wcj1OuSr5Qs6X%2Fhq0jgDbR%2BFw6da3fO5Hov8iV8%2BPo07CVnIQDSL1X2WDZzSN3Srqid%2BLKP%2BnoME2Jv9AfhaPwYkbElg0x40pLspkCv7%2FeRs93ROkrvLUL0aTA%2B7wXrIe5FKkvptqfqjReMayVR1lKmiGw8SWToNJ0OQoDp4g6191vJIy9ld%2BQfRU6PLq9dUH3XIifNvCwOceMCqpOXNlJIAb8MC2FkXK%2FCwEij5mj%2BpqNEevMf0DRczuUklJe20FeXrx6bSsjEIly8Swt1j4UYZZJY817TRQp%2FG3XEOjnLfAH5g%3D%3D&version=1.0&app_id=9021000123613164&sign_type=RSA2&timestamp=2023-07-30+23%3A11%3A17&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json">
         * <input type="hidden" name="biz_content" value="{&quot;out_trade_no&quot;:&quot;202307302206&quot;,&quot;product_code&quot;:&quot;FAST_INSTANT_TRADE_PAY&quot;,&quot;subject&quot;:&quot;iPhone&quot;,&quot;total_amount&quot;:&quot;12.56&quot;}">
         * <input type="submit" value="立即支付" style="display:none" >
         * </form>
         * <script>document.forms[0].submit();</script>
         */
        httpResponse.setContentType("text/html;charset=UTF-8"); // 設(shè)置頭部
        httpResponse.getWriter().write(form);// 直接將完整的表單html輸出到頁面
        httpResponse.getWriter().flush();
        httpResponse.getWriter().close();
    }

    /**
     * 支付寶異步回調(diào)
     * request.setNotifyUrl("");
     * http://localhost:9090/api/ali/notify
     * 上面這個(gè)網(wǎng)址用內(nèi)網(wǎng)穿透代理一下
     * http://jqdxgm.natappfree.cc/api/ali/notify
     * 此時(shí)支付寶就能回調(diào)到這個(gè)頁面
     */
    @PostMapping("/notify")
    public void aliPayNotify(HttpServletRequest request) throws AlipayApiException {
        log.debug(">>>>>>>支付寶異步回調(diào)");
        Map<String, String[]> parameterMap = request.getParameterMap();
        // [gmt_create, charset, gmt_payment, notify_time, subject, sign, buyer_id, invoice_amount, version, notify_id,
        // fund_bill_list, notify_type, out_trade_no, total_amount, trade_status, trade_no, auth_app_id, receipt_amount,
        // point_amount, buyer_pay_amount, app_id, sign_type, seller_id]
        Set<String> keySet = parameterMap.keySet(); // 獲取http請求里面的所有鍵

        /**
         * paramsMap如下:
         * {gmt_create=2023-07-31 15:54:11, charset=UTF8,
         * gmt_payment=2023-07-31 15:54:26,
         * notify_time=2023-07-31 15:54:27,
         * sign=fsCABNzc5hax4mwwMULluDiEAT70Kqj77uTMcCgSi82AU6tP5LGbXucEvP7CbvjXrYo5g3hrz5xRQAwddE7qU9Qyrg0v3EnearJBcW4It6N+VNBQ7yfY/W79eKRSKspLBKHRa21RILjyRrmQYG4Cw8R7twP7y0lDCOE8j3rV6ZyGfhiQ7EXp49d6HpgcIT1NjgJjQYSyJFdgyqkzFljKRfbhwPFAtubsmd8IcJCU7XI3YosSKnDhQaCA6ec4dmQiWtvcTbOLNR/r2Sou7rCnI7s1lc8pKeEsuacWTZW2FVR7hdHoLZ/expaRQIt+dNzA86lwQxu3SRCQ9wNTPICv1A==,
         * buyer_id=2088722005286475, invoice_amount=12.56, version=1.0, notify_id=2023073101222155427086470500776505,
         * fund_bill_list=[{"amount":"12.56","fundChannel":"ALIPAYACCOUNT"}],
         * notify_type=trade_status_sync,
         * subject=iPhone, // 物品名稱
         * out_trade_no=202307311553, // 進(jìn)行支付的訂單id,唯一,商家自定義,即支付時(shí)傳入的 String orderId
         * total_amount=12.56, // 總價(jià)格
         * trade_status=TRADE_SUCCESS, // 支付狀態(tài)
         * trade_no=2023073122001486470500697216, auth_app_id=9021000123613164,
         * receipt_amount=12.56, point_amount=0.00,
         * buyer_pay_amount=12.56, app_id=9021000123613164, sign_type=RSA2, seller_id=2088721005318559}
         */
        Map<String,String> paramsMap = new HashMap<>(); // 專門用來放置請求里面的參數(shù)
        for(String key : keySet){
            paramsMap.put(key, request.getParameter(key));
        }
        System.out.println("*************");
        System.out.println(paramsMap);

        // 驗(yàn)證簽名
        String sign = paramsMap.get("sign");
        String contentV1 = AlipaySignature.getSignCheckContentV1(paramsMap);
        boolean rsa256CheckSignature = AlipaySignature.rsa256CheckContent(contentV1, sign, alipayPublicKey, "UTF-8");
        if (rsa256CheckSignature && "TRADE_SUCCESS".equals(paramsMap.get("trade_status"))){
            // 簽名驗(yàn)證成功 并且 支付寶回調(diào)的狀態(tài)是成功狀態(tài) TRADE_SUCCESS
            log.info("在{},買家{}進(jìn)行訂單{}的付款,交易名稱{},付款金額{}",
                    paramsMap.get("gmt_payment"),paramsMap.get("buyer_id"),paramsMap.get("out_trade_no"),paramsMap.get("subject"),paramsMap.get("total_amount"));

            // 支付成功,修改數(shù)據(jù)庫中該訂單的狀態(tài)
            // 比如:流程,根據(jù)訂單ID查詢出一條數(shù)據(jù),修改該條訂單的數(shù)據(jù),或者只有支付成功,才給數(shù)據(jù)庫里面新增一條數(shù)據(jù)
        }
    }
}

3.進(jìn)行支付流程

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

支付密碼輸入

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

支付成功

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

4.支付成功回調(diào)

設(shè)置異步回調(diào)

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

啟動(dòng)內(nèi)網(wǎng)穿透

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

設(shè)置地址

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

異步回調(diào)流程解析

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

支付寶支付成功跳轉(zhuǎn)

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

跳轉(zhuǎn)成功

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

依賴注入的改進(jìn)

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

1.整體結(jié)構(gòu)

SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn),SpringBoot,spring boot,后端,java

2.pom.xml文件依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tianju.alipay</groupId>
    <artifactId>springboot-alipay</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </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>

        <!--json工具-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.12</version>
        </dependency>


        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

        <!--        支付寶相關(guān)-->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.34.0.ALL</version>
        </dependency>


    </dependencies>
</project>

3.配置文件

applicaiton.yml

server:
  port: 9090


# 日志需要配置一下 @Slf4j
logging:
  level:
    com.tianju.alipay: debug

alipay.properties

ali.privateKey = 
ali.alipayPublicKey = 
ali.appId = 9021000123613164
ali.serverUrl = https://openapi-sandbox.dl.alipaydev.com/gateway.do

ali.returnUrl = http://localhost:9090/aliPayReturn.html
ali.notifyUrl = http://uw7ayu.natappfree.cc/api/ali/notify

4.配置類,依賴注入

package com.tianju.alipay.config;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:config/alipay.properties")
@Getter
public class AlipayConfig {
    @Value("${ali.serverUrl}")
    private String serverUrl;
    @Value("${ali.appId}")

    private String appId;
    @Value("${ali.alipayPublicKey}")
    private String alipayPublicKey;

    @Value("${ali.privateKey}")
    private String privateKey;

    @Bean
    public AlipayClient alipayClient() throws AlipayApiException {
        // 2.把需要配置的參數(shù)set進(jìn)AlipayConfig類中
        com.alipay.api.AlipayConfig alipayConfig = new com.alipay.api.AlipayConfig();
        alipayConfig.setServerUrl(serverUrl);
        alipayConfig.setAppId(appId);
        alipayConfig.setPrivateKey(privateKey);
        alipayConfig.setFormat("json");
        alipayConfig.setAlipayPublicKey(alipayPublicKey);
        alipayConfig.setCharset("UTF8");
        alipayConfig.setSignType("RSA2");
        return new DefaultAlipayClient(alipayConfig);
    }
}

5.支付商品id,價(jià)格,名稱

package com.tianju.alipay.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Alipay {
    private String orderId; // 商家自定義的訂單編號,唯一
    private String price; // 商品價(jià)格
    private String subject; // 支付主題
}

6.controller層進(jìn)行支付和回調(diào)

package com.tianju.alipay.controller;


import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.tianju.alipay.entity.Alipay;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 支付寶的支付接口
 * 用戶名:flrnht7304@sandbox.com
 * 密碼:111111
 */

// http://localhost:9090/api/ali/pay?orderId=202307302321&price=12.56&subject=iPhone
@RestController
@RequestMapping("/api/ali")
@Slf4j
public class AliPayController {

    @Autowired
    private AlipayClient alipayClient;

    @Value("${ali.alipayPublicKey}")
    private String alipayPublicKey;
    @Value("${ali.returnUrl}")
    private String returnUrl; // 支付成功返回的頁面
    @Value("${ali.notifyUrl}")
    private String notifyUrl; // 支付寶支付成功異步回調(diào)的頁面,需要內(nèi)網(wǎng)穿透

    @GetMapping("/pay")
    public void payOrder(Alipay alipay, HttpServletResponse httpResponse) throws IOException {

        // 4.準(zhǔn)備支付的參數(shù),包括需要支付的訂單的id,價(jià)格,物品名稱,
        AlipayTradePagePayModel model = new AlipayTradePagePayModel();
        model.setOutTradeNo(alipay.getOrderId()); // 需要支付的訂單id,自定義的訂單id,不能重復(fù),唯一,已經(jīng)支付的無法繼續(xù)支付
        model.setTotalAmount(alipay.getPrice()); // 需要支付的錢 model.setTotalAmount("88.88");
        model.setSubject(alipay.getSubject()); // 要支付的物品,比如 model.setSubject("Iphone6 16G");
        model.setProductCode("FAST_INSTANT_TRADE_PAY");

        // 5.創(chuàng)建支付的請求,把上面的準(zhǔn)備支付的參數(shù)進(jìn)行set
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setBizModel(model);

        /**
         * 設(shè)置支付寶異步回調(diào),這個(gè)需要用內(nèi)網(wǎng)穿透
         */
        request.setNotifyUrl(notifyUrl);

        /**
         * 設(shè)置支付寶支付成功返回的頁面
         * 這里讓支付成功直接回到static下的一個(gè)靜態(tài)頁面中
         */
        request.setReturnUrl(returnUrl);

        // 6.調(diào)用ali客戶端alipayClient,用客戶端執(zhí)行請求,獲取響應(yīng),獲取.getBody(),拿到form表單
        // 執(zhí)行請求,拿到響應(yīng)的結(jié)果,返回給瀏覽器
        String form = "";
        try {
            form = alipayClient.pageExecute(request).getBody(); // 調(diào)用SDK生成表單
            log.debug(">>>>>>getAliPayFrom");
            System.out.println("getAliPayFrom");
            System.out.println(form);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }

        // 表單數(shù)據(jù)作為響應(yīng)返回給前端,顯示前端頁面
        httpResponse.setContentType("text/html;charset=UTF-8"); // 設(shè)置頭部
        httpResponse.getWriter().write(form);// 直接將完整的表單html輸出到頁面
        httpResponse.getWriter().flush();
        httpResponse.getWriter().close();
    }

    /**
     * 支付寶異步回調(diào)
     * request.setNotifyUrl("");
     * http://localhost:9090/api/ali/notify
     * 上面這個(gè)網(wǎng)址用內(nèi)網(wǎng)穿透代理一下
     * http://jqdxgm.natappfree.cc/api/ali/notify
     * 此時(shí)支付寶就能回調(diào)到這個(gè)頁面
     */
    @PostMapping("/notify")
    public void aliPayNotify(HttpServletRequest request) throws AlipayApiException {
        log.debug(">>>>>>>支付寶異步回調(diào)");
        Map<String, String[]> parameterMap = request.getParameterMap();
        Set<String> keySet = parameterMap.keySet(); // 獲取http請求里面的所有鍵

        /**
         * paramsMap如下:
         * {gmt_create=2023-07-31 15:54:11, charset=UTF8,
         * gmt_payment=2023-07-31 15:54:26,
         * notify_time=2023-07-31 15:54:27,
         * sign=fsCABNzc5hax4mwwMULluDiEAT70Kqj77uTMcCgSi82AU6tP5LGbXucEvP7CbvjXrYo5g3hrz5xRQAwddE7qU9Qyrg0v3EnearJBcW4It6N+VNBQ7yfY/W79eKRSKspLBKHRa21RILjyRrmQYG4Cw8R7twP7y0lDCOE8j3rV6ZyGfhiQ7EXp49d6HpgcIT1NjgJjQYSyJFdgyqkzFljKRfbhwPFAtubsmd8IcJCU7XI3YosSKnDhQaCA6ec4dmQiWtvcTbOLNR/r2Sou7rCnI7s1lc8pKeEsuacWTZW2FVR7hdHoLZ/expaRQIt+dNzA86lwQxu3SRCQ9wNTPICv1A==,
         * buyer_id=2088722005286475, invoice_amount=12.56, version=1.0, notify_id=2023073101222155427086470500776505,
         * fund_bill_list=[{"amount":"12.56","fundChannel":"ALIPAYACCOUNT"}],
         * notify_type=trade_status_sync,
         * subject=iPhone, // 物品名稱
         * out_trade_no=202307311553, // 進(jìn)行支付的訂單id,唯一,商家自定義,即支付時(shí)傳入的 String orderId
         * total_amount=12.56, // 總價(jià)格
         * trade_status=TRADE_SUCCESS, // 支付狀態(tài)
         * trade_no=2023073122001486470500697216, auth_app_id=9021000123613164,
         * receipt_amount=12.56, point_amount=0.00,
         * buyer_pay_amount=12.56, app_id=9021000123613164, sign_type=RSA2, seller_id=2088721005318559}
         */
        Map<String,String> paramsMap = new HashMap<>(); // 專門用來放置請求里面的參數(shù)
        for(String key : keySet){
            paramsMap.put(key, request.getParameter(key));
        }
        System.out.println("*************");
        System.out.println(paramsMap);

        // 驗(yàn)證簽名
        String sign = paramsMap.get("sign");
        String contentV1 = AlipaySignature.getSignCheckContentV1(paramsMap);
        boolean rsa256CheckSignature = AlipaySignature.rsa256CheckContent(contentV1, sign, alipayPublicKey, "UTF-8");
        if (rsa256CheckSignature && "TRADE_SUCCESS".equals(paramsMap.get("trade_status"))){
            // 簽名驗(yàn)證成功 并且 支付寶回調(diào)的狀態(tài)是成功狀態(tài) TRADE_SUCCESS
            log.info("在{},買家{}進(jìn)行訂單{}的付款,交易名稱{},付款金額{}",
                    paramsMap.get("gmt_payment"),paramsMap.get("buyer_id"),paramsMap.get("out_trade_no"),paramsMap.get("subject"),paramsMap.get("total_amount"));

            // 支付成功,修改數(shù)據(jù)庫中該訂單的狀態(tài)
            // 比如:流程,根據(jù)訂單ID查詢出一條數(shù)據(jù),修改該條訂單的數(shù)據(jù),或者只有支付成功,才給數(shù)據(jù)庫里面新增一條數(shù)據(jù)
        }
    }
}

7.主啟動(dòng)類

package com.tianju.alipay;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AliPayApp {
    public static void main(String[] args) {
        SpringApplication.run(AliPayApp.class, args);

    }
}

總結(jié)

1.springboot整合支付寶沙箱支付;
2.準(zhǔn)備工作:沙箱api,內(nèi)網(wǎng)穿透;
3.極簡實(shí)現(xiàn)理解支付,異步回調(diào)等;
4.按照spring依賴注入的思想改造基礎(chǔ)demo;文章來源地址http://www.zghlxwxcb.cn/news/detail-676254.html

到了這里,關(guān)于SpringBoot項(xiàng)目(支付寶整合)——springboot整合支付寶沙箱支付 & 從極簡實(shí)現(xiàn)到IOC改進(jìn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Springboot----項(xiàng)目整合微信支付(獲取支付二維碼)

    Springboot----項(xiàng)目整合微信支付(獲取支付二維碼)

    個(gè)人簡介 : ??個(gè)人主頁:趙四司機(jī) ??學(xué)習(xí)方向:JAVA后端開發(fā) ??種一棵樹最好的時(shí)間是十年前,其次是現(xiàn)在! ??喜歡的話麻煩點(diǎn)點(diǎn)關(guān)注喔,你們的支持是我的最大動(dòng)力。 前言 目前更新的是Springboot項(xiàng)目整合微信支付系列的文章,可以在我的主頁中找到該系列其他文章,這

    2024年02月05日
    瀏覽(18)
  • Springboot支付寶沙箱支付---完整詳細(xì)步驟

    Springboot支付寶沙箱支付---完整詳細(xì)步驟

    不經(jīng)常看消息和評論,代碼和數(shù)據(jù)庫已上傳至gitee 項(xiàng)目源碼 沙箱環(huán)境-支付寶文檔中心 1.1、進(jìn)入個(gè)人沙箱環(huán)境 點(diǎn)擊進(jìn)入沙箱環(huán)境并用支付寶登陸 沙箱管理界面如圖所示 appid,支付寶網(wǎng)關(guān),自定義密鑰等 這里是沙箱支付寶(虛擬)的賬號和密碼,可以用來支付 1.2、接下來進(jìn)行

    2023年04月25日
    瀏覽(26)
  • SpringBoot集成沙箱支付

    SpringBoot集成沙箱支付

    支付寶沙箱支付( Alipay Sandbox Payment )是支付寶提供的一個(gè)模擬支付環(huán)境,用于開發(fā)和測試支付寶支付功能的開發(fā)者工具。在真實(shí)的支付寶環(huán)境中進(jìn)行支付開發(fā)和測試可能涉及真實(shí)資金和真實(shí)用戶賬戶,而沙箱環(huán)境則提供了一個(gè)安全、隔離的環(huán)境,使開發(fā)者能夠模擬支付過程

    2024年02月03日
    瀏覽(17)
  • Java集成支付寶沙箱支付,詳細(xì)教程(SpringBoot完整版)

    Java集成支付寶沙箱支付,詳細(xì)教程(SpringBoot完整版)

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 easy支付官方文檔:https://opendocs.alipay.com/open/009ys9 通用版文檔:https://opendocs.alipay.com/open/02np94 支付寶沙箱的配置: 注冊支付寶開發(fā)者賬戶,進(jìn)入開發(fā)者控制臺 沙箱快捷入口: https://open.alipay.com/develop/

    2024年02月20日
    瀏覽(19)
  • SpringBoot 3.x整合Fluent Mybatis極簡流程

    SpringBoot 3.x整合Fluent Mybatis極簡流程

    此為基礎(chǔ)配置,不包括其他高級配置,需要其他高級配置請查閱官方文檔:[fluent mybatis特性總覽 - Wiki - Gitee.com](https://gitee.com/fluent-mybatis/fluent-mybatis/wikis/fluent mybatis特性總覽) 版本信息 Spring Boot 版本:3.1.2 Fluent Mybatis 版本:1.9.9 mybatis-spring-boot-starter 版本:3.0.0 JDK 版本:JDK17

    2024年02月13日
    瀏覽(17)
  • Spring Boot 整合支付寶實(shí)現(xiàn)在線支付方案(沙箱環(huán)境)

    Spring Boot 整合支付寶實(shí)現(xiàn)在線支付方案(沙箱環(huán)境)

    TIP:對于許多個(gè)人開發(fā)者而言,實(shí)現(xiàn)支付寶支付功能在以往往往意味著需要跨越復(fù)雜的商業(yè)流程。這涉及到擁有自己的網(wǎng)站及其備案,以及提交營業(yè)執(zhí)照等一系列文檔。但現(xiàn)在,支付寶開放平臺帶來了突破性的便利——通過沙箱環(huán)境,個(gè)人僅需擁有支付寶賬號,就能夠測試并

    2024年01月16日
    瀏覽(94)
  • springboot整合pi支付開發(fā)

    springboot整合pi支付開發(fā)

    pi支付流程圖: 使用Pi SDK功能發(fā)起支付 由 Pi SDK 自動(dòng)調(diào)用的回調(diào)函數(shù)(讓您的應(yīng)用服務(wù)器知道它需要發(fā)出批準(zhǔn) API 請求) 從您的應(yīng)用程序服務(wù)器到 Pi 服務(wù)器的 API 請求以批準(zhǔn)付款(讓 Pi 服務(wù)器知道您知道此付款) Pi瀏覽器向用戶顯示付款詳細(xì)信息頁面,我們正在等待用戶簽署

    2024年02月07日
    瀏覽(21)
  • SpringBoot整合微信小程序支付V3(支付、退款)

    微信支付開發(fā)前,需要先獲取商家信息,包括商戶號、AppId、證書和密鑰。 獲取商戶號 微信商戶平臺 申請成為商戶 = 提交資料 = 簽署協(xié)議 = 獲取商戶號 獲取AppID 微信公眾平臺 注冊服務(wù)號 = 服務(wù)號認(rèn)證 = 獲取APPID = 綁定商戶號 申請商戶證書 登錄商戶平臺 = 選擇 賬戶中心 = 安

    2024年02月08日
    瀏覽(50)
  • SpringBoot 整合微信小程序微信支付V3 jsapi (支付、退款)

    SpringBoot 整合微信小程序微信支付V3 jsapi (支付、退款)

    最近的一個(gè)微信小程序項(xiàng)目里有用到微信支付,網(wǎng)上找的資料都是特別亂,看起來特別懵,結(jié)合了好多文章的內(nèi)容,終于做了出來,可能我的這個(gè)博文看起來也是特別亂,但是是可以直接C走簡單改一改就可以用的。(支付成功回調(diào),和退款回調(diào)因?yàn)樽蛱靹傇诎⒗锷暾埖挠蛎€

    2024年04月25日
    瀏覽(25)
  • springboot整合IJPay實(shí)現(xiàn)微信支付-V3---微信小程序

    springboot整合IJPay實(shí)現(xiàn)微信支付-V3---微信小程序

    微信支付適用于許多場合,如小程序、網(wǎng)頁支付、但微信支付相對于其他支付方式略顯麻煩,我們使用IJpay框架進(jìn)行整合 JPay 讓支付觸手可及, 封裝了微信支付、支付寶支付、銀聯(lián)支付常用的支付方式以及各種常用的接口。不依賴任何第三方 mvc 框架,僅僅作為工具使用簡單

    2024年02月02日
    瀏覽(58)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包