day07:用户下单、订单支付

文章目录

  • 地址薄相关相关代码
    • 需求分析和设计
    • 代码书写
  • 用户下单
    • 需求分析和设计
    • 代码开发
  • 订单支付
    • 微信支付介绍
    • 微信支付准备工作
      • 如何保证数据安全?
      • 如何调用到商户系统

地址薄相关相关代码

需求分析和设计

产品原型
image.png
接口设计
image.png
数据库设计
image.png

代码书写

地址薄相关代码都是单表接口,对着Apifox上的接口设计书写即可

用户下单

需求分析和设计

用户下单业务说明
在电商系统中,用户是通过下单的方式通知商家,用户已经购买了商品,需要商家进行备货和发货。
image.png
用户点餐业务流程
image.png
接口设计
image.png
数据库设计
订单表 orders
image.png
订单明细表 order_detail
image.png

代码开发

五张表一起开发,企业最低标准

package com.sky.service.impl;import com.sky.context.BaseContext;
import com.sky.dto.OrdersSubmitDTO;
import com.sky.entity.*;
import com.sky.mapper.*;
import com.sky.service.OrderService;
import com.sky.vo.OrderSubmitVO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;@Service
public class OrderServiceImpl implements OrderService {@Resourceprivate OrderMapper orderMapper;@Resourceprivate OrderDetailMapper orderDetailMapper;@Resourceprivate AddressBookMapper addressBookMapper;@Resourceprivate ShoppingCartMapper shoppingCartMapper;@Resourceprivate UserMapper userMapper;/*** 用户下单接口** @param ordersSubmitDTO* @return*/@Overridepublic OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO) {//1.封装订单表Orders对象插入到数据库Orders orders = new Orders();//1.1准备需要的数据//获取登录用户idLong userId = BaseContext.getCurrentId();//根据用户id查询用户数据User user = userMapper.findById(userId);//根据收获地址id查询收货地址数据AddressBook addressBook = addressBookMapper.findBookById(AddressBook.builder().id(orders.getAddressBookId()).userId(userId).build());//根据用户id获取购物车集合数据List<ShoppingCart> shoppingCartList = shoppingCartMapper.list(ShoppingCart.builder().userId(userId).build());//1.2将ordersSubmitDTO数据封装给Orders对象数据BeanUtils.copyProperties(ordersSubmitDTO, orders);//1.3补全Orders对象数据//订单号 uuid、orders.setNumber(UUID.randomUUID().toString().replace("-",""));//status,默认待接单orders.setStatus(Orders.PENDING_PAYMENT);//用户idorders.setUserId(userId);//下单时间,当前时间orders.setOrderTime(LocalDateTime.now());//pay_status,默认未支付orders.setPayStatus(Orders.UN_PAID);//phone,收货人手机号orders.setPhone(addressBook.getPhone());//address,地址=省份+城市+街道+街道详情orders.setAddress(addressBook.getProvinceName()+ addressBook.getCityName()+ addressBook.getDistrictName()+ addressBook.getDetail());//user_name,用户表用户别名orders.setUserName(user.getName());//consignee,收货人名字orders.setConsignee(addressBook.getConsignee());//1.4插入到数据库orderMapper.insert(orders);//2.封装订单详情表集合List<OrderDetail>数据插入到数据库中//2.1定义List<OrderDetail>数据List<OrderDetail> orderDetailList = new ArrayList<>();//2.2遍历购物车集合数据for (ShoppingCart shoppingCart : shoppingCartList) {OrderDetail orderDetail = new OrderDetail();//将购物车每个ShoppingCart对象赋值给每个OrderDetail对象BeanUtils.copyProperties(shoppingCart,orderDetail);//补全逻辑:order_idorderDetail.setOrderId(orders.getId());//将封装好的每个orderDetail对象添加到List<OrderDetail>数据中orderDetailList.add(orderDetail);}//2.批量插入订单详情数据orderDetailMapper.batchInsert(orderDetailList);//3.清空购物车shoppingCartMapper.deleteAll(userId);//4.封装数据返回OrderSubmitVO orderSubmitVO = OrderSubmitVO.builder().id(orders.getId()).orderAmount(orders.getAmount()).orderNumber(orders.getNumber()).orderTime(orders.getOrderTime()).build();return orderSubmitVO;}
}

订单支付

微信支付介绍

支付大家应该都不陌生了,在现实生活中经常购买商品并且使用支付功能来付款,在付款的时候可能使用比较多的就是微信支付和支付宝支付了。在苍穹外卖项目中,选择的就是微信支付这种支付方式。
要实现微信支付就需要注册微信支付的一个商户号,这个商户号是必须要有一家企业并且有正规的营业执照。只有具备了这些资质之后,才可以去注册商户号,才能开通支付权限。
个人不具备这种资质,所以我们在学习微信支付时,最重要的是了解微信支付的流程,并且能够阅读微信官方提供的接口文档,能够和第三方支付平台对接起来就可以了。
微信支付产品
image.png
参考:https://pay.weixin.qq.com/static/product/product_index.shtml
微信支付接入流程
image.png
微信小程序支付时序图
image.png
微信支付相关接口
JSAPI下单:商品系统调用该接口在微信支付服务后台生成预支付交易单
image.png
微信小程序调起支付:通过JSAPI下单接口获取搭配发起支付的必要参数prepay_id,然后使用微信支付提供的小程序方法调起小程序支付
image.png

微信支付准备工作

如何保证数据安全?

完成微信支付有两个关键的步骤:
第一个就是需要在商户系统当中调用微信后台的一个下单接口,就是生成预支付交易单。
第二个就是支付成功之后微信后台会给推送消息。
这两个接口数据的安全性,要求其实是非常高的。
**解决:**微信提供的方式就是对数据进行加密、解密、签名多种方式。要完成数据加密解密,需要提前准备相应的一些文件,其实就是一些证书。
获取微信支付平台证书、商户私钥文件
image.png

如何调用到商户系统

微信后台会调用到商户系统给推送支付的结果,在这里我们就会遇到一个问题,就是微信后台怎么就能调用到我们这个商户系统呢?因为这个调用过程,其实本质上也是一个HTTP请求。
目前,商户系统它的ip地址就是当前自己电脑的ip地址,只是一个局域网内的ip地址,微信后台无法调用到。
解决:内网穿透。通过cpolar软件可以获得一个临时域名,而这个临时域名是一个公网ip,这样,微信后台就可以请求到商户系统了。
内网穿透
软件:cpolar,花生壳,netapp
下载好cpoplar后按照下面的图片在windows上进行操作。
获取临时域名:支付成功后微信服务通过该域名回调我们的程序
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Objects类

Objects类 Objects类&#xff1a;常用方法&#xff1a;equals()&#xff1a; Objects类&#xff1a; Objects是一个工具类&#xff0c;提供了很多操作对象的静态方法给我们使用。 常用方法&#xff1a; 方法名说明public static boolean equals(Object a, Object b)先做非空判…

电商大型活动行动清单样例

背景 为保证在大型活动/节日&#xff08;双十一、黑色星期五&#xff09;时服务稳定&#xff0c;提出各个角色必要的行动清单 涉及到的角色与职能范围&#xff08;包括但不限于&#xff09; 产品&#xff1a;确定核心功能链路&#xff0c;制定服务降级默认行为&#xff0c;提…

视频行业(监控,直播,会议,视频通话)痛点,随时接入,异构融合,以OvMeet视频会议为中心解决企业视频应用完美解决方案

近年来随着网络的普及及音视频技术的不断发展&#xff0c;以全球化、网络化、智能化未趋势的办公方式越来越受到各行各业的青睐。视频会议解决方案的应用转往多种交互式视频应用&#xff0c;如转往视频接入融合&#xff0c;调度与管理、日常沟通、工作部署、紧急救援、作战指挥…

誉天Cloud Service Solutions Architect(云服务)怎么样

誉天云服务课程亮点 深度融合云原生 包含原生K8s和docker内容&#xff0c;引入isito和ASM功能进行微服务治理&#xff0c;结合Linux功底设计云上性能优化&#xff0c;和架构设计。师资力量强大 课程由两名5HCIE认证讲师授课&#xff0c;认证辅导由已通过HCIE-Cloud Service专职…

【图形图像-1】SDF

在图形图像处理中&#xff0c;SDF&#xff08;Signed Distance Field&#xff0c;带符号的距离场&#xff09;是一种表示图形轮廓和空间距离的数学结构。它通常用于计算机图形学、文本渲染、碰撞检测和物理模拟等领域。 SDF&#xff08;Signed Distance Field&#xff0c;带符号…

Card Game【map】

Card Game 题面翻译 题目描述 两名玩家正在玩在线纸牌游戏。游戏使用一副 32 32 32 张牌进行。每张牌都有花色和数字。有四种花色&#xff1a;梅花、方块、红心和黑桃。用字符 C、D、H 和 S 分别表示它们。共有 8 种数字&#xff0c;按递增顺序为 2、3、4、5、6、7、8、9。…

《中国数据库前世今生》观影——认识1980年起步阶段

引出 中国数据库的前世今生观影——认识1980年的起步阶段 20 世纪 60 年代国外就有了商业数据库&#xff0c;20 世纪 80 年代我国才有了第一批数据库专业人才。不要小看这 20 年的差距&#xff0c;它可能需要几代数据库人用一生去追。2024 年了&#xff0c;中国跨过数据库这座大…

搞DDR你必须得看看我的这篇笔记

Hi! 这篇约你一起深入认识一下DDR。 文章目录 DDR基础DDR是什么?DDR有什么用?为什么要用DDRDDR协议是如何演进的如何访问DDRDDR关键时序参数ACTIVATE Timing 激活时序REFRESH Timing 刷新时序READ Timing 读时序写时序模式寄存器时序DDR基础 DDR是什么? 如果你在学生时代自…

动态创建标签jQuery效果

动态创建标签jQuery效果https://www.bootstrapmb.com/item/14832 使用jQuery来动态创建HTML标签并添加效果是一种常见的方法。以下是一个简单的示例&#xff0c;说明如何使用jQuery来动态创建<div>标签&#xff0c;并给它们添加一些基本的效果。 1. 创建一个新的<di…

Ubuntu 24.04 LTS 无法打开Chrome浏览器

解决办法&#xff1a; 删除本地配置文件&#xff0c;再次点击Chrome图标&#xff0c;即可打开。 rm ~/.config/google-chrome/ -rf ref: Google chrome not opening in Ubuntu 22.04 LTS - Ask Ubuntu

3GPP眼中的XR及其技术特点

3GPP R18 支持了XR Services。XR需要高数据速率和低延迟通信&#xff0c;这也真是5G可以大展身手的地方。这篇就从3GPP的角度看下XR是什么以及XR有哪些技术特点。 Extended Reality (XR) 是指由计算机技术和可穿戴设备生成的所有现实与虚拟相结合的环境和人机交互技术。 实际上…

使用vscode搜索打开的文件夹下的文件

右键空白处打开命令面板 摁一次删除键&#xff0c;删除掉图中的大于号 这样就能够找到例化的模块&#xff0c;文件具体在哪个位置&#xff0c;然后打开了

探索WebKit的Web Serial API:开启串行通信的新纪元

探索WebKit的Web Serial API&#xff1a;开启串行通信的新纪元 在现代Web开发中&#xff0c;与硬件设备的交互变得越来越普遍。WebKit的Web Serial API为Web应用提供了一种直接与串行设备通信的能力&#xff0c;使得开发者能够通过浏览器与外部设备进行数据交换。这项技术的应…

python实现责任链模式

把多个处理方法串成一个list。下一个list的节点是上一个list的属性。 每个节点都有判断是否能处理当前数据的方法。能处理&#xff0c;则直接处理&#xff0c;不能处理则调用下一个节点&#xff08;也就是当前节点的属性&#xff09;来进行处理。 Python 实现责任链模式&#…

【Unity】RPG2D龙城纷争(十七)敌方常规AI(Normal)的实现

更新日期:2024年7月24日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、AI_Normal类二、AI调遣策略第一阶段:收集1.提供战场数据收集方法2.收集战场数据三、AI调遣策略第二阶段:评估四、AI调遣策略第三阶段:行动简介 AI_Normal定位为框架自带的最基础的…

Vue3升级了哪些重要的功能

createApp // vue2.x const app new Vue({ .... });//vue3.x const app Vue.createApp({ ... });emits属性 // 父组件 <HelloWorld :msg"msg" sayHello"onSayHello" />export default {name: HelloWorld,props: {msg: String},emits: [onSayHell…

汽车充电桩投资盈利方案

说明&#xff1a;系统支持SASS运营商多开&#xff0c;每个月运营商都有独立小程序、独立收款。支持各种引流平台的互联互通充电&#xff0c;如星星充电、特来电、快电等等&#xff0c;实现地图软件如高德地图上充电导航。后台有每日统计、单枪运能、大数据面板。独立的移动端管…

STL标准模板库---容器篇(一)

STL(Standard Template Library)是C的一套功能强大的 C 模板类和函数的集合&#xff0c;它提供了一系列通用的、可复用的算法和数据结构。 STL 的设计基于泛型编程&#xff0c;这意味着使用模板可以编写出独立于任何特定数据类型的代码。 STL 分为多个组件&#xff0c;包括容…

常用的自动化测试工具有哪些?

什么是自动化测试&#xff1f;简单来说&#xff0c;自动化测试就是通过重复执行预定义的动作来执行测试用例的系统来代替人工操作。为了充分利用自动化&#xff0c;必须选择正确的自动化测试工具。 一、自动化测试工具有哪些 1、Selenium WEB自动化测试 Selenium是网页应用中最…

electron-builder打包vue2项目不显示element-ui图标

1、使用版本 vue ^2.6.14element-ui ^2.15.14vue-cli-plugin-electron-builder 2.1.1 2、解决办法 1&#xff09; 如果是简单的图标可以使用图片代替&#xff08;这种对于elementui组件的图标还是不会显示&#xff09; 2&#xff09;在vue.config.js配置 const { defineCon…