1、创建新订单(在高并发的情况下,减库存会出现问题)超卖,采用Redis的锁来解决
商品价格一定要去自己的数据库去查询,不能有前端传来
在创建新订单前,确保库存充足,不能出现超卖的情况
- 查询商品(单价,数量)
- 根据商品的product_id
- 如果为空则抛出异常,商品不存在
- 设置OrderDetail时,设置了6位id,要确保在高并发情况下,id不重复,要添加synchronized锁
- 在创建订单Service层,添加事务注解,确保下单成功,如果不成功则进行回滚
- 计算总金额
- 写入数据库(OrderMaster, OrderDetail) -> OrderDTO(包含前两个表的所有信息)
- 扣库存
2、查询订单
- 传入orderId,如果查询出orderMaster列表为空则直接抛出异常
- 传入orderId,如果查询出orderDetail列表为空则直接抛出异常
- 创建orderDTO。将orderMaster属性拷贝给orderDTO,并设置orderDetail;
3、查询订单列表(buyerOpenId) 前端不需要详情页,只需要订单主列表
- 查询出来的orderMaster要转换为orderDTO
- 需要判断查询订单的人是否是本人
4、取消订单(需要判断是本人)
订单状态(已取消,新订单,已完结)
- 判断订单状态
- 如果订单状态是新订单则可以进行下不操作;
- 修改订单状态
- 如果返回为空,则证明更新失败,要掏出异常
- 返还库存(重点)
- 判断是否有商品(CollectionsUtils.isEmpty())
- 如果已支付还需退款
5、完结订单
- 判断订单状态
- 修改订单状态
6、支付订单
- 判断订单状态
- 判断订单支付状态
- 修改订单支付状态
7、微信特性(公众号支付)
微信支付开发文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
网页授权:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
微信测试平台:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
目录
1 第一步:用户同意授权,获取code (code是换取access_token的票据。5分钟内有效)
2 第二步:通过code换取网页授权access_token(这一步可以拿到OppenID)
3 第三步:刷新access_token(如果需要)
4 第四步:拉取用户信息(需scope为 snsapi_userinfo)
5 附:检验授权凭证(access_token)是否有效
7.1、微信授权
- 获取OpenID
- 手工方式
-
在微信公众号设置,设置网页授权域名
-
编写重定向地址
-
用户同意授权后
如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。
-
通过code换取网页授权access_token(里面有OpenId)
-
传入微信公众号的appid和secret和第一步所获取的用户的code
-
- 手工方式
总结
1、设置域名(白名单验证,将验证文件放在项目的根目录下,用到内网穿透工具)
2、获取code(scope两个方式,无感知,和用户感知的| base和userInfo)
3、用code换取access_token
- 第三方SDK Software Development Kit(软件开发工具包)
7.2、微信支付(使用到统一下单接口和支付结果通知接口和退款接口)
-
支付需要的有:商户号、商户密钥、商户证书路径,微信支付的异步通知的地址(很重要否则不能发起微信支付)
-
生成用户订单
-
调用统一用户下单API 返回预支付信息
-
生成JSAPI页面调用的支付参数并签名
-
异步通知
- 验证签名
- 支付的状态
- 支付的金额
- 支付人(下单人==支付人)
-
返回商家的处理结果(不返回的 话,微信一直会异步通知)====
很重要
7.3、微信退款
- 退款需要证书(双向证书)(商户平台那下载证书)
商家登录
- 将token设置到redis,在登录的时候就去找redis要,k为固定前缀+token(uuid), v为openid,并设置过期时间
- 将token设置到cookie
向从cookie查询token,然后再去redis查询对应的value
商家登出
- 先从request中取出cookie的值,遍历cookies的数组
先删除redis中的,在删除cookie中的,将cookis中的过期时间设置为0就可以将其删除
AOP做权限管理
切入点之前的操作所出现的异常全部抛出,在定义一个异常处理类专门处理
@ControllerAdvice
@ControllerAdvice注解的作用:https://www.cnblogs.com/lenve/p/10748453.html