《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个开源的聚合支付框架,支持微信支付、支付宝支付等——IJPay。
IJPay 封装了微信支付、QQ支付、支付宝支付、京东支付、银联支付、PayPal 支付等常用的支付方式以及各种常用的接口。不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。
功能特性
简洁至上
以 Module 为中心的项目结构,简洁方便易扩展,发布后总包体不超过 2M。
开箱即用
不依赖任何第三方 MVC 框架,仅仅作为工具使用,简单快速完成支付模块的开发,可轻松嵌入到任何系统里。
渠道丰富1
-
• 微信支付:支持多应用多商户,支持普通商户模式与服务商商模式当然也支持境外、同时支持 Api-v 3 与 Api-v2 版本的接口。
-
• 支付宝支付:支持多应用,签名同时支持普通公钥方式与公钥证书方式。
-
• 银联支付:全渠道扫码支付、微信 App 支付、公众号&小程序支付、银联 JS 支付、支付宝服务窗支付。
-
• 个人微信支付:微信个人商户,最低费率 0.38%,官方直连的异步回调通知。
-
• PayPal 支付:自动管理 AccessToken,极速接入各种常用的支付方式。
极简入门
IJPay 一直以简洁至上、开箱即用为核心,提供完整示例简单修改配置即可使用。
接入微信支付示例
添加依赖
-
• 一次性添加所有支付方式的依赖
<dependency>
<groupId>com.github.javen205</groupId>
<artifactId>IJPay-All</artifactId>
<version>latest-version</version>
</dependency>
-
• 或者只添加所需支付方式的依赖
<dependency>
<groupId>com.github.javen205</groupId>
<artifactId>IJPay-WxPay</artifactId>
<version>latest-version</version>
</dependency>
构建请求参数 Model
IJPay 中常用的支付方式涉及到的 Model 都是使用 builder
模式来构建,其中 Model 每个字段与官方接口文档保持一致,同时支持商户模式、服务商模式。
为什么要使用 Lombok 来构建接口的请求参数?
-
1. 使用 Lombok 来构建请求参数是为了方便,不用写太多的冗余 get set。
-
2. 避免手动设置误写参数导致的低级错误。
外界对 Lombok 的评价也不太一致,喜欢的非常喜欢不喜欢的就使劲吐槽,那么 IJPay 中有其他的替代方案吗?当然是有的,最简单粗暴的方法使用 Map 来构建请求参数,再使用 WxPayKit.buildSign
来构建签名即可。IJPay 1.x 版本就是这么做的
扩展 Model
由于支付方式的不同涉及到的接口非常多,如果某些接口的 Model 在 IJPay 没有提供封装,大家可以继承 BaseModel 所有属性字段名称与接口参数保持一致且必须为 String
类型,最后添加如下注解来实现 builder
模式。
@Builder
@AllArgsConstructor
@Getter
@Setter
public class CloseOrderModel extends BaseModel {
// 属性字段名称与接口参数保持一致
private String appid;
// 省略接口中的其他参数...
}
前方高能
-
1. 扩展 Model 必须继承 BaseModel
-
2. 所有属性字段名称与接口参数保持一致且必须为
String
类型 -
3. 必须添加 Lombok 注解
@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
-
4. IDEA 必须安装 Lombok 插件
构建参数并执行请求
-
1. 根据接口需要的参数,使用 Model 构建除
sign
以外的参数 -
2.
build
后根据接口的签名方式创建签名creatSign
-
3. 使用 WxPayApi 提供的接口执行
https
请求 -
4. 构建支付参数唤起支付
例如公众号支付(JSAPI 支付)的统一下单:
// 统一下单构建请求参数
Map<String, String> params = UnifiedOrderModel
.builder()
.appid(wxPayBean.getAppId())
.mch_id(wxPayBean.getMchId())
.nonce_str(WxPayKit.generateStr())
.body("IJPay 让支付触手可及")
.attach("Node.js 版:https://gitee.com/javen205/TNWX")
.out_trade_no(WxPayKit.generateStr())
.total_fee("1000")
.spbill_create_ip(ip)
.notify_url(wxPayBean.getDomain().concat("/wxpay/pay_notify"))
.trade_type(TradeType.JSAPI.getTradeType())
.openid(openId)
.build()
// 同时支持 SignType.MD5、SignType.HMACSHA256
.creatSign(wxPayBean.getPartnerKey(), SignType.HMACSHA256);
// 发送请求
String xmlResult = WxPayApi.pushOrder(false,params);
// 将请求返回的 xml 数据转为 Map,方便后面逻辑获取数据
Map<String, String> resultMap = WxPayKit.xmlToMap(xmlResult);
// 判断返回的结果
String returnCode = resultMap.get("return_code");
String returnMsg = resultMap.get("return_msg");
if (!WxPayKit.codeIsOk(returnCode)) {
return new AjaxResult().addError(returnMsg);
}
String resultCode = resultMap.get("result_code");
if (!WxPayKit.codeIsOk(resultCode)) {
return new AjaxResult().addError(returnMsg);
}
// 以下字段在return_code 和result_code都为SUCCESS的时候有返回
String prepayId = resultMap.get("prepay_id");
// 二次签名,构建公众号唤起支付的参数,这里的签名方式要与上面统一下单请求签名方式保持一致
Map<String, String> packageParams = WxPayKit.prepayIdCreateSign(prepayId,
wxPayBean.getAppId(),wxPayBean.getPartnerKey(),SignType.HMACSHA256);
// 将二次签名构建的数据返回给前端并唤起公众号支付
String jsonStr = JSON.toJSONString(packageParams);
return new AjaxResult().success(jsonStr);
-END-
开源协议:木兰1.0
开源地址:https://github.com/Javen205/IJPay
原文始发于微信公众号(开源技术专栏):快速完成支付模块的开发,轻松嵌入到任何系统里
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/53753.html