黑马程序员技术交流社区

标题: 【郑州校区】Java之品优购课程讲义_day19(8) [打印本页]

作者: 谷粒姐姐    时间: 2018-11-2 14:37
标题: 【郑州校区】Java之品优购课程讲义_day19(8)
支付成功保存订单
5.3.1 后端代码
(1)修改 pinyougou-seckill-interface 的 SeckillOrderService.java,定义方法
[AppleScript] 纯文本查看 复制代码
/** 
  * 支付成功保存订单
  * @param userId
  * @param orderId
*/
public void saveOrderFromRedisToDb(String userId,Long orderId,String transactionId);

(2)在 pinyougou-seckill-service 的 SeckillOrderServiceImpl.java 实现该方法
[AppleScript] 纯文本查看 复制代码
@Override 
public void saveOrderFromRedisToDb(String userId, Long orderId, String
transactionId) {
  System.out.println("saveOrderFromRedisToDb:"+userId);
  //根据用户 ID 查询日志
  TbSeckillOrder seckillOrder = (TbSeckillOrder)
redisTemplate.boundHashOps("seckillOrder").get(userId);
  if(seckillOrder==null){
   throw new RuntimeException("订单不存在");
  }
  //如果与传递过来的订单号不符
  if(seckillOrder.getId().longValue()!=orderId.longValue()){
   throw new RuntimeException("订单不相符");
  }   
  seckillOrder.setTransactionId(transactionId);//交易流水号
  seckillOrder.setPayTime(new Date());//支付时间
  seckillOrder.setStatus("1");//状态
  seckillOrderMapper.insert(seckillOrder);//保存到数据库
  redisTemplate.boundHashOps("seckillOrder").delete(userId);//从 redis 中清除
}

(3)修改 pinyougou-seckill-web 的 PayController.java,增加查询的方法
[AppleScript] 纯文本查看 复制代码
/** 
  * 查询支付状态
  * @param out_trade_no
  * @return
  */
@RequestMapping("/queryPayStatus")
public Result queryPayStatus(String out_trade_no){
  //获取当前用户   
  String
userId=SecurityContextHolder.getContext().getAuthentication().getName();
  Result result=null;   
  int x=0;   
  while(true){
   //调用查询接口
   Map<String,String> map = weixinPayService.queryPayStatus(out_trade_no);
   if(map==null){//出错   
    result=new  Result(false, "支付出错");
    break;
   }   
   if(map.get("trade_state").equals("SUCCESS")){//如果成功     
    result=new  Result(true, "支付成功");     
    seckillOrderService.saveOrderFromRedisToDb(userId,
Long.valueOf(out_trade_no), map.get("transaction_id"));
    break;

[AppleScript] 纯文本查看 复制代码
 }    
   try {
    Thread.sleep(3000);//间隔三秒
   } catch (InterruptedException e) {
    e.printStackTrace();
   }  
   x++;//设置超时时间为 5 分钟
   if(x>100){
    result=new  Result(false, "二维码超时");
    break;
   }   
  }
  return result;
}







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2