IJPay 中的微信支付

官方参考文档

支付方式与支付工具

IJPay 中支持的支付方式以及支付工具

  1. 付款码支付【商户模式】【服务商模式
  2. 公众号支付(JSAPI 支付)【商户模式】【服务商模式
  3. 扫码支付(Native 支付)【商户模式】【服务商模式
  4. APP支付【商户模式】【服务商模式
  5. H5 支付【商户模式】【服务商模式
  6. 小程序支付【商户模式】【服务商模式
  7. 人脸支付 【服务商模式
  8. 企业付款到零钱/银行卡 【商户模式
  9. 现金红包 【商户模式】【服务商模式

使用步骤

  1. 添加相关依赖
  2. 找到相关支付方式的接口文档。构建请求参数 Model,并使用 https 执行请求
  3. 调用支付接口唤起支付并完成支付逻辑

微信支付 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
2
3
4
5
6
7
8
9

前方高能

  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);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

完整示例

公众号如何唤起支付,完整示例请参考 IJPay-Demo

多应用支持

微信支付的多应用支持方式与支付宝的多应用无缝切换一致,请参考 支付宝初始化

完整示例

IJPay 2.x 版本示例

IJPay 1.x 版本示例