支付
1)修改前台页面,编写根据orderId查询order接口。为了我的乐优中的查看订单的功能,查询order顺带查出orderDetail与orderStatus。我们使用QrCode(Quick Response)来生成二维码。
2)创建PayHelper微信支付工具类,它需要WXPay,WXPay需要WXPayConfig(实现WXPayConfig接口)来注入属性。我们可以在PayHelper的构造方法中初始化WXPay,也可以将它做成@Configuration配置类。在service中调用,返回String类型的code_url。
3)用户支付后微信不仅返回给用户支付结果,同时异步通知商户支付结果,所以我们的程序要给微信提供一个接口。但是我们是在局域网内操作,因此使用NATAPP进行内网穿透。添加映射的本地端口为订单微服务,配置config.ini。因为拦截器拦截了所有路径,对没有token的用户进行拦截。所以我们修改拦截路径为/order/**,微信调用我们的接口写在NotifyController中。微信通过域名直接访问8089端口,即订单微服务,在根据请求路径执行相应的Controller,不经过网关。
4)编写notify接口。因为微信传过来的参数和要求返回的值都是xml格式,我们可以使用对象或者Map来接收。因为SpringMvc默认使用的消息转换器是用来json互转的,微信传递xml格式的参数会出错。所以我们添加xml消息转换器的依赖。这样mvc就会自动根据参数类型使用不同的转换器。注意在contorller上面添加producer="application/xml",表示返回的类型是xml。在notifyService中我们调用orderService,在里面完成商户应该做的操作(校验签名【PayHelper里完成】,校验订单金额,改变订单状态),然后将返回参数放在Map中传回给微信。
5)刷新支付页面出现错误,查看日志,发现是ORDERPAID错误码,即订单已支付。在前端查看校验,报错status不存在,一直以为是vue的问题,但是我查看响应体,发现orders根本没有orderStatus,是因为queryOrder的时候没set。
6)查询支付状态接口,我们根据订单状态来判断支付状态,返回PayState的value值给前端。所以需要先根据orderId查订单状态表,如果订单状态是除了1以外的其他值,那么代表已支付。但是是1的话不能确认就是未支付,有可能是因为网络延迟导致微信回调较慢,订单状态表还没变化。因此调用微信的查询订单状态接口,根据订单返回的状态转成我们自己的PayState。注意每次获得微信返回的result后都要校验状态,校验签名,校验金额。
7)项目打包。在idea中比如想要打包商品微服务,那么要在project-structure中将它的依赖(ly-item-interface,ly-common)export。然后添加maven插件的依赖。使用java -jar运行。