项目
博客
文档
归档
资源链接
关于我
项目
博客
文档
归档
资源链接
关于我
25| 订单微服务 - 创建订单业务
2024-08-13
·
·
原创
·
·
本文共 605个字,预计阅读需要 3分钟。
### 核心接口-下单 构建项目:nla-order-service 订单微服务涉及的功能知识点 * 创建订单和`防重提交` * 多个微服务之间`通讯-分布式事务`选择 * 商品`库存锁定和回收` * `优惠券使用锁定和回收` * 支付宝`支付对接` * 优惠券+商品`订单验价` * `多通道支付`和设计整合 据库表: `p-nla-order` * 订单表 ```sql CREATE TABLE `product_order` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `out_trade_no` varchar(64) DEFAULT NULL COMMENT '订单唯一标识', `state` varchar(11) DEFAULT NULL COMMENT 'NEW 未支付订单,PAY已经支付订单,CANCEL超时取消订单', `create_time` datetime DEFAULT NULL COMMENT '订单生成时间', `total_amount` decimal(16,2) DEFAULT NULL COMMENT '订单总金额', `pay_amount` decimal(16,2) DEFAULT NULL COMMENT '订单实际支付价格', `pay_type` varchar(64) DEFAULT NULL COMMENT '支付类型,微信-银行-支付宝', `nickname` varchar(64) DEFAULT NULL COMMENT '昵称', `head_img` varchar(524) DEFAULT NULL COMMENT '头像', `user_id` int(11) DEFAULT NULL COMMENT '用户id', `del` int(5) DEFAULT '0' COMMENT '0表示未删除,1表示已经删除', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `order_type` varchar(32) DEFAULT NULL COMMENT '订单类型 DAILY普通单,PROMOTION促销订单', `receiver_address` varchar(1024) DEFAULT NULL COMMENT '收货地址 json存储', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='订单表'; ``` * 订单项表 ```sql CREATE TABLE `product_order_item` ( `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT, `product_order_id` bigint(11) DEFAULT NULL COMMENT '订单号', `out_trade_no` varchar(32) DEFAULT NULL, `product_id` bigint(11) DEFAULT NULL COMMENT '产品id', `product_name` varchar(128) DEFAULT NULL COMMENT '商品名称', `product_img` varchar(524) DEFAULT NULL COMMENT '商品图片', `buy_num` int(11) DEFAULT NULL COMMENT '购买数量', `create_time` datetime DEFAULT NULL, `total_amount` decimal(16,2) DEFAULT NULL COMMENT '购物项商品总价格', `amount` decimal(16,0) DEFAULT NULL COMMENT '购物项商品单价', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='订单项表'; ``` 枚举类配置 ```java /** * 客户端枚举类 */ public enum ClientType { /** * 原生应用 */ APP, /** * 电脑端 */ PC, /** * 网页 */ H5 } public enum ProductOrderPayTypeEnum { /** * 微信支付 */ WECHAT, /** * 支付支付 */ ALIPAY, /** * 银行卡支付 */ BANK; } public enum ProductOrderStateEnum { /** * 未支付订单 */ NEW, /** * 已经支付订单 */ PAY, /** * 超时取消订单 */ CANCEL; } public enum ProductOrderTypeEnum { /** * 普通订单 */ DAILY, /** * 促销订单 */ PROMOTION; } ``` ### 创建订单接口 下单逻辑 * 二步:创建订单-> 调用支付(京东) * 一步:创建订单并调用支付(手淘) 请求参数: ```java @ApiModel(value = "添加订单对象", description = "添加订单请求对象") @Data public class ConfirmOrderRequest { @ApiModelProperty(value = "购物车使用的优惠券,集满减劵(如果传空或者小于0,则不用优惠券)", example = "1") @JsonProperty("coupon_record_id") private Long couponRecordId; @ApiModelProperty(value = "最终购买的商品列表:传递id,购买数量从购物车中读取") @JsonProperty("product_ids") private List
productIdList; @ApiModelProperty(value = "支付方式", example = "WECHAT") @JsonProperty("pay_type") private String payType; /** * 端类型 */ @ApiModelProperty(value = "端类型", example = "APP") @JsonProperty("client_type") private String clientType; /** * 收货地址id */ @ApiModelProperty(value = "收货地址id", example = "中国") @JsonProperty("address_id") private long addressId; /** * 总价格,前端传递,后端需要验价 */ @ApiModelProperty(value = "总价格", example = "40.00") @JsonProperty("total_amount") private BigDecimal totalAmount; /** * 实际支付的价格, * 如果用了优惠劵,则是减去优惠券后端价格,如果没的话,则是totalAmount一样 */ @ApiModelProperty(value = "实际支付的价格", example = "20.00") @JsonProperty("real_pay_amount") private BigDecimal realPayAmount; /** * 防重令牌 */ @ApiModelProperty(value = "防重令牌", example = "sdvdgwerqwerwrwerqweq") @JsonProperty("token") private String token; } ``` controller层 ```java @Api(tags = "订单控制器") @Slf4j @RestController @RequestMapping("/odr/product") public class ProductOrderController { @Resource private ProductOrderService orderService; @ApiOperation("提交订单") @PostMapping("confirm") public void confirmOrder(@ApiParam("订单对象") @RequestBody ConfirmOrderRequest orderRequest, HttpServletResponse response) { JsonData jsonData = orderService.confirmOrder(orderRequest); if (jsonData.getCode() == 0) { String client = orderRequest.getClientType(); String payType = orderRequest.getPayType(); //如果是支付宝网页支付,都是跳转网页,APP除外 if (payType.equalsIgnoreCase(ProductOrderPayTypeEnum.ALIPAY.name())) { log.info("创建支付宝订单成功:{}", orderRequest.toString()); if (client.equalsIgnoreCase(ClientType.H5.name())) { writeData(response, jsonData); } else if (client.equalsIgnoreCase(ClientType.APP.name())) { //APP SDK支付 TODO } } else if (payType.equalsIgnoreCase(ProductOrderPayTypeEnum.WECHAT.name())) { //微信支付 TODO } } else { log.error("创建订单失败{}", jsonData); } } private void writeData(HttpServletResponse response, JsonData jsonData) { try { response.setContentType("text/html;charset=UTF8"); response.getWriter().write(jsonData.getData().toString()); response.getWriter().flush(); response.getWriter().close(); } catch (IOException e) { log.error("写出Html异常", e); } } } ``` ### 创建订单伪代码编写 service编写伪代码 * 防重提交 * 用户微服务-确认收货地址 * 商品微服务-获取最新购物项和价格 * 订单验价 * 优惠券微服务-获取优惠券 * 验证价格 * 锁定优惠券 * 锁定商品库存 * 创建订单对象 * 创建子订单对象 * 发送延迟消息-用于自动关单 * 创建支付信息-对接三方支付