IJPay 中的微信支付
官方参考文档
支付方式与支付工具
::: tip IJPay 中支持的支付方式以及支付工具 :::
- 付款码支付【商户模式】【服务商模式】
- 公众号支付(JSAPI 支付)【商户模式】【服务商模式】
- 扫码支付(Native 支付)【商户模式】【服务商模式】
- APP支付【商户模式】【服务商模式】
- H5 支付【商户模式】【服务商模式】
- 小程序支付【商户模式】【服务商模式】
- 人脸支付 【服务商模式】
- 企业付款到零钱/银行卡 【商户模式】
- 现金红包 【商户模式】【服务商模式】
使用步骤
- 添加相关依赖
- 找到相关支付方式的接口文档。构建请求参数 Model,并使用 https 执行请求
- 调用支付接口唤起支付并完成支付逻辑
微信支付 Model
IJPay 中常用支付方式涉及到的 Model
都是使用 builder
模式来构建,其中 Model 每个字段与官方接口文档保持一致,同时支持商户模式、服务商模式。
::: warning 为什么要使用 Lombok 来构建接口的请求参数?
1、使用 Lombok 来构建请求参数是为了方便,不用写太多的冗余 get set。
2、避免手动设置误写参数导致的低级错误。
外界对 Lombok 的评价也不太一致,喜欢的非常喜欢不喜欢的就使劲吐槽,那么 IJPay 中有其他的替代方案吗?
当然是有的,最简单粗暴的方法使用 Map 来构建请求参数,再使用 WxPayKit.buildSign
来构建签名即可。 IJPay 1.x 版本就是这么做的
:::
扩展 Model
由于支付方式的不同涉及到的接口非常多,如果某些接口的 Model 在 IJPay 没有提供封装,大家可以继承 BaseModel
所有属性字段名称与接口参数保持一致且必须为 String
类型,最后添加如下注解来实现 builder
模式。
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class CloseOrderModel extends BaseModel {
// 属性字段名称与接口参数保持一致
private String appid;
// 省略接口中的其他参数...
}
::: warning 前方高能
- 扩展 Model 必须继承 BaseModel
- 所有属性字段名称与接口参数保持一致且必须为
String
类型 - 必须添加 Lombok 注解
@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
- IDEA 必须安装 Lombok 插件 :::
构建参数并执行请求
- 根据接口需要的参数,使用 Model 构建除
sign
以外的参数 build
后根据接口的签名方式创建签名creatSign
- 使用 WxPayApi 提供的接口执行 https 请求
- 构建支付参数唤起支付
例如公众号支付(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);
::: tip 完整示例 公众号如何唤起支付,完整示例请参考 IJPay-Demo :::
多应用支持
微信支付的多应用支持方式与支付宝的多应用无缝切换一致,请参考 支付宝初始化
完整示例
::: tip IJPay 2.x 版本示例 :::
::: tip IJPay 1.x 版本示例 :::