本期推荐的是一个SpringBoot风格微信和支付宝支付开发包——Payment Spring Boot。
大部分的 Java Web 项目都会使用 Spring,尤其是 Spring Boot。所以该项目作者选择了直接构建于Spring依赖之上的支付开发包。项目最开始实现微信支付的时候刚好是微信支付V3版本的 API公布了。相比较于 V2版本:
- 遵循统一的 Restful 的设计风格
- 使用 JSON 作为数据交互的格式,不再使用XML
- 使用基于非对称密钥的 SHA256-RSA 的数字签名算法,不再使用 MD5 或 HMAC-SHA256
- 不再要求 HTTPS 客户端证书
- 使用 AES-256-GCM,对回调中的关键信息进行加密保护
这种开发体验要远远好于之前的 V2,因此选择了微信支付V3。
目前支持的渠道
- 微信支付V3 全量支持,并支持多租户同时满足移动应用App、公众号、小程序等支付场景
- 支付宝 集成SDK,做了简单适配
功能
- 实现微信支付多商户
- 集成支付宝SDK、快速接入Spring Boot
- 实现微信支付V3 基础支付
- 实现微信支付V3 合单支付
- 实现微信支付V3 代金券
- 实现微信支付V3 微信支付分
- 实现微信支付V3 先享卡
- 实现微信支付V3 商家券
- 实现微信支付V3 批量转账到零钱
采用技术
只依赖了 Spring已有的东西,做到了低依赖。
- Spring
- Jackson
- Ali-pay-sdk
核心API架构
快速接入
1. Maven依赖
<dependency>
<groupId>cn.felord</groupId>
<artifactId>payment-spring-boot-starter</artifactId>
<version>1.0.11.RELEASE</version>
</dependency>
2. Spring Boot 版本适配
需要自行克隆项目,修改根目录下的pom.xml以下配置项:
<properties>
<!-- 修改为你对应的Spring Boot版本号 -->
<spring-boot.version>2.4.0</spring-boot.version>
</properties>
3. 安装
以 Spring Boot Starter 的形式集成到项目中。从GitHub项目地址拉取 release 分支到本地后使用以下两种方式之一进行环境集成:
- mvn install 安装到本地
- mvn deploy 部署到Maven仓库
然后引用Maven坐标,请注意 ${
payment-spring-boot-starter.version} 要同你安装的一致。
<dependency>
<groupId>cn.felord</groupId>
<artifactId>payment-spring-boot-starter</artifactId>
<version>${payment-spring-boot-starter.version}</version>
</dependency>
4. 微信支付配置
在Spring Boot项目中的 application.yaml 中配置 wechat.pay.v3 相关参数。
wechat:
pay:
v3:
# 租户id
<tentantID>:
# 应用appId 服务商模式下为服务商的appid 必填
app-id: xxxxxxxx
# v2 api 密钥 1.0.5版本以后如果用到V2的接口时必填
app-secret: xxxxxxxxxxx
# api v3 密钥 必填
app-v3-secret: xxxxxxxx
# 微信支付商户号 服务商模式下为服务商的mchid 必填
mch-id: xxxxxxx
# 商户服务器域名 用于回调 需要放开回调接口的安全策略 必填
domain: https://felord.cn
# 商户 api 证书路径 必填 填写classpath路径 位于 maven项目的resources文件下
cert-path: apiclient_cert.p12
微信支付 tentantID 场景说明
当项目中需要同时支持微信App支付、微信公众号支付、微信小程序支付时,上述配置中的 app-id 可能为多个,因此我们需要进行路由标识以区分它们,所以这里需要你定义一个 tentanID 来进行标识。假如我们同时有App支付和微信小程序支付,我们应该这样配置:
wechat:
pay:
v3:
# App租户租户标识为 mobile
mobile:
app-id: wx524534x423234
app-secret: felord
app-v3-secret: 0e5b123323h12234927e455703ec
mch-id: 1603337223
domain: https://felord.cn/mobile
cert-path: mobile/apiclient_cert.p12
# 微信小程序租户标识为 miniapp
miniapp:
app-id: wx344123x3541223
app-secret: felord
app-v3-secret: 0e5b123323h12234927e455703ec
mch-id: 1603337223
domain: https://felord.cn/miniapp
cert-path: miniapp/apiclient_cert.p12
注意:在一套系统中需要开发者保证 tentanID 唯一。
5. 启用配置
配置完毕后需要启用 @EnableMobilePay 注解来开启支付功能:
@EnableMobilePay
@Configuration
public class PayConfig {
}
6. 使用API
微信支付V3开放接口都是通过 WechatApiProvider 引入的,当启用配置步骤完成后会被初始化并注入了Spring IoC,可通过如下形式引入:
@Autowired
WechatApiProvider wechatApiProvider;
WechatApiProvider 需要开发者明确租户IDtenantID以初始化具体场景的Api。例如查询终端用户在租户 mobile 下的优惠券:
// 查询商户下的优惠quan
@Test
public void v3MchStocks() {
// 配置文件中对应的tenantID:
String tenantId =“mobile”;
StocksQueryParams params = new StocksQueryParams();
params.setOffset(0);
params.setLimit(10);
WechatResponseEntity<ObjectNode> objectNodeWechatResponseEntity = wechatApiProvider.favorApi(tenantId).queryStocksByMch(params);
System.out.println("objectNodeWechatResponseEntity = " + objectNodeWechatResponseEntity);
}
更多内容大家可自行前往阅读。