月下飞天镜,云生结海楼。
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
,然后使用这个配置文件初始化 JsapiService
、NativePayService
和 RefundService
。此外,对于微信的回调操作,需要初始化 NotificationParser
信息进行回调报文的解密和验签。

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

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

这里的退款需要设置原交易单号和本次退款的请求号,退款原因等信息,这里的退款金额也需要设置为分,并且类型是 long
。在选择退款账户时,一般选择的是可用余额。
4 支付回调
支付完成后,微信会通过支付时传递的回调地址回调支付结果,服务端需要在处理完业务流程之后,返回成功或者错误信息,如果是异常场景,微信会认为回调失败,会间隔时间进行重试。在接收到回调信息时,需要读取请求头和请求内容,统一封装成 RequestParam
对象,然后通过 parser 的parse 方法转换成对应的支付响应对象。需要注意的是,在这一步会进行解密以及验签操作。

在业务场景中,通常不会只有等待微信回调一种方式,还会对接微信的支付查询接口,通过回调+定时任务轮询补偿的方式,确保业务订单能够及时的处理。需要注意的是,在处理业务订单流程时,需要保证接口方法的幂等性。
5 退款回调
退款的回调和支付场景的回调类似,在接收到退款回调时,需要判断退款的状态,获取订单信息后在进行业务退款单的处理,退款的场景通过比较复杂,涉及到许多逆向流程的处理,这里需要注意接口的幂等和条件的判断。

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