校验订单实现|学习笔记

简介: 快速学习校验订单实现

开发者学堂课程【RocketMQ 知识精讲与项目实战(第二阶段)校验订单实现】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/703/detail/12412


校验订单实现


内容介绍:

一、校验订单功能

二、总结


一、校验订单功能

在check的地方抽取一个方法,比如叫 checkorder,再传递 order 对象到这个方法里面,在这里边添加注释叫做校验订单,根据流程分析。

第一步校验订单是否存在;

第二步是校验订单当中的商品是否存在;

第三步是校验下单用户是否存在

第四步是校验订单金额是否合法;

第五步是校验订单当中的商品数量是否合法

如果都通过的说明这个订单是没有问题的,就可以进行下一步操作。

现在去看一下第一步校验订单是否存在,直接判断它如果能等于空就不能往下走,直接拖一个异常,之前有一个 CastException.cast,在每举类当中找一个当前的订单,它不合法的一个常量去抛出,这里边有一个 shoporder 订单无效这么一个常量传递过去,然后这里会进行一个异常抛出,只要抛出异常,后面就不能执行。

第二步校验订单的商品首先取出 getGoodsId,通过 getGoodsId 从数据库当中去查,怎么从数据库查呢?

当然是去调用服务的提供方从数据库查,所以现在它要去调用 getGoods service 这个地方需要把接口接入进来,所以添加一个接口叫做 IGoodsService,有了接口之后回到private,给它注入进来之后在接口当中需要提供一个查询根据主键ID 去查询当前商品对象的方法,现在先把方法写出来叫做 findOne,从这里面取出 getGoodsID ,之后返回来一个 getGoods 对象,需要 getGoods 提供一个方法,先把接口完善一下,

这个接口的意思是根据 id 查询商品对象,要在 getGoods service 实现接口,对于当前 getGoods service 需要把它进行一个配置,把它配置成 double 服务,定义一下interfaceClass 接口全新的令名,也就是服务提供服务名,在这里边查询数据库要通过 mapper 接口进行数据库的查询,

所以把private TradeGoodsMapper goodsMapper 拿出来,然后通过@Autowired 自动装备的方式去注入,它要去注入当前 TradeGoodsMapper 接口是不能直接去用的,必须要产生接口的一个实现类对象去用,那么这一切可以通过思普如去进行处理。

要加上@ Mapper 注解,思普如扫描到这个注解会产生接口的类去调用。在这里边它要根据 ID 查询商品对象,首先为了保证代码的见证性,先判断一下传递过来的这个 ID 如果为空,就不需要查了,直接去抛异常,有一个常量叫做 ShopCode.Shop-request 参数非法异常,如果没问题调用 goodsMapper.selectByPrimaryKey,再把 goodsId 传递过去,这样根据 ID 去查询商品对象的服务就可提供。

如果这个地方查询出来为空,需要继续抛异常。

第三步校验下单用户是否存在,通过用户的 ID 判断,方式可以和 goodsService 一样,去定义一个当前的 IUserservice 的接口,现在在订单的实践类当中去注入它,

private IUesrService userService,继续进行判断, userService.提供一个根据主键去查询的方法,让继续返回 user 对象,现在把这个方法创建出来,返回 tradeuser ,实现刚才的接口,那么要在编写一个服务,让它去实现 userService 接口。

先去判断是否合法,如果不合法就直接抛异常,ShopCode.;如果合法,查询数据库,把 userMapper 拿过来,不要忘记加上@Mapper ,如果 ID 正常,查 select 把 userid 传递过去进行一个

image.png

查询,现在服务的提供方已经编辑,之后调用这个服务根据主键去查询用户对象,在下图判断如果查询回来等于空,那么直接抛异常 shop.shop-USER-NO-EXIST,就不用往下走,如果非空,说明用户对象是正确的。

接下来继续校验订单金额是否合法,订单的金额其实是在当前里边的  order.getPayAmount()现在判断金额等不等于商品的单价乘以商品的数量,商品对象已经查询出来,所以需要.getgoodsService 商品的单价去乘以 multiply 商品的数量,而商品的数量在 getGoodsNumber,看总价等不等于单价乘以商品的数量,

注意 multiply 的 getGoodsNumber 进行相乘的时候,需要依然 getGoodsNumber 对象,把它放到 good 方法当中,这两个比较完之后相等是等于零,如果现在判断如果不等于零,那么说明这两个不相等,不相等给它抛出一个异常,叫做 shopcode.shop-order

看里面订单金额总价不正确,有这个常量法,用它就可以。

订单的金额合法之后还要继续判断订单的数量是否合法,数量的合法指的是当前订单当中购买的商品数量要等于或者小于当前总库存的数量,判断 order.getGoodsNumber 不能大于,如果大于当前要抛异常,如果大于等于 goods.getGoodsNumber 说明买的商品数量大于库存数量,所以要抛出一个异常 shopcode.shop-.

这些东西都做完之后说明当前的订单校验通过,但凡有一个没有通过都会去抛异常导致程序往下走。

image.png

为了看得更加清楚,打印日志,在下图那里加上一个@s1f4j 去打印

image.png

image.png

所做的第一步 Log.info 校验订单完成。


二、总结

根据流程分析完成以下五步校验法,其中第一步校验订单是否存在,

第二步是数校验订单中的商品是否存在,第三步是校验下单用户是否存在,第四步是校验订单金额是否合法,第五不是校验订单商品数量是否合法,直接判断对象是否为空,如果为空,直接抛异常;

而校验订单商品是否存在,是通过 goodsService 去完成校验,根据逐渐去查询,查询之后做一个判断,然后校验下单用户是否存在,也是通过 userService 去发起一个远程 RPC 的调用去判断当前的用户对象是否存在,而订单的金额校验再去判断总的金额是否等于订单的单价乘以总的数量,如果不相等,说明这个订单金额是有问题的,然后再去判断一下商品的数量是否合法,主要是来判断商品的数量不能大于当前总库存的数量,如果大于,需要去说明当前库存不足而抛出异常,整个校验订单的功能开发完。

image.png

相关文章
|
NoSQL Java Redis
服务端如何防止订单重复支付!
如图是一个简化的下单流程,首先是提交订单,然后是支付。 支付的话,一般是走支付网关(支付中心),然后支付中心与第三方支付渠道(微信、支付宝、银联)交互。 支付成功以后,异步通知支付中心,支付中心更新自身支付订单状态,再通知业务应用,各业务再更新各自订单状态。
服务端如何防止订单重复支付!
|
5月前
|
JSON 数据格式
支付系统41----定时查单-订单未支付
支付系统41----定时查单-订单未支付
|
5月前
|
关系型数据库 MySQL 数据库
生成订单的过程------支付系统21------支付宝支付----统一收单下单并支付页面接口----创建订单,下订单,我们要在我们数据库的订单表中,设置订单,订单表常用数据库设置格式
生成订单的过程------支付系统21------支付宝支付----统一收单下单并支付页面接口----创建订单,下订单,我们要在我们数据库的订单表中,设置订单,订单表常用数据库设置格式
支付系统22------统一收单下单并支付页面接口-----调用支付宝接口,创建订单后期出现异常,能够打印出来的方法
支付系统22------统一收单下单并支付页面接口-----调用支付宝接口,创建订单后期出现异常,能够打印出来的方法
|
5月前
|
API 开发工具
支付系统17------支付宝支付-----API预览以及签名验签说明,出现支付宝扫描二维码的操作,支付完成之后,查询订单的状态,支付成功之后,需要退款调用的接口,退款状态的接口,完成退款之后,通知
支付系统17------支付宝支付-----API预览以及签名验签说明,出现支付宝扫描二维码的操作,支付完成之后,查询订单的状态,支付成功之后,需要退款调用的接口,退款状态的接口,完成退款之后,通知
|
5月前
|
开发工具
支付系统31---支付成功,异步通知,签名验证
支付系统31---支付成功,异步通知,签名验证
|
存储 安全 API
电商平台订单接口调用注意事项
电商平台订单接口调用注意事项
|
弹性计算
阿里云存在未支付订单导致无法下单解决方法
解决阿里云存在未支付订单请支付或作废后再下单,阿里云服务器或其他云资源无法立即购买,提示“您选择的资源存在未支付订单,请支付或作废后再下单!”什么原因?这是由于你的阿里云账号之前已经创建了该订单,只是订单没有支付,所以无法再次创建订单。解决方法是,要么取消之前的订单,要么支付之前的订单。阿里云百科来详细说下阿里云账号下存在未支付订单的解决方法:
1036 0
阿里云存在未支付订单导致无法下单解决方法
|
消息中间件 RocketMQ 开发者
校验订单流程分析|学习笔记
快速学习校验订单流程分析
167 0
校验订单流程分析|学习笔记
|
消息中间件 数据库 RocketMQ
创建支付订单流程|学习笔记
快速学习创建支付订单流程
370 0
创建支付订单流程|学习笔记