| package com.dsh.other.controller; | 
|   | 
| import cn.hutool.http.HttpRequest; | 
| import com.alibaba.fastjson.JSONObject; | 
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
| import com.dsh.other.entity.TGame; | 
| import com.dsh.other.entity.TGameConfig; | 
| import com.dsh.other.entity.TGameRecord; | 
| import com.dsh.other.feignclient.account.AppUserClient; | 
| import com.dsh.other.feignclient.account.model.AppUser; | 
| import com.dsh.other.model.QueryMySiteVo; | 
| import com.dsh.other.service.TGameConfigService; | 
| import com.dsh.other.service.TGameRecordService; | 
| import com.dsh.other.service.TGameService; | 
| import com.dsh.other.util.*; | 
| import com.dsh.other.util.httpClinet.HttpResult; | 
| import io.swagger.annotations.ApiImplicitParam; | 
| import io.swagger.annotations.ApiImplicitParams; | 
| import io.swagger.annotations.ApiOperation; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.web.bind.annotation.PostMapping; | 
| import org.springframework.web.bind.annotation.RequestMapping; | 
| import org.springframework.web.bind.annotation.ResponseBody; | 
| import org.springframework.web.bind.annotation.RestController; | 
|   | 
| import java.math.BigDecimal; | 
| import java.text.SimpleDateFormat; | 
| import java.util.*; | 
|   | 
| @RestController | 
| @RequestMapping("/api/game") | 
| public class GameController { | 
|   | 
|     @Autowired | 
|     private TGameRecordService gameRecordService; | 
|   | 
|     @Autowired | 
|     private TGameService gameService; | 
|   | 
|     @Autowired | 
|     private TGameConfigService gameConfigService; | 
|   | 
|     @Autowired | 
|     private TokenUtil tokenUtil; | 
|   | 
|     @Autowired | 
|     private AppUserClient appUserClient; | 
|   | 
|     @Autowired | 
|     private PayMoneyUtil payMoneyUtil; | 
|   | 
|   | 
|     @ResponseBody | 
|     @PostMapping("/queryGameList") | 
|     @ApiOperation(value = "获取当前场地的游戏列表配置", tags = {"用户—游戏"}) | 
|     @ApiImplicitParams({ | 
|             @ApiImplicitParam(value = "siteId", name = "siteId", dataType = "int", required = true), | 
|             @ApiImplicitParam(value = "storeId", name = "storeId", dataType = "int", required = true), | 
|             @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), | 
|     }) | 
|     public ResultUtil<List<TGameConfig>> queryGameList(Integer siteId, Integer storeId){ | 
|         try { | 
|             List<TGameConfig> tGameConfigs = new ArrayList<>(); | 
|   | 
|             List<TGame> list = gameService.list(new LambdaQueryWrapper<TGame>().eq(TGame::getSiteId, siteId).eq(TGame::getStoreId, storeId)); | 
|             if(list.size()>0){ | 
|                 Integer id = list.get(0).getId(); | 
|                 tGameConfigs = gameConfigService.list(new LambdaQueryWrapper<TGameConfig>().eq(TGameConfig::getOtherId, id)); | 
|             } | 
|             return ResultUtil.success(tGameConfigs); | 
|         }catch (Exception e){ | 
|             e.printStackTrace(); | 
|             return ResultUtil.runErr(); | 
|         } | 
|     } | 
|   | 
|   | 
|     @ResponseBody | 
|     @PostMapping("/payGame") | 
|     @ApiOperation(value = "支付游戏", tags = {"用户—游戏"}) | 
|     @ApiImplicitParams({ | 
|             @ApiImplicitParam(value = "三方游戏id", name = "gameId", dataType = "int", required = true), | 
|             @ApiImplicitParam(value = "游戏配置id", name = "configId", dataType = "int", required = true), | 
|             @ApiImplicitParam(value = "sutuId", name = "sutuId", dataType = "int", required = true), | 
|             @ApiImplicitParam(value = "spaceId", name = "spaceId", dataType = "int", required = true), | 
|             @ApiImplicitParam(value = "1微信 2支付宝 3玩湃币", name = "type", dataType = "int", required = true), | 
|             @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9....."), | 
|     }) | 
|     public ResultUtil payGame(Integer gameId, Integer configId,Integer type,Integer sutuId,Integer spaceId){ | 
|         try { | 
|             Integer uid = tokenUtil.getUserIdFormRedis(); | 
|             if(null == uid){ | 
|                 return ResultUtil.tokenErr(); | 
|             } | 
|             SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); | 
|             String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5); | 
|             TGameConfig config = gameConfigService.getById(configId); | 
|             TGameRecord tGameRecord = new TGameRecord(); | 
|             tGameRecord.setGameId(gameId); | 
|             tGameRecord.setPayType(type); | 
|             tGameRecord.setUserId(uid); | 
|             tGameRecord.setNumber(code); | 
|             gameRecordService.save(tGameRecord); | 
|             if(type==1){ | 
|                 ResultUtil weixinpay = payMoneyUtil.weixinpay("游戏支付", "", code, config.getCash().toString(), "/base/course/weChatPaymentCourseCallback", "APP", ""); | 
|                 if(weixinpay.getCode() == 200){ | 
|                     new Thread(new Runnable() { | 
|                         @Override | 
|                         public void run() { | 
|                             try { | 
|                                 int num = 1; | 
|                                 int wait = 0; | 
|                                 while (num <= 10){ | 
|                                     int min = 5000; | 
|                                     wait += (min * num); | 
|                                     Thread.sleep(wait); | 
|                                     List<TGameRecord> list = gameRecordService.list(new QueryWrapper<TGameRecord>().eq("code", code).eq("payType", 2)); | 
|                                     TGameRecord one = list.get(0); | 
|   | 
|                                     if(one.getStatus() == 1){ | 
|                                         break; | 
|                                     } | 
|                                     ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryWXOrder(code, ""); | 
|                                     if(resultUtil.getCode() == 200 && one.getStatus() == 0){ | 
|                                         /** | 
|                                          * SUCCESS—支付成功, | 
|                                          * REFUND—转入退款, | 
|                                          * NOTPAY—未支付, | 
|                                          * CLOSED—已关闭, | 
|                                          * REVOKED—已撤销(刷卡支付), | 
|                                          * USERPAYING--用户支付中, | 
|                                          * PAYERROR--支付失败(其他原因,如银行返回失败) | 
|                                          */ | 
|                                         Map<String, String> data1 = resultUtil.getData(); | 
|                                         String s = data1.get("trade_state"); | 
|                                         String transaction_id = data1.get("transaction_id"); | 
|                                         if("REFUND".equals(s) || "NOTPAY".equals(s) || "CLOSED".equals(s) || "REVOKED".equals(s) || "PAYERROR".equals(s) || num == 10){ | 
|                                             break; | 
|                                         } | 
|                                         if("SUCCESS".equals(s)){ | 
|                                             for (TGameRecord coursePackagePayment : list) { | 
|                                                 coursePackagePayment.setStatus(1); | 
|                                                 coursePackagePayment.setOrderNo(transaction_id); | 
|                                             } | 
|                                             gameRecordService.updateBatchById(list); | 
|                                             Integer integer = startGame(uid, gameId, spaceId, sutuId); | 
|                                             break; | 
|                                         } | 
|                                         if("USERPAYING".equals(s)){ | 
|                                             num++; | 
|                                         } | 
|                                     } | 
|                                 } | 
|                             }catch (Exception e){ | 
|                                 e.printStackTrace(); | 
|                             } | 
|                         } | 
|                     }).start(); | 
|                 } | 
|                 return weixinpay; | 
|             }else if(type==2){ | 
|                 ResultUtil alipay = payMoneyUtil.alipay("游戏支付", "游戏支付", "", code, config.getCash().toString(), "/base/course/aliPaymentCourseCallback"); | 
|                 if(alipay.getCode() == 200){ | 
|                     new Thread(new Runnable() { | 
|                         @Override | 
|                         public void run() { | 
|                             try { | 
|                                 int num = 1; | 
|                                 int wait = 0; | 
|                                 while (num <= 10){ | 
|                                     int min = 5000; | 
|                                     wait += (min * num); | 
|                                     Thread.sleep(wait); | 
|                                     List<TGameRecord> list = gameRecordService.list(new QueryWrapper<TGameRecord>().eq("code", code).eq("payType", 3)); | 
|                                     TGameRecord one = list.get(0); | 
|                                     if(one.getStatus() == 1){ | 
|                                         break; | 
|                                     } | 
|                                     ResultUtil<Map<String, String>> resultUtil = payMoneyUtil.queryALIOrder(code); | 
|                                     if(resultUtil.getCode() == 200 && one.getStatus() == 0){ | 
|                                         /** | 
|                                          * WAIT_BUYER_PAY(交易创建,等待买家付款)、 | 
|                                          * TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、 | 
|                                          * TRADE_SUCCESS(交易支付成功)、 | 
|                                          * TRADE_FINISHED(交易结束,不可退款) | 
|                                          */ | 
|                                         Map<String, String> data1 = resultUtil.getData(); | 
|                                         String s = data1.get("tradeStatus"); | 
|                                         String tradeNo = data1.get("tradeNo"); | 
|                                         if("TRADE_CLOSED".equals(s) || "TRADE_FINISHED".equals(s) || num == 10){ | 
|                                             break; | 
|                                         } | 
|                                         if("TRADE_SUCCESS".equals(s)){ | 
|                                             for (TGameRecord coursePackagePayment : list) { | 
|                                                 coursePackagePayment.setStatus(1); | 
|                                                 coursePackagePayment.setOrderNo(tradeNo); | 
|                                             } | 
|                                             gameRecordService.updateBatchById(list); | 
|                                             Integer integer = startGame(uid, gameId, spaceId, sutuId); | 
|                                             break; | 
|                                         } | 
|                                         if("WAIT_BUYER_PAY".equals(s)){ | 
|                                             num++; | 
|                                         } | 
|                                     } | 
|                                 } | 
|                             }catch (Exception e){ | 
|                                 e.printStackTrace(); | 
|                             } | 
|                         } | 
|                     }).start(); | 
|                 } | 
|                 return alipay; | 
|             }else if(type==3){ | 
|                 AppUser appUser = appUserClient.queryAppUser(uid); | 
|                 Integer playPaiCoins = appUser.getPlayPaiCoins(); | 
|                 BigDecimal playCoin = config.getPlayCoin(); | 
|                 int i = playCoin.intValue(); | 
|                 if(playPaiCoins<i){ | 
|                     return ResultUtil.error("玩湃币不足"); | 
|                 } | 
|                 int i1 = playPaiCoins - i; | 
|                 appUser.setPlayPaiCoins(i1); | 
|                 appUserClient.updateAppUser(appUser); | 
|                 startGame(uid,gameId,spaceId,sutuId); | 
|                 return ResultUtil.success(); | 
|   | 
|             }else { | 
|                 return ResultUtil.error("支付方式错误"); | 
|             } | 
|         }catch (Exception e){ | 
|             e.printStackTrace(); | 
|             return ResultUtil.runErr(); | 
|         } | 
|   | 
|   | 
|   | 
|     } | 
|   | 
|   | 
|     private static Integer startGame(Integer uid,Integer gameId,Integer spaceId,Integer sutuId){ | 
|         HashMap<String, String> map = new HashMap<>(); | 
|         map.put("sign","0DB011836143EEE2C2E072967C9F4E4B"); | 
|         map.put("app_user_id",uid+""); | 
|         map.put("game_id",gameId+""); | 
|         map.put("space_id",spaceId+""); | 
|         map.put("sutu_id",sutuId+""); | 
|   | 
|         String s = HttpRequestUtil.postRequest("https://try.daowepark.com/v7/user_api/general/gameStart", map); | 
|         JSONObject jsonObject = JSONObject.parseObject(s); | 
|         Object code = jsonObject.get("code"); | 
|         if(String.valueOf(code)!=null && "200".equals(String.valueOf(code))){ | 
|             return 200; | 
|         }else { | 
|             return 500; | 
|         } | 
|     } | 
|   | 
|   | 
|     public static void main(String[] args) { | 
|         Integer integer = startGame(1, 13, 1001, 1001); | 
|         System.out.println(integer); | 
|     } | 
| } |