课程支付接口开发(生成订单接口)

1、在课程详情页面,点击"立即购买"生成订单,向订单表添加一条记录

2、订单表添加需要很多数据

(1)订单号:手动生成订单号 (2)课程相关数据 根据课程id查询信息方法,在service_edu模块创建 在service_order模块远程调用课程信息 (3)在用户相关信息内容 根据用户id查询用户信息,在service_ucenter模块创建 在service_order模块远程调用用户信息

3、在TOrderController 创建生成课程支付订单的方法

java 复制代码
package com.atguigu.orderservice.controller;

import com.atguigu.commonutils.R;
import com.atguigu.commonutils.utils.JwtUtils;
import com.atguigu.orderservice.entity.TOrder;
import com.atguigu.orderservice.service.TOrderService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

@Api(description="订单管理")
@RestController
@RequestMapping("/orderservice/order")
@CrossOrigin
public class TOrderController {

    @Autowired
    private TOrderService orderService;

    @ApiOperation(value = "生成课程支付订单")
    @GetMapping("createOrder/{courseId}")
    public R createOrder(@PathVariable String courseId,
                         HttpServletRequest request){
        //根据token获取用户id
        String memberId = JwtUtils.getMemberIdByJwtToken(request);
        //生成订单,返回订单号,参数:课程id、用户id
        String orderNo = orderService.createOrder(courseId,memberId);
        return R.ok().data("orderNo",orderNo);
    }

}

4、在service_edu模块中填写接口,根据课程id获取课程、讲师信息

(1)在common中创建统一返回的vo类。

java 复制代码
package com.atguigu.commonutils.vo;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.math.BigDecimal;

@Data
public class CourseWebVoPay {

    private String id;

    @ApiModelProperty(value = "课程标题")
    private String title;

    @ApiModelProperty(value = "课程销售价格,设置为0则可免费观看")
    private BigDecimal price;

    @ApiModelProperty(value = "总课时")
    private Integer lessonNum;

    @ApiModelProperty(value = "课程封面图片路径")
    private String cover;

    @ApiModelProperty(value = "销售数量")
    private Long buyCount;

    @ApiModelProperty(value = "浏览数量")
    private Long viewCount;

    @ApiModelProperty(value = "课程简介")
    private String description;

    @ApiModelProperty(value = "讲师ID")
    private String teacherId;

    @ApiModelProperty(value = "讲师姓名")
    private String teacherName;

    @ApiModelProperty(value = "讲师资历,一句话说明讲师")
    private String intro;

    @ApiModelProperty(value = "讲师头像")
    private String avatar;

    @ApiModelProperty(value = "课程类别ID")
    private String subjectLevelOneId;

    @ApiModelProperty(value = "类别名称")
    private String subjectLevelOne;

    @ApiModelProperty(value = "课程类别ID")
    private String subjectLevelTwoId;

    @ApiModelProperty(value = "类别名称")
    private String subjectLevelTwo;
}

(2)com/atguigu/eduservice/api/CourseApiController中创建远程调用方法。

java 复制代码
@ApiOperation(value = "根据id查询课程、讲师信息,支付订单模块远程调用")
@GetMapping("getCourseInfoPay/{id}")
public CourseWebVoPay getCourseInfoPay(@PathVariable String id){
    //查询课程基本信息
    CourseWebVo courseWebVo = courseService.getCourseWebVo(id);
    CourseWebVoPay courseWebVoPay = new CourseWebVoPay();
    BeanUtils.copyProperties(courseWebVo,courseWebVoPay);
    return courseWebVoPay;
}

5、在service-order模块远程调用service-edu服务

(1)service-order、service-edu在注册中心注册,并在OrderApplication启动类上添加注解。

java 复制代码
@SpringBootApplication
@ComponentScan({"com.atguigu"})
@MapperScan("com.atguigu.orderservice.mapper")
@EnableDiscoveryClient
@EnableFeignClients
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class,args);
    }
}

(2)在service-order模块中创建client/EduClient接口,定义调用接口。

java 复制代码
@Component
@FeignClient("service-edu")
public interface EduClient {
    //根据id查询课程、讲师信息,支付订单模块远程调用
    @GetMapping("/eduservice/courseapi/getCourseInfoPay/{id}")
    public CourseWebVoPay getCourseInfoPay(@PathVariable("id") String id);
}

(3)在service-order模块中,在service实现方法远程调用接口,获取课程信息。

java 复制代码
package com.atguigu.orderservice.service.impl;
import com.atguigu.commonutils.vo.CourseWebVoPay;
import com.atguigu.commonutils.vo.UcenterMemberPay;
import com.atguigu.orderservice.client.EduClient;
import com.atguigu.orderservice.client.UcenterClient;
import com.atguigu.orderservice.entity.TOrder;
import com.atguigu.orderservice.mapper.TOrderMapper;
import com.atguigu.orderservice.service.TOrderService;
import com.atguigu.orderservice.utils.OrderNoUtil;
import com.atguigu.servicebase.handler.GuliException;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> implements TOrderService {

    @Autowired
    private EduClient eduClient;
    @Autowired
    private UcenterClient ucenterClient;

    //生成课程支付订单
    @Override
    public String createOrder(String courseId, String memberId) {
        //1生成订单号
        String orderNo = OrderNoUtil.getOrderNo();
        //2根据课程id查询课程信息,远程调用
        //2.1远程调用
        CourseWebVoPay courseInfoPay = eduClient.getCourseInfoPay(courseId);
        //2.2校验数据
        if(courseInfoPay==null){
            throw new GuliException(20001,"课程获取失败");
        }
        //3根据用户id查询用户信息,远程调用
        //3.1远程调用
        UcenterMemberPay ucenterPay = ucenterClient.getUcenterPay(memberId);
        //3.2校验数据
        if(ucenterPay==null){
            throw new GuliException(20001,"用户获取失败");
        }
        //4把订单数据插入数据库
        TOrder order = new TOrder();
        order.setOrderNo(orderNo);
        order.setCourseId(courseId);
        order.setCourseTitle(courseInfoPay.getTitle());
        order.setCourseCover(courseInfoPay.getCover());
        order.setTeacherName(courseInfoPay.getTeacherName());
        order.setTotalFee(courseInfoPay.getPrice());
        order.setMemberId(memberId);
        order.setMobile(ucenterPay.getMobile());
        order.setNickname(ucenterPay.getNickname());
        order.setStatus(0);//0:未支付 1:已支付
        order.setPayType(1);//1微信
        baseMapper.insert(order);

        return orderNo;
    }
}

6、在service-ucenter模块中创建接口,根据用户id获取用户信息,service-order模块进行远程调用

(1)创建vo,用于远程调用。

java 复制代码
package com.atguigu.commonutils.vo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Date;

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="UcenterMember对象", description="会员表")
public class UcenterMemberPay implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "会员id")
    @TableId(value = "id", type = IdType.ID_WORKER_STR)
    private String id;

    @ApiModelProperty(value = "微信openid")
    private String openid;

    @ApiModelProperty(value = "手机号")
    private String mobile;

    @ApiModelProperty(value = "密码")
    private String password;

    @ApiModelProperty(value = "昵称")
    private String nickname;

    @ApiModelProperty(value = "性别 1 女,2 男")
    private Integer sex;

    @ApiModelProperty(value = "年龄")
    private Integer age;

    @ApiModelProperty(value = "用户头像")
    private String avatar;

    @ApiModelProperty(value = "用户签名")
    private String sign;

    @ApiModelProperty(value = "是否禁用 1(true)已禁用,  0(false)未禁用")
    private Boolean isDisabled;

    @ApiModelProperty(value = "逻辑删除 1(true)已删除, 0(false)未删除")
    private Boolean isDeleted;

    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间")
    private Date gmtCreate;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "更新时间")
    private Date gmtModified;


}

(2)com/atguigu/ucenterservice/controller/UcenterMemberController中创建远程调用方法。

java 复制代码
@ApiOperation(value = "根据用户id获取用户信息,订单支付远程调用")
@GetMapping("getUcenterPay/{memberId}")
public UcenterMemberPay getUcenterPay(@PathVariable String memberId){
    //根据用户获取用户信息
    UcenterMember ucenterMember = ucenterService.getById(memberId);
    UcenterMemberPay ucenterMemberPay = new UcenterMemberPay();
    BeanUtils.copyProperties(ucenterMember,ucenterMemberPay);
    return ucenterMemberPay;
}

(3)service-ucenter服务,开启服务发现。 1)配置文件添加下面的内容

java 复制代码
# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

#开启熔断机制
feign.hystrix.enabled=true
# 设置hystrix超时时间,默认1000ms
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000

2)启动类添加注解

(4)在service-order模块中client目录下创建UcenterClient接口,定义调用接口。

java 复制代码
@Component
@FeignClient("service-ucenter")
public interface UcenterClient {

    //根据用户id获取用户信息,订单支付远程调用
    @GetMapping("/ucenterservice/ucenter/getUcenterPay/{memberId}")
    public UcenterMemberPay getUcenterPay(@PathVariable("memberId") String memberId);
    
}

(5)在service-order服务中service实现方法远程调用,获取用户信息。

java 复制代码
package com.atguigu.orderservice.service.impl;
import com.atguigu.commonutils.vo.CourseWebVoPay;
import com.atguigu.commonutils.vo.UcenterMemberPay;
import com.atguigu.orderservice.client.EduClient;
import com.atguigu.orderservice.client.UcenterClient;
import com.atguigu.orderservice.entity.TOrder;
import com.atguigu.orderservice.mapper.TOrderMapper;
import com.atguigu.orderservice.service.TOrderService;
import com.atguigu.orderservice.utils.OrderNoUtil;
import com.atguigu.servicebase.handler.GuliException;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> implements TOrderService {

    @Autowired
    private EduClient eduClient;
    @Autowired
    private UcenterClient ucenterClient;

    //生成课程支付订单
    @Override
    public String createOrder(String courseId, String memberId) {
        //1生成订单号
        String orderNo = OrderNoUtil.getOrderNo();
        //2根据课程id查询课程信息,远程调用
        //2.1远程调用
        CourseWebVoPay courseInfoPay = eduClient.getCourseInfoPay(courseId);
        //2.2校验数据
        if(courseInfoPay==null){
            throw new GuliException(20001,"课程获取失败");
        }
        //3根据用户id查询用户信息,远程调用
        //3.1远程调用
        UcenterMemberPay ucenterPay = ucenterClient.getUcenterPay(memberId);
        //3.2校验数据
        if(ucenterPay==null){
            throw new GuliException(20001,"用户获取失败");
        }
        //4把订单数据插入数据库
        TOrder order = new TOrder();
        order.setOrderNo(orderNo);
        order.setCourseId(courseId);
        order.setCourseTitle(courseInfoPay.getTitle());
        order.setCourseCover(courseInfoPay.getCover());
        order.setTeacherName(courseInfoPay.getTeacherName());
        order.setTotalFee(courseInfoPay.getPrice());
        order.setMemberId(memberId);
        order.setMobile(ucenterPay.getMobile());
        order.setNickname(ucenterPay.getNickname());
        order.setStatus(0);//0:未支付 1:已支付
        order.setPayType(1);//1微信
        baseMapper.insert(order);

        return orderNo;
    }
}

7、实现生成订单service方法

(1)复制工具类。

java 复制代码
package com.atguigu.orderservice.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 订单号工具类
 *
 * @author qy
 * @since 1.0
 */
public class OrderNoUtil {

    /**
     * 获取订单号
     * @return
     */
    public static String getOrderNo() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String newDate = sdf.format(new Date());
        String result = "";
        Random random = new Random();
        for (int i = 0; i < 3; i++) {
            result += random.nextInt(10);
        }
        return newDate + result;
    }

}

(2)在com/atguigu/orderservice/service中添加接口方法。

java 复制代码
String createOrder(String courseId, String memberId);

(3)在com/atguigu/orderservice/service/ impl/ TorderServiceImpl中实现接口方法。

java 复制代码
package com.atguigu.orderservice.service.impl;
import com.atguigu.commonutils.vo.CourseWebVoPay;
import com.atguigu.commonutils.vo.UcenterMemberPay;
import com.atguigu.orderservice.client.EduClient;
import com.atguigu.orderservice.client.UcenterClient;
import com.atguigu.orderservice.entity.TOrder;
import com.atguigu.orderservice.mapper.TOrderMapper;
import com.atguigu.orderservice.service.TOrderService;
import com.atguigu.orderservice.utils.OrderNoUtil;
import com.atguigu.servicebase.handler.GuliException;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * <p>
 * 订单 服务实现类
 * </p>
 *
 * @author testjava
 * @since 2020-07-06
 */
@Service
public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> implements TOrderService {

    @Autowired
    private EduClient eduClient;
    @Autowired
    private UcenterClient ucenterClient;

    //生成课程支付订单
    @Override
    public String createOrder(String courseId, String memberId) {
        //1生成订单号
        String orderNo = OrderNoUtil.getOrderNo();
        //2根据课程id查询课程信息,远程调用
        //2.1远程调用
        CourseWebVoPay courseInfoPay = eduClient.getCourseInfoPay(courseId);
        //2.2校验数据
        if(courseInfoPay==null){
            throw new GuliException(20001,"课程获取失败");
        }
        //3根据用户id查询用户信息,远程调用
        //3.1远程调用
        UcenterMemberPay ucenterPay = ucenterClient.getUcenterPay(memberId);
        //3.2校验数据
        if(ucenterPay==null){
            throw new GuliException(20001,"用户获取失败");
        }
        //4把订单数据插入数据库
        TOrder order = new TOrder();
        order.setOrderNo(orderNo);
        order.setCourseId(courseId);
        order.setCourseTitle(courseInfoPay.getTitle());
        order.setCourseCover(courseInfoPay.getCover());
        order.setTeacherName(courseInfoPay.getTeacherName());
        order.setTotalFee(courseInfoPay.getPrice());
        order.setMemberId(memberId);
        order.setMobile(ucenterPay.getMobile());
        order.setNickname(ucenterPay.getNickname());
        order.setStatus(0);//0:未支付 1:已支付
        order.setPayType(1);//1微信
        baseMapper.insert(order);

        return orderNo;
    }
}
相关推荐
罗_三金5 分钟前
前端框架对比和选择?
javascript·前端框架·vue·react·angular
Redstone Monstrosity12 分钟前
字节二面
前端·面试
kinlon.liu13 分钟前
零信任安全架构--持续验证
java·安全·安全架构·mfa·持续验证
东方翱翔19 分钟前
CSS的三种基本选择器
前端·css
王哲晓34 分钟前
Linux通过yum安装Docker
java·linux·docker
java66666888838 分钟前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存39 分钟前
源码分析:LinkedList
java·开发语言
执键行天涯40 分钟前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
Fan_web42 分钟前
JavaScript高级——闭包应用-自定义js模块
开发语言·前端·javascript·css·html
yanglamei19621 小时前
基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue
前端·数据库·flask