注册

某用户说他付钱了订单状态未修改




背景


某项目中有一个收费业务,生成订单,订单状态为待支付。在移动端上打开该功能时可查看到待支付的订单,然后用户可以对待支付的订单进行支付。但偶尔出现客户反馈支付后订单还是待支付的状态,导致用户无法继续使用接下来的功能,导致用户的体验行特别差。重新梳理一遍,排查该问题。


涉及服务:



  • server1 主服务业务,提供所有业务的服务;
  • m-server:提供移动端 H5 视图和部分业务功能,部分功能业务都直接请求 server1;

总体架构


2022-09-02-10-11-16-image.png


总体流程:



  • 用户打开移动端应用时,由 m-server 提供页面视图;
  • 移动端相关业务数据由 server1 提供,即用户请求时,会到 m- server 再由其转发到 server1 服务上;
  • 相关支付业务由 m-server 服务与微信支付交互,支付完成后再由 m-server 与 server1 交互,同步订单的状态;

详细支付时序图:


支付流程的时序图,可以参考微信的官网:pay.weixin.qq.com/wiki/doc/ap…


支付流程:



  • 用户点击支付时,向 m-server 发起支付,然后生成订单
  • 向微信支付发起生成预付单
  • 点击微信支付的支付,此时会与微信支付进行验证支付授权权限
  • 微信返回支付授权,然后用户输入密码,确认支付,向微信支付服务提交授权
  • 微信支付返回支付结果给用户,并发微信消息提醒,同时会向 m-server 异步通知支付结果
  • m-server 接收到支付结果将同步给 server ,然后server 变更订单状态结果
  • m-server 显示最后结果给用户,如支付成功的订单详情

订单状态同步设计:


2022-09-02-10-34-24-image.png


订单状态流程:



  • server1 生成订单并记录到 db 中
  • m-server 从 server 中获取到订单的列表
  • m-server 接收到微信支付成功时,就会告知 server 支付成功,然后由 server 将订单状态修改为已支付

问题分析


已支付成功了,但订单状态却还是未支付成功?


首先,订单的状态由待支付到支付成功,必须是由微信支付服务异步通知 m-server 支付成功,然后再由 m-server 通知 server1 去修改订单状态。


所以,无论 m-server 还是 server1 服务在支付期间发生抖动都可能导致支付成功的信息成功通知给 server1 ,从而导致订单状态修改失败。还有一种可能性,微信支付服务可能没有异步通知。毕竟是第三方发起通知,所以也可能发生未通知情况。


优化方案


为了保证订单状态最终结果状态一致性,需要增加服务高可用,且可以支持自动重新发送订单状态变更的请求,及时重发重试。


详细设计


2022-09-02-10-45-00-image.png



  • m-server 确认支付时也将订单信息进行存储,状态为待支付
  • m-server 接收到微信支付成功通知后,就转发告知server1 服务
  • server1 修改订单状态进行响应,m-server 接收到响应进行删除或者修改订单状态(可按需进行),m-server 这里订单信息没有用了就也可以删除
  • 同时开启一个异步轮询 m-server 存储的订单信息,对于订单状态是待支付的,进行重发重试。这个过程需要先和微信支付服务确认确实是已支付,然后再将信息重新发送 server1,告知将订单状态调整为已支付

// 定时轮询订单信息状态
func notifyAuto() {
// 异步定时监控订单状态的变化
var changeOrder = func() {
result := orderService.getUnPayOrder(0) // 获取当前未支付状态的订单
if len(result) > 0 {
for v := range result {
status := wechat.getOrderStatus(v.orderId)
if status == 1 { // 订单在微信上时已支付的,需重新调用server 修改订单状态
orderService.sendOrderFinish(v.orderId)
}
}
}
}

go func() {
time.AfterFunc(time.Minute*10, changeOrder)
}()
}
复制代码
作者:小雄Ya
来源:juejin.cn/post/7138609603356901413
>

0 个评论

要回复文章请先登录注册