1. 前言
距离上次发原创分享应该有 12 天了,最近忙里忙外的,无论是 Spring Security OAuth2 相关的,还是微信支付相关的都留了很多坑没有来得及去补,所以十分抱歉。今天得空赶紧分享一些有用的东西。今天就分享一下关于微信支付代金券的一些开发知识。
2. 微信支付营销
微信支付提供了商家券、代金券、立减金等营销能力来帮助商家进行拉新保活,增强与用户的互动性。从开发层面上来说比接入微信支付要难一些,而且涉及的策略也会更多一些。那么本次分享胖哥将分享自己的一些经验。
3. 开发前准备
开发前我们需要申请微信支付相关的账号,手续还是比较多的。
微信商户账号
地址为https://pay.weixin.qq.com 用来开通微信支付能力,没有商户号是无法使用微信支付的。而且后续申请的公众号 appid 和移动应用、小程序的 appid 都要同微信商户帐号进行绑定。
微信开放平台账号
地址为https://open.weixin.qq.com 用来开发第三方平台、移动应用、公众平台、网站应用的开发。后续申请的微信公众号服务号、移动应用 appid 需要绑定到开放平台中。
微信公众平台服务号
通过https://mp.weixin.qq.com申请, 切记是服务号,不是订阅号,也不是个人号!服务号才是企业开发用的。申请认证完毕后需要同微信商户帐号和微信开放平台帐号进行绑定。
具体的操作步骤去查看官方指引,总之需要准备的材料是比较多的,而且走的流程也比较多,需要专人去办理。
4. 微信支付 V3
在之前对微信支付 V3 的一些难点胖哥也做了一些介绍。其实这个东西你研究了才会发现,无论微信支付也好还是支付宝也好都是下面的流程:
- 收集对应 API 的参数。
- 对参数进行签名。
- 请求对应的 API
- 对响应的来源的验证以确保响应来自支付服务器。
- 对响应进行解析。
- 对回调请求的响应。
所以针对上面的流程,胖哥做了一个小小的模型设计,以代金券创建为例:
代码语言:javascript复制/**
* 创建代金券批次API.
*
* @param params the params
* @return the wechat response entity
*/
public WechatResponseEntity<ObjectNode> createStock(StocksCreateParams params) {
WechatResponseEntity<ObjectNode> wechatResponseEntity = new WechatResponseEntity<>();
// 1. 根据请求类型组织参数
this.client().withType(WechatPayV3Type.MARKETING_FAVOR_STOCKS_COUPON_STOCKS, params)
// 2. 对参数进行归纳处理
.function(this::createStocksFunction)
// 3. 嵌入对结果进行消费的逻辑
.consumer(wechatResponseEntity::convert)
.request();
return wechatResponseEntity;
}
无论微信支付 V3 的哪个 API 都可以按照上面的模型进行封装。
5. 微信支付开发包
针对上面的设计,以 Spring Boot Starter 的形式封装了一个开发包,第三方依赖几乎为零。仅仅使用了 Spring 框架提供的RestTemplate
和Jackson
类库。目前对代金券封装已经结束并进行了测试,其它的 API 封装只剩下体力活了,我会尽快完善。
github : https://github.com/NotFound403/payment-spring-boot.git
集成
以Spring Boot Starter的形式集成到项目中,目前并没有提交到 maven 中央仓库,需要自己编译安装。
代码语言:javascript复制 <dependency>
<groupId>cn.felord</groupId>
<artifactId>payment-spring-boot-starter</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>
配置
在 Spring Boot 项目中的application.yaml
中配置wechat.pay
相关参数。
wechat:
pay:
v3:
# 应用appId 必填
app-id: xxxxxxxx
# api 密钥 必填
app-secret: xxxxxxxxxxx
# api v3 密钥 必填
app-v3-secret: xxxxxxxx
# 微信支付商户号 必填
mch-id: xxxxxxx
# 合作商 选填
partner-key:
# 商户服务器域名 用于回调 需要放开回调接口的安全策略 必填
domain: https://xxxx.xxx.com
# 商户 api 证书 必填
cert-path: apiclient_cert.p12
# 微信服务号 优惠券必须
mp:
app-id: xxxxxxxxx
app-secret: xxxxxxxxxxxxxxxxxxx
然后启用@EnableWechatPay
注解:
@EnableMobilePay
@Configuration
public class PayConfig {
}
请注意:只有
wechat.pay.v3.app-id
设置了有效值才能启用下面的 API。
API 使用
微信支付 V3 开放接口引入:
代码语言:javascript复制 // 支付API
@Autowired
WechatPayApi wechatPayV3Api;
// 营销API
@Autowired
WechatMarketingApi wchatMarketingApi;
例如查询优惠券
代码语言:javascript复制 // 查询商户下的优惠券
@Test
public void v3MchStocks() {
StocksQueryParams params = new StocksQueryParams();
params.setOffset(0);
params.setLimit(10);
WechatResponseEntity<ObjectNode> objectNodeWechatResponseEntity = wechatPayV3Api.queryStocksByMch(params);
System.out.println("objectNodeWechatResponseEntity = " objectNodeWechatResponseEntity);
}
如果你在微信支付中有什么疑问可以给我留言,知无不答。感谢对胖哥的关注。
Java中的微信支付(3):API V3对微信服务器响应进行签名验证
2020-10-30
Java中的微信支付(2):API V3 微信平台证书的获取与刷新
2020-10-27
Java中的微信支付(1):API V3版本签名详解
2020-10-24