支付成功保存订单
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;
}
|
|