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

07_SpringBoot 對接支付寶完成掃碼支付,完整流程梳理!

這篇具有很好參考價值的文章主要介紹了07_SpringBoot 對接支付寶完成掃碼支付,完整流程梳理!。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

SpringBoot 對接支付寶完成掃碼支付,完整流程梳理!

需求:系統(tǒng)A對接支付寶,實現(xiàn)支持用戶掃碼支付

1、支付方式選擇

對接的API文檔:

  • https://open.alipay.com/api

可選的支付方式有:

  • 掃碼付:出示付款碼或者用戶掃碼付款
  • APP支付:在APP中喚起支付寶
  • 手機網站支付:在移動端網頁中喚起支付寶 App 或支付寶網頁
  • 電腦網站支付:在PC端喚起支付寶App或者網頁登錄支付寶賬戶
  • 刷臉付:需硬件支持
  • 商家扣款:類似每月會員扣款
  • 預授權支付:凍結對應額度,交易完成后給商家
  • JSAPI支付:小程序

這里選擇掃碼付的方式,點擊下單后,返回支付二維碼,用戶掃碼支付。

2、交互流程

畫個下單流程的時序圖:

支付包掃碼對接,# SpringBoot整合第三方庫,spring boot,后端,java

大致流程:

  • 用戶下單,系統(tǒng)A組裝信息后(訂單信息、回調地址、簽名),調用支付寶預下單接口,返回二維碼鏈接
  • 系統(tǒng)A將二維碼鏈接轉二維碼圖片
  • 用戶掃碼,喚醒本地支付寶,完成支付
  • 支付寶返回支付成功信息給用戶
  • 支付寶異步通知系統(tǒng)A支付成功的消息(回調地址),如果用戶支付成功,支付寶就調用回調地址的API,回調接口中自然是系統(tǒng)A收到用戶支付成功消息后的動作
  • 上一步如果通知失敗,比如網絡異?;蛑Ц秾氄{用異步通知接口時系統(tǒng)A正好掛了 ? 可主動調支付寶提供的查詢支付結果接口,或者加定時任務輪詢來查詢交易狀態(tài),如3s-5s
  • 還可以考慮在第一步請求支付寶接口時加上二維碼的有效時間,過期就重新發(fā)起

查詢支付結果流程:

支付包掃碼對接,# SpringBoot整合第三方庫,spring boot,后端,java

退款流程同上查詢支付結果。PS:注意下單、退款過程中,相關訂單的業(yè)務數(shù)據(jù)落庫到系統(tǒng)A。

3、對接準備

加密解密 + 簽名驗簽

支付信息不能在網絡上明文傳輸,以防被篡改。系統(tǒng)A到支付寶的方向,采用:

  • 支付寶公鑰加密 + 系統(tǒng)A的私鑰簽名(系統(tǒng)A做的事)
  • 支付寶私鑰解密 + 系統(tǒng)A的公鑰驗簽(收到信息后,支付寶做的事)

同理,支付寶返回支付結果時,就是在支付寶中用系統(tǒng)A的公鑰加密+支付寶的私鑰簽名,傳輸?shù)较到y(tǒng)A后,則是先用支付寶的公鑰驗簽,再用系統(tǒng)A的私鑰解密支付結果

支付包掃碼對接,# SpringBoot整合第三方庫,spring boot,后端,java

沙箱環(huán)境

調試過程中,可采用支付寶提供的沙箱環(huán)境,點擊右上角控制臺,登錄后選擇沙箱:

支付包掃碼對接,# SpringBoot整合第三方庫,spring boot,后端,java

這里有一套可調試的APPID、系統(tǒng)A的公鑰、密鑰、支付寶的公鑰、支付寶的網關地址,以及商家賬戶和用戶賬戶(用于后續(xù)登錄沙箱版本支付寶APP完成支付)

支付包掃碼對接,# SpringBoot整合第三方庫,spring boot,后端,java
支付包掃碼對接,# SpringBoot整合第三方庫,spring boot,后端,java

點擊【沙箱工具】側邊欄,下載沙箱版支付寶APP,等于上面的買家賬戶。

內網穿透

前面提到,用戶支付成功后,支付寶需要回調系統(tǒng)A接口來通知系統(tǒng)A,但我的開發(fā)環(huán)境在內網,支付寶訪問不到,考慮做內網穿透,讓支付寶通知到一個中轉地址,再由中轉地址到我的內網。穿透工具選擇cpolar,下載地址 https://dashboard.cpolar.com/get-started,下載后,解壓并安裝msi包

支付包掃碼對接,# SpringBoot整合第三方庫,spring boot,后端,java

雙擊exe文件,執(zhí)行認證:

cpolar authtoken xxxx

支付包掃碼對接,# SpringBoot整合第三方庫,spring boot,后端,java

創(chuàng)建隧道,建立鏈接:

cpolar http 9527

//返回結果
Forwarding http://maggie.cpolar.io  -> localhost:9527
Forwarding https://maggie.cpolar.io  -> localhost:9527

轉發(fā)成功。此時,給支付寶訪問forward的地址即可,比如系統(tǒng)A的異步通知接口:

localhost:9527/notify

那就是:

http://maggie.cpolar.io/notify

二維碼

二維碼是消息的載體。平時玩可直接在草料二維碼UI頁面,這里需要給系統(tǒng)A的訂單服務用代碼生成二維碼。二維碼中的信息自然是支付寶預下單返回的url。

Java生成二維碼可集成zxing庫,但這樣得自己兩層for填充方格子,這里選擇hutool工具類庫(對zxing的二次封裝),引入依賴:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.22</version>
</dependency>

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.4.1</version>
</dependency>

調用方式:

//生成直到url對應的二維碼,寬高均300像素,可到路徑,也可到Http響應
QrCodeUtil.generate("https://url/path", 300, 300, "png", httpServletResponse.getOutPutStream());

也可引入QrConfig對象,設置其他屬性:

QrConfig config = new QrConfig(300, 300);
//糾錯級別
config.setErrorCorrection(ErrorCorrectionLevel.H);
//二維碼顏色
config.setBackColor(Color.BLUE);
QrCodeUtil.generate("https://www.baidu.com", config, new File("D:\\code.png"));

下單

支付寶提供的SDK 中已經對加簽驗簽邏輯做了封裝,使用 SDK 時傳入支付寶公鑰等內容可直接通過 SDK 自動進行加驗簽。SDK文檔地址:https://opendocs.alipay.com/open/54/103419?pathHash=d6bc7c2b 。支付寶提供了兩種SDK:

  • 通用版SDK
  • 簡易版SDK

官網有通用版的API代碼示例,這里走簡易版的。引入簡易版SDK的依賴:

<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-easysdk</artifactId>
    <version>2.2.0</version>
</dependency>

在application.yml配置文件中統(tǒng)一寫密鑰、通知地址等(生產環(huán)境不要將私鑰信息配置在源碼中,例如配置為常量或儲存在配置文件中,這樣源碼一丟,這些保密信息都泄漏了,放安全區(qū)域或服務器,運行時讀取即可)

alipay:
  easy:
    protocol: https
    gatewayHost: openapi-sandbox.dl.alipaydev.com
    signType: RSA2
    appId: 9021000133624745
    merchantPrivateKey: MIIEvQIBADANBgkqhkiG9w0B
    alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOC
    notifyUrl: http://maggie.cpolar.io/notify
server:
  port: 9527

@ConfigurationProperties注解統(tǒng)一讀到:

@Configuration
@Data
@ConfigurationProperties(prefix = "alipay.easy")
public class AliPayConfigInfo {

    /**
     * 請求協(xié)議
     */
    private String protocol;
    /**
     * 請求網關
     */
    private String gatewayHost;
    /**
     * 簽名類型
     */
    private String signType;
    /**
     * 應用ID(來自支付寶申請)
     */
    private String appId;
    /**
     * 應用秘鑰
     */
    private String merchantPrivateKey;
    /**
     * 支付寶公鑰
     */
    private String alipayPublicKey;
    /**
     * 支付結果異步通知的地址
     */
    private String notifyUrl;
    /**
     * 設施AES秘鑰
     */
    private String encryptKey;
}

將配置處理成Config類型的Bean,方便后面?zhèn)魅隒onfig對象:

@Configuration
public class AliPayConfig {

    @Bean
    public Config config(AliPayConfigInfo configInfo){
        Config config = new Config();
        config.protocol = configInfo.getProtocol();
        config.gatewayHost = configInfo.getGatewayHost();
        config.signType = configInfo.getSignType();
        config.appId = configInfo.getAppId();
        config.merchantPrivateKey = configInfo.getMerchantPrivateKey();
        config.alipayPublicKey = configInfo.getAlipayPublicKey();
        config.notifyUrl = configInfo.getNotifyUrl();
        config.encryptKey = "";
        return config;
    }
}

寫下單接口,響應一個二維碼給前端,這里業(yè)務數(shù)據(jù)、訂單編號直接寫死,只做示意:

@RestController
@Slf4j
public class PayController {

    @Resource
    private Config config;
    /**
     * 收銀臺點擊結賬
     * 發(fā)起下單請求
     */
    @GetMapping("/pay")
    public void pay(HttpServletRequest request, HttpServletResponse response) throws Exception {
        Factory.setOptions(config);
        //調用支付寶的接口
        AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace().preCreate("訂單主題:Mac筆記本", "LS123qwe123", "19999");
        //參照官方文檔響應示例,解析返回結果
        String httpBodyStr = payResponse.getHttpBody();
        JSONObject jsonObject = JSONObject.parseObject(httpBodyStr);
        String qrUrl = jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString();
        QrCodeUtil.generate(qrUrl, 300, 300, "png", response.getOutputStream());
    }
}

異步通知回調

異步回調參考文檔:https://opendocs.alipay.com/open/194/103296?pathHash=e43f422e&ref=api,實現(xiàn)先全放Controller層了:

@RestController
@Slf4j
public class PayController {

    @Resource
    private Config config;
 
    /**
     * 給支付寶的回調接口
     */
    @PostMapping("/notify")
    public void notify(HttpServletRequest request, HttpServletResponse response) throws Exception {
        Map<String, String> params = new HashMap<>();
        //獲取支付寶POST過來反饋信息,將異步通知中收到的待驗證所有參數(shù)都存放到map中
        Map<String, String[]> parameterMap = request.getParameterMap();
        for (String name : parameterMap.keySet()) {
            String[] values = parameterMap.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            //亂碼解決
            valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }
        //驗簽
        Boolean signResult = Factory.Payment.Common().verifyNotify(params);
        if (signResult) {
            log.info("收到支付寶發(fā)送的支付結果通知");
            String out_trade_no = request.getParameter("out_trade_no");
            log.info("交易流水號:{}", out_trade_no);
            //交易狀態(tài)
            String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
            //交易成功
            switch (trade_status) {
                case "TRADE_SUCCESS":
                    //支付成功的業(yè)務邏輯,比如落庫,開vip權限等
                    log.info("訂單:{} 交易成功", out_trade_no);
                    break;
                case "TRADE_FINISHED":
                    log.info("交易結束,不可退款");
                    //其余業(yè)務邏輯
                    break;
                case "TRADE_CLOSED":
                    log.info("超時未支付,交易已關閉,或支付完成后全額退款");
                    //其余業(yè)務邏輯
                    break;
                case "WAIT_BUYER_PAY":
                    log.info("交易創(chuàng)建,等待買家付款");
                    //其余業(yè)務邏輯
                    break;
            }
            response.getWriter().write("success");   //返回success給支付寶,表示消息我已收到,不用重調

        } else {
            response.getWriter().write("fail");   ///返回fail給支付寶,表示消息我沒收到,請重試
        }
    }
}

到此,看下效果,請求下單接口:

支付包掃碼對接,# SpringBoot整合第三方庫,spring boot,后端,java

用沙箱版app掃碼:

支付包掃碼對接,# SpringBoot整合第三方庫,spring boot,后端,java

支付包掃碼對接,# SpringBoot整合第三方庫,spring boot,后端,java

查詢支付結果

主動查詢用戶的支付結果,訂單編號依然寫死:

@RestController
@Slf4j
public class PayController {

    @Resource
    private Config config;
    
    @GetMapping("/query")
    public String query() throws Exception {
        Factory.setOptions(config);
        AlipayTradeQueryResponse result = Factory.Payment.Common().query("LS123qwe123");
        return result.getHttpBody();
    }

}

支付包掃碼對接,# SpringBoot整合第三方庫,spring boot,后端,java

退款

退款操作:

@RestController
@Slf4j
public class PayController {

    @Resource
    private Config config;

    @GetMapping("/refund")
    public String refund() throws Exception {
        Factory.setOptions(config);
        AlipayTradeRefundResponse refundResponse = Factory.Payment.Common().refund("LS123qwe123", "19999");
        return refundResponse.getHttpBody();
    }
}

支付包掃碼對接,# SpringBoot整合第三方庫,spring boot,后端,java

通用版SDK

官方文檔就是以這個SDK為例的,貼個代碼示例:

private static final String GATEWAY_URL = "https://openapi.alipaydev.com/gateway.do";
private static final String FORMAT = "JSON";
private static final String CHARSET = "UTF-8";
    //簽名方式
    private static final String SIGN_TYPE = "RSA2";
@Resource
private AliPayConfig aliPayConfig;

@Resource
private OrdersMapper ordersMapper;

@GetMapping("/pay") // &subject=xxx&traceNo=xxx&totalAmount=xxx
public void pay(AliPay aliPay, HttpServletResponse httpResponse) throws Exception {
    // 1. 創(chuàng)建Client,通用SDK提供的Client,負責調用支付寶的API
    AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, aliPayConfig.getAppId(),
            aliPayConfig.getAppPrivateKey(), FORMAT, CHARSET, aliPayConfig.getAlipayPublicKey(), SIGN_TYPE);

    // 2. 創(chuàng)建 Request并設置Request參數(shù)
    AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();  // 發(fā)送請求的 Request類
    request.setNotifyUrl(aliPayConfig.getNotifyUrl());
    JSONObject bizContent = new JSONObject();
    bizContent.set("out_trade_no", aliPay.getTraceNo());  // 我們自己生成的訂單編號
    bizContent.set("total_amount", aliPay.getTotalAmount()); // 訂單的總金額
    bizContent.set("subject", aliPay.getSubject());   // 支付的名稱
    bizContent.set("product_code", "FAST_INSTANT_TRADE_PAY");  // 固定配置
    request.setBizContent(bizContent.toString());

    // 執(zhí)行請求,拿到響應的結果,返回給瀏覽器
    String form = "";
    try {
        form = alipayClient.pageExecute(request).getBody(); // 調用SDK生成表單
    } catch (AlipayApiException e) {
        e.printStackTrace();
    }
    httpResponse.setContentType("text/html;charset=" + CHARSET);
    httpResponse.getWriter().write(form);// 直接將完整的表單html輸出到頁面
    httpResponse.getWriter().flush();
    httpResponse.getWriter().close();
}

具體有業(yè)務數(shù)據(jù)邏輯的對接支付寶接口,可跳轉支付寶業(yè)務對接:文章來源地址http://www.zghlxwxcb.cn/news/detail-852909.html

  • https://llg-notes.blog.csdn.net/article/details/130357977

到了這里,關于07_SpringBoot 對接支付寶完成掃碼支付,完整流程梳理!的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

領支付寶紅包贊助服務器費用

相關文章

  • 2023微信支付對接全流程

    2023微信支付對接全流程

    簡單說一下微信支付的幾種類型的應用場景以及前提條件 官方文檔:https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml 前提條件: 1.需要一個載體公眾號或者小程序,公眾號要是服務號不是訂閱號。 2.小程序和公眾號支付都要認證,要300rmb。 3.需要一個商戶號,綁定公眾號或者小程序

    2024年02月05日
    瀏覽(19)
  • 微信native-v3版支付對接流程及demo

    微信native-v3版支付對接流程及demo

    openssl pkcs12 -in apiclient_cert.p12 -out apiclient_cert.pem -nodes 密碼是:商戶id https://github.com/wechatpay-apiv3/CertificateDownloader 生成證書 https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient

    2024年02月07日
    瀏覽(27)
  • 【java】Java項目從開發(fā)到部署生產完整流程梳理

    【java】Java項目從開發(fā)到部署生產完整流程梳理

    從事Java開發(fā)許久,從最初學習的JDK環(huán)境變量開始,到如今開發(fā)部署發(fā)布,已經逐漸形成了自己的一套體系,當然,其中也不少學習了網上各種資料總結,接下來將在本文對Java項目開發(fā)到部署發(fā)布整個流程進行歸納梳理。 關于開發(fā)環(huán)境,在之前寫的一篇文章里有詳細教學,因

    2024年02月03日
    瀏覽(19)
  • SpringBoot對接小程序微信支付

    SpringBoot對接小程序微信支付

    目錄 前言 一、準備工作 2.1、企業(yè)微信小程序開通 2.1.1、獲取開發(fā)者ID 2.1.2、開通支付功能 2.1.3、關聯(lián)商戶號 2.2、企業(yè)商戶號的開通 2.2.1、獲取商戶號mch_id 2.2.2、獲取商戶API密鑰mch_key 二、整體流程 三、后端項目搭建 3.1、統(tǒng)一下單 3.2、支付支付回調 3.3、問題排查 3.4、統(tǒng)一下

    2024年02月04日
    瀏覽(26)
  • SpringBoot對接微信小程序支付功能開發(fā)(二,支付回調功能)

    SpringBoot對接微信小程序支付功能開發(fā)(二,支付回調功能)

    接著上一篇: SpringBoot對接微信小程序支付功能開發(fā)(一,下單功能) 在上一篇下單功能中我們有傳支付結果回調地址。 下面是回調接口實現(xiàn) 根據(jù)官網給的參數(shù)進行業(yè)務處理 這就完成了,微信支付回調你的地址,并且把支付的信息傳進來,剩下就要根據(jù)自己業(yè)務進行操作。

    2024年02月11日
    瀏覽(63)
  • Laravel對接 AWS S3 完整流程

    Laravel對接 AWS S3 完整流程

    重要的三個參數(shù) 1、創(chuàng)建存儲桶 2、開啟權限 3、編輯存儲桶策略 4、使用策略生成器生成json策略 顯示公開訪問 控制臺隨便上傳一個文件后查看屬性復制 AWS_ENDPOINT 即對象URI的域名字段 5、創(chuàng)建IAM用戶、添加用戶組權限 創(chuàng)建用戶成功后進入用戶詳情 創(chuàng)建訪問密鑰 至此三個參數(shù)

    2024年02月12日
    瀏覽(21)
  • 微信小程序支付完整流程

    微信小程序支付完整流程

    1、注冊微信支付商戶號(由上級或法人注冊) 注冊鏈接:https://pay.weixin.qq.com/index.php/apply/applyment_home/guide_normal#none 此商戶號,需要由主管及更上級領導進行注冊,會成為公司收款賬戶 企業(yè)注冊需要材料:營業(yè)執(zhí)照,對公銀行賬戶信息,法人身份證 2、注冊小程序賬號(由上級或

    2024年02月10日
    瀏覽(27)
  • SpringBoot對接微信小程序支付功能開發(fā)(一,下單功能)

    1,接入前準備: 接入模式選擇直連模式; 申請小程序,得到APPID,并開通微信支付; 申請微信商戶號,得到mchid,并綁定APPID; 配置商戶API key,下載并配置商戶證書,根據(jù)微信官方文檔操作:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_1.shtml 上面都配置完之后會得到:小

    2024年02月10日
    瀏覽(32)
  • Springboot支付寶沙箱支付---完整詳細步驟

    Springboot支付寶沙箱支付---完整詳細步驟

    不經??聪⒑驮u論,代碼和數(shù)據(jù)庫已上傳至gitee 項目源碼 沙箱環(huán)境-支付寶文檔中心 1.1、進入個人沙箱環(huán)境 點擊進入沙箱環(huán)境并用支付寶登陸 沙箱管理界面如圖所示 appid,支付寶網關,自定義密鑰等 這里是沙箱支付寶(虛擬)的賬號和密碼,可以用來支付 1.2、接下來進行

    2023年04月25日
    瀏覽(26)
  • Google Play創(chuàng)建商品,手機支付,訂單管理完整流程

    Google Play創(chuàng)建商品,手機支付,訂單管理完整流程

    首先進入 Google Play Console 后臺:https://play.google.com/console/u/0/developers/,找到對應的項目,點擊進入項目。找到左側的Produces--In-App produces(一次性商品), Produces--Subscriptions(訂閱商品) 中文:商品--應用內商品和訂閱 點擊Create product 可以去創(chuàng)建商品,注意Product ID 在一個項目中是唯

    2024年02月16日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包