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

SpringBoot實現(xiàn)微信小程序支付功能

 更新時間:2025年04月11日 11:04:05   作者:全干程序員demo  
小程序支付功能已成為眾多應用的核心需求之一,本文主要介紹了SpringBoot實現(xiàn)微信小程序支付功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、引言

在當今數(shù)字化時代,小程序支付功能已成為眾多應用的核心需求之一。通過小程序支付,用戶可以便捷地完成購物、充值等操作,極大地提升了用戶體驗和業(yè)務效率。Spring Boot作為一款流行的Java開發(fā)框架,以其簡潔、高效的特點,為實現(xiàn)小程序支付功能提供了強大的支持。本文將詳細介紹如何在Spring Boot項目中實現(xiàn)微信小程序支付功能,包括環(huán)境搭建、接口開發(fā)、支付流程實現(xiàn)以及支付結果通知處理等關鍵環(huán)節(jié)。

二、準備工作

(一)微信支付商戶平臺配置

注冊微信支付商戶號:在微信支付商戶平臺(pay.weixin.qq.com/)注冊一個商戶號,獲取商戶號(mch_id)、API密鑰(key)等基本信息。
申請微信支付證書:在商戶平臺下載支付證書,用于簽名驗證和數(shù)據(jù)加密。
配置支付參數(shù):在商戶平臺配置支付參數(shù),包括回調地址(notify_url)等。

(二)Spring Boot項目搭建

創(chuàng)建Spring Boot項目:通過Spring Initializr(start.spring.io/)快速創(chuàng)建一個Spring Boot項目,選擇所需的依賴,如Spring Web、Spring Boot DevTools等。

添加微信支付依賴:在pom.xml文件中添加微信支付相關依賴:

<dependency>
    <groupId>com.github.wechatpay-apiv3</groupId>
    <artifactId>wechatpay-java</artifactId>
    <version>1.0.0</version>
</dependency>

(三)配置文件設置

在application.properties或application.yml文件中配置微信支付相關參數(shù):

wx.pay.appId: your_app_id
wx.pay.mchId: your_mch_id
wx.pay.key: your_api_key
wx.pay.notifyUrl: your_notify_url

三、支付功能實現(xiàn)

(一)統(tǒng)一下單接口開發(fā)

創(chuàng)建支付服務類:創(chuàng)建WxPayService類,用于處理支付相關邏輯:

@Service
public class WxPayService {
    @Value("${wx.pay.appId}")
    private String appId;
    @Value("${wx.pay.mchId}")
    private String mchId;
    @Value("${wx.pay.key}")
    private String key;
    @Value("${wx.pay.notifyUrl}")
    private String notifyUrl;

    public Map<String, String> unifiedOrder(Map<String, String> params) {
        // 構建統(tǒng)一下單請求參數(shù)
        Map<String, String> requestParams = new HashMap<>();
        requestParams.put("appid", appId);
        requestParams.put("mch_id", mchId);
        requestParams.put("nonce_str", UUID.randomUUID().toString().replace("-", ""));
        requestParams.put("body", params.get("body"));
        requestParams.put("out_trade_no", params.get("out_trade_no"));
        requestParams.put("total_fee", params.get("total_fee"));
        requestParams.put("spbill_create_ip", params.get("spbill_create_ip"));
        requestParams.put("notify_url", notifyUrl);
        requestParams.put("trade_type", "JSAPI");
        requestParams.put("openid", params.get("openid"));

        // 簽名
        String sign = WxPayUtil.createSign(requestParams, key);
        requestParams.put("sign", sign);

        // 發(fā)起統(tǒng)一下單請求
        String xml = WxPayUtil.mapToXml(requestParams);
        String result = HttpClientUtil.doPost("https://api.mch.weixin.qq.com/pay/unifiedorder", xml);
        Map<String, String> resultMap = WxPayUtil.xmlToMap(result);

        // 返回前端需要的支付參數(shù)
        Map<String, String> payParams = new HashMap<>();
        payParams.put("appId", appId);
        payParams.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
        payParams.put("nonceStr", UUID.randomUUID().toString().replace("-", ""));
        payParams.put("package", "prepay_id=" + resultMap.get("prepay_id"));
        payParams.put("signType", "MD5");
        payParams.put("paySign", WxPayUtil.createSign(payParams, key));

        return payParams;
    }
}

創(chuàng)建支付控制器:創(chuàng)建WxPayController類,用于接收小程序的支付請求并調用統(tǒng)一下單接口:

@RestController
@RequestMapping("/wxpay")
public class WxPayController {
    @Autowired
    private WxPayService wxPayService;

    @PostMapping("/unifiedOrder")
    public Map<String, String> unifiedOrder(@RequestBody Map<String, String> params) {
        return wxPayService.unifiedOrder(params);
    }
}

(二)支付結果通知處理

創(chuàng)建支付結果通知處理接口:創(chuàng)建WxPayNotifyController類,用于接收微信支付結果通知:

@RestController
@RequestMapping("/wxpay")
public class WxPayNotifyController {
    @Autowired
    private WxPayService wxPayService;

    @PostMapping("/notify")
    public String notify(@RequestBody String notifyData) {
        return wxPayService.notify(notifyData);
    }
}

實現(xiàn)支付結果處理邏輯:在WxPayService中實現(xiàn)支付結果處理邏輯:

public String notify(String notifyData) {
    try {
        // 解析通知數(shù)據(jù)
        Map<String, String> notifyMap = WxPayUtil.xmlToMap(notifyData);
        // 驗證簽名
        if (!WxPayUtil.verifySignature(notifyMap, key)) {
            return "FAIL";
        }

        // 處理支付結果
        if ("SUCCESS".equals(notifyMap.get("result_code"))) {
            // 更新訂單狀態(tài)等業(yè)務邏輯
            return "SUCCESS";
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "FAIL";
}

(三)前端調用支付接口

在小程序前端頁面中,調用后端接口獲取支付參數(shù),并調用微信支付API完成支付:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WeChat Pay Example</title>
</head>
<body>
    <h1>WeChat Pay Example</h1>
    <button id="payButton">Pay Now</button>
    <script>
        document.getElementById("payButton").addEventListener("click", function() {
            // 調用后端接口獲取支付參數(shù)
            fetch('/wxpay/unifiedOrder', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    body: 'Test Payment',
                    out_trade_no: '123456789',
                    total_fee: '1',
                    spbill_create_ip: '127.0.0.1',
                    openid: 'your_openid'
                })
            })
            .then(response => response.json())
            .then(payParams => {
                // 調用微信支付API
                WeixinJSBridge.invoke(
                    'getBrandWCPayRequest', {
                        "appId": payParams.appId,
                        "timeStamp": payParams.timeStamp,
                        "nonceStr": payParams.nonceStr,
                        "package": payParams.package,
                        "signType": payParams.signType,
                        "paySign": payParams.paySign
                    },
                    function(res) {
                        if (res.err_msg == "get_brand_wcpay_request:ok") {
                            alert("支付成功");
                        } else {
                            alert("支付失敗");
                        }
                    }
                );
            });
        });
    </script>
</body>
</html>

四、測試與優(yōu)化

(一)測試支付流程

  • 模擬支付請求:在小程序中發(fā)起支付請求,檢查是否能夠正確調用后端接口并返回支付參數(shù)。
  • 驗證支付結果通知:模擬微信支付結果通知,檢查后端是否能夠正確處理支付結果并更新訂單狀態(tài)。

(二)優(yōu)化與安全

  • 簽名驗證:確保在支付結果通知處理中嚴格驗證簽名,防止偽造通知。
  • 日志記錄:記錄支付請求和通知處理的日志,便于排查問題。
  • 異常處理:在支付流程中添加異常處理邏輯,確保系統(tǒng)在遇到錯誤時能夠正常運行。

五、總結

通過以上步驟,我們成功在Spring Boot項目中實現(xiàn)了微信小程序支付功能。從環(huán)境搭建到接口開發(fā),再到支付流程實現(xiàn)和支付結果通知處理,每一步都至關重要。在實際開發(fā)中,還需要根據(jù)具體業(yè)務需求進行進一步的優(yōu)化和調整 。希望本文能夠為開發(fā)者提供一個清晰的實現(xiàn)思路和參考代碼,幫助大家快速實現(xiàn)小程序支付功能。

六、參考代碼

以下是完整的參考代碼:

(一)WxPayService.java

@Service
public class WxPayService {
    @Value("${wx.pay.appId}")
    private String appId;
    @Value("${wx.pay.mchId}")
    private String mchId;
    @Value("${wx.pay.key}")
    private String key;
    @Value("${wx.pay.notifyUrl}")
    private String notifyUrl;

    public Map<String, String> unifiedOrder(Map<String, String> params) {
        Map<String, String> requestParams = new HashMap<>();
        requestParams.put("appid", appId);
        requestParams.put("mch_id", mchId);
        requestParams.put("nonce_str", UUID.randomUUID().toString().replace("-", ""));
        requestParams.put("body", params.get("body"));
        requestParams.put("out_trade_no", params.get("out_trade_no"));
        requestParams.put("total_fee", params.get("total_fee"));
        requestParams.put("spbill_create_ip", params.get("spbill_create_ip"));
        requestParams.put("notify_url", notifyUrl);
        requestParams.put("trade_type", "JSAPI");
        requestParams.put("openid", params.get("openid"));

        String sign = WxPayUtil.createSign(requestParams, key);
        requestParams.put("sign", sign);

        String xml = WxPayUtil.mapToXml(requestParams);
        String result = HttpClientUtil.doPost("https://api.mch.weixin.qq.com/pay/unifiedorder", xml);
        Map<String, String> resultMap = WxPayUtil.xmlToMap(result);

        Map<String, String> payParams = new HashMap<>();
        payParams.put("appId", appId);
        payParams.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
        payParams.put("nonceStr", UUID.randomUUID().toString().replace("-", ""));
        payParams.put("package", "prepay_id=" + resultMap.get("prepay_id"));
        payParams.put("signType", "MD5");
        payParams.put("paySign", WxPayUtil.createSign(payParams, key));

        return payParams;
    }

    public String notify(String notifyData) {
        try {
            Map<String, String> notifyMap = WxPayUtil.xmlToMap(notifyData);
            if (!WxPayUtil.verifySignature(notifyMap, key)) {
                return "FAIL";
            }

            if ("SUCCESS".equals(notifyMap.get("result_code"))) {
                // Update order status and other business logic
                return "SUCCESS";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "FAIL";
    }
}

(二)WxPayController.java

@RestController
@RequestMapping("/wxpay")
public class WxPayController {
    @Autowired
    private WxPayService wxPayService;

    @PostMapping("/unifiedOrder")
    public Map<String, String> unifiedOrder(@RequestBody Map<String, String> params) {
        return wxPayService.unifiedOrder(params);
    }
}

(三)WxPayNotifyController.java

@RestController
@RequestMapping("/wxpay")
public class WxPayNotifyController {
    @Autowired
    private WxPayService wxPayService;

    @PostMapping("/notify")
    public String notify(@RequestBody String notifyData) {
        return wxPayService.notify(notifyData);
    }
}

通過以上代碼示例和詳細步驟,可以快速實現(xiàn)微信小程序支付功能。希望能夠幫助大家更好地理解和應用Spring Boot實現(xiàn)小程序支付功能。

到此這篇關于SpringBoot實現(xiàn)微信小程序支付功能的文章就介紹到這了,更多相關SpringBoot小程序支付內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot利用Undertow實現(xiàn)高可用的反向代理配置

    SpringBoot利用Undertow實現(xiàn)高可用的反向代理配置

    Undertow是一個采用Java開發(fā)的靈活的高性能Web服務器,本文將介紹如何利用?Undertow?服務器的反向代理能力,實現(xiàn)高可用的反向代理配置,感興趣的可以了解下
    2025-06-06
  • Java輸入輸出語句舉例詳解(通俗易懂!)

    Java輸入輸出語句舉例詳解(通俗易懂!)

    這篇文章主要給大家介紹了關于Java輸入輸出語句的相關資料,作為一種常用的編程語言,Java提供了多種輸入輸出的方式,用于與用戶進行數(shù)據(jù)交互或處理文件數(shù)據(jù),需要的朋友可以參考下
    2023-10-10
  • 淺析我對 String、StringBuilder、StringBuffer 的理解

    淺析我對 String、StringBuilder、StringBuffer 的理解

    StringBuilder、StringBuffer 和 String 一樣,都是用于存儲字符串的。這篇文章談談小編對String、StringBuilder、StringBuffer 的理解,感興趣的朋友跟隨小編一起看看吧
    2020-05-05
  • java 鍵盤輸入一個數(shù),輸出數(shù)組中指定元素的示例

    java 鍵盤輸入一個數(shù),輸出數(shù)組中指定元素的示例

    今天小編就為大家分享一篇java 鍵盤輸入一個數(shù),輸出數(shù)組中指定元素的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Java 可視化垃圾回收_動力節(jié)點Java學院整理

    Java 可視化垃圾回收_動力節(jié)點Java學院整理

    Ben Evans是一名資深培訓師兼顧問,他在演講可視化垃圾回收中從基礎談起討論了垃圾回收。以下是對其演講的簡短總結。感興趣的朋友一起學習吧
    2017-05-05
  • Springboot + Mysql8實現(xiàn)讀寫分離功能

    Springboot + Mysql8實現(xiàn)讀寫分離功能

    這篇文章主要介紹了Springboot + Mysql8實現(xiàn)讀寫分離功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • Java并發(fā)編程之CountDownLatch的使用

    Java并發(fā)編程之CountDownLatch的使用

    CountDownLatch是一個倒數(shù)的同步器,常用來讓一個線程等待其他N個線程執(zhí)行完成再繼續(xù)向下執(zhí)行,本文主要介紹了CountDownLatch的具體使用方法,感興趣的可以了解一下
    2023-05-05
  • 關于Kill指令停掉Java程序的問題

    關于Kill指令停掉Java程序的問題

    這篇文章主要介紹了Kill指令停掉Java程序的思考,主要探究kill指令和java的關閉鉤子的問題,需要的朋友可以參考下
    2021-10-10
  • SpringBoot整合Mybatis注解開發(fā)的實現(xiàn)代碼

    SpringBoot整合Mybatis注解開發(fā)的實現(xiàn)代碼

    這篇文章主要介紹了SpringBoot整合Mybatis注解開發(fā)的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • IDEA中文亂碼的幾種常見解決方案

    IDEA中文亂碼的幾種常見解決方案

    IntelliJ IDEA 如果不進行相關設置,可能會導致控制臺中文亂碼、配置文件中文亂碼等問題,非常影響編碼過程中進行問題追蹤,所以本文給大家介紹了IDEA中文亂碼的幾種常見解決方案,需要的朋友可以參考下
    2025-04-04

最新評論

永嘉县| 卓资县| 林甸县| 秦皇岛市| 祁东县| 阜宁县| 桂平市| 汝南县| 合阳县| 德清县| 南溪县| 霍林郭勒市| 保亭| 沛县| 潜江市| 扶余县| 乐山市| 房产| 襄汾县| 东阿县| 通许县| 红安县| 盘山县| 泗水县| 涿州市| 阜城县| 大庆市| 北川| 商南县| 行唐县| 伊川县| 巢湖市| 尚义县| 灯塔市| 福贡县| 镇雄县| 大渡口区| 建湖县| 黔西| 略阳县| 宁德市|