一、业务流程图
先盗一张微信官方文档的流程图,嘿嘿
二、微信支付流程
- 导入依赖
<!--微信支付-->
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-apache-httpclient</artifactId>
<version>0.2.2</version>
</dependency>
- 统一下单:调用统一下单接口,返回一个预支付交易会话标识
- 调起微信支付:微信小程序端根据预支付标识(当然还有小程序id、随机字符串等其他参数,这些参数最好由后端统一返回,详情见具体代码)调起微信支付
- 微信支付操作:调起微信支付之后就可以做输入密码、确认支付等操作了
- 回调接口中做业务逻辑操作:在统一下单的时候需要给微信服务端提供一个回调接口,微信服务端会通过这个接口将支付状态返回给我们,我们通过这个状态做具体的业务业务逻辑操作,比如将微信支付状态更新为支付成功等
- 手动获取微信支付状态:如果因为某些原因导致微信服务端未能及时调用回调接口,我们可以去手动拉去微信支付状态,以保证订单状态的准确性。
三、签名和验签
调用微信支付接口都需要做签名验证,将拼接好的签名放进请求头中;微信在调用我们的回调接口时候也会有签名,我们也需要做相应的验签,以保证我们的回调接口是微信服务端调用。具体签名拼接方式以及验签方式下边代码会有具体实现,并且如果使用wechatpay-apache-httpclien也可以不用做签名和验签,sdk里会帮我们完成这些操作。具体的实现方式也可以看看sdk中的具体实现https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient
但是,我还是想说一说拼接签名时候踩过的坑。
- 所有接口需要的参数名以及参数类型一定要完全按照api文档去定义;否则如果与验签有关的参数会提示签名错误,与验签无关的参数统一下单接口正常,但是
小程序端在用预支付编码拉起微信支付的时候输入完密码就会一致加载 最后提示系统繁忙。
切记!切记!切记!切记!切记!切记!切记!
切记!切记!切记!切记!切记!切记!切记!
切记!切记!切记!切记!切记!切记!切记! - 构造签名串时候,行尾以 \n结束,包括最后一行。如果参数本身以\n结束或者请求主题为空,也需要附加一个\n。
- URL部分是绝对路径,比如你要调用获取微信支付平台证书接口,路径必须是/v3/certificates,而不能是https://api.mch.weixin.qq.com/v3/certificates
总结
第一次发博客,写的不好,请大家多多包涵,并且本人也是一只菜鸡,所以如果有什么不对的地方欢迎多多指教,在这里我也要感谢微信昵称为Shing的大佬(由于怕微信账号公布出来之后大佬被骚扰,这里就用昵称了),在我做微信支付期间给我很多帮助。最后附上微信支付代码的git地址https://gitee.com/zk_first_gitee/wechat-pay-v3.git