/**
* 支付成功保存订单
* @param userId
* @param orderId
*/
public void saveOrderFromRedisToDb(String userId,Long orderId,String transactionId);
@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 中清除
}
/**
* 查询支付状态
* @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;
}
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 |