一.创建订单需获取商品id和用户id
1.生成一个订单号,订单号要唯一
2.商品信息和用户信息需要远程RPC调用
3.将订单保存到数据库中
4.返回订单号给前端
二.具体代码实现
1.用户id可以根据客服端传来的token取出
2.需用到一个工具类JwtUtils
public class JwtUtils {
public static final String SUBJECT = "guli";
//秘钥
public static final String APPSECRET = "guli";
public static final long EXPIRE = 1000 * 60 * 30; //过期时间,毫秒,30分钟
/**
* 根据token,获取token里面主体内容
* @param request
* @return
*/
public static String getMemberIdByJwtToken(HttpServletRequest request) {
String jwtToken = request.getHeader("token");
if(StringUtils.isEmpty(jwtToken)) return "";
Claims claims = Jwts.parser().setSigningKey(APPSECRET).parseClaimsJws(jwtToken).getBody();
// Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
// Claims claims = claimsJws.getBody();
return (String)claims.get("id");
}
}
3.工具类中有一个getMemberIdByJwtToken方法,其中HttpServletRequest可以获取到客服端传来的token
token中包含userId,如果token为空,则返回一个空,否则拿到JWT三要素中的主体claims ,通过claims取到userId
4.通过商品id和userId创建订单
@RestController
@RequestMapping("/order")
@CrossOrigin
public class EduOrderController {
@Autowired
private EduOrderService orderService;
//1.根据商品id下订单
@GetMapping("createOrder/{courseId}")
//传入商品id和用户id
public RetVal createOrder(@PathVariable String courseId, HttpServletRequest request) {
//通过工具类拿到userId
String userId = JwtUtils.getMemberIdByJwtToken(request);
//根据传入商品id和用户id创建订单
String orderNo = orderService.createOrder(courseId, userId);
//将生成的订单号返回
return RetVal.success().data("orderNo", orderNo);
}
5.生成订单号需用到一个工具类OrderNoUtil
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;
}
}
6.创建createOrder,进入service层
@Autowired
private EduPayLogService payLogService;
@Override
public String createOrder(String courseId, String userId) {
//创建一个订单
EduOrder order = new EduOrder();
//通过OrderNoUtil工具类获取到订单号
String orderNo = OrderNoUtil.getOrderNo();
//将订单号和商品id放进订单中
order.setOrderNo(orderNo);
order.setCourseId(courseId);
//具体看数据库订单表中需要的数据
//商品信息需要通过远程RPC的形式从其他微服务中查询
//查寻到后放进订单中
//这里就直接写入假数据,仅供参考
order.setCourseTitle("潮流新品紧身连衣裙包臀性感2020年秋季夏新款修身显瘦裙子短款气质小个子吊带女夏香槟);
order.setCourseCover("http://img10.360buyimg.com/imgzone/jfs/t1/125022/5/8461/11118d239de7a1.jpg");
//用户个人信息需要通过远程RPC的形式从其他微服务中查询
order.setTeacherName("张三");
order.setMemberId(userId);
order.setNickName("一只独狼");
order.setMobile("13177567651");
order.setTotalFee(new BigDecimal(0.01));
order.setPayType(1);
order.setStatus(0);
//添加订单到数据库中
baseMapper.insert(order);
//将订单号返回
return orderNo;
}