当前位置: 首页 > news >正文

与国外公司合作网站建设上海公司网站如何开通微信支付接口

与国外公司合作网站建设上海公司,网站如何开通微信支付接口,安微省建设厅田网站,哪个网站可以免费建站啊免费建网站在支付系统中,如何确保支付状态的准确传递和处理显得尤为重要。今天,我们将以一个支付流程为例,探讨在引入RabbitMQ前后的实现和优化。 改造前 在引入RabbitMQ之前,我们通常会直接在支付方法中完成所有的操作。这包括查询支付单…

在支付系统中,如何确保支付状态的准确传递和处理显得尤为重要。今天,我们将以一个支付流程为例,探讨在引入RabbitMQ前后的实现和优化。

改造前

在引入RabbitMQ之前,我们通常会直接在支付方法中完成所有的操作。这包括查询支付单、判断状态、扣减余额、修改支付单状态以及通知订单服务等。以下是一个典型的实现:

@Override
@Transactional
public void tryPayOrderByBalance(PayOrderFormDTO payOrderFormDTO) {// 1.查询支付单PayOrder po = getById(payOrderFormDTO.getId());// 2.判断状态if (!PayStatus.WAIT_BUYER_PAY.equalsValue(po.getStatus())) {// 订单不是未支付,状态异常throw new BizIllegalException("交易已支付或关闭!");}// 3.尝试扣减余额userClient.deductMoney(payOrderFormDTO.getPw(), po.getAmount());// 4.修改支付单状态boolean success = markPayOrderSuccess(payOrderFormDTO.getId(), LocalDateTime.now());if (!success) {throw new BizIllegalException("交易已支付或关闭!");}// 5.修改订单状态tradeClient.markOrderPaySuccess(po.getBizOrderNo());
}
代码解读
  1. 查询支付单:通过支付单ID查询对应的支付单信息。
  2. 判断支付状态:检查支付单状态是否为“等待买家付款”,如果状态异常则抛出业务异常。
  3. 扣减用户余额:调用用户服务,尝试扣减用户余额。
  4. 修改支付单状态:如果扣减余额成功,则更新支付单状态为“支付成功”。
  5. 通知订单服务:直接调用订单服务,更新订单状态。
存在的问题
  1. 强耦合:支付服务和订单服务强耦合,修改其中一个模块可能会影响到另一个模块。
  2. 失败处理:如果在某一步骤失败,整个流程需要回滚,复杂度增加。
  3. 可扩展性差:难以扩展其他需要在支付成功后进行处理的业务逻辑。

改造后

为了提高系统的可靠性和可维护性,我们引入RabbitMQ来实现支付状态的异步通知。改造后的代码如下:

@Override
@Transactional
public void tryPayOrderByBalance(PayOrderFormDTO payOrderFormDTO) {// 1.查询支付单PayOrder po = getById(payOrderFormDTO.getId());// 2.判断状态if (!PayStatus.WAIT_BUYER_PAY.equalsValue(po.getStatus())) {// 订单不是未支付,状态异常throw new BizIllegalException("交易已支付或关闭!");}// 3.尝试扣减余额userClient.deductMoney(payOrderFormDTO.getPw(), po.getAmount());// 4.修改支付单状态boolean success = markPayOrderSuccess(payOrderFormDTO.getId(), LocalDateTime.now());if (!success) {throw new BizIllegalException("交易已支付或关闭!");}// 5.发送支付成功消息try {rabbitTemplate.convertAndSend("pay.direct", "pay.success", po.getBizOrderNo());} catch (AmqpException e) {log.error("发生支付状态通知失败,订单id:{}", po.getBizOrderNo(), e);}
}public boolean markPayOrderSuccess(Long id, LocalDateTime successTime) {return lambdaUpdate().set(PayOrder::getStatus, PayStatus.TRADE_SUCCESS.getValue()).set(PayOrder::getPaySuccessTime, successTime).eq(PayOrder::getId, id)// 支付状态的乐观锁判断.in(PayOrder::getStatus, PayStatus.NOT_COMMIT.getValue(), PayStatus.WAIT_BUYER_PAY.getValue()).update();
}
代码解读
  1. 查询支付单:通过支付单ID查询对应的支付单信息。
  2. 判断支付状态:检查支付单状态是否为“等待买家付款”,如果状态异常则抛出业务异常。
  3. 扣减用户余额:调用用户服务,尝试扣减用户余额。
  4. 修改支付单状态:如果扣减余额成功,则更新支付单状态为“支付成功”。
  5. 发送支付成功消息:通过RabbitMQ发送支付成功的消息,通知其他系统或服务支付已完成。
异步通知的实现

改造后的系统中,我们通过RabbitMQ实现了异步消息通知。以下是支付状态监听器的实现:

@Component
@RequiredArgsConstructor
public class PayStatusListener {private final IOrderService orderService;@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "trade.pay.success.queue", durable = "true"),exchange = @Exchange(name = "pay.direct"),key = "pay.success"))public void listenPaySuccess(Long orderId) {orderService.markOrderPaySuccess(orderId);}
}
监听器解读
  1. 监听队列:绑定支付成功的队列和交换机,并指定路由键。
  2. 处理消息:监听到支付成功的消息后,调用订单服务更新订单状态。

总结

通过引入RabbitMQ,我们实现了支付状态的异步通知,解决了系统强耦合、失败处理复杂、可扩展性差的问题。RabbitMQ不仅提高了系统的可靠性,还使得系统更加易于维护和扩展。

http://www.yayakq.cn/news/274257/

相关文章:

  • 网站动态图片如何做免费商城网站建设平台
  • 佛山百度网站快速优化泰钢材企业网站源码
  • 最新钓鱼网站源码十大传媒公司
  • 企业1级域名网站怎么做怎样重新安装wordpress
  • 建立电子商务网站目的做外贸自己做网站么
  • 郑州做网站公司电话网站统计cnzz
  • 兰州模板网站seo价格针对网站开发者的问答网站
  • 潍坊正规网站建设公司wordpress 评论代码
  • 广东网站设计品牌设计中国施工企业协会官网
  • 兰州网站建设wordpress布局模板
  • 易无忧建站广州软件开发培训机构有哪些
  • 深圳龙华建设局官方网站网站界面设计的相关指南
  • 个人如何在企业网站做实名认证新手怎么注册自媒体账号
  • 如何建微信微商城网站wordpress主题实例制作
  • 腾讯 微商 网站 建设软件工程师报名官网
  • 企业网站icp是什么wordpress给幻灯片添加图片
  • 对网站建设 意见和建议怎样做旅游网站
  • 淮安网站定制泉州市培训建设系统中心网站
  • 网站开发选题背景WordPress热门排行榜插件
  • 网站 左右浮动 广告宿迁房产网信息网
  • 高级网站开发工程师考试题东莞网页网站制作
  • 宁波模版建站公司品牌注册怎么注册
  • 主营商城网站建设网站2级域名 还是子目录
  • 正能量网站有哪些东莞代理公司注册
  • 南通做网站优化的公司中国造价工程建设监理协会网站
  • 响应式网站尺寸节点北方工业大学网站建设
  • 有专门做最佳推荐的网站加拿大28网站开发
  • 长尾词挖掘工具爱站网公司简介模板100字范文
  • 可以做pos机的网站怎么知道网站的ftp
  • 网站代付系统怎么做北京seo服务商找行者seo