| | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.fasterxml.jackson.databind.ObjectMapper; |
| | | import com.yami.trading.bean.vo.RechargeAddressVo; |
| | | import com.yami.trading.common.constants.RedisKeys; |
| | | import com.yami.trading.security.common.enums.CryptoCurrencyEnum; |
| | | import com.yami.trading.security.common.util.LocalKeyStorageAESUtil; |
| | | import com.yami.trading.api.UD.*; |
| | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | |
| | | private SysUserService sysUserService; |
| | | @Autowired |
| | | RechargeBlockchainOrderService rechargeBlockchainOrderService; |
| | | |
| | | private final String gateway = "https://sig11.udun.io"; |
| | | private final String merchantKey = "7fd79e4ed59e7c31e1fa2e13d64f7e6c"; |
| | | private final String merchantId = "319563"; |
| | | private final String defaultCallBackUrl = "https://openapi.yanshiz.com/api/channelBlockchain!rechargeCallback.action"; |
| | | |
| | | |
| | | @Autowired |
| | | UdunClient udunClient; |
| | | |
| | | /** |
| | | * 获取所有链地址 |
| | |
| | | */ |
| | | @GetMapping(action + "getBlockchainName.action") |
| | | public Object getBlockchainName(HttpServletRequest request) throws Exception { |
| | | String coin = request.getParameter("coin"); |
| | | List<ChannelBlockchain> data = new ArrayList<ChannelBlockchain>(); |
| | | |
| | | /*String coin = request.getParameter("coin"); |
| | | List<ChannelBlockchain> data = new ArrayList<>(); |
| | | try { |
| | | coin = coin.toLowerCase(); |
| | | Map<String, List<CryptoCurrencyEnum>> allGroupedByCoin = CryptoCurrencyEnum.getAllGroupedByCoin(); |
| | |
| | | log.error("获取充值地址错误:",e); |
| | | return Result.failed("充值链暂不可用"); |
| | | } |
| | | return Result.succeed(data); |
| | | return Result.succeed(data);*/ |
| | | |
| | | |
| | | |
| | | // String partyId =SecurityUtils.getUser().getUserId(); |
| | | // User party = userService.getById(partyId); |
| | | // if (0 == this.sysparaService.find("can_recharge").getInteger()) { |
| | | // return Result.failed("请联系客服充值"); |
| | |
| | | // data.get(i).setAddress(null); |
| | | // } |
| | | // } |
| | | |
| | | |
| | | // String partyId =SecurityUtils.getUser().getUserId(); |
| | | // if(!StringUtils.isNotEmpty(partyId)){ |
| | | // throw new YamiShopBindException("请登录!"); |
| | |
| | | // if (0 == this.sysparaService.find("can_recharge").getInteger()) { |
| | | // return Result.failed("请联系客服充值"); |
| | | // } |
| | | // RechargeAddressVo rechargeAddressVo = new RechargeAddressVo(); |
| | | // |
| | | // //获取u盾地址 |
| | | // //获取商户支持币种 |
| | | // List<Coin> coinList = listSupportCoin(merchantId,false); |
| | | // //创建地址 |
| | | // coinList.forEach(f->{ |
| | | // Address address = new Address(); |
| | | // if(f.getName().equals("BTC")){ |
| | | // String ress = (String)redisTemplate.opsForValue().get(partyId + "BTC"); |
| | | // if(StringUtils.isNotEmpty(ress)){ |
| | | // rechargeAddressVo.setAddress(ress); |
| | | // rechargeAddressVo.setCoin(coin); |
| | | // rechargeAddressVo.setBlockchainName(coin); |
| | | // }else{ |
| | | // address = createAddress(f.getMainCoinType(),null,null,null); |
| | | // rechargeAddressVo.setAddress(address.getAddress()); |
| | | // rechargeAddressVo.setCoin(coin); |
| | | // rechargeAddressVo.setBlockchainName(coin); |
| | | // redisTemplate.opsForValue().set(partyId + "BTC",address.getAddress()); |
| | | // } |
| | | // }else if(f.getName().equals("ETH")){ |
| | | // String ress = (String)redisTemplate.opsForValue().get(partyId + "ETH"); |
| | | // if(StringUtils.isNotEmpty(ress)){ |
| | | // rechargeAddressVo.setAddress(ress); |
| | | // rechargeAddressVo.setCoin(coin); |
| | | // rechargeAddressVo.setBlockchainName(coin); |
| | | // }else{ |
| | | // address = createAddress(f.getMainCoinType(),null,null,null); |
| | | // rechargeAddressVo.setAddress(address.getAddress()); |
| | | // rechargeAddressVo.setCoin(coin); |
| | | // rechargeAddressVo.setBlockchainName(coin); |
| | | // redisTemplate.opsForValue().set(partyId + "ETH",address.getAddress()); |
| | | // } |
| | | // }else if(f.getName().equals("USDT")){ |
| | | // String ress = (String)redisTemplate.opsForValue().get(partyId + "USDT"); |
| | | // if(StringUtils.isNotEmpty(ress)){ |
| | | // rechargeAddressVo.setAddress(ress); |
| | | // rechargeAddressVo.setCoin(coin); |
| | | // rechargeAddressVo.setBlockchainName(coin); |
| | | // }else{ |
| | | // address = createAddress(f.getMainCoinType(),null,null,null); |
| | | // rechargeAddressVo.setAddress(address.getAddress()); |
| | | // rechargeAddressVo.setCoin(coin); |
| | | // rechargeAddressVo.setBlockchainName(coin); |
| | | // redisTemplate.opsForValue().set(partyId + "USDT",address.getAddress()); |
| | | // } |
| | | // } |
| | | // }); |
| | | // return Result.succeed(rechargeAddressVo); |
| | | } |
| | | String coin = request.getParameter("coin"); |
| | | coin = coin.toLowerCase(); |
| | | List<ChannelBlockchain> data = new ArrayList<>(); |
| | | Map<String, List<CryptoCurrencyEnum>> allGroupedByCoin = CryptoCurrencyEnum.getAllGroupedByCoin(); |
| | | List<CryptoCurrencyEnum> currencyEnums = allGroupedByCoin.get(coin); |
| | | try { |
| | | String partyId = SecurityUtils.getUser().getUserId(); |
| | | //获取u盾地址 |
| | | //获取商户支持币种 |
| | | List<Coin> coinList = udunClient.listSupportCoin(false); |
| | | |
| | | public List<Coin> listSupportCoin(String merchantId , boolean showBalance) { |
| | | Map<String, Object> params = new HashMap<>(); |
| | | params.put("merchantId", merchantId); |
| | | params.put("showBalance", showBalance); |
| | | ResultMsg result = JSONUtil.toBean(UdunUtils.post(gateway, merchantKey, ApiPath.SUPPORT_COIN, JSONUtil.toJsonStr(params)), ResultMsg.class); |
| | | if (result.getCode() != HttpStatus.HTTP_OK) { |
| | | Console.error(JSONUtil.toJsonStr(result)); |
| | | return null; |
| | | currencyEnums.forEach((currencyEnum) -> { |
| | | String coinName = currencyEnum.getName(); |
| | | Coin c = coinList.stream().filter(x -> x.getName().equals(coinName)).findFirst().orElse(null); |
| | | if (c != null) { |
| | | ChannelBlockchain rechargeAddressVo = new ChannelBlockchain(); |
| | | //创建地址 |
| | | Address address; |
| | | String ress = (String)redisTemplate.opsForValue().get(RedisKeys.BLOCKCHAIN_ADDRESS + partyId + coinName); |
| | | if(StringUtils.isNotEmpty(ress)){ |
| | | rechargeAddressVo.setAddress(ress); |
| | | }else{ |
| | | address = udunClient.createAddress(c.getMainCoinType()); |
| | | rechargeAddressVo.setAddress(address.getAddress()); |
| | | redisTemplate.opsForValue().set(RedisKeys.BLOCKCHAIN_ADDRESS + partyId + coinName, address.getAddress()); |
| | | } |
| | | //rechargeAddressVo.setAddress("test" + coinName); |
| | | rechargeAddressVo.setCoin(currencyEnum.getCoin()); |
| | | rechargeAddressVo.setBlockchain_name(currencyEnum.getChain()); |
| | | rechargeAddressVo.setAuto(false); |
| | | rechargeAddressVo.setImg(null); |
| | | |
| | | data.add(rechargeAddressVo); |
| | | } |
| | | }); |
| | | }catch (Exception e){ |
| | | log.error("获取充值地址错误:",e); |
| | | return Result.failed("充值链暂不可用"); |
| | | } |
| | | return JSONUtil.toList(JSONUtil.parseArray(result.getData()), Coin.class); |
| | | return Result.succeed(data); |
| | | } |
| | | |
| | | public Address createAddress(String mainCoinType, String alias, String walletId, String callUrl) throws UdunException { |
| | | Map<String, String> params = new HashMap<>(); |
| | | params.put("merchantId", merchantId); |
| | | params.put("coinType", mainCoinType); |
| | | params.put("callUrl", defaultCallBackUrl); |
| | | params.put("walletId", walletId); |
| | | params.put("alias", alias); |
| | | |
| | | ResultMsg result = JSONUtil.toBean(UdunUtils.post(gateway, merchantKey, ApiPath.CREATE_ADDRESS, StrUtil.format("[{}]", JSONUtil.toJsonStr(params))), ResultMsg.class); |
| | | if (result.getCode() != HttpStatus.HTTP_OK) { |
| | | throw new UdunException(result.getCode(), result.getMessage()); |
| | | } |
| | | return JSONUtil.toBean(result.getData(), Address.class); |
| | | } |
| | | |
| | | @RequestMapping(action +"rechargeCallback.action") |
| | | @PostMapping(action +"rechargeCallback.action") |
| | | public ResultMsg rechargeCallback(HttpServletRequest request){ |
| | | String timestamp = request.getParameter("timestamp"); |
| | | String nonce = request.getParameter("nonce"); |
| | | String sign = request.getParameter("sign"); |
| | | String body = request.getParameter("body"); |
| | | |
| | | ResultMsg resultMsg = new ResultMsg(); |
| | | try{ |
| | | log.info("===rechargeCallback===:{}", body); |
| | | boolean flag = udunClient.checkSign(timestamp, nonce, body, sign); |
| | | log.info("===rechargeCallback===sign:{}", flag); |
| | | |
| | | if (!flag){ |
| | | resultMsg.setCode(406); |
| | | resultMsg.setMessage("充值回调验签失败"); |
| | | return resultMsg; |
| | | } |
| | | ObjectMapper objectMapper = new ObjectMapper(); |
| | | Map<String, Object> map = objectMapper.readValue(body, HashMap.class); |
| | | double amounts = Double.parseDouble(map.get("amount").toString()); // 假设 amount 的值为 1000 |
| | |
| | | double success_amount = amounts / Math.pow(10, decimals); |
| | | String address = map.get("address").toString(); |
| | | |
| | | |
| | | RechargeBlockchainOrder blockchainOrder = rechargeBlockchainOrderService.getOne(new LambdaQueryWrapper<>(RechargeBlockchainOrder.class) |
| | | .eq(RechargeBlockchainOrder::getSucceeded, 0) |
| | | .eq(RechargeBlockchainOrder::getChannelAddress, address).last(" limit 1 ")); |
| | | if(ObjectUtil.isEmpty(blockchainOrder)){ |
| | | ResultMsg resultMsg = new ResultMsg(); |
| | | resultMsg.setCode(200); |
| | | return resultMsg; |
| | | } |
| | | SysUser user = sysUserService.getSysUserById( Long.getLong(blockchainOrder.getPartyId())); |
| | | rechargeBlockchainOrderService.manualReceipt(1,blockchainOrder.getPartyId(), BigDecimal.valueOf(success_amount),user.getUsername()); |
| | | ResultMsg resultMsg = new ResultMsg(); |
| | | Integer status = Integer.valueOf(map.get("status").toString()); |
| | | User user = userService.getById(blockchainOrder.getPartyId()); |
| | | |
| | | log.info("===rechargeCallback==d=blockchainOrder:{}", blockchainOrder); |
| | | if (status == 3) { //交易成功 |
| | | rechargeBlockchainOrderService.manualReceipt(1,blockchainOrder.getOrderNo(), BigDecimal.valueOf(success_amount),user.getUserName()); |
| | | } else if(status == 2) { //驳回 |
| | | rechargeBlockchainOrderService.refusalApply(blockchainOrder.getUuid(), "订单失败:" + status, user.getUserName()); |
| | | } |
| | | |
| | | resultMsg.setCode(200); |
| | | return resultMsg; |
| | | }catch (Exception e){ |
| | | ResultMsg resultMsg = new ResultMsg(); |
| | | resultMsg.setCode(500); |
| | | resultMsg.setMessage("回调处理失败"); |
| | | return resultMsg; |