准备工作:
需要:
微信支付id、商户号、商户key、回调地址
# 微信支付所需固定参数
weixin.pay.appid=wx74862e0dfcf69954 weixin.pay.partner=1558950191 weixin.pay.partnerkey=T6m9iK73b0kn9g5v426MKfHQH7X8rKwb weixin.pay.notifyurl=http://localhost/api/order/weixinPay/weixinNotify
支付流程
创建订单
前端发送课程号和请求头中带有用户信息的token后端使用jwt进行解析用户id,之后根据courseID和userId创建订单信息,最后将订单id发送给前端,前端带着订单id进行购物车页面的跳转,在购物车页面进行异步获取订单信息,进行渲染
前端
//course详情页面点击购买 createOrder() { orders.createOrder(this.courseId).then(res => { // 获取订单号 // res.data.data.orderNo // 生成订单之后跳转到订单的显示页面 this.$router.push({ path: '/orders/' + res.data.data.orderNo }) }) } //购物车order页面异步渲染 asyncData({ params, error }) { return orders.getById(params.orderId).then(res => { console.log(res.data) return { order: res.data.data.item } }) },
后端
controller //生成订单的方法 @GetMapping("createOrder/{courseId}") public R saveOrder(@PathVariable String courseId, HttpServletRequest request){ String userId = JwtUtils.getMemberIdByJwtToken(request); //创建订单返回订单号 String orderNo = orderService.createOrders(courseId,userId); return R.ok().data("orderNo",orderNo); } //根据订单id查询订单信息 @GetMapping("/getOrderInfo/{orderId}") public R getOrderInfo(@PathVariable String orderId){ LambdaQueryWrapper<Order> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(Order::getOrderNo,orderId); Order order = orderService.getOne(lambdaQueryWrapper); return R.ok().data("item",order); }
service生成订单的业务逻辑,通过feign远程调用edu模块和ucenter模块根据courseid和userid获取课程信息、用户信息、教师信息
//生成订单的方法 @Override public String createOrders(String courseId, String userId) { //通过远程调用获取课程信息 CourseInfoVO courseInfo = getCourseInfoById.getCourseInfo(courseId); //通过远程调用获取用户信息 UcenterMemberOrder userInfo = getUserInfoById.getUcenterMember(userId); //通过远程调用获取老师信息 TeacherVO teacherInfo = getTeacherInfoById.getTeacherInfo(courseInfo.getTeacherId()); Order order = new Order(); order.setOrderNo(OrderNoUtil.getOrderNo()); order.setCourseId(courseId); order.setCourseTitle(courseInfo.getTitle()); order.setCourseCover(courseInfo.getCover()); order.setTeacherName(teacherInfo.getName()); order.setTotalFee(courseInfo.getPrice()); order.setMemberId(userId); order.setMobile(userInfo.getMobile()); order.setNickname(userInfo.getNickname()); order.setStatus(0); order.setPayType(1); baseMapper.insert(order); return order.getOrderNo(); }
购物车order页面渲染订单信息后,用户确认立即支付带着订单号跳转到支付pay页面,支付页面根据订单号异步向后端发起请求获取支付的微信付款码和订单基本信息例如金额,订单号等,封装成map返回给前端进行渲染