package org.example.ssmico.demos.web.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.*; import lombok.extern.slf4j.Slf4j; import org.example.ssmico.demos.web.dto.ResultDataListDto; import org.example.ssmico.demos.web.dto.ResultListDto; import org.example.ssmico.demos.web.util.RsaSigner; import org.example.ssmico.demos.web.util.GoogleTranslateUtil; import org.example.ssmico.demos.web.vo.WithdrawDepositVo; import org.example.ssmico.demos.web.dto.AddressListDto; import org.example.ssmico.demos.web.dto.ResultDto; import org.example.ssmico.demos.web.service.UserPayService; import org.example.ssmico.demos.web.util.ResultObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SignatureException; import java.security.spec.InvalidKeySpecException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; @Slf4j @Service public class UserPayServiceImpl implements UserPayService { @Value("${HB_PRIKEY}") private String priKey; @Value("${HB_PUBKEY}") private String pubKey; @Value("${HB_BASEURL}") private String baseUrl; @Value("${HB_APP_ID}") private String appId; /** * 获取地址 * @return * @throws NoSuchAlgorithmException * @throws InvalidKeySpecException * @throws SignatureException * @throws InvalidKeyException */ @Override public ResultDto getAddressList(String coin) throws NoSuchAlgorithmException, InvalidKeySpecException, SignatureException, InvalidKeyException { RsaSigner signer = new RsaSigner(); ResultDto resultDto = new ResultDto(); Map params = new HashMap<>(); params.put("app_id", appId); params.put("version", "1.0"); params.put("key_version", "admin"); params.put("time", Long.toString(System.currentTimeMillis() / 1000)); params.put("coin", coin); try { String sign = signer.genSign(params, priKey); params.put("sign", sign); System.out.println("prikey="+priKey); Gson gson = new GsonBuilder().create(); System.out.println("params = " + gson.toJson(params)); String url = baseUrl + "/address/getBatch"; System.out.println("请求地址:"+url); String res = signer.doPost(url, gson.toJson(params)); log.info("---获取地址结果--->"+res); if (StringUtils.isBlank(res)) { log.error("获取火币地址错误,结果集为空"); }else{ resultDto = JSONUtil.toBean(res, ResultDto.class); } log.info("获取火币地址返回结果:{}", resultDto); } catch (Exception e) { log.error("获取火币地址错误: {}", e.getMessage()); throw e; } return resultDto; } /** * 地址状态同步 * @param userId * @param address * @return */ public ResultDto syncStatus(String coin,String userId,String address){ ResultDto resultDto = new ResultDto(); RsaSigner signer = new RsaSigner(); Map params = new HashMap<>(); params.put("app_id", appId); params.put("version", "1.0"); params.put("key_version", "admin"); params.put("time", Long.toString(System.currentTimeMillis() / 1000)); params.put("coin", coin); params.put("address", address); params.put("user_id", userId); try { params.put("sign", signer.genSign(params, priKey)); Gson gson = new GsonBuilder().create(); System.out.println("params = " + gson.toJson(params)); String res = signer.doPost( baseUrl + "/address/syncStatus", gson.toJson(params)); if (null == res) { throw new RuntimeException("支付地址绑定失败"); } List list = new ArrayList<>(); list.add(address); resultDto = JSONUtil.toBean(res, ResultDto.class); resultDto.setData(list); log.info("用户匹配地址返回结果:{}", resultDto.toString()); } catch (Exception e) { e.printStackTrace(); } return resultDto; } // // public static void main(String[] args) { // String priKey="MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDNZrCLnuGZTJ++4eyc4tEGrub6GjVj3w5Hg3n8ROdeJAj1SJmuPwZl3egonJPp9kh80MJL5dshuN7lMTti1CuLb8Qt7MW8aqORYqBytx2tMr9JZwA1bh3ZQ5IPszKPw/Vt5OO5+3iWy9VhqrzrXXHuoX1eB4X2z3KmtIBQB7Mz+8DCGDOv5KqY2kuqU8qXdTDOUWZwUeevU2bHh5UtIeUztlVZhH4o3DJUC1+CTz9uSiQ73YEa97vn+Mafz/rpNG7uCzLf5kKro0RfFyuiVPcwULo3TuWVeEGj3V9H4PDmI/oOa7B6BQpKkIb7u/9BBMRJQcz9gLt+PWF4zAddDOwJAgMBAAECggEAWg/s2UuRH+a5JLlrRl8tyABoxsE3J9NmL3U2x6ZuzJiAVQzAVebMp13lrej58lxK7G+cwirHKsIk+dnccDkX3svi+UAYc8VOczELqUEhgg/+T/EZ5lOiQuGd6cRpJyCFPOpf7+yTs4ssxOZYb9tJWZj1n4Us+Et9uhrrKCw4J1IyaHwyMOYh2w57vkeaa8ktLQSjPLeXgTL9kJXN9l7yJsl4dCnWFsOcH48+qtplzT5/JlB6R9vgvZDiR9Xi6ld1ImZfLYvq4AqWVU4p7JOL2b/Z7hNAuRCt/8he6KfJ94UemjHct8yL27xeFK6UXQfPqKAX6nqf+KncX5hiHlalAQKBgQD1H3j5UAs/HVdSwq4OL72hzCwKp5sXMs/23LM1elh7Cya7v7L4bPYkxaLF0BNB4IgmBT4KsBjhXRxguoZExG+PX/6ATSWZXO2rePRQti1ueoZETDihfqiRqNYO/SfKlxLTDHP4CWTV5Xt5fRz9Xxei7CJ0x3+4PEVjzrUFN4XOJwKBgQDWg/0Q6+QV8tBPdHIzrhlnL1CLqkHAlhOyl/wDOYN+ogsLpzJbiX74t6TEgrAnZGIYrsldHSHFOFD/DCDZfcNz2aKibnLnEBYKE2xpgiDCdmY5EphqLgha4XUUjxUQXS++Y+NGm5cMsfrhcNMYldg040D6nHeDFfqnfJPbdWoCTwKBgQDtjIqYUlIT4EN4GOLFLM8BtfQYf0V1vfB8tHWYJfEJjU0ENksjJbWE/WM5gOSouwg2kG4HvZDfFnUh6KGmkxfqQoVJoXoGnmBWBOoALgzpPCRSm+tl1nFWd+C6teuSEcZUcYURo0jtYW+/1Nf7U+R8J4tc0NmdmgtFJlWXsK8jkQKBgQDTmIwWleh9Me8CgOVpTtEl9AjqSz3ifubdIofmkmO/lI16qCjHHCBPq63uXM7vfFg66qYbn/HAvSU//zGj9ybFbqa6vGHAxCBJPhGRHVe9GdcJcus+yTtakcvQRLbNVm4SyirUagMb9a93krfXJ2+F86gTzCUi+5osfXjHX9D6hwKBgFvl9pDYX8pDeXGIvpcN7f9lzk0aWQJiAm0rVgfsvn+3ovXD2L0kGkiJNqubGfkcM++aLIZZ6mYZs4Xv1VHiLO8pnbUYTNsuRYiuJzanrZpmnYajBx8CdyRFl5Y4fLsgO8b0GWMJEuTKaf54NtdiEmdLEnK5CmJlXQBx04YL+W4O"; // String HB_PUBKEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4N5eqJktuOjTweTlllS3b8h5v2usp4hIevyoVpZCKFF4yqN+1MPRnjLS6Du+rhnjiv382MxnrebaZasNkeNo1X2+QfScyLu+994v8GzdQ7u5n8FVJoZkQR9lvC+a9DuJ61KCuY08vQdCuaMh0FeCxyF5Rk3yvx6H6K9zGJGXMbo2cJUofqktcHVoova009lzYJHLh2Pwk0o2hgp/9Nir6ZkXjYxw1upqKJA8lsgIFDvsefXWo7D50mzm/3BvVfus0d2fu+scS7CmeRgSuMxpfhmhlLGJ5GtAnsJ/3amMcp/X8tcRCLmRzGx758Hsb+2/zEKbjR7a6EVNdct8u5ELnwIDAQAB"; // String baseUrl="https://apitest.hyperbc.pro/shopapi"; // String appId="skktesi4demjjm6m"; // String coin = "trx"; // String address = "TNJd5mA41rrJn2gGELpQtVLRFjnTdjcFNh"; // ResultObject resultObject = new ResultObject(); // RsaSigner signer = new RsaSigner(); // Map params = new HashMap<>(); // params.put("app_id", appId); // params.put("version", "1.0"); // params.put("key_version", "admin"); // params.put("time", Long.toString(System.currentTimeMillis() / 1000)); // params.put("coin", coin); // if(!StringUtils.isBlank(address)){ // params.put("address", address); // } // params.put("page", "1"); // params.put("is_used", "1"); // // try { // // params.put("sign", signer.genSign(params, priKey)); // // Gson gson = new GsonBuilder().create(); // System.out.println("params = " + gson.toJson(params)); // ObjectMapper objectMapper = new ObjectMapper(); // String res = signer.doPost(baseUrl + "/address/list", gson.toJson(params)); // if (null == res) { // throw new RuntimeException("http error"); // } // AddressListDto addressListDto = objectMapper.readValue(res, AddressListDto.class); // if(addressListDto.getStatus() != 200){ // resultObject.setCode("1"); // resultObject.setMsg(addressListDto.getMsg()); // } // if(null != addressListDto.getData() && addressListDto.getData().getCount() > 0 && null != addressListDto.getData().getList()){ // if(null != addressListDto.getData().getList().get(0)){ // resultObject.setData(addressListDto.getData().getList().get(0)); // } // } // log.info("查询地址绑定状态返回结果:{}", addressListDto.toString()); // } catch (Exception e) { // e.printStackTrace(); // } // } /** * 查询地址绑定状态 * @param userId * @param address * @return */ public ResultObject getBindingState(String coin,String address) { ResultObject resultObject = new ResultObject(); RsaSigner signer = new RsaSigner(); Map params = new HashMap<>(); params.put("app_id", appId); params.put("version", "1.0"); params.put("key_version", "admin"); params.put("time", Long.toString(System.currentTimeMillis() / 1000)); params.put("coin", coin); if(!StringUtils.isBlank(address)){ params.put("address", address); } params.put("page", "1"); params.put("is_used", "1"); try { params.put("sign", signer.genSign(params, priKey)); Gson gson = new GsonBuilder().create(); System.out.println("params = " + gson.toJson(params)); ObjectMapper objectMapper = new ObjectMapper(); String res = signer.doPost(baseUrl + "/address/list", gson.toJson(params)); System.out.println("-----获取地址返回参数:"+res.toString()); if (null == res) { throw new RuntimeException("http error"); } AddressListDto addressListDto = objectMapper.readValue(res, AddressListDto.class); if(addressListDto.getStatus() != 200){ resultObject.setCode("1"); resultObject.setMsg(addressListDto.getMsg()); } if(null != addressListDto.getData() && addressListDto.getData().getCount() > 0 && null != addressListDto.getData().getList()){ if(null != addressListDto.getData().getList().get(0)){ resultObject.setData(addressListDto.getData().getList().get(0)); } } log.info("查询地址绑定状态返回结果:{}", addressListDto.toString()); } catch (Exception e) { e.printStackTrace(); } return resultObject; } public List getBindingState(String coin) { ResultObject resultObject = new ResultObject(); RsaSigner signer = new RsaSigner(); Map params = new HashMap<>(); params.put("app_id", appId); params.put("version", "1.0"); params.put("key_version", "admin"); params.put("time", Long.toString(System.currentTimeMillis() / 1000)); params.put("coin", coin); params.put("page", "1"); params.put("is_used", "2"); try { params.put("sign", signer.genSign(params, priKey)); Gson gson = new GsonBuilder().create(); System.out.println("params = " + gson.toJson(params)); ObjectMapper objectMapper = new ObjectMapper(); String res = signer.doPost(baseUrl + "/address/list", gson.toJson(params)); log.info("查询未使用地址结果:{}", res.toString()); if (null == res) { return new ArrayList(); } ResultListDto resultDto = JSONUtil.toBean(res, ResultListDto.class); if (null == resultDto) { return new ArrayList(); } if(CollectionUtils.isEmpty(resultDto.getData().getList())){ return new ArrayList(); } List list = resultDto.getData().getList() .stream().filter(f -> StringUtils.isBlank(f.getUser_id())).map(ResultDataListDto::getAddress).collect(Collectors.toList()); System.out.println("response = " + list); log.info("查询未使用地址:{}", list.toString()); return list; } catch (Exception e) { e.printStackTrace(); } return new ArrayList(); } @Override public ResultObject withdrawDeposit(WithdrawDepositVo vo) { ResultObject resultObject = new ResultObject(); RsaSigner signer = new RsaSigner(); Map params = new HashMap<>(); params.put("app_id", appId); params.put("version", "1.0"); params.put("key_version", "admin"); params.put("time", Long.toString(System.currentTimeMillis() / 1000)); params.put("user_id", vo.getUserId()); params.put("coin", "eth"); params.put("address", vo.getAddress()); params.put("amount", vo.getAmount()); params.put("trade_id", vo.getTradeId()); try { params.put("sign", signer.genSign(params, priKey)); Gson gson = new GsonBuilder().create(); System.out.println("params = " + gson.toJson(params)); String res = signer.doPost(baseUrl + "/transfer", gson.toJson(params)); if (null == res) { throw new RuntimeException("http error"); } } catch (Exception e) { e.printStackTrace(); } return resultObject; } @Override public ResultObject getUserRechargeAddress(String s,String userId,String lang) throws Exception { ResultObject resultObject = new ResultObject(); GoogleTranslateUtil googleTranslateUtil = new GoogleTranslateUtil(); String address = ""; try { //查询地址 ResultDto resultDto = getAddressList(s); System.out.println("获取地址-->"+resultDto.toString()); if(resultDto.getStatus() == 200 && null != resultDto.getData() && !resultDto.getData().isEmpty()){ address = resultDto.getData().get(0); } if(resultDto.getStatus() == 500){ resultObject.setCode("1"); resultObject.setMsg("地址不足"); return resultObject; } if(resultDto.getStatus() == 551){//已分配未使用 List list = getAddressUnusedList(s); if(CollectionUtils.isEmpty(list)){ resultObject.setCode("1"); resultObject.setMsg("没有可用地址"); return resultObject; } address = list.get(0); } //地址状态同步 ResultDto result = syncStatus(s,userId,address); if(result.getStatus() == 525){ //查询用户有没有分配地址 ResultObject bindingState = getBindingState(s,null); if(!bindingState.getCode().equals("0")){ return bindingState; } Map map = BeanUtil.beanToMap(bindingState.getData(), new HashMap<>(), false, true); resultObject.setData(map.get("address")); return resultObject; } resultObject.setData(result.getData().get(0)); } catch (Exception e) { e.printStackTrace(); resultObject.setCode("1"); resultObject.setMsg(googleTranslateUtil.translate("获取火币地址出错", lang)); } return resultObject; } @Override public List getAddressUnusedList(String coin) { return getBindingState(coin); } }