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<String, Object> 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<String, Object> 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<String> 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<String, Object> 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<String, Object> 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<String, Object> 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<String>();
|
}
|
ResultListDto resultDto = JSONUtil.toBean(res, ResultListDto.class);
|
if (null == resultDto) {
|
return new ArrayList<String>();
|
}
|
if(CollectionUtils.isEmpty(resultDto.getData().getList())){
|
return new ArrayList<String>();
|
}
|
List<String> 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<String>();
|
}
|
|
@Override
|
public ResultObject withdrawDeposit(WithdrawDepositVo vo) {
|
ResultObject resultObject = new ResultObject();
|
RsaSigner signer = new RsaSigner();
|
|
Map<String, Object> 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<String> 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<String, Object> 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<String> getAddressUnusedList(String coin) {
|
return getBindingState(coin);
|
}
|
}
|