Springboot wechatpay-java 微信支付实践

月下飞天镜,云生结海楼。

1 前言

前文已经介绍了 SpringBoot-微信支付对接实践 的内容,相信大家对微信支付的对接流程有了一定的了解,在本文中将继续介绍微信官方另外一款 API,在使用方面更加的方便和灵活。在本文中将结合几项重要的业务场景对微信的支付流程进行实践操作。

2 环境准备

首先,我们需要引入对应的依赖,此外还要准备一个微信配置文件,用于初始化一些 bean 信息。

xml 复制代码
<!--   wechatpay-apache-httpclient  -->
<dependency>
    <groupId>com.github.wechatpay-apiv3</groupId>
    <artifactId>wechatpay-apache-httpclient</artifactId>
    <version>0.3.0</version>
</dependency>
        
<!--   wechatpay-java  -->
<dependency>
    <groupId>com.github.wechatpay-apiv3</groupId>
    <artifactId>wechatpay-java</artifactId>
    <version>0.2.15</version>
</dependency>

如下图所示,需要使用 RSAPublicKeyConfig.Builder 初始化 Config,然后使用这个配置文件初始化 JsapiServiceNativePayServiceRefundService。此外,对于微信的回调操作,需要初始化 NotificationParser 信息进行回调报文的解密和验签。

2 微信支付

微信支付方式很多,这里介绍 nativejsapiPay 两种方式。Native支付即服务商模式,通过该种方式下单,会返回一个 code_url ,根据此生成二维码,用户通过扫一扫打开支付页面,可以确认金额和收款人,确认后进行支付。jsapiPay 即微信内置浏览器或者小程序支付场景,用户下单后返回 prepay_id,前端通过此信息拉起微信收银台进行支付。此外还有 app 支付和 H5 支付两者支付场景。每一种支付场景对应的业务类型不同,需要根据业务的应用场合开通对应的服务。

这里需要说明的是,在下单参数里面不仅要传订单金额(需要转换成分)、title 信息、订单号以及回调地址。还可以根据不同的业务单设置 attach, 用于区分不同的业务订单和支付场景。不过对于 jsapipay 的发那个还是,还需要生成一些信息提供给前端,诸如 nonceStr、时间戳、签名等信息,用于拉起微信收银台。

3 微信退款

微信支付的场景有很多,但是对于微信的退款,方式是固定的,如下图所示:

这里的退款需要设置原交易单号和本次退款的请求号,退款原因等信息,这里的退款金额也需要设置为分,并且类型是 long。在选择退款账户时,一般选择的是可用余额。

4 支付回调

支付完成后,微信会通过支付时传递的回调地址回调支付结果,服务端需要在处理完业务流程之后,返回成功或者错误信息,如果是异常场景,微信会认为回调失败,会间隔时间进行重试。在接收到回调信息时,需要读取请求头和请求内容,统一封装成 RequestParam 对象,然后通过 parser 的parse 方法转换成对应的支付响应对象。需要注意的是,在这一步会进行解密以及验签操作。

在业务场景中,通常不会只有等待微信回调一种方式,还会对接微信的支付查询接口,通过回调+定时任务轮询补偿的方式,确保业务订单能够及时的处理。需要注意的是,在处理业务订单流程时,需要保证接口方法的幂等性。

5 退款回调

退款的回调和支付场景的回调类似,在接收到退款回调时,需要判断退款的状态,获取订单信息后在进行业务退款单的处理,退款的场景通过比较复杂,涉及到许多逆向流程的处理,这里需要注意接口的幂等和条件的判断。

6 总结

本文主要介绍了如何对接微信支付,并且列举了其支付和退款、订单和退款单的回调场景,至于支付单和退款单的查询比较简单,没有单列进行分享,在代码中有对应的示例代码。本文中所涉及的代码已经上传至 github, 欢迎交流学习。项目地址 sandbox-stock

相关推荐
orient5 小时前
CompletableFuture 源码深度解析:6 大 API + 链式编排实战
后端
沐言人生5 小时前
HelloAgentR工程手记1/100天——项目工作流搭建
spring boot·agent·vibecoding
Zane19945 小时前
map 比推导式快"是真的吗?一文讲透 map、filter、reduce 与 lambda 的真实性能与设计取舍
后端·python
字节跳动数据库5 小时前
火山引擎 RDS MySQL 向量索引:把高性能向量检索带到 MySQL 上
人工智能·后端·mysql
拖孩5 小时前
用 AI 重解千年观音灵签,做了一个微信小程序,每天摇一摇,命运给你回应
前端·后端·微信小程序
Python私教5 小时前
AI Agent 可观测性不只是日志:一套可回放的多步执行链
人工智能·后端·python
Python私教5 小时前
模型越强越不需要 Skills?我把 AI 编程能力拆成 4 层
人工智能·后端·python
云烟成雨TD6 小时前
Micrometer 系列【33】Spring Boot Micrometer Metrics 自动配置模块解析
spring boot·云原生·micrometer
名字还没想好☜6 小时前
Go 的 io.Reader/Writer 组合实战:io.Copy、TeeReader、MultiWriter 优雅处理数据流
开发语言·后端·golang·go·iphone
喵个咪7 小时前
GoWind Shop 架构剖析:一个 REST 请求穿越三服务 BFF 的七环链路
vue.js·后端·go