首页 > 其他分享 >还在手动造轮子?试试这款可以轻松集成多种支付渠道的工具!

还在手动造轮子?试试这款可以轻松集成多种支付渠道的工具!

时间:2023-11-24 12:01:36浏览次数:33  
标签:集成 支付宝 公钥 String 手动 支付 轮子 model aliPayBean

大家好,我是 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/#/

大家的点赞、收藏和评论都是对作者的支持,如文章对你有帮助还请点赞转发支持下,谢谢!

标签:集成,支付宝,公钥,String,手动,支付,轮子,model,aliPayBean
From: https://blog.51cto.com/u_15644617/8547686

相关文章

  • 还在手动造轮子?试试这款可以轻松集成多种支付渠道的工具!
    大家好,我是Java陈序员。随着电商的兴起,各种支付也是蓬勃发展。微信支付、支付宝支付、银联支付等各种支付方式可是深入到日常生活中。可以说,扫码支付给我们的生活带来了极大的便利。同时,随着市场需求的变化,这也要求我们在企业开发中,需要集成第三方支付渠道!我们在集成第三方支......
  • R语言集成模型:提升树boosting、随机森林、约束最小二乘法加权平均模型融合分析时间序
    原文链接:http://tecdat.cn/?p=24148原文出处:拓端数据部落公众号 最近我们被要求撰写关于集成模型的研究报告,包括一些图形和统计输出。特别是在经济学/计量经济学中,建模者不相信他们的模型能反映现实。比如:收益率曲线并不遵循三因素的Nelson-Siegel模型,股票与其相关因素之间的......
  • R数据分析:集成学习方法之随机生存森林的原理和做法,实例解析
    很久很久以前给大家写过决策树,非常简单明了的算法。今天给大家写随机(生存)森林,随机森林是集成了很多个决策数的集成模型。像随机森林这样将很多个基本学习器集合起来形成一个更加强大的学习器的这么一种集成思想还是非常好的。所以今天来写写这类算法。 集成学习方法Ensembl......
  • Linux文本模式手动配置静态ip ubuntu改ip
    查看当前系统版本cat/etc/os-release查看当前网卡设备名ipaifcofig-a高版本的ubuntu没有interfaces:vim/etc/netplan/xxxxxxnetwork:ethernets:ens33:#配置的网卡的名称addresses:[192.168.8.9/24]#配置的静态ip地址和掩码dhcp4:false......
  • springboot 集成swagger3.0 并开启权限认证
    1.POM文件只需要引入一个依赖即可  2.swagger配置文件如下注意:要添加“@EnableWebMvc"注解,详细代码如下:@Configuration@EnableWebMvcpublicclassSwaggerConfig{@Value("${swagger.enabled}")booleanenabled;@BeanpublicDocketdocket(){r......
  • 在vue2.0 项目中集成 Electron 实现桌面端应用
    需求:在桌面端有个应用能直接打开项目,不用在浏览器中浏览。方案:vue2.0+Electron关于vue的项目搭建和electron的相关介绍可以去官网了解,这里是直接在已经开发好的vue2.0的项目中直接加入electron。electron介绍:参考1: https://electronjs.p2hp.com/参考2:https://www.......
  • SAP集成技术(七)集成解决方案咨询方法论(ISA-M)
    目前,ISA-M主要以MicrosoftPowerPoint演示文稿的形式提供。可以在SAPCommunity博客文章(https://blogs.sap.com/)以及关于ISA-M的SAPJam社区中找到补充性的文档和信息。尽管ISA-M是由SAP开发和维护的,但该方法论对所有SAP和非SAP集成解决方案都是开放的。因此,即使......
  • 新品推荐|Si24R03 一款集成2.4G+RISC-V核MCU低功耗SOC芯片
    Si24R03是-款高度集成的低功耗SOC芯片,其集成了基于RISC-V核的低功耗MCU和工作在2.4GHzISM频段的无线收发器模块。MCU模块具有低功耗、LowPinCount、宽电压工作范围,集成了13/14/15/16位精度的ADC、LVD、UART、SPI.I2C、TIMER、WUP、IWDG、RTC等丰富的外设。内核采用RISC-VR......
  • 【AGC】集成AGC服务上架应用市场审核问题
    ​【关键字】AGC、应用市场、审核 【问题描述】集成了AGC服务,上架到应用市场不通过,检查发现是com.huawei.secure.android.common.ssl.util.c.doInBackground存在获取安装列表行为。​已经按照sdk设置了,但是检测还是有授权前去获取安装列表。 【解决方案】经排查后集......
  • .NET8:快速集成Rapid.NET三维控件
    .NET8正式版本发布了,AnyCADRapid.NET针对.NET8进行了升级和优化。本文以WPF项目为例介绍在.NET8中使用AnyCADRapid.NET三维控件。1从.NET6升级若之前使用NET6升级到.NET8,升级过程非常简单,升级到AnyCADRapid.NET最新版本后,仅需要更改以下两处:(1).csproj文件<TargetFramewor......