快速完成支付模块的开发,轻松嵌入到任何系统里

《开源精选》是我们分享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. 1. 使用 Lombok 来构建请求参数是为了方便,不用写太多的冗余 get set。

  2. 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. 1. 扩展 Model 必须继承 BaseModel

  2. 2. 所有属性字段名称与接口参数保持一致且必须为 String 类型

  3. 3. 必须添加 Lombok 注解 @Builder @AllArgsConstructor(access = AccessLevel.PRIVATE) @Getter

  4. 4. IDEA 必须安装 Lombok 插件

构建参数并执行请求

  1. 1. 根据接口需要的参数,使用 Model 构建除 sign 以外的参数

  2. 2. build 后根据接口的签名方式创建签名 creatSign

  3. 3. 使用 WxPayApi 提供的接口执行 https 请求

  4. 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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!