還在手動造輪子?試試這款可以輕鬆集成多種支付渠道的工具!

来源:https://www.cnblogs.com/codechen8848/archive/2023/11/24/17853409.html
-Advertisement-
Play Games

IJPay 的宗旨是讓支付觸手可及。封裝了微信支付、QQ 支付、支付寶支付、京東支付、銀聯支付、PayPal 支付等常用的支付方式以及各種常用的介面。 ...


大家好,我是 Java陳序員

隨著電商的興起,各種支付也是蓬勃發展。

微信支付、支付寶支付、銀聯支付等各種支付方式可是深入到日常生活中。可以說,掃碼支付給我們的生活帶來了極大的便利。

同時,隨著市場需求的變化,這也要求我們在企業開發中,需要集成第三方支付渠道!

我們在集成第三方支付渠道時,常規的操作是查閱官方文檔、封裝代碼、測試聯調等。

今天,給大家介紹一個已經封裝好各種支付渠道的項目,開箱即用,我們就不用重覆手動造輪子了!

項目介紹

IJPay 的宗旨是讓支付觸手可及。封裝了微信支付、QQ 支付、支付寶支付、京東支付、銀聯支付、PayPal 支付等常用的支付方式以及各種常用的介面。

不依賴任何第三方 MVC 框架,僅僅作為工具使用簡單快速完成支付模塊的開發,開箱即用,可快速集成到系統中。

功能模塊:

  • 微信支付: 支持多商戶多應用,普通商戶模式與服務商商模式當然也支持境外商戶、同時支持 Api-v3Api-v2 版本的介面
  • 個人微信支付: 微信個人商戶,最低費率 0.38%,官方直連的非同步回調通知
  • 支付寶支付: 支持多商戶多應用,簽名同時支持普通公鑰方式與公鑰證書方式
  • 銀聯支付: 全渠道掃碼支付、微信 App 支付、公眾號&小程式支付、銀聯 JS 支付、支付寶服務窗支付
  • PayPal 支付: 自動管理 AccessToken,極速接入各種常用的支付方式

項目安裝

一次性添加所有支付方式的依賴

<dependency>
    <groupId>com.github.javen205</groupId>
    <artifactId>IJPay-All</artifactId>
    <version>latest-version</version>
</dependency>

或者選擇某一個/多個支付方式的依賴,如:
支付寶支付

<dependency>
    <groupId>com.github.javen205</groupId>
    <artifactId>IJPay-AliPay</artifactId>
    <version>latest-version</version>
</dependency>

微信支付

<dependency>
    <groupId>com.github.javen205</groupId>
    <artifactId>IJPay-WxPay</artifactId>
    <version>latest-version</version>
</dependency>

更多支付方式依賴參考:

https://javen205.gitee.io/ijpay/guide/maven.html#maven

集成Demo

以支付寶支付為例。

引入依賴

<dependency>
    <groupId>com.github.javen205</groupId>
    <artifactId>IJPay-AliPay</artifactId>
    <version>latest-version</version>
</dependency>

初始化客戶端配置信息

AliPayApiConfig aliPayApiConfig = AliPayApiConfig.builder() 
    .setAppId(aliPayBean.getAppId())
    .setAppCertPath(aliPayBean.getAppCertPath())
    .setAliPayCertPath(aliPayBean.getAliPayCertPath())
    .setAliPayRootCertPath(aliPayBean.getAliPayRootCertPath())
    .setCharset("UTF-8")
    .setPrivateKey(aliPayBean.getPrivateKey())  
    .setAliPayPublicKey(aliPayBean.getPublicKey())
    .setServiceUrl(aliPayBean.getServerUrl())
    .setSignType("RSA2")
    // 普通公鑰方式
    //.build();
    // 證書模式
    .buildByCert();   
    // 或者 
    .setAppId(aliPayBean.getAppId())
    .setAliPayPublicKey(aliPayBean.getPublicKey())
    .setCharset("UTF-8")
    .setPrivateKey(aliPayBean.getPrivateKey())
    .setServiceUrl(aliPayBean.getServerUrl())
    .setSignType("RSA2")
    .build(); // 普通公鑰方式 
    .build(appCertPath, aliPayCertPath, aliPayRootCertPath) // 2.3.0 公鑰證書方式  

AliPayApiConfigKit.setThreadLocalAppId(aliPayBean.getAppId()); // 2.1.2 之後的版本,可以不用單獨設置 
AliPayApiConfigKit.setThreadLocalAliPayApiConfig(aliPayApiConfig);

參數說明:

  • appId: 應用編號
  • privateKey: 應用私鑰
  • publicKey: 支付寶公鑰,通過應用公鑰上傳到支付寶開放平臺換取支付寶公鑰(如果是證書模式,公鑰與私鑰在CSR目錄)。
  • appCertPath: 應用公鑰證書 (證書模式必須)
  • aliPayCertPath: 支付寶公鑰證書 (證書模式必須)
  • aliPayRootCertPath: 支付寶根證書 (證書模式必須)
  • serverUrl: 支付寶支付網關
  • domain: 外網訪問項目的功能變數名稱,支付通知中會使用

多應用無縫切換:

從上面的初始化配置中,可以看到 IJPay 預設是使用當前線程中的 appId 對應的配置。

如果要切換應用可以調用 AliPayApiConfigKit.setThreadLocalAppId 來設置當前線程中的 appId, 實現應用的切換進而達到多應用的支持。

調用支付API

App 支付

public AjaxResult appPay() {
    try {
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        model.setBody("測試數據-Java陳序員");
        model.setSubject("Java陳序員 App 支付測試");
        model.setOutTradeNo(StringUtils.getOutTradeNo());
        model.setTimeoutExpress("15m");
        model.setTotalAmount("0.01");
        model.setPassbackParams("callback params");
        model.setProductCode("QUICK_MSECURITY_PAY");
        String orderInfo = AliPayApi.appPayToResponse(model, aliPayBean.getDomain() + NOTIFY_URL).getBody();
        result.success(orderInfo);
    } catch (AlipayApiException e) {
        e.printStackTrace();
        result.addError("system error:" + e.getMessage());
    }
    return result;
}

PC 支付

public void pcPay(HttpServletResponse response) {
    try {
        String totalAmount = "0.01";
        String outTradeNo = StringUtils.getOutTradeNo();
        log.info("pc outTradeNo>" + outTradeNo);

        String returnUrl = aliPayBean.getDomain() + RETURN_URL;
        String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL;
        AlipayTradePagePayModel model = new AlipayTradePagePayModel();

        model.setOutTradeNo(outTradeNo);
        model.setProductCode("FAST_INSTANT_TRADE_PAY");
        model.setTotalAmount(totalAmount);
        model.setSubject("Java陳序員 PC 支付測試");
        model.setBody("Java陳序員 PC 支付測試");
        model.setPassbackParams("passback_params");

        AliPayApi.tradePage(response, model, notifyUrl, returnUrl);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

手機網站支付

public void wapPay(HttpServletResponse response) {
    String body = "測試數據-Java陳序員";
    String subject = "Java陳序員 Wap支付測試";
    String totalAmount = "0.01";
    String passBackParams = "1";
    String returnUrl = aliPayBean.getDomain() + RETURN_URL;
    String notifyUrl = aliPayBean.getDomain() + NOTIFY_URL;

    AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
    model.setBody(body);
    model.setSubject(subject);
    model.setTotalAmount(totalAmount);
    model.setPassbackParams(passBackParams);
    String outTradeNo = StringUtils.getOutTradeNo();
    System.out.println("wap outTradeNo>" + outTradeNo);
    model.setOutTradeNo(outTradeNo);
    model.setProductCode("QUICK_WAP_PAY");

    try {
        AliPayApi.wapPay(response, model, returnUrl, notifyUrl);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

掃碼支付

public String tradePreCreatePay() {
    String subject = "Java陳序員 支付寶掃碼支付測試";
    String totalAmount = "0.01";
    String storeId = "123";
    String notifyUrl = aliPayBean.getDomain() + "/aliPay/cert_notify_url";

    AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
    model.setSubject(subject);
    model.setTotalAmount(totalAmount);
    model.setStoreId(storeId);
    model.setTimeoutExpress("15m");
    model.setOutTradeNo(StringUtils.getOutTradeNo());
    try {
        String resultStr = AliPayApi.tradePrecreatePayToResponse(model, notifyUrl).getBody();
        JSONObject jsonObject = JSONObject.parseObject(resultStr);
        return jsonObject.getJSONObject("alipay_trade_precreate_response").getString("qr_code");
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

單筆轉賬到支付寶賬戶

public String transfer() {
    String totalAmount = "0.01";
    AlipayFundTransToaccountTransferModel model = new AlipayFundTransToaccountTransferModel();
    model.setOutBizNo(StringUtils.getOutTradeNo());
    model.setPayeeType("ALIPAY_LOGONID");
    model.setPayeeAccount("[email protected]");
    model.setAmount(totalAmount);
    model.setPayerShowName("測試退款");
    model.setPayerRealName("沙箱環境");
    model.setRemark("Java陳序員 測試單筆轉賬到支付寶");

    try {
        return AliPayApi.transferToResponse(model).getBody();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

其他支付方式集成可參考:

https://github.com/Javen205/IJPay/tree/dev/IJPay-Demo-SpringBoot

總結

可以說,目前 IJPay 集成了大部分主流的支付渠道。可以全部集成到項目中,也可以按需載入某一種、某幾種支付渠道。

最後,貼上項目地址:

https://github.com/Javen205/IJPay

線上文檔地址:

https://javen205.gitee.io/ijpay/

最後

推薦的開源項目已經收錄到 GitHub 項目,歡迎 Star

https://github.com/chenyl8848/great-open-source-project

或者訪問網站,進行線上瀏覽:

https://chencoding.top:8090/#/

大家的點贊、收藏和評論都是對作者的支持,如文章對你有幫助還請點贊轉發支持下,謝謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ReentrantReadWriteLock讀寫鎖 樂觀鎖和悲觀鎖 樂觀鎖 樂觀鎖,就是給需要共用的數據,添加一個版本號version,例如1,每次有線程更新共用數據後,version+1,每次線程進行數據更新時,要比較當前線程持有的數據的版本號,相等則修改,不相等則不修改,支持併發訪問。 悲觀鎖 ...
  • 哈嘍大家好,我是鹹魚 接觸過 Python 的小伙伴應該對【字典】這一數據類型都瞭解吧 雖然 Python 沒有顯式名稱為“哈希表”的內置數據結構,但是字典是哈希表實現的數據結構 在 Python 中,字典的鍵(key)被哈希,哈希值決定了鍵對應的值(value)在字典底層數據存儲中的位置 那麼今天 ...
  • 0 大綱 [Apache Flink]2017年12月發佈的1.4.0版本開始,為流計算引入里程碑特性:TwoPhaseCommitSinkFunction。它提取了兩階段提交協議的通用邏輯,使得通過Flink來構建端到端的Exactly-Once程式成為可能。同時支持: 數據源(source) 和 ...
  • 一眨眼明天就周末了,一周過的真快! 今天咱們用Python來實現一下動態網頁數據的抓取 最近不是有消息說世界首富馬上要變成中國人了嗎,這要真成了,可就是歷史上首位中國世界首富了! 那我們就以富豪排行榜為例,爬取一下2023年國內富豪五百強,最後實現一下可視化分析。 準備工作 環境使用 Python ...
  • 來源:levelup.gitconnected.com/how-to-design-a-system-to-scale-to-your-first-100-million-users-4450a2f9703d 1 從頭開始 2 可擴展性的藝術 3 使用負載均衡器來均衡所有節點上的流量 4 擴展關係數 ...
  • 因PDF文檔具有較好的穩定性和相容性,現在越來越多的合同、研究論文、報告等都採用PDF格式。為了進一步保護這些重要文檔內容免受未經授權的複製或使用,我們可以添加水印以表明其狀態、所有權或用途。針對工作中可能出現的在 C++ 應用程式中給 PDF 文檔添加文字水印的需求,本文將詳細展示如何通過第三方國 ...
  • wmproxy wmproxy已用Rust實現http/https代理, socks5代理, 反向代理, 靜態文件伺服器,四層TCP/UDP轉發,七層負載均衡,內網穿透,後續將實現websocket代理等,會將實現過程分享出來,感興趣的可以一起造個輪子 項目地址 國內: https://gitee. ...
  • 消息系統 消息系統被用於各種場景,如解耦數據生產者,緩存未處理的消息。Kafka 可作為傳統的消息系統的替代者,與傳統消息系統相比,kafka有更好的吞吐量、更好的可用性,這有利於處理大規模的消息。 根據經驗,通常消息傳遞對吞吐量要求較低,但可能要求較低的端到端延遲,並經常依賴kafka可靠的dur ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...