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

相关推荐
.生产的驴17 分钟前
SpringBoot 封装统一API返回格式对象 标准化开发 请求封装 统一格式处理
java·数据库·spring boot·后端·spring·eclipse·maven
景天科技苑26 分钟前
【Rust】Rust中的枚举与模式匹配,原理解析与应用实战
开发语言·后端·rust·match·enum·枚举与模式匹配·rust枚举与模式匹配
晨集27 分钟前
Uni-App 多端电子合同开源项目介绍
java·spring boot·uni-app·电子合同
时间之城29 分钟前
笔记:记一次使用EasyExcel重写convertToExcelData方法无法读取@ExcelDictFormat注解的问题(已解决)
java·spring boot·笔记·spring·excel
追逐时光者1 小时前
MongoDB从入门到实战之Docker快速安装MongoDB
后端·mongodb
方圆想当图灵1 小时前
深入理解 AOP:使用 AspectJ 实现对 Maven 依赖中 Jar 包类的织入
后端·maven
豌豆花下猫1 小时前
Python 潮流周刊#99:如何在生产环境中运行 Python?(摘要)
后端·python·ai
嘻嘻嘻嘻嘻嘻ys2 小时前
《Spring Boot 3 + Java 17:响应式云原生架构深度实践与范式革新》
前端·后端
异常君2 小时前
线程池隐患解析:为何阿里巴巴拒绝 Executors
java·后端·代码规范
mazhimazhi2 小时前
GC垃圾收集时,居然还有用户线程在奔跑
后端·面试