From 9031180e72e881827c30e757237a63ce9304c149 Mon Sep 17 00:00:00 2001 From: zainali5120 <512061637@qq.com> Date: Sun, 31 May 2020 22:44:07 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/main/java/com/xcong/excoin/modules/blackchain/service/BchService.java | 138 ++ src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAuthenticationInfoVo.java | 26 src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java | 283 ++++ src/main/java/com/xcong/excoin/modules/member/dao/AgentReturnDao.java | 10 src/main/java/com/xcong/excoin/modules/platform/dao/PlatformFeeSettingDao.java | 14 src/main/java/com/xcong/excoin/modules/blackchain/service/DateUtil.java | 1369 +++++++++++++++++++ src/main/java/com/xcong/excoin/modules/platform/entity/PlatformCnyUsdtExchangeEntity.java | 8 src/main/resources/mapper/platform/PlatformFeeSettingDao.xml | 24 src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java | 6 pom.xml | 20 src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransactions.java | 36 src/main/java/com/xcong/excoin/modules/blackchain/service/HttpUtil.java | 281 ++++ src/main/java/com/xcong/excoin/modules/member/parameter/dto/MemberPaymethodDto.java | 6 src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAvivableCoinInfoVo.java | 19 src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java | 110 + lib/ripple-core-0.0.1-SNAPSHOT.jar | 0 src/main/java/com/xcong/excoin/modules/blackchain/controller/BlockController.java | 47 src/main/resources/mapper/member/AgentReturnDao.xml | 5 src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoListVo.java | 16 src/main/java/com/xcong/excoin/modules/blackchain/service/BigDecimalUtil.java | 190 ++ src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoVo.java | 14 src/main/resources/mapper/member/MemberCoinAddressDao.xml | 19 src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransResult.java | 49 src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java | 92 src/main/java/com/xcong/excoin/modules/blackchain/service/BlockSerive.java | 9 src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java | 219 +++ src/main/java/com/xcong/excoin/modules/blackchain/service/LtcService.java | 125 + src/main/java/com/xcong/excoin/modules/blackchain/service/BtcService.java | 138 ++ src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTx.java | 63 src/main/java/com/xcong/excoin/modules/platform/entity/PlatformFeeSettingEntity.java | 53 src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtService.java | 167 ++ src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberPersonCenterInfoVo.java | 32 src/main/java/com/xcong/excoin/modules/blackchain/service/XrpService.java | 487 +++++++ src/main/java/com/xcong/excoin/modules/member/service/MemberService.java | 8 34 files changed, 4,033 insertions(+), 50 deletions(-) diff --git a/lib/ripple-core-0.0.1-SNAPSHOT.jar b/lib/ripple-core-0.0.1-SNAPSHOT.jar new file mode 100644 index 0000000..e3744e0 --- /dev/null +++ b/lib/ripple-core-0.0.1-SNAPSHOT.jar Binary files differ diff --git a/pom.xml b/pom.xml index f2cea20..191b9fe 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,14 @@ </properties> <dependencies> + + <dependency> + <groupId>ripple</groupId> + <artifactId>ripple</artifactId> + <version>0.0.1</version> + <scope>system</scope> + <systemPath>${basedir}/lib/ripple-core-0.0.1-SNAPSHOT.jar</systemPath> + </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> @@ -112,6 +120,18 @@ <artifactId>mysql-connector-java</artifactId> <version>${mysql-driver.version}</version> </dependency> + + <dependency> + <groupId>org.web3j</groupId> + <artifactId>core</artifactId> + <version>4.5.5</version> + </dependency> + <!-- https://mvnrepository.com/artifact/org.web3j/parity --> + <dependency> + <groupId>org.web3j</groupId> + <artifactId>parity</artifactId> + <version>4.5.10</version> + </dependency> <!-- 参数校验 start --> <dependency> diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/controller/BlockController.java b/src/main/java/com/xcong/excoin/modules/blackchain/controller/BlockController.java new file mode 100644 index 0000000..e024e8d --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/controller/BlockController.java @@ -0,0 +1,47 @@ +package com.xcong.excoin.modules.blackchain.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.xcong.excoin.common.response.Result; +import com.xcong.excoin.modules.blackchain.service.BlockSerive; +import com.xcong.excoin.utils.RedisUtils; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Api(value = "链上钱包接口", tags = "链上钱包接口") +@RestController +@RequestMapping(value = "/api/block") +public class BlockController { + + + + @Autowired + RedisUtils redisUtils; + @Autowired + BlockSerive blockSerive; + /** + * BTC + * @param token + * @return + */ + @ApiOperation(value = "链上生成钱包地址接口", notes = "链上生成钱包地址接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "symbol", value = "币种", required = true, dataType = "String", paramType="query") + }) + @GetMapping(value = "/findBlockAddress") + public Result findBlockAddress(String symbol) { + return blockSerive.findBlockAddress(symbol); + } + +} diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransResult.java b/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransResult.java new file mode 100644 index 0000000..a9bf035 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransResult.java @@ -0,0 +1,49 @@ +package com.xcong.excoin.modules.blackchain.model; + +import java.util.List; + +// https://github.com/ripple/rippled-historical-database#get-account-transaction-history +public class XrpTransResult { + private String result; //success + private Integer count; // + private String marker;// + + //transactions + List<XrpTransactions> transactions; + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public String getMarker() { + return marker; + } + + public void setMarker(String marker) { + this.marker = marker; + } + + public List<XrpTransactions> getTransactions() { + return transactions; + } + + public void setTransactions(List<XrpTransactions> transactions) { + this.transactions = transactions; + } + + + + +} diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransactions.java b/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransactions.java new file mode 100644 index 0000000..f69f00f --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransactions.java @@ -0,0 +1,36 @@ +package com.xcong.excoin.modules.blackchain.model; + +public class XrpTransactions { + + private String hash; + private Integer ledger_index; + private String date;//2019-10-28T15:01:01+00:00 + private XrpTx tx; + + public String getHash() { + return hash; + } + public void setHash(String hash) { + this.hash = hash; + } + public Integer getLedger_index() { + return ledger_index; + } + public void setLedger_index(Integer ledger_index) { + this.ledger_index = ledger_index; + } + public String getDate() { + return date; + } + public void setDate(String date) { + this.date = date; + } + public XrpTx getTx() { + return tx; + } + public void setTx(XrpTx tx) { + this.tx = tx; + } + + +} diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTx.java b/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTx.java new file mode 100644 index 0000000..513f593 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTx.java @@ -0,0 +1,63 @@ +package com.xcong.excoin.modules.blackchain.model; + +public class XrpTx { + private String TransactionType; + private Integer Flags; + private Integer Sequence; + private Integer DestinationTag; // 对应的用户标签 + private Integer Amount; // 金额 除以1000000 一百万 + private Integer Fee; // 手续费 + private String Account; // 转账人 + private String Destination; // 收款人(收款人是系统账户 说明是转入) + + public String getTransactionType() { + return TransactionType; + } + public void setTransactionType(String transactionType) { + TransactionType = transactionType; + } + public Integer getFlags() { + return Flags; + } + public void setFlags(Integer flags) { + Flags = flags; + } + public Integer getSequence() { + return Sequence; + } + public void setSequence(Integer sequence) { + Sequence = sequence; + } + public Integer getDestinationTag() { + return DestinationTag; + } + public void setDestinationTag(Integer destinationTag) { + DestinationTag = destinationTag; + } + public Integer getAmount() { + return Amount; + } + public void setAmount(Integer amount) { + Amount = amount; + } + public Integer getFee() { + return Fee; + } + public void setFee(Integer fee) { + Fee = fee; + } + public String getAccount() { + return Account; + } + public void setAccount(String account) { + Account = account; + } + public String getDestination() { + return Destination; + } + public void setDestination(String destination) { + Destination = destination; + } + + +} diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/BchService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/BchService.java new file mode 100644 index 0000000..eb142df --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/BchService.java @@ -0,0 +1,138 @@ +package com.xcong.excoin.modules.blackchain.service; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringUtils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; + + +public class BchService { + + + private static BchService service = null; + private final static String RESULT = "result"; + private final static String METHOD_SEND_TO_ADDRESS = "sendtoaddress"; + private final static String METHOD_GET_TRANSACTION = "gettransaction"; + private final static String METHOD_LIST_TRANSACTIONS = "listtransactions"; + private final static String METHOD_GET_BLOCK_COUNT = "getblockcount"; + private final static String METHOD_NEW_ADDRESS = "getnewaddress"; + private final static String METHOD_GET_BALANCE = "getbalance"; + private final static String METHOD_GET_BALANCE_ADDRESS = "getreceivedbyaddress"; + private final static String METHOD_WALLET_PASSPHRASE = "walletpassphrase"; + private final static String METHOD_WALLET_LOCK = "walletlock"; + + private String url = "http://121.40.86.163:1882"; + private String username = "biyi"; + private String password = "biyi12345"; + + public static BchService getInstance() { + if (service != null) { + return service; + } + return new BchService(); + } + + private BchService() { + } + + /** + * 创建BTC钱包 每个账户对应一个地址 方便后续操作 + * @param mId 账户 + * @return + */ + public static Map<String, String> createWallet(String mId) { + BchService btcService = getInstance(); + // 创建钱包地址 + String address = btcService.getAddress(mId); + // 私钥 + String privateKey = btcService.dumpprivkey(address); + Map<String, String> result = new HashMap<String,String>(); + result.put("address", address); + result.put("privateKey", privateKey); + return result; + } + public String getAddress(String label) { + try { + JSONObject json = doRequest(METHOD_NEW_ADDRESS,label); + if (isError(json)) { + return ""; + } + return json.getString(RESULT); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private JSONObject doRequest(String method, Object... params) { + JSONObject param = new JSONObject(); + param.put("id", System.currentTimeMillis() + ""); + param.put("jsonrpc", "2.0"); + param.put("method", method); + if (params != null) { + param.put("params", params); + } + String creb = Base64.encodeBase64String((username + ":" + password).getBytes()); + Map<String, String> headers = new HashMap<>(2); + headers.put("Authorization", "Basic " + creb); + return JSON.parseObject(HttpUtil.jsonPost(url, headers, param.toJSONString())); + } + + private boolean isError(JSONObject json) { + if (json == null || (StringUtils.isNotEmpty(json.getString("error")) && json.get("error") != "null")) { + return true; + } + return false; + } + + public String dumpprivkey(String address) { + try { + JSONObject obj = doRequest("dumpprivkey", address); + System.out.println(obj); + if (!isError(obj)) { + return obj.getString(RESULT); + } else { + return null; + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 查询给定地址的总收款额(只计算接受的) + * @param address + * @return + */ + public BigDecimal getBalance(String address) { + JSONObject json = doRequest(METHOD_GET_BALANCE_ADDRESS,address,3); + if (!isError(json)) { + return new BigDecimal(json.getString(RESULT)); + } else { + return null; + } + } + + public String METHOD_GET_BLOCK_COUNT() { + JSONObject json = doRequest(METHOD_GET_BLOCK_COUNT); + if (!isError(json)) { + return json.getString(RESULT); + } else { + return null; + } + } + public static void main(String[] args) { + BchService ser = new BchService(); + //ser.getBalance("36RiLqCrnFfBoyUUHpGvEotXiMRtrJG8dp"); + //System.out.println(ser.METHOD_GET_BLOCK_COUNT()); + System.out.println(ser.getBalance("36RiLqCrnFfBoyUUHpGvEotXiMRtrJG8dp")); + } + + +} diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/BigDecimalUtil.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/BigDecimalUtil.java new file mode 100644 index 0000000..3043a0f --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/BigDecimalUtil.java @@ -0,0 +1,190 @@ +package com.xcong.excoin.modules.blackchain.service; + + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.DecimalFormat; + +/** + * 数据计算工具类 + * + * @author cloud cloud + * @create 2017/10/11 + **/ +public class BigDecimalUtil { + + + /** + * 基本单位 + */ + private static final BigDecimal UNIT = new BigDecimal(100000000); + + /** + * 对double数据进行取精度. + * @param value double数据. + * @param scale 精度位数(保留的小数位数). + * @param roundingMode 精度取值方式. + * @return 精度计算后的数据. + */ + public static double round(double value, int scale, + int roundingMode) { + BigDecimal bd = new BigDecimal(value); + bd = bd.setScale(scale, roundingMode); + double d = bd.doubleValue(); + bd = null; + return d; + } + + /** + * 获取四位小数的字符串,小数位不够补充0 + * @param value + * @return X.0000 + */ + public static String getFourString(double value){ + DecimalFormat df = new DecimalFormat("0.0000"); + return df.format(value); + } + + + /** + * double 相加 + * @param d1 + * @param d2 + * @return + */ + public static double sum(Double d1,Double d2){ + BigDecimal bd1 = new BigDecimal(d1.toString()); + BigDecimal bd2 = new BigDecimal(d2.toString()); + return bd1.add(bd2).doubleValue(); + } + + public static double sum(String a,String b){ + BigDecimal pa = new BigDecimal(a); + BigDecimal pb = new BigDecimal(b); + return pa.add(pb).doubleValue(); + } + + + /** + * double 相减 + * @param d1 + * @param d2 + * @return + */ + public static double sub(double d1,double d2){ + BigDecimal bd1 = new BigDecimal(Double.toString(d1)); + BigDecimal bd2 = new BigDecimal(Double.toString(d2)); + return bd1.subtract(bd2).setScale(6,BigDecimal.ROUND_HALF_UP).doubleValue(); + } + + /** + * double 乘法 + * @param d1 + * @param d2 + * @return + */ + public static double mul(double d1,double d2){ + BigDecimal bd1 = new BigDecimal(Double.toString(d1)); + BigDecimal bd2 = new BigDecimal(Double.toString(d2)); + return bd1.multiply(bd2).setScale(6,BigDecimal.ROUND_HALF_UP).doubleValue(); + } + + + /** + * double 除法 + * @param d1 + * @param d2 + * @param scale 四舍五入 小数点位数 + * @return + */ + public static double div(double d1,double d2,int scale){ + // 当然在此之前,你要判断分母是否为0, + // 为0你可以根据实际需求做相应的处理 + + BigDecimal bd1 = new BigDecimal(Double.toString(d1)); + BigDecimal bd2 = new BigDecimal(Double.toString(d2)); + return bd1.divide + (bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); + } + + /** + * 长整数相乘 + * @param pa + * @param pb + * @return + */ + public static long longMul(long pa,long pb){ + BigDecimal b1 = new BigDecimal(pa); + BigDecimal b2 = new BigDecimal(pb); + return b1.multiply(b2).longValue(); + } + + public static long longMul(long pa ,Double rate){ + BigDecimal b1 = new BigDecimal(pa); + BigDecimal b2 = new BigDecimal(rate.toString()); + b2 = b2.setScale(6,BigDecimal.ROUND_HALF_UP); + return b1.multiply(b2).longValue(); + } + + public static long longMul(long pa ,String rate){ + BigDecimal b1 = new BigDecimal(pa); + BigDecimal b2 = new BigDecimal(rate); + return b1.multiply(b2).longValue(); + } + + /** + * 长整数相减 + * @param pa + * @param pb + * @return + */ + public static long longSub(long pa,long pb){ + BigDecimal b1 = new BigDecimal(pa); + BigDecimal b2 = new BigDecimal(pb); + return b1.subtract(b2).longValue(); + } + + /** + * 长整数相加 + * @param pa + * @param pb + * @return + */ + public static long longAdd(long pa,long pb){ + BigDecimal b1 = new BigDecimal(pa); + BigDecimal b2 = new BigDecimal(pb); + return b1.add(b2).longValue(); + } + + /** + * 入参转化 + * @param value + * @return + */ + public static long inputConvert(Double value){ + BigDecimal input = new BigDecimal(value.toString()); + return input.multiply(UNIT).longValue(); + } + + /** + * 输出转化 + * @param value + * @return + */ + public static double outputConvert(long value){ + BigDecimal output = new BigDecimal(value); + return output.divide(UNIT,6, RoundingMode.DOWN).doubleValue(); + } + + public static void main(String[] args) { + long res = longMul(100000000,0.000009999999); + System.out.println(res); + + } + + public static long sum(Long d1,String d2){ + BigDecimal bd1 = new BigDecimal(d1.toString()); + BigDecimal bd2 = new BigDecimal(d2); + return bd1.add(bd2).longValue(); + } +} diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/BlockSerive.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/BlockSerive.java new file mode 100644 index 0000000..4784320 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/BlockSerive.java @@ -0,0 +1,9 @@ +package com.xcong.excoin.modules.blackchain.service; + +import com.xcong.excoin.common.response.Result; + +public interface BlockSerive { + + Result findBlockAddress(String symbol); + +} diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/BtcService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/BtcService.java new file mode 100644 index 0000000..b8a4c84 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/BtcService.java @@ -0,0 +1,138 @@ +package com.xcong.excoin.modules.blackchain.service; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringUtils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; + + +public class BtcService { + + + private static BtcService service = null; + private final static String RESULT = "result"; + private final static String METHOD_SEND_TO_ADDRESS = "sendtoaddress"; + private final static String METHOD_GET_TRANSACTION = "gettransaction"; + private final static String METHOD_LIST_TRANSACTIONS = "listtransactions"; + private final static String METHOD_GET_BLOCK_COUNT = "getblockcount"; + private final static String METHOD_NEW_ADDRESS = "getnewaddress"; + private final static String METHOD_GET_BALANCE = "getbalance"; + private final static String METHOD_GET_BALANCE_ADDRESS = "getreceivedbyaddress"; + private final static String METHOD_WALLET_PASSPHRASE = "walletpassphrase"; + private final static String METHOD_WALLET_LOCK = "walletlock"; + + private String url = "http://120.55.86.146:1880"; + private String username = "biyi"; + private String password = "biyi1234"; + + public static BtcService getInstance() { + if (service != null) { + return service; + } + return new BtcService(); + } + + private BtcService() { + } + + /** + * 创建BTC钱包 每个账户对应一个地址 方便后续操作 + * @param mId 账户 + * @return + */ + public static Map<String, String> createWallet(String mId) { + BtcService btcService = getInstance(); + // 创建钱包地址 + String address = btcService.getAddress(mId); + // 私钥 + String privateKey = btcService.dumpprivkey(address); + Map<String, String> result = new HashMap<String,String>(); + result.put("address", address); + result.put("privateKey", privateKey); + return result; + } + public String getAddress(String label) { + try { + JSONObject json = doRequest(METHOD_NEW_ADDRESS,label); + if (isError(json)) { + return ""; + } + return json.getString(RESULT); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private JSONObject doRequest(String method, Object... params) { + JSONObject param = new JSONObject(); + param.put("id", System.currentTimeMillis() + ""); + param.put("jsonrpc", "2.0"); + param.put("method", method); + if (params != null) { + param.put("params", params); + } + String creb = Base64.encodeBase64String((username + ":" + password).getBytes()); + Map<String, String> headers = new HashMap<>(2); + headers.put("Authorization", "Basic " + creb); + return JSON.parseObject(HttpUtil.jsonPost(url, headers, param.toJSONString())); + } + + private boolean isError(JSONObject json) { + if (json == null || (StringUtils.isNotEmpty(json.getString("error")) && json.get("error") != "null")) { + return true; + } + return false; + } + + public String dumpprivkey(String address) { + try { + JSONObject obj = doRequest("dumpprivkey", address); + System.out.println(obj); + if (!isError(obj)) { + return obj.getString(RESULT); + } else { + return null; + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 查询给定地址的总收款额(只计算接受的) + * @param address + * @return + */ + public BigDecimal getBalance(String address) { + JSONObject json = doRequest(METHOD_GET_BALANCE_ADDRESS,address,3); + if (!isError(json)) { + return new BigDecimal(json.getString(RESULT)); + } else { + return null; + } + } + + public String METHOD_GET_BLOCK_COUNT() { + JSONObject json = doRequest(METHOD_GET_BLOCK_COUNT); + if (!isError(json)) { + return json.getString(RESULT); + } else { + return null; + } + } + public static void main(String[] args) { + BtcService ser = new BtcService(); + //ser.getBalance("36RiLqCrnFfBoyUUHpGvEotXiMRtrJG8dp"); + //System.out.println(ser.METHOD_GET_BLOCK_COUNT()); + System.out.println(ser.getBalance("36RiLqCrnFfBoyUUHpGvEotXiMRtrJG8dp")); + } + + +} diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/DateUtil.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/DateUtil.java new file mode 100644 index 0000000..d8217db --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/DateUtil.java @@ -0,0 +1,1369 @@ +package com.xcong.excoin.modules.blackchain.service; +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.lang.StringUtils; +public class DateUtil { + + public DateUtil() { + + } + /** + * 测试用 + * @param args + * @throws ParseException + */ + public static void main(String[] args) throws ParseException { +// long time = System.currentTimeMillis()+7200000; +// Date a = new Date(time); +// long space = dateSpaceHours(new Date(), a); +// System.out.println(space); +// System.out.println(DateUtil.dateToString(DateUtil.getStringToDate(DateUtil.getSQLDateYMD()))); + +// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); +// Date date= DateUtil.addDays(new Date(), -1); +// System.out.println(date); +// System.out.println(DateUtil.dateToString(date)); +// System.out.println(simpleDateFormat.format(date)); +// System.out.println(DateUtil.getStringToDate(dateToStringYMD(date),"yyyy-MM-dd")); +// System.out.println(DateUtil.getStringToDate(null)); + //for(int i=0;i<10;i++){ + //System.out.println(getSQLDateYMD()); + //} + //System.out.println(dateDiff("2013-06-08 12:25:23","2013-07-08 12:25:23")); + // System.out.println(currentTimeDiff2("2013-12-08")); + // System.out.println(compare_date("2013-07-08 12:25:23", "2013-07-08 12:23:23")); + //System.out.println(fomatDate("2013-10-16 9:27:34")); + //System.out.println(System.currentTimeMillis()); + //System.out.println(getTenTimestamp()); + //System.out.println(getSixRandom()); + // SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + //获取当前时间 + // Date time = Calendar.getInstance().getTime(); + + // System.out.println(simpleDateFormat.format(datePlusOrMinus("2013-10-16 9:27:34",2))); + + // System.out.println(dateToString(datePlusOrMinus(getSQLDate(), 2))); + + // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // String strDate1 = "2012-3-15"; + // String strDate2 = "2013-5-13"; + // Date date1=sdf.parse(strDate1); + // Date date2=sdf.parse(strDate2); + // // + // // System.out.println(getMonths(date2,date1)); + // System.out.println(daysBetween(date2, date1)); + // System.out.println(fomatDate("2014-04")); + // System.out.println(fomatDate("2014-05")); + // System.out.println(Double.parseDouble(fomatDate("2014-05")) > Double.parseDouble(fomatDate("2014-04"))); + // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); + // String date1 = "2014-04"; + // String date2 = "2015-08"; + // Date start = sdf.parse(date1); + // Date end = sdf.parse(date2); + // + // + // System.out.println("###start:==" + start); + // System.out.println("###end:==" + end); + + // System.out.println("月份="+myTimeStr(9615000)); + // System.out.println(fomatDateToNumber("2014-07-28 14:12:14")); + //System.out.println(compareDate("2014-08-13","2014-08-12")); + // System.out.println(getNineRandom()); + // System.out.println("222="+dateDiffStr("2014-06-11 00:00:00","2014-06-25 23:59:59")); +// System.out.println("getUTCTimeStr()=="+DateUtil.currentTimeDiffToHour("2015-01-22 18:12:59")); + //System.out.println(DateUtil.dateDiff("2015-09-02 09:55:14",DateUtil.dateToString(new Date()))); + System.out.println(DateUtil.currentTimeDiff("2018-07-11 18:00:00")); + } + + /** + * 计算今天的剩余秒数 + * @return + */ + public static int getTodaySeconds(){ + Calendar cal = Calendar.getInstance(); + long start = TimeUnit.MILLISECONDS.toSeconds(cal.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, 1); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + long end = TimeUnit.MILLISECONDS.toSeconds(cal.getTimeInMillis()); + return (int) (end - start); + } + + /** + * 获取当前分钟 + * @return + */ + public static Integer getNowDateMin(){ + Calendar c1 = Calendar.getInstance(); + c1.setTime(new Date()); + return c1.get(Calendar.MINUTE); + } + /** + * 获取当前day + * @return + */ + public static Integer getNowDateDay(){ + Calendar c1 = Calendar.getInstance(); + c1.setTime(new Date()); + return c1.get(Calendar.DATE); + } + + /** + * 获取当前秒 + * @return + */ + public static Integer getNowDateSecond(){ + Calendar c1 = Calendar.getInstance(); + c1.setTime(new Date()); + return c1.get(Calendar.SECOND); + } + /** + * 返回两个日期之间相差天数---只比较天数 + * @param fDate + * @param oDate + * @return + */ + public static int daysOfTwo(Date fDate, Date oDate) { + + Calendar aCalendar = Calendar.getInstance(); + + aCalendar.setTime(fDate); + + int day1 = aCalendar.get(Calendar.DAY_OF_YEAR); + + aCalendar.setTime(oDate); + + int day2 = aCalendar.get(Calendar.DAY_OF_YEAR); + + return Math.abs(day2 - day1); + + } + + /** + * 把日期格式转换为字符串格式HH:mm:ss + * @param date + * @return + */ + public static String dateToStringHMS (Date date){ + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss"); + return simpleDateFormat.format(date); + } + /** + * 把日期格式转换为字符串格式HH:mm + * @param date + * @return + */ + public static String dateToStringHM (Date date){ + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm"); + return simpleDateFormat.format(date); + } + /** + * 把日期格式转换为字符串格式HHmm + * @param date + * @return + */ + public static int dateToIntHM (Date date){ + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HHmm"); + return Integer.parseInt(simpleDateFormat.format(date)); + } + /** + * 指定格式日期往后加多少分钟 + * @param format + * @param StrDate + * @param min + * @return + */ + @SuppressWarnings("static-access") + public static String addMin(String format,String StrDate,int min){ + Calendar cal = Calendar.getInstance(); + SimpleDateFormat sFmt = new SimpleDateFormat(format); + cal.setTime(sFmt.parse( (StrDate), new ParsePosition(0))); + + if (min != 0) { + cal.add(cal.MINUTE,min); + } + return sFmt.format(cal.getTime()); + } + /** + * 指定格式日期往后加多少分钟 + * @param date + * @param min + * @return + */ + public static Date addMin(Date date,int min){ + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + if (min != 0) { + cal.add(Calendar.MINUTE,min); + } + return cal.getTime(); + } + /** + * HH:mm:ss上加秒 + * @param date + * @param seconds + * @return + */ + public static String addSecond(Date date, int seconds) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.SECOND, seconds); + date =calendar.getTime(); + return dateToStringHMS(date); + } + + /** + * 产生2位 + */ + public static String getThreeRandom(){ + int random1 = (int) (Math.random() * 900 + 100); + String random = String.valueOf(random1); + return random; + } + + /** + * 把日期格式转换为字符串格式yyyy-MM-dd + * @param + * @return + */ + public static String dateToStringYMD (){ + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + return simpleDateFormat.format(new Date()); + } + /** + * 把日期格式转换为字符串格式yyyy-MM-dd + * @param + * @return + */ + public static String dateToStringYMD (Date data){ + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + return simpleDateFormat.format(data); + } + + /** + * String类型时间转为Timestamp,str与format必须格式一致 + * + * @param str + * @param + * @return + */ + public static Timestamp str2Timestamp(String str) { + Timestamp ts = null; + try { + if (null != str && !"".equals(str)) { + DateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + ts = new Timestamp(sdf.parse(str).getTime()); + } + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + } + return ts; + } + + /** + * Date类型时间转为String格式,format为需要返回的格式 + * + * @param + * @param + * @return + */ + public static String timeStamp2Str(Date dateTime) { + /*SimpleDateFormat oldFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + try { + date = oldFormat.parse(dateTime); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }*/ + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + return sdf.format(dateTime); + } + + /** + * 获取一个月的天数 + * @param year + * @param month + * @return + */ + public static int dateToString (String year,String month){ + Calendar c= Calendar.getInstance(); + c.set(Calendar.YEAR, Integer.parseInt(year)); + c.set(Calendar.MONTH, Integer.parseInt(month)+1); + return c.getActualMaximum(Calendar.DAY_OF_MONTH); + } + + /** + * 把日期格式转换为字符串格式 + * @param date + * @return + */ + public static String dateToString (Date date){ + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return simpleDateFormat.format(date); + } + /** + * 把日期格式转换为字符串格式 + * @param date + * @return + */ + public static String dateToString (Date date,String dateFormat){ + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat); + return simpleDateFormat.format(date); + } + + /** + * 把日期格式转换为YYMMDDHHMMSS格式 + * @param + * @return + */ + public static String dateToNumber (String time){ + SimpleDateFormat oldFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + SimpleDateFormat newFormat = new SimpleDateFormat("yyMMddHHmmss"); + Date date = new Date(); + try { + date = oldFormat.parse(time); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return newFormat.format(date); + } + + /** + * 根据有效期格式化时间 + * @param type 1每年 2 每月 3 每天 4 每小时 5 每分钟 + * @param time yyMMddHHmmss + * @return + */ + public static String termvalidityFormat(int type,String time){ + String retime = null; + try { + + if(type == 1){ + retime = "00"+time.substring(2, time.length()); + }else if(type == 2){ + retime = "0000"+time.substring(4, time.length()); + }else if(type == 3){ + retime = "000000"+time.substring(6, time.length()); + }else if(type == 4){ + retime = "00000000"+time.substring(8, time.length()); + }else if(type == 5){ + retime = "0000000000"+time.substring(10, time.length()); + }else { + retime = time; + } + + } catch (Exception e) { + e.printStackTrace(); + } + return retime; + + } + + /** + * 把原始字符串扩展成自定的长度 + * @param oriStr 原始字符串 + * @param fillChar 要填充的字符 + * @param setLength 要扩展成的长度 + * @param preFill 前扩充还是后扩充 true-在前面填充,false-后面填充 + * @return + */ + public static String fixStringToSetLength(String oriStr, String fillChar, int setLength, boolean preFill) { + if(oriStr == null || fillChar.equals("")) { + return oriStr; + } + + int oriLength = oriStr.length(); + StringBuilder sb = null; + if(preFill == true) { + sb = new StringBuilder(); + for(int i = oriLength; i < setLength; i++) { + sb.append(fillChar); + } + sb.append(oriStr); + } else { + sb = new StringBuilder(oriStr); + for(int i = oriLength; i < setLength; i++) { + sb.append(fillChar); + } + } + + return sb.toString(); + } + + + + //日期往后加多少个月,多少天,多少年 + @SuppressWarnings("static-access") + public static String addMonth(String format,String StrDate,int year,int month,int day){ + + Calendar cal = Calendar.getInstance(); + SimpleDateFormat sFmt = new SimpleDateFormat(format); + cal.setTime(sFmt.parse( (StrDate), new ParsePosition(0))); + + if (day != 0) { + cal.add(cal.DATE,day); + } + if (month != 0) { + cal.add(cal.MONTH, month); + } + if (year != 0) { + cal.add(cal.YEAR, year); + } + return sFmt.format(cal.getTime()); + } + + /** + * 在当前时间增加或减少N个小時 + * @param + * @param month + * @return + */ + public static Date addHour(int hour){ + Calendar cal = Calendar.getInstance(); + cal.add( Calendar.HOUR, hour); + return cal.getTime(); + } + + /** + * 在当前时间增加或减少N个月 + * @param + * @param month + * @return + */ + public static Date addMonth(int month){ + Calendar cal = Calendar.getInstance(); + cal.add( Calendar.MONTH, month); + return cal.getTime(); + } + + /** + * 增加days天 + * @param date + * @param days + * @return + */ + public static Date addDays(Date date ,int days){ + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.add(Calendar.DAY_OF_MONTH, days); + return cal.getTime(); + } + /** + * 判断两个时间字符串之差 + * @param date1 + * @param date2 + * @return 毫秒数 + */ + public static Long dateDiff(String date1,String date2) { + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + return df.parse(date1).getTime() - df.parse(date2).getTime(); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 判断两个指定格式时间字符串之差 + * @param format + * @param date1 + * @param date2 + * @return 毫秒数 + */ + public static Long dateDiff(String format,String date1,String date2) { + DateFormat df = new SimpleDateFormat(format); + try { + return df.parse(date1).getTime() - df.parse(date2).getTime(); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 计算时间差,相差多少天、小时、分、秒 + * @param stime + * @param etime + * @return + */ + public static String dateDiffStr(String stime,String etime){ + String diff = ""; + try { + SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + java.util.Date begin=dfs.parse(stime); + java.util.Date end = dfs.parse(etime); + long between=(end.getTime()-begin.getTime())/1000;//除以1000是为了转换成秒 + long day1=between/(24*3600); + long hour1=between%(24*3600)/3600; + long minute1=between%3600/60; + long second1=between%60; + System.out.println(""+day1+"天"+hour1+"小时"+minute1+"分"+second1+"秒"); + if(day1>0){ + diff = ""+day1+"天"+hour1+"小时"+minute1+"分"+second1+"秒"; + return diff; + } + + if(hour1>0){ + diff = ""+hour1+"小时"+minute1+"分"+second1+"秒"; + return diff; + } + + if(minute1>0){ + diff = ""+minute1+"分"+second1+"秒"; + return diff; + } + + if(second1>=0){ + diff = ""+second1+"秒"; + return diff; + } + + return diff; + } catch (Exception e) { + e.printStackTrace(); + } + return diff; + + } + + /** + * 和当前时间差 + * @param date + * @return 当前时间 - date 毫秒数 + */ + public static Long currentTimeDiff(String date) { + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + return System.currentTimeMillis() - df.parse(date).getTime(); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } + /** + * 和当前时间差 + * @param date + * @return 当前时间 - date 返回相差小时 + */ + public static int currentTimeDiffToHour(String date) { + if(date == null || date.equals("")){ + return 25; + } + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Long longss = System.currentTimeMillis() - df.parse(date).getTime(); + int hour = Integer.parseInt(longss/(1000*3600)+""); + return hour; + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return 25; + } + + /** + * 和当前时间差 分钟 + * @param date + * @return 当前时间 - 返回分钟 + */ + public static int currentTimeDiffToMin(String date) { + if(date == null || date.equals("")){ + return 25; + } + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Long longss = System.currentTimeMillis() - df.parse(date).getTime(); + int hour = Integer.parseInt(longss/(1000*60)+""); + return hour; + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return 0; + } + /** + * 和当前时间差(不需要时分秒) + * @param date + * @return 当前时间 - date + * + * */ + public static Long currentTimeDiff2(String date) { + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + try { + return System.currentTimeMillis() - df.parse(date).getTime(); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } + + + /** + * 日期比较 + * @param DATE1 + * @param DATE2 + * @return DATE1 > DATE2 返回1 + */ + public static int compare_date(String DATE1, String DATE2) { + + + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date dt1 = df.parse(DATE1); + Date dt2 = df.parse(DATE2); + if (dt1.getTime() > dt2.getTime()) { + return 1; + } else if (dt1.getTime() < dt2.getTime()) { + return -1; + } else { + return 0; + } + } catch (Exception exception) { + exception.printStackTrace(); + } + return 0; + } + + + /** + * 日期比较 + * @param DATE1 + * @param DATE2 + * @return DATE1 > DATE2 返回1 + */ + public static int compareDate(String DATE1, String DATE2) { + + if(DATE1 == null || DATE1.equals("")){ + return -1; + } + if(DATE2 == null || DATE2.equals("")){ + return 1; + } + if(DATE1.equals(DATE2)){ + return 0; + } + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + try { + Date dt1 = df.parse(DATE1); + Date dt2 = df.parse(DATE2); + if (dt1.getTime() > dt2.getTime()) { + return 1; + } else if (dt1.getTime() < dt2.getTime()) { + return -1; + } else { + return 0; + } + } catch (Exception exception) { + exception.printStackTrace(); + } + return 0; + } + + + /** + * 日期比较 + * @param DATE1 + * @param DATE2 + * @return DATE1 > DATE2 返回1 + */ + public static int compareDate(String DATE1, String DATE2,String formate) { + + if(DATE1 == null || DATE1.equals("")){ + return -1; + } + if(DATE2 == null || DATE2.equals("")){ + return 1; + } + if(DATE1.equals(DATE2)){ + return 0; + } + DateFormat df = new SimpleDateFormat(formate); + try { + Date dt1 = df.parse(DATE1); + Date dt2 = df.parse(DATE2); + if (dt1.getTime() > dt2.getTime()) { + return 1; + } else if (dt1.getTime() < dt2.getTime()) { + return -1; + } else { + return 0; + } + } catch (Exception exception) { + exception.printStackTrace(); + } + return 0; + } + + + /** + * 将日期yyyy-MM-dd HH:mm:ss 格式化为 yyyyMMddHHmmss + * @param date + * @return + */ + public static String fomatDate(String date){ + String dateStr = null; + if(date == null || "".equals(date)){ + dateStr = ""; + }else{ + try { + dateStr = date.replaceAll(":", "").replaceAll("-", "").replaceAll(" ", ""); + } catch (Exception e) { + e.printStackTrace(); + } + } + + return dateStr; + } + + /** + * 获取插入数据库格式的时间 + * @return + */ + public static String getSQLDate() { + String systemdate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(Calendar.getInstance().getTime()); // 获取系统当前时间 + return systemdate; + } + + /** + * 字符串转日期 yyyy-MM-dd HH:mm:ss + * @param date + * @return + */ + public static Date getStringToDate(String date){ + if (StringUtils.isEmpty(date)) { + return null; + } + Date date2 = new Date(); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + date2 = simpleDateFormat.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + } + return date2; + } + /** + * 字符串转日期 yyyy-MM-dd HH:mm:ss + * @param date + * @return + */ + public static Date getStringToDate(String date,String format){ + Date date2 = new Date(); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format); + try { + date2 = simpleDateFormat.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + } + return date2; + } + + /** + * 获取插入数据库格式的时间yyyy-MM-dd + * @return + */ + public static String getSQLDateYMD() { + String systemdate = new SimpleDateFormat("yyyy-MM-dd") + .format(Calendar.getInstance().getTime()); // 获取系统当前时间 + return systemdate; + } + + public static Integer getSQLDateMonth() { + String systemdate = new SimpleDateFormat("MM") + .format(Calendar.getInstance().getTime()); // 获取系统当前时间 + return Integer.parseInt(systemdate); + } + + /** + * 对月份进行加减 + * @param i + * @return + * @throws ParseException + */ + public static Date datePlusOrMinus(String systime ,Integer i) throws ParseException{ + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date systDate =df.parse(systime); + GregorianCalendar gc =new GregorianCalendar(); + gc.setTime(systDate); + gc.add(2,i); + return gc.getTime(); + } + + /** + * 得到月日时分秒10位时间戳字符串 + */ + public static String getTenTimestamp() { + String systemdate = new SimpleDateFormat("MMddHHmmss").format(Calendar.getInstance().getTime()); + return systemdate; + } + + + /** + * 得到年月日 + */ + public static String getDateTime() { + SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd"); + String systemdate = sdf.format(Calendar.getInstance().getTime()); + return systemdate.substring(0, systemdate.length()); + } + + /** + * 得到16位时间戳字符串,前面14位年月日时分秒,第15位毫秒,第16位随机数 + */ + public static String getUniqueTimestamp() { + SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmssSSS"); + String systemdate = sdf.format(Calendar.getInstance().getTime()); + return systemdate.substring(0, systemdate.length()-2)+getOneRandom(); + } + + /** + * 产生6位随机数 + */ + public static String getSixRandom(){ + int random1 = (int) (Math.random() * 900000 + 100000); + String random = String.valueOf(random1); + return random; + } + + /** + * 产生4位随机数 + */ + public static String getFourRandom(){ + int random1 = (int) (Math.random() * 9000 + 1000); + String random = String.valueOf(random1); + return random; + } + /** + * 产生2位随机数 + */ + public static String getTwoRandom(){ + int random1 = (int) (Math.random() * 90 + 10); + String random = String.valueOf(random1); + return random; + } + /** + * 产生1位随机数 + */ + public static String getOneRandom(){ + int random1 = (int) (Math.random() * 9 + 1); + String random = String.valueOf(random1); + return random; + } + + /** + * 产生2位小于60的随机数 + */ + public static String getTwoRandomSixth(){ + int random1 = (int) (Math.random() * 90 + 10); + String random = String.valueOf(random1); + return random; + } + /** + * 产生-10——10之间的数字 + * @return + */ + public static Integer randomZF(){ + int a=(int)(Math.random()*2+1); + //System.out.println(a); + int aa=(int)(Math.pow(-1, a)); + //System.out.println(aa); + int aaa=(int)(Math.random()*10+1); + int num=aa*aaa; + //System.out.println(num); + return num; + } + + /** + * 计算两个日期之间相差的月数 + * + * @param date1 + * @param date2 + * @return + */ + public static int getMonths(Date date1, Date date2) { + int iMonth = 0; + int flag = 0; + try { + Calendar objCalendarDate1 = Calendar.getInstance(); + objCalendarDate1.setTime(date1); + + Calendar objCalendarDate2 = Calendar.getInstance(); + objCalendarDate2.setTime(date2); + + if (objCalendarDate2.equals(objCalendarDate1)) + return 0; + if (objCalendarDate1.after(objCalendarDate2)) { + Calendar temp = objCalendarDate1; + objCalendarDate1 = objCalendarDate2; + objCalendarDate2 = temp; + } + if (objCalendarDate2.get(Calendar.DAY_OF_MONTH) < objCalendarDate1 + .get(Calendar.DAY_OF_MONTH)) + flag = 1; + + if (objCalendarDate2.get(Calendar.YEAR) > objCalendarDate1 + .get(Calendar.YEAR)) + iMonth = ((objCalendarDate2.get(Calendar.YEAR) - objCalendarDate1 + .get(Calendar.YEAR)) + * 12 + objCalendarDate2.get(Calendar.MONTH) - flag) + - objCalendarDate1.get(Calendar.MONTH); + else + iMonth = objCalendarDate2.get(Calendar.MONTH) + - objCalendarDate1.get(Calendar.MONTH) - flag; + + } catch (Exception e) { + e.printStackTrace(); + } + return iMonth; + } + + /** + * 计算两个日期之间相差的天数 + * + * @param date1 + * @param date2 + * @return + */ + public static final int daysBetween(Date date1, Date date2) { + + java.util.Calendar time1 = java.util.Calendar.getInstance(); + java.util.Calendar time2 = java.util.Calendar.getInstance(); + time1.setTime(date1); + time2.setTime(date2); + int days = 0; + if(time1.getTime().getTime() >= time2.getTime().getTime()){ + days = ((int) (time1.getTime().getTime() / 1000) - (int) (time2.getTime().getTime() / 1000)) / 3600 / 24; + }else{ + days = ((int) (time2.getTime().getTime() / 1000) - (int) (time1.getTime().getTime() / 1000)) / 3600 / 24; + } + return days; + } + + /** + * 计算两个日期之间相差秒 + * + * @param sdate1 + * @param sdate2 + * @return + */ + public static final int secBetween(String sdate1, String sdate2) { + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date1 = null; + try { + date1 = df.parse(sdate1); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Date date2 = null; + try { + date2 = df.parse(sdate2); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + java.util.Calendar time1 = java.util.Calendar.getInstance(); + java.util.Calendar time2 = java.util.Calendar.getInstance(); + time1.setTime(date1); + time2.setTime(date2); + + int sec = 0; + if(time1.getTime().getTime() >= time2.getTime().getTime()){ + sec = ((int) (time1.getTime().getTime() / 1000) - (int) (time2.getTime().getTime() / 1000)); + }else{ + sec = ((int) (time2.getTime().getTime() / 1000) - (int) (time1.getTime().getTime() / 1000)); + } + return sec; + } + + /** + * + * @param date1 <String> + * @param date2 <String> + * @return int + * @throws ParseException + */ + public static int getMonthSpace(String date1, String date2) + throws ParseException { + + int result = 0; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + Calendar c1 = Calendar.getInstance(); + Calendar c2 = Calendar.getInstance(); + + c1.setTime(sdf.parse(date1)); + c2.setTime(sdf.parse(date2)); + + result = c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH); + + return result == 0 ? 1 : Math.abs(result); + + } + + /** + * 根据毫秒数计算时分秒 + * @param timeMillis + * @return + */ + public static String myTimeStr(long timeMillis) { + int timezone = 8; + long totalSeconds = timeMillis / 1000; + totalSeconds += 60 * 60 * timezone; + int second = (int)(totalSeconds % 60);// 秒 + long totalMinutes = totalSeconds / 60; + int minute = (int)(totalMinutes % 60);// 分 + long totalHours = totalMinutes / 60; + int hour = (int)(totalHours % 24);// 时 + int totalDays = (int)(totalHours / 24); + + int _year = 1970; + + int year = _year + totalDays / 366; + int month = 1; + int day = 1; + + int diffDays; + boolean leapYear; + while (true) { + int diff = (year - _year) * 365; + diff += (year - 1) / 4 - (_year - 1) / 4; + diff -= ((year - 1) / 100 - (_year - 1) / 100); + diff += (year - 1) / 400 - (_year - 1) / 400; + + diffDays = totalDays - diff; + + leapYear = (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0); + if (!leapYear && diffDays < 365 || leapYear && diffDays < 366) { + break; + } else { + year++; + } + } + + int[] monthDays; + if (diffDays >= 59 && leapYear) { + monthDays = new int[]{-1,0,31,60,91,121,152,182,213, 244, 274, 305, 335 }; + } else { + monthDays = new int[]{-1,0,31,59,90,120,151,181,212, 243, 273, 304, 334 }; + } + for (int i = monthDays.length - 1; i >= 1; i--) { + if (diffDays >= monthDays[i]) { + month = i; + day = diffDays - monthDays[i] + 1; + break; + } + } + + return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second; + + } + /** + * 根据秒数计算小时 + * @param + * @return + */ + public static String secondToHour(String second) { + if(second == null || "".equals(second) || "null".equals(second)){ + return null; + } + Double sec = Double.parseDouble(second); + Double hour = sec/3600; + DecimalFormat df=new DecimalFormat("0.0"); + return df.format(hour).toString(); + } + /** + * 根据秒数计算分钟 + * @param + * @return + */ + public static String secondToMinute(String second) { + if(second == null || "".equals(second) || "null".equals(second)){ + return null; + } + Double sec = Double.parseDouble(second); + Double minute = sec/60; + DecimalFormat df=new DecimalFormat("0.0"); + return df.format(minute).toString(); + } + /** + * 根据小时数计算秒 + * @param + * @return + */ + public static String hourToSecond(String hour) { + if(hour == null || "".equals(hour) || "null".equals(hour)){ + return null; + } + DecimalFormat df=new DecimalFormat("0"); + return df.format(Double.parseDouble(hour)*3600).toString(); + } + /** + * 根据分钟计算秒 + * @param + * @return + */ + public static String MinuteToSecond(String minute) { + if(minute == null || "".equals(minute) || "null".equals(minute)){ + return null; + } + DecimalFormat df=new DecimalFormat("0"); + return df.format(Double.parseDouble(minute)*60).toString(); + } + + /** + * 将日期yyyy-MM-dd HH:mm:ss 格式化为 yyMMddHHmmss + * @param date + * @return + */ + public static String fomatDateToNumber(String date){ + String dateStr = null; + if(date == null || "".equals(date)){ + dateStr = ""; + }else{ + try { + dateStr = date.replaceAll(":", "").replaceAll("-", "").replaceAll(" ", ""); + dateStr = dateStr.substring(2); + } catch (Exception e) { + e.printStackTrace(); + } + } + + return dateStr; + } + + /** + * 把YYMMDDHHMMSS格式转换为date格式 + * @param + * @return + */ + public static String numberToDate (String number){ + SimpleDateFormat oldFormat = new SimpleDateFormat("yyMMddHHmmss"); + SimpleDateFormat newFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + try { + date = oldFormat.parse(number); + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + return newFormat.format(date); + } + + /** + * 产生8位HHmmss + */ + public static String getEightRandom(){ + String systemdate = new SimpleDateFormat("HHmmss") + .format(Calendar.getInstance().getTime()); // 获取系统当前时间 + int random1 = (int) (Math.random() * 90 + 10); + String random = String.valueOf(random1); + return systemdate + random; + } + + /** + * 时间戳转换成时间 + * @param time + * @return + */ + public static String TimeStampToDateTime(long time){ + String datetime = null; + try { + SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + datetime = sdf.format(new Date(time*1000)); + } catch (Exception e) { + e.printStackTrace(); + } + return datetime; + } + + + /** + * 时间转成时间戳 毫秒 + * @param datetime + * @return + */ + public static long DateTimeToTimeStampSS(String datetime){ + try { + SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + Date date=simpleDateFormat.parse(datetime); + long timeStemp = date.getTime(); + return timeStemp; + } catch (Exception e) { + e.printStackTrace(); + return 0L ; + } + + } + + /** + * 时间转成时间戳 秒 + * @param datetime + * @return + */ + public static long DateTimeToTimeStampS(String datetime){ + try { + SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + Date date=simpleDateFormat.parse(datetime); + long timeStemp = date.getTime()/1000; + return timeStemp; + } catch (Exception e) { + e.printStackTrace(); + return System.currentTimeMillis()/1000 ; + } + + } + + /** + * 转成时间戳 + * @param datetime + * @return + */ + public static long NumberTimeToTimeStamp(String datetime){ + try { + SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyMMddHHmmss"); + Date date=simpleDateFormat.parse(datetime); + long timeStemp = date.getTime()/1000; + return timeStemp; + } catch (Exception e) { + e.printStackTrace(); + return System.currentTimeMillis()/1000 ; + } + + } + + /** + * 得到UTC时间,类型为字符串,格式为"yyyy-MM-dd HH:mm"<br /> + * 如果获取失败,返回null + * @return + */ + public static String getUTCTimeStr() { + SimpleDateFormat foo = new SimpleDateFormat("yyyy-MM-dd hh:mm"); + System.out.println("foo:"+foo.format(new Date())); + + Calendar gc = GregorianCalendar.getInstance(); + System.out.println("gc.getTime():"+gc.getTime()); + System.out.println("gc.getTimeInMillis():"+new Date(gc.getTimeInMillis())); + + //当前系统默认时区的时间: + Calendar calendar=new GregorianCalendar(); + System.out.print("时区:"+calendar.getTimeZone().getID()+" "); + System.out.println("时间:"+calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE)); + //美国洛杉矶时区 + TimeZone tz=TimeZone.getTimeZone("America/Los_Angeles"); + //时区转换 + calendar.setTimeZone(tz); + System.out.print("时区:"+calendar.getTimeZone().getID()+" "); + System.out.println("时间:"+calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE)); + + //1、取得本地时间: + java.util.Calendar cal = java.util.Calendar.getInstance(); + + //2、取得时间偏移量: + int zoneOffset = cal.get(java.util.Calendar.ZONE_OFFSET); + + //3、取得夏令时差: + int dstOffset = cal.get(java.util.Calendar.DST_OFFSET); + + //4、从本地时间里扣除这些差量,即可以取得UTC时间: + cal.add(java.util.Calendar.MILLISECOND, -(zoneOffset + dstOffset)); + + //之后调用cal.get(int x)或cal.getTimeInMillis()方法所取得的时间即是UTC标准时间。 + System.out.println("UTC:"+new Date(cal.getTimeInMillis())); + + Calendar calendar1 = Calendar.getInstance(); + TimeZone tztz = TimeZone.getTimeZone("GMT"); + calendar1.setTimeZone(tztz); + System.out.println(calendar.getTime()); + System.out.println("9999:"+calendar.getTimeInMillis()/1000); + + System.out.println("utc1="+System.currentTimeMillis()/1000); + System.out.println("utc="+new Date().getTime()/1000); + + + System.out.println(TimeStampToDateTime(1421724351)); + System.out.println("=="+DateTimeToTimeStampS("2015-01-20 11:35:06")); + System.out.println(TimeStampToDateTime(DateTimeToTimeStampS("2015-01-20 11:35:06"))); + return null; + } + + /** + * 获得指定日期的前/后n天,小时 + * + * @param specifiedDay + * @return + */ + public static String getSpecifiedDayAbove(String specifiedDay,int n,int h) { + Calendar c = Calendar.getInstance(); + Date date = null; + try { + date = new SimpleDateFormat("yy-MM-dd HH:mm:ss").parse(specifiedDay); + } catch (ParseException e) { + e.printStackTrace(); + } + c.setTime(date); + int day = c.get(Calendar.DATE); + c.set(Calendar.DATE, day + n); + int hour = c.get(Calendar.HOUR); + c.set(Calendar.HOUR,hour + h); + + String dayAfter = new SimpleDateFormat("yy-MM-dd HH:mm:ss") + .format(c.getTime()); + return dayAfter; + } + + /** + * 两个时间的小时差 + * @param st + * @param ed + * @return + */ + public static long dateSpaceHours(Date st,Date ed){ + return (long) Math.ceil((ed.getTime() - st.getTime())/3600000.0); + } + + public static String formatDate(Date date, String format) throws ParseException { + DateFormat df = new SimpleDateFormat(format); + df.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); + return df.format(date); + } + public static Date parseDate(String date, String format) { + DateFormat df = new SimpleDateFormat(format); + df.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); + try { + return df.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } +} + + + + + + + + diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java new file mode 100644 index 0000000..a897a16 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java @@ -0,0 +1,283 @@ +package com.xcong.excoin.modules.blackchain.service; + +import java.io.File; +import java.io.IOException; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; + +import org.web3j.abi.FunctionEncoder; +import org.web3j.abi.FunctionReturnDecoder; +import org.web3j.abi.TypeReference; +import org.web3j.abi.datatypes.Address; +import org.web3j.abi.datatypes.Function; +import org.web3j.abi.datatypes.Type; +import org.web3j.abi.datatypes.generated.Uint256; +import org.web3j.crypto.Credentials; +import org.web3j.crypto.RawTransaction; +import org.web3j.crypto.TransactionEncoder; +import org.web3j.crypto.WalletUtils; +import org.web3j.protocol.Web3j; +import org.web3j.protocol.admin.Admin; +import org.web3j.protocol.core.DefaultBlockParameterName; +import org.web3j.protocol.core.Request; +import org.web3j.protocol.core.methods.request.Transaction; +import org.web3j.protocol.core.methods.response.*; +import org.web3j.protocol.http.HttpService; +import org.web3j.utils.Convert; +import org.web3j.utils.Numeric; +import org.web3j.utils.Convert.Unit; + +/** + * ETH类,使用Web3j 下面为使用教程 + * https://kauri.io/article/925d923e12c543da9a0a3e617be963b4/manage-an-ethereum-account-with-java-and-web3js + * + * @author Administrator + * + */ + +public class EthService { + + private static String ethWalletPath = "/home/javaweb/webresource/eth"; + // private static String ethWalletPath="E://"; + private Web3j web3j; + // private Admin admin; + // private Parity parity; + /** + * 服务器地址 + */ + //private static final String ETH_UTL = "https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321"; + private static final String ETH_UTL = "http://120.55.86.146:8545"; + + public EthService() { + try { + HttpService service = new HttpService(ETH_UTL); + web3j = Web3j.build(service); + // parity = Parity.build(service); + // admin = Admin.build(service); + } catch (Exception e) { + System.out.println("liangjieshibao"); + // logger.error("==============虚拟币-以太坊链接获取失败!"); + e.printStackTrace(); + } + } + + /** + * 查询ETH余额 + * + * @param address + * @return + */ + public static BigDecimal getEthBlance(String address) { + Web3j web3 = Web3j.build(new HttpService(ETH_UTL)); + EthGetBalance balanceWei; + try { + balanceWei = web3.ethGetBalance(address, DefaultBlockParameterName.LATEST).send(); + if (balanceWei.getResult() == null) { + return null; + } + BigDecimal balanceInEther = Convert.fromWei(balanceWei.getBalance().toString(), Unit.ETHER); + return balanceInEther; + } catch (Exception e) { + System.out.println("ETH查询失败:" + address); + e.printStackTrace(); + } + return null; + + } + + /** + * 创建ETH钱包 + * + * @return + */ + public static Map<String, String> createEth() { + Map<String, String> wallet = new HashMap<String, String>(); + try { + String walletPassword = "secr3t"; + // 文件路径 + String walletDirectory = ethWalletPath; + + String walletName = WalletUtils.generateNewWalletFile(walletPassword, new File(walletDirectory)); + System.out.println("wallet location: " + walletDirectory + "/" + walletName); + Credentials credentials = WalletUtils.loadCredentials(walletPassword, walletDirectory + "/" + walletName); + String accountAddress = credentials.getAddress(); + String privateKey = credentials.getEcKeyPair().getPrivateKey().toString(16); + // 钱包地址 + wallet.put("address", accountAddress); + // 钱包私钥 + wallet.put("privateKey", privateKey); + // 产生的钱包文件地址 + wallet.put("walletLocation", walletDirectory + "/" + walletName); + } catch (Exception e) { + e.printStackTrace(); + } + return wallet; + } + + public boolean checkTransferResult(String hash) { + // 0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816 交易hash + Request<?, EthGetTransactionReceipt> ethGetTransactionReceiptRequest = web3j.ethGetTransactionReceipt(hash); + EthGetTransactionReceipt send = null; + try { + send = ethGetTransactionReceiptRequest.send(); + if(send!=null){ + TransactionReceipt result = send.getResult(); + if(result!=null){ + String status = result.getStatus(); + System.out.println(status);//0x1 + if("0x1".equals(status)){ + return true; + }else{ + return false; + } + } + + } + + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return false; + } + + public static void main(String[] args) throws IOException { + HttpService service = new HttpService(ETH_UTL); + Web3j build = Web3j.build(service); + //Request<?, EthTransaction> ethTransactionRequest = build.ethGetTransactionByHash("0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816"); + Request<?, EthGetTransactionReceipt> ethGetTransactionReceiptRequest = build.ethGetTransactionReceipt("0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816"); + EthGetTransactionReceipt send = ethGetTransactionReceiptRequest.send(); + String status = send.getResult().getStatus(); + System.out.println(status);//0x1 +// EthTransaction send = ethTransactionRequest.send(); +// String input = send.getResult().getInput(); +// System.out.println(input); + } + + /** + * + * 方法描述:获取代币余额 + * + * @param fromAddress + * @param + * @param + * @return long + */ + public BigDecimal tokenGetBalance(String fromAddress) { + try { + // 合约地址 + String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7"; + int decimal = 6; + String methodName = "balanceOf"; + List<Type> inputParameters = new ArrayList<>(); + List<TypeReference<?>> outputParameters = new ArrayList<>(); + Address address = new Address(fromAddress); + inputParameters.add(address); + TypeReference<Uint256> typeReference = new TypeReference<Uint256>() { + }; + outputParameters.add(typeReference); + Function function = new Function(methodName, inputParameters, outputParameters); + String data = FunctionEncoder.encode(function); + Transaction transaction = Transaction.createEthCallTransaction(fromAddress, contractAddress, data); + + EthCall ethCall; + BigInteger balanceValue = BigInteger.ZERO; + try { + ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send(); + List<Type> results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters()); + balanceValue = (BigInteger) results.get(0).getValue(); + } catch (IOException e) { + e.printStackTrace(); + } + double res = BigDecimalUtil.div(new BigDecimal(balanceValue).doubleValue(), Math.pow(10, decimal), 8); + if (res > 0) { + return new BigDecimal(res); + } + } catch (Exception e) { + // logger.error("==============以太坊代币链接获取失败!"); + e.printStackTrace(); + } + return BigDecimal.ZERO; + } + + // USDT + public String tokenSend(String privateKey, String fromAddress, String toAddress, String amount) + throws InterruptedException, ExecutionException { + // Web3j web3j = Web3j.build(new + // HttpService("https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321")); + String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7"; + Credentials credentials = Credentials.create(privateKey); + + EthGetTransactionCount ethGetTransactionCount = web3j + .ethGetTransactionCount(fromAddress, DefaultBlockParameterName.LATEST).sendAsync().get(); + + BigInteger nonce = ethGetTransactionCount.getTransactionCount(); + + Function function = new Function("transfer", + Arrays.asList(new Address(toAddress), new Uint256(new BigInteger(amount))), + Arrays.asList(new TypeReference<Type>() { + })); + + String encodedFunction = FunctionEncoder.encode(function); + + RawTransaction rawTransaction = RawTransaction.createTransaction(nonce, + Convert.toWei("40", Convert.Unit.GWEI).toBigInteger(),// 给矿工开的转账单价 单价越高越快 + Convert.toWei("80000", Convert.Unit.WEI).toBigInteger(), contractAddress, encodedFunction);//里程上限 + // 10*80000/1000000000=0.0008 手续费 + + byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials); + String hexValue = Numeric.toHexString(signedMessage); + + // log.debug("transfer hexValue:" + hexValue); + + EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get(); + + + if (ethSendTransaction.hasError()) { + // log.info("transfer error:", ethSendTransaction.getError().getMessage()); + return ""; + } else { + String transactionHash = ethSendTransaction.getTransactionHash(); + // log.info("Transfer transactionHash:" + transactionHash); + return transactionHash; + } + } + + public String ethSend(String privateKey, String fromAddress, String toAddress, String amount) + throws InterruptedException, ExecutionException { + // Web3j web3j = Web3j.build(new + // HttpService("https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321")); + + Credentials credentials = Credentials.create(privateKey); + + EthGetTransactionCount ethGetTransactionCount = web3j + .ethGetTransactionCount(fromAddress, DefaultBlockParameterName.LATEST).sendAsync().get(); + + BigInteger nonce = ethGetTransactionCount.getTransactionCount(); + BigInteger value = Convert.toWei(amount, Convert.Unit.ETHER).toBigInteger(); + RawTransaction rawTransaction = RawTransaction.createEtherTransaction(nonce, + Convert.toWei("40", Convert.Unit.GWEI).toBigInteger(), + Convert.toWei("60000", Convert.Unit.WEI).toBigInteger(), toAddress, value); + byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials); + String hexValue = Numeric.toHexString(signedMessage); + + EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get(); + if (ethSendTransaction.hasError()) { + // log.info("transfer error:", ethSendTransaction.getError().getMessage()); + return ""; + } else { + String transactionHash = ethSendTransaction.getTransactionHash(); + // log.info("Transfer transactionHash:" + transactionHash); + return transactionHash; + } + } + + +} diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/HttpUtil.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/HttpUtil.java new file mode 100644 index 0000000..a146fe4 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/HttpUtil.java @@ -0,0 +1,281 @@ +package com.xcong.excoin.modules.blackchain.service; + +/** + * @author: DengJiong + * @date: 2018-05-09 18:43 + * @description: + */ + +import org.apache.commons.lang3.StringUtils; + +import javax.net.ssl.*; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.HashMap; +import java.util.Map; + +/** + * http 工具类 + * + * @author cloud cloud + * @create 2017/10/18 + **/ +public class HttpUtil { + + private static final String CHARSET = "UTF-8"; + private static final String HTTP_POST = "POST"; + private static final String HTTP_GET = "GET"; + + private static final String HTTP_PUT = "PUT"; + + /** + * Send GET request + */ + public static String get(String url, Map<String, String> queryParas, Map<String, String> headers) { + HttpURLConnection conn = null; + try { + conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), HTTP_GET, headers); + conn.connect(); + return readResponseString(conn); + } + catch (Exception e) { + throw new RuntimeException(e); + } + finally { + if (conn != null) { + conn.disconnect(); + } + } + } + + public static String get(String url, Map<String, String> queryParas) { + return get(url, queryParas, null); + } + + public static String get(String url) { + return get(url, null, null); + } + + public static String jsonGet(String url,Map<String,String> params){ + Map<String,String> headers = new HashMap<>(); + headers.put("Content-Type","application/json"); + return get(url,params,headers); + } + + + /** + * Send POST request + */ + public static String post(String url, Map<String, String> queryParas, String data, Map<String, String> headers) { + HttpURLConnection conn = null; + try { + conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), HTTP_POST, headers); + conn.connect(); + OutputStream out = conn.getOutputStream(); + out.write(data.getBytes(CHARSET)); + out.flush(); + out.close(); + return readResponseString(conn); + } + catch (Exception e) { + throw new RuntimeException(e); + } + finally { + if (conn != null) { + conn.disconnect(); + } + } + } + + public static String post(String url, Map<String, String> queryParas, String data) { + return post(url, queryParas, data, null); + } + + public static String post(String url, String data, Map<String, String> headers) { + return post(url, null, data, headers); + } + + public static String post(String url, String data) { + return post(url, null, data, null); + } + + public static String jsonPost(String url,String data){ + Map<String,String> headers = new HashMap<>(); + headers.put("Content-Type","application/json"); + return post(url,null,data,headers); + } + + public static String jsonPost(String url,Map<String,String>headers,String data){ + if(headers == null){ + headers = new HashMap<>(); + } + headers.put("Content-Type","application/json"); + return post(url,null,data,headers); + } + + /** + * Send POST request + */ + public static String put(String url, Map<String, String> queryParas, String data, Map<String, String> headers) { + HttpURLConnection conn = null; + try { + conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), HTTP_PUT, headers); + conn.connect(); + OutputStream out = conn.getOutputStream(); + out.write(data.getBytes(CHARSET)); + out.flush(); + out.close(); + return readResponseString(conn); + } + catch (Exception e) { + throw new RuntimeException(e); + } + finally { + if (conn != null) { + conn.disconnect(); + } + } + } + + + + public static String jsonPut(String url,String data){ + Map<String,String> headers = new HashMap<>(); + headers.put("Content-Type","application/json"); + return put(url,null,data,headers); + } + + + /** + * https 域名校验 + */ + private static class TrustAnyHostnameVerifier implements HostnameVerifier { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + } + + /** + * https 证书管理 + */ + private static class TrustAnyTrustManager implements X509TrustManager { + @Override + public X509Certificate[] getAcceptedIssuers() { + return null; + } + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + } + + private static SSLSocketFactory initSSLSocketFactory() { + try { + TrustManager[] tm = {new TrustAnyTrustManager()}; + SSLContext sslContext = SSLContext.getInstance("TLS", "SunJSSE"); + sslContext.init(null, tm, new java.security.SecureRandom()); + return sslContext.getSocketFactory(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static final SSLSocketFactory sslSocketFactory = initSSLSocketFactory(); + private static final TrustAnyHostnameVerifier trustAnyHostnameVerifier = new TrustAnyHostnameVerifier(); + + private static HttpURLConnection getHttpConnection(String url, String method, Map<String, String> headers) throws Exception { + URL _url = new URL(url); + HttpURLConnection conn = (HttpURLConnection)_url.openConnection(); + if (conn instanceof HttpsURLConnection) { + ((HttpsURLConnection)conn).setSSLSocketFactory(sslSocketFactory); + ((HttpsURLConnection)conn).setHostnameVerifier(trustAnyHostnameVerifier); + } + conn.setRequestMethod(method); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setConnectTimeout(30000); + conn.setReadTimeout(30000); + conn.setUseCaches(false); // Post 请求不能使用缓存 + if(headers != null){ + String contentType = headers.get("Content-Type"); + if(StringUtils.isNotEmpty(contentType)){ + conn.setRequestProperty("Content-Type",contentType); + }else{ + conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=utf-8"); + } + } + conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36"); + if (headers != null && !headers.isEmpty()) + for (Map.Entry<String, String> entry : headers.entrySet()) + conn.setRequestProperty(entry.getKey(), entry.getValue()); + + return conn; + } + + private static String readResponseString(HttpURLConnection conn) { + StringBuilder sb = new StringBuilder(); + InputStream inputStream = null; + try { + inputStream = conn.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, CHARSET)); + String line = null; + while ((line = reader.readLine()) != null){ + sb.append(line).append("\n"); + } + return sb.toString(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + /** + * Build queryString of the url + */ + private static String buildUrlWithQueryString(String url, Map<String, String> queryParas) { + if (queryParas == null || queryParas.isEmpty()) + return url; + + StringBuilder sb = new StringBuilder(url); + boolean isFirst; + if (url.indexOf("?") == -1) { + isFirst = true; + sb.append("?"); + } + else { + isFirst = false; + } + + for (Map.Entry<String, String> entry : queryParas.entrySet()) { + if (isFirst) isFirst = false; + else sb.append("&"); + + String key = entry.getKey(); + String value = entry.getValue(); + if (!StringUtils.isEmpty(value)){ + try {value = URLEncoder.encode(value, CHARSET);} catch (UnsupportedEncodingException e) {throw new RuntimeException(e);} + sb.append(key).append("=").append(value); + } + } + return sb.toString(); + } +} + + diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java new file mode 100644 index 0000000..7f62bdb --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java @@ -0,0 +1,219 @@ +package com.xcong.excoin.modules.blackchain.service.Impl; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSONObject; +import com.xcong.excoin.common.LoginUserUtils; +import com.xcong.excoin.common.response.Result; +import com.xcong.excoin.modules.blackchain.service.BlockSerive; +import com.xcong.excoin.modules.blackchain.service.BtcService; +import com.xcong.excoin.modules.blackchain.service.EthService; +import com.xcong.excoin.modules.blackchain.service.LtcService; +import com.xcong.excoin.modules.blackchain.service.UsdtService; +import com.xcong.excoin.modules.blackchain.service.XrpService; +import com.xcong.excoin.modules.member.dao.MemberCoinAddressDao; +import com.xcong.excoin.modules.member.dao.MemberDao; +import com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity; +import com.xcong.excoin.modules.member.entity.MemberEntity; +import com.xcong.excoin.utils.MessageSourceUtils; +import com.xcong.excoin.utils.RedisUtils; + +@Service +public class BlockSeriveImpl implements BlockSerive { + + @Resource + RedisUtils redisUtil; + @Resource + MemberDao memberDao; + @Resource + MemberCoinAddressDao memberMapper; + + @Override + public Result findBlockAddress(String symbol) { + + //获取用户ID + String mId = LoginUserUtils.getAppLoginUser().getId().toString(); + MemberEntity member = memberDao.selectById(mId); + if(member==null) { + return Result.fail(MessageSourceUtils.getString("member_service_0003")); + } + String lable = member.getInviteId(); + Result result = new Result(); + try { + Map<String, String> map = new HashMap<String, String>(); + MemberCoinAddressEntity memberCoinAddress = new MemberCoinAddressEntity(); + + if("USDT".equals(symbol)) { + memberCoinAddress = memberMapper.selectBlockAddressWithTag(Long.parseLong(mId), symbol,member.getInviteId()); + }else { + memberCoinAddress = memberMapper.selectBlockAddress(Long.parseLong(mId), symbol); + } + ////System.out.println("symbol ========== "+symbol); + if(memberCoinAddress!=null) { + ////System.out.println("1==================================="); + map.put("address", memberCoinAddress.getAddress()); + map.put("lable", memberCoinAddress.getLabel()); + result.setData(map); + result.setCode(0); + }else { + ////System.out.println("2==================================="); + String address = ""; + String key = ""; + String uuid = member.getInviteId(); + switch (symbol) { + case "BTC": + Map<String,String> btcMap = UsdtService.createWallet(mId); + address = btcMap.get("address"); + key = btcMap.get("privateKey"); + map.put("address", address); + break; + case "ETH": + Map<String,String> ethMap = EthService.createEth(); + address = ethMap.get("address"); + key = ethMap.get("privateKey"); + map.put("address", address); + break; + case "BCH": + MemberCoinAddressEntity btcAddress = memberMapper.selectBlockAddress(Long.parseLong(mId), "BTC"); + if(btcAddress!=null) { + address = btcAddress.getAddress(); + key = btcAddress.getPrivateKey(); + map.put("address", address); + }else { + Map<String,String> bchMap = BtcService.createWallet(mId); + address = bchMap.get("address"); + key = bchMap.get("privateKey"); + map.put("address", address); + + MemberCoinAddressEntity coinAddress = new MemberCoinAddressEntity(); + coinAddress.setAddress(address); + coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES); + coinAddress.setMemberId(Long.parseLong(mId)); + coinAddress.setPrivateKey(key); + coinAddress.setSymbol("BTC"); + coinAddress.setLabel(uuid); + memberMapper.insert(coinAddress); + } + break; + case "EOS": + address = "biyicteos123"; +// lable = member.getUID(); +// Map<String,String> eosMap = new HashMap<String, String>(); + map.put("address", address); + map.put("lable",uuid); + break; + case "XRP": + JSONObject jSONObject = XrpService.createWallet(); + address = (String)jSONObject.get("xAddress"); + key = (String)jSONObject.get("secret"); +// lable = member.getUID(); + map.put("address", address); + map.put("lable", uuid); + break; + case "LTC": + Map<String,String> ltcMap = LtcService.createWallet(mId); + address = ltcMap.get("address"); + key = ltcMap.get("privateKey"); + map.put("address", address); + break; + case "ETC": + MemberCoinAddressEntity ethAddress = memberMapper.selectBlockAddress(Long.parseLong(mId), "ETH"); + if(ethAddress!=null) { + address = ethAddress.getAddress(); + key = ethAddress.getPrivateKey(); + map.put("address", address); + }else { + Map<String,String> etcMap = EthService.createEth(); + address = etcMap.get("address"); + key = etcMap.get("privateKey"); + map.put("address", address); + + MemberCoinAddressEntity coinAddress = new MemberCoinAddressEntity(); + coinAddress.setAddress(address); + coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES); + coinAddress.setMemberId(Long.parseLong(mId)); + coinAddress.setPrivateKey(key); + coinAddress.setSymbol("ETH"); + coinAddress.setLabel(uuid); + memberMapper.insert(coinAddress); + } + + break; + case "USDT": + if("OMNI".equals(lable)) { + MemberCoinAddressEntity btcAddress2 = memberMapper.selectBlockAddress(Long.parseLong(mId), "BTC"); + if(btcAddress2!=null) { + address = btcAddress2.getAddress(); + key = btcAddress2.getPrivateKey(); + map.put("address", address); + }else { + //如果BTC地址不存在,创建一个BTC地址 + Map<String,String> usdtMap = UsdtService.createWallet(mId); + address = usdtMap.get("address"); + key = usdtMap.get("privateKey"); + map.put("address", address); + + MemberCoinAddressEntity coinAddress = new MemberCoinAddressEntity(); + coinAddress.setAddress(address); + coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES); + coinAddress.setMemberId(Long.parseLong(mId)); + coinAddress.setPrivateKey(key); + coinAddress.setSymbol("BTC"); + coinAddress.setLabel(uuid); + memberMapper.insert(coinAddress); + } + + }else { + MemberCoinAddressEntity ethAddress2 = memberMapper.selectBlockAddress(Long.parseLong(mId), "ETH"); + if(ethAddress2!=null) { + address = ethAddress2.getAddress(); + key = ethAddress2.getPrivateKey(); + map.put("address", address); + }else { + Map<String,String> usdtMap = EthService.createEth(); + address = usdtMap.get("address"); + key = usdtMap.get("privateKey"); + map.put("address", address); + + MemberCoinAddressEntity coinAddress = new MemberCoinAddressEntity(); + coinAddress.setAddress(address); + coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES); + coinAddress.setMemberId(Long.parseLong(mId)); + coinAddress.setPrivateKey(key); + coinAddress.setSymbol("ETH"); + coinAddress.setLabel(uuid); + memberMapper.insert(coinAddress); + } + } + break; + default: + break; + } + MemberCoinAddressEntity coinAddress = new MemberCoinAddressEntity(); + coinAddress.setAddress(address); + coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES); + coinAddress.setMemberId(Long.parseLong(mId)); + coinAddress.setPrivateKey(key); + coinAddress.setSymbol(symbol); + coinAddress.setLabel(uuid); + if(symbol.equals("USDT")) { + coinAddress.setTag(lable); + } + + memberMapper.insert(coinAddress); + ////System.out.println("生成的地址:"+address+" 密钥:"+key); + result.setData(map); + result.setCode(0); + } + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + +} diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/LtcService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/LtcService.java new file mode 100644 index 0000000..9acd8a1 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/LtcService.java @@ -0,0 +1,125 @@ +package com.xcong.excoin.modules.blackchain.service; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringUtils; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; + + +public class LtcService { + + private static LtcService service = null; + private final static String RESULT = "result"; + private final static String METHOD_SEND_TO_ADDRESS = "sendtoaddress"; + private final static String METHOD_GET_TRANSACTION = "gettransaction"; + private final static String METHOD_LIST_TRANSACTIONS = "listtransactions"; + private final static String METHOD_GET_BLOCK_COUNT = "getblockcount"; + private final static String METHOD_NEW_ADDRESS = "getnewaddress"; + private final static String METHOD_GET_BALANCE = "getbalance"; + private final static String METHOD_WALLET_PASSPHRASE = "walletpassphrase"; + private final static String METHOD_WALLET_LOCK = "walletlock"; + private final static String METHOD_GET_BALANCE_ADDRESS = "getreceivedbyaddress"; + + private String url = "http://121.40.86.163:1888"; + private String username = "biyiltc"; + private String password = "biyiltc"; + + public static LtcService getInstance() { + if (service != null) { + return service; + } + return new LtcService(); + } + + private LtcService() { + } + + /** + * 创建BTC钱包 每个账户对应一个地址 方便后续操作 + * @param mId 账户 + * @return + */ + public static Map<String, String> createWallet(String mId) { + LtcService btcService = getInstance(); + // 创建钱包地址 + String address = btcService.getAddress(mId); + // 私钥 + String privateKey = btcService.dumpprivkey(address); + Map<String, String> result = new HashMap<String,String>(); + result.put("address", address); + result.put("privateKey", privateKey); + return result; + } + public String getAddress(String label) { + try { + JSONObject json = doRequest(METHOD_NEW_ADDRESS,label); + //JSONObject json = doRequest(METHOD_NEW_ADDRESS); + if (isError(json)) { + return ""; + } + return json.getString(RESULT); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private JSONObject doRequest(String method, Object... params) { + JSONObject param = new JSONObject(); + param.put("id", System.currentTimeMillis() + ""); + param.put("jsonrpc", "2.0"); + param.put("method", method); + if (params != null) { + param.put("params", params); + } + String creb = Base64.encodeBase64String((username + ":" + password).getBytes()); + Map<String, String> headers = new HashMap<>(2); + headers.put("Authorization", "Basic " + creb); + return JSON.parseObject(HttpUtil.jsonPost(url, headers, param.toJSONString())); + } + + private boolean isError(JSONObject json) { + if (json == null || (StringUtils.isNotEmpty(json.getString("error")) && json.get("error") != "null")) { + return true; + } + return false; + } + + public String dumpprivkey(String address) { + try { + JSONObject obj = doRequest("dumpprivkey", address); + //System.out.println(obj); + if (!isError(obj)) { + return obj.getString(RESULT); + } else { + return null; + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 查询给定地址的总收款额(只计算接受的) + * @param address + * @return + */ + public BigDecimal getBalance(String address) { + JSONObject json = doRequest(METHOD_GET_BALANCE_ADDRESS,address,3); + if (!isError(json)) { + return new BigDecimal(json.getString(RESULT)); + } else { + return null; + } + } + + public static void main(String[] args) { + BigDecimal s = LtcService.getInstance().getBalance("MS6UBteTkQYbbBg5xEPWUQ1PPG7zkxY368"); + System.out.println(s); + } +} diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtService.java new file mode 100644 index 0000000..bfb5074 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtService.java @@ -0,0 +1,167 @@ +package com.xcong.excoin.modules.blackchain.service; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringUtils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + + +public class UsdtService { +// public static void main(String[] args) throws IOException { +// ECKey key = new ECKey(); +// //logger.info("We created a new key:\n" + key); +// // TEST 网络 +// NetworkParameters params = MainNetParams.get(); +// Address addressFromKey = key.toAddress(params); +// System.out.println("Public Address generated: " + addressFromKey); +// //logger.info("Public Address generated: " + addressFromKey); +// String privateKey = key.getPrivateKeyEncoded(params).toString(); +// System.out.println("Private key is: " + privateKey); +// //logger.info("Private key is: " + privateKey); +// //logger.info("Private Hex key is: " + key.getPrivateKeyAsHex()); +// Wallet wallet = new Wallet(TestNet3Params.get()); +// File walletFile = new File("D//:test.wallet"); +// wallet.importKey(key); +// wallet.saveToFile(walletFile); +// } + + private static UsdtService service = null; + private final static String RESULT = "result"; + private final static String METHOD_SEND_TO_ADDRESS = "sendtoaddress"; + private final static String METHOD_GET_TRANSACTION = "gettransaction"; + private final static String METHOD_LIST_TRANSACTIONS = "listtransactions"; + private final static String METHOD_GET_BLOCK_COUNT = "getblockcount"; + private final static String METHOD_NEW_ADDRESS = "getnewaddress"; + private final static String METHOD_GET_BALANCE = "getbalance"; + private final static String METHOD_GET_BALANCE_ADDRESS = "getreceivedbyaddress"; + private final static String METHOD_WALLET_PASSPHRASE = "walletpassphrase"; + private final static String METHOD_WALLET_LOCK = "walletlock"; + + private String url = "http://120.55.86.146:1880"; + private String username = "biyi"; + private String password = "biyi1234"; + + public static UsdtService getInstance() { + if (service != null) { + return service; + } + return new UsdtService(); + } + + private UsdtService() { + } + + /** + * 创建BTC钱包 每个账户对应一个地址 方便后续操作 + * + * @param mId 账户 + * @return + */ + public static Map<String, String> createWallet(String mId) { + UsdtService btcService = getInstance(); + // 创建钱包地址 + String address = btcService.getAddress(mId); + // 私钥 + String privateKey = btcService.dumpprivkey(address); + Map<String, String> result = new HashMap<String, String>(); + result.put("address", address); + result.put("privateKey", privateKey); + return result; + } + + public String getAddress(String label) { + try { + JSONObject json = doRequest(METHOD_NEW_ADDRESS, label); + if (isError(json)) { + return ""; + } + return json.getString(RESULT); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private JSONObject doRequest(String method, Object... params) { + JSONObject param = new JSONObject(); + param.put("id", System.currentTimeMillis() + ""); + param.put("jsonrpc", "2.0"); + param.put("method", method); + if (params != null) { + param.put("params", params); + } + String creb = Base64.encodeBase64String((username + ":" + password).getBytes()); + Map<String, String> headers = new HashMap<>(2); + headers.put("Authorization", "Basic " + creb); + return JSON.parseObject(HttpUtil.jsonPost(url, headers, param.toJSONString())); + } + + private boolean isError(JSONObject json) { + if (json == null || (StringUtils.isNotEmpty(json.getString("error")) && json.get("error") != "null")) { + return true; + } + return false; + } + + public String dumpprivkey(String address) { + try { + JSONObject obj = doRequest("dumpprivkey", address); + System.out.println(obj); + if (!isError(obj)) { + return obj.getString(RESULT); + } else { + return null; + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 查询给定地址的总收款额(只计算接受的) + * + * @param address + * @return + */ + public BigDecimal getBalance(String address) { + try { + JSONObject json = doRequest("omni_getbalance", address, 31); + if (!isError(json)) { + return new BigDecimal(json.getJSONObject(RESULT).get("balance").toString()); + } else { + return null; + } + } catch (Exception e) { + e.printStackTrace(); + System.out.println("BTC-USDT查询余额失败"); + return null; + } + + } + + public String METHOD_GET_BLOCK_COUNT() { + JSONObject json = doRequest(METHOD_GET_BLOCK_COUNT); + if (!isError(json)) { + return json.getString(RESULT); + } else { + return null; + } + } + + + + + + public static void main(String[] args) { + + System.out.println(UsdtService.getInstance().getBalance("1PLCr8A2z7YLEtoPLJdzzqpfb3Ym87UCtt")); + } +} diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/XrpService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/XrpService.java new file mode 100644 index 0000000..397ce7d --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/XrpService.java @@ -0,0 +1,487 @@ +package com.xcong.excoin.modules.blackchain.service; + +import java.io.IOException; +import java.math.BigDecimal; +import java.text.MessageFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringUtils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.ripple.core.coretypes.AccountID; +import com.ripple.core.coretypes.Amount; +import com.ripple.core.coretypes.uint.UInt32; +import com.ripple.core.types.known.tx.signed.SignedTransaction; +import com.ripple.core.types.known.tx.txns.Payment; +import com.xcong.excoin.modules.blackchain.model.XrpTransResult; + +public class XrpService { + + // private //logger //logger = //logger.get//logger(getClass()); + /** + * 官方接口地址 + */ + private static String getUrl = "https://data.ripple.com"; + private String postUrl = "https://s1.ripple.com:51234"; + + /** + * 本地nodejs创建钱包地址 + */ + private static String localUrl = "http://121.40.86.163:1886"; + private String address; + private String password; + + private static final String gasFee = "100"; + private static final String COIN_XRP = "XRP"; + + private final static String RESULT = "result"; + private final static String SUCCESS = "success"; + private final static String TES_SUCCESS = "tesSUCCESS"; + + private final static String METHOD_GET_TRANSACTION = "/v2/accounts/{0}/transactions"; + private final static String METHOD_GET_BALANCE = "/v2/accounts/{0}/balances"; + private final static String METHOD_POST_SIGN = "sign"; + private final static String METHOD_POST_INDEX = "ledger_current"; + private final static String METHOD_POST_ACCOUNT_INFO = "account_info"; + private final static String METHOD_POST_SUBMIT = "submit"; + + public XrpService(String address, String password) { + try { + this.address = address; + this.password = password; + } catch (Exception e) { + e.printStackTrace(); + } + } + + public String getAddress() { + return address; + } + + public static void main(String[] args) { + // 十分钟查一次 每次100条 + String result = HttpUtil.get("https://data.ripple.com/v2/accounts/rBEXvZL66VvaMzX5R2W5g5xC9Z3D81wkzb/transactions?start=2019-09-01T10:10:00Z"); + JSONObject json = JSONObject.parseObject(result); + XrpTransResult res = json.toJavaObject(XrpTransResult.class); + } + + /** + * 创建钱包 { "xAddress":"X7bpbHDKxS3Mr417RPtgS3TFFHwAHqULXJUVZntHWAKnccw", + * "secret":"snYpXT4wrhi8ve2miSUHUdn9wgzz7", + * "classicAddress":"rsJftGoh49zju51k2LdvUYrzLzJ44XJpXh", + * "address":"rsJftGoh49zju51k2LdvUYrzLzJ44XJpXh" } + * + * @return + */ + public static JSONObject createWallet() { + String res = HttpUtil.get(localUrl); + JSONObject obj = JSONObject.parseObject(res); + return obj; + } + + /** + * 查询交易记录 用于更新用户的余额 本系统的地址:X75MxY8sjcebBasymUXDYcYHWj6v8wqWLGmg9N3x65SXUJw + * https://data.ripple.com/v2/accounts/rBEXvZL66VvaMzX5R2W5g5xC9Z3D81wkzb/transactions + * https://data.ripple.com/v2/accounts/rBEXvZL66VvaMzX5R2W5g5xC9Z3D81wkzb/transactions?start=2019-09-01T10:10:00Z&limit=1 + */ + + /** + * start YYYY-MM-DDThh:mm:ssZ String - Timestamp Start time of query range. The default is the + * earliest date available. + * end String - Timestamp End time of query range. The + * default is the current date. + * min_sequence String Minimum sequence number to + * query. + * max_sequence String Max sequence number to query. + * type String Restrict results to a specified transaction type. + * result String Restrict results to a specified transaction result. + * binary Boolean Return results in binary format. + * descending Boolean If true, return results in reverse chronological order.The default is false. + * limit Integer Maximum results per page. The default is 20. Cannot be more than 1,000. + * marker String Pagination key from previously + * returned response. + * + * https://github.com/ripple/rippled-historical-database + */ + public static XrpTransResult getTransactions(Date start) { + // SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-DDThh:mm:ssZ"); + SimpleDateFormat formatDay = new SimpleDateFormat("YYYY-MM-dd"); + SimpleDateFormat formatHour = new SimpleDateFormat("hh:mm:ss"); + String startTime = formatDay.format(start)+"T"+formatHour.format(start)+"Z"; + String url ="https://data.ripple.com/v2/accounts/X75MxY8sjcebBasymUXDYcYHWj6v8wqWLGmg9N3x65SXUJw/transactions?start="+startTime+"&limit=1000"; + // 十分钟查一次 每次100条 + String result = HttpUtil.get(url); + try { + JSONObject json = JSONObject.parseObject(result); + XrpTransResult res = json.toJavaObject(XrpTransResult.class); + return res; + }catch(Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * XRP查询余额 + * + * @return + */ + public static double getBalance(String address) { + try { + HashMap<String, String> params = new HashMap<String, String>(); + params.put("currency", COIN_XRP); + String re = HttpUtil.jsonGet(getUrl + MessageFormat.format(METHOD_GET_BALANCE, address), params); + if (!StringUtils.isEmpty(re)) { + JSONObject json = JSON.parseObject(re); + if (SUCCESS.equals(json.getString(RESULT))) { + JSONArray array = json.getJSONArray("balances"); + if (array != null && array.size() > 0) { + // 总余额 + double balance = array.getJSONObject(0).getDoubleValue("value"); + if (balance >= 20) { + // 可用余额 xrp会冻结20个币 + return BigDecimalUtil.sub(balance, 20); + } + } + } + } + } catch (Exception e) { + // logger.error("==============虚拟币-瑞波币getBalance失败!"); + e.printStackTrace(); + } + return 0.00; + } + + /** + * 发送交易 + * + * @param address + * @param value + * @return + */ + public synchronized String send(String toAddress, double value, String tag) { + try { + String txBlob = this.sign(toAddress, value, tag); + if (StringUtils.isEmpty(txBlob)) { + // logger.error("签名失败:{" + toAddress + "}"); + return null; + } + HashMap<String, Object> params = new HashMap<String, Object>(); + params.put("tx_blob", txBlob); + // 签名 + JSONObject json = doRequest(METHOD_POST_SUBMIT, params); + if (!isError(json)) { + // logger.error("============瑞波币XRP转账返回!json="+json); + JSONObject result = json.getJSONObject(RESULT); + if (result != null) { + if (TES_SUCCESS.equals(result.getString("engine_result"))) { + String hash = result.getJSONObject("tx_json").getString("hash"); + if (!StringUtils.isEmpty(hash)) { + // logger.error("转账成功:toAddress:{" + toAddress + "},value:{" + value + + // "},hash:{" + hash + "}"); + return hash; + } else { + // logger.error( + // "转账失败:toAddress:{" + toAddress + "},value:{" + value + "},hash:{" + hash + + // "}"); + } + } + } + } else { + // logger.error("============瑞波币XRP转账失败!json="+json); + } + } catch (Exception e) { + // logger.error("==============虚拟币-瑞波币send失败!"); + e.printStackTrace(); + } + return null; + } + + public synchronized String sendOnLine(String toAddress, double value, String tag) { + try { + String txBlob = this.signOnLine(toAddress, value, tag); + if (StringUtils.isEmpty(txBlob)) { + // logger.error("签名失败:{" + toAddress + "}"); + return null; + } + HashMap<String, Object> params = new HashMap<String, Object>(); + params.put("tx_blob", txBlob); + // 签名 + JSONObject json = doRequest(METHOD_POST_SUBMIT, params); + if (!isError(json)) { + // logger.error("============瑞波币XRP转账返回!json="+json); + JSONObject result = json.getJSONObject(RESULT); + if (result != null) { + if (TES_SUCCESS.equals(result.getString("engine_result"))) { + String hash = result.getJSONObject("tx_json").getString("hash"); + if (!StringUtils.isEmpty(hash)) { + // logger.error("转账成功:toAddress:{" + toAddress + "},value:{" + value + + // "},hash:{" + hash + "}"); + return hash; + } else { + // logger.error( + // "转账失败:toAddress:{" + toAddress + "},value:{" + value + "},hash:{" + hash + + // "}"); + } + } + } + } else { + // logger.error("==============瑞波币XRP转账失败!json="+json); + } + } catch (Exception e) { + // logger.error("==============虚拟币-瑞波币send失败!"); + e.printStackTrace(); + } + return null; + } + + @Deprecated + public String signOnLine(String toAddress, Double value, String tag) { + try { + // 瑞波币余额存储加六位长度 + value = BigDecimalUtil.mul(value, 1000000); + Integer vInteger = BigDecimal.valueOf(value).intValue(); + JSONObject txJson = new JSONObject(); + txJson.put("Account", address); + txJson.put("Amount", vInteger.toString()); + txJson.put("Destination", toAddress);// 标签 + txJson.put("TransactionType", "Payment"); + txJson.put("DestinationTag", tag); + HashMap<String, Object> params = new HashMap<String, Object>(); + params.put("secret", password); + params.put("tx_json", txJson); + params.put("offline", false); + // 签名 + JSONObject json = doRequest(METHOD_POST_SIGN, params); + if (!isError(json)) { + // logger.error("==============XRP签名返回:"+json); + JSONObject result = json.getJSONObject(RESULT); + if (result != null) { + if (SUCCESS.equals(result.getString("status"))) { + return result.getString("tx_blob"); + } + } + } else { + // logger.error("瑞波币XRP签名失败!json="+json); + } + } catch (Exception e) { + // logger.error("==============虚拟币-瑞波币signOnLine失败!"); + e.printStackTrace(); + } + return null; + } + + /** + * 签名 + * + * @param address + * @param value + * @return tx_blob + */ + public String sign(String toAddress, Double value, String tag) { + try { + value = BigDecimalUtil.mul(value, 1000000); + Integer vInteger = BigDecimal.valueOf(value).intValue(); + Map<String, String> map = getAccountSequenceAndLedgerCurrentIndex(); + Payment payment = new Payment(); + payment.as(AccountID.Account, address); + payment.as(AccountID.Destination, toAddress); + payment.as(UInt32.DestinationTag, tag); + payment.as(Amount.Amount, vInteger.toString()); + payment.as(UInt32.Sequence, map.get("accountSequence")); + payment.as(UInt32.LastLedgerSequence, map.get("ledgerCurrentIndex") + 4); + payment.as(Amount.Fee, gasFee); + SignedTransaction signed = payment.sign(password); + if (signed != null) { + return signed.tx_blob; + } + } catch (Exception e) { + // logger.error("==============虚拟币-瑞波币sign失败!"); + e.printStackTrace(); + } + return null; + } + + public Map<String, String> getAccountSequenceAndLedgerCurrentIndex() { + try { + HashMap<String, String> params = new HashMap<String, String>(); + params.put("account", address); + params.put("strict", "true"); + params.put("ledger_index", "current"); + params.put("queue", "true"); + JSONObject re = doRequest(METHOD_POST_ACCOUNT_INFO, params); + if (re != null) { + JSONObject result = re.getJSONObject("result"); + if (SUCCESS.equals(result.getString("status"))) { + Map<String, String> map = new HashMap<String, String>(); + map.put("accountSequence", result.getJSONObject("account_data").getString("Sequence")); + map.put("ledgerCurrentIndex", result.getString("ledger_current_index")); + return map; + } + } + } catch (Exception e) { + // logger.error("==============虚拟币-瑞波币getAccountSequenceAndLedgerCurrentIndex失败!"); + e.printStackTrace(); + } + return null; + } + + /** + * 获取用户交易序列号 + * + * @return + */ + public long getAccountSequence() { + try { + HashMap<String, String> params = new HashMap<String, String>(); + params.put("account", address); + params.put("strict", "true"); + params.put("ledger_index", "current"); + params.put("queue", "true"); + JSONObject re = doRequest(METHOD_POST_ACCOUNT_INFO, params); + if (re != null) { + JSONObject result = re.getJSONObject("result"); + if (SUCCESS.equals(result.getString("status"))) { + return result.getJSONObject("account_data").getLongValue("Sequence"); + } + } + } catch (Exception e) { + // logger.error("==============虚拟币-瑞波币getAccountSequence失败!"); + e.printStackTrace(); + } + return 0L; + } + + /** + * 获取最新序列 + * + * @return + */ + public long getLedgerIndex() { + try { + JSONObject re = doRequest(METHOD_POST_INDEX); + if (re != null) { + JSONObject result = re.getJSONObject("result"); + if (SUCCESS.equals(result.getString("status"))) { + return result.getLongValue("ledger_current_index"); + } + } + } catch (Exception e) { + // logger.error("==============虚拟币-瑞波币getLedgerIndex失败!"); + e.printStackTrace(); + } + return 0L; + } + + public String getTransaction(Date dateGMT, String limit) throws ParseException { + try { + HashMap<String, String> params = new HashMap<String, String>(); + params.put("start", DateUtil.formatDate(dateGMT, "yyyy-MM-dd'T'HH:mm:ss")); + params.put("result", "tesSUCCESS"); + params.put("type", "Payment"); + params.put("limit", limit); + return HttpUtil.jsonGet(getUrl + MessageFormat.format(METHOD_GET_TRANSACTION, address), params); + // {"result":"success","count":1,"transactions":[{"hash":"86859CBEFB870C941727E291BB13312BC3D6042D8DA08BF1DEDE6BB55F21B8EC","ledger_index":42268358,"date":"2018-10-16T06:49:30+00:00","tx":{"TransactionType":"Payment","Flags":2147483648,"Sequence":37996,"Amount":"29840000","Fee":"1000","SigningPubKey":"0279154FA62D1F28B6CB1F0264663F19EF3A1718D15363CAC1B47A9C6987231F94","TxnSignature":"304502210089F6526134F335C01C65D3E82284C06E22598A4EAD912604BF4FEAA42D5ACCE402203C044F32D399CEA6F4A16DD6DCBB339A7D0CF76E52C1AB090330A67EDFBABBE4","Account":"rH8yTBLm2SYgcL5HQGDznuNxMiy5ayYcmK","Destination":"raHb1tR1BcNB92nEqxiTuKsDap46szkJG2"},"meta":{"TransactionIndex":1,"AffectedNodes":[{"CreatedNode":{"LedgerEntryType":"AccountRoot","LedgerIndex":"56419B3209DA988033F6F0BD921806B4821A73EDF8C338FB5F06C785E527E967","NewFields":{"Sequence":1,"Balance":"29840000","Account":"raHb1tR1BcNB92nEqxiTuKsDap46szkJG2"}}},{"ModifiedNode":{"LedgerEntryType":"AccountRoot","PreviousTxnLgrSeq":42268355,"PreviousTxnID":"63D5A3121F2706099835D9A3A9E5DA574070A4E08FC70956DB1CC196DE6CDEFC","LedgerIndex":"7D2FC14FA2B344F41BB8A6E10B319301EA1C11705AE159B3E2FA82D9F3079E4C","PreviousFields":{"Sequence":37996,"Balance":"2051629511468"},"FinalFields":{"Flags":131072,"Sequence":37997,"OwnerCount":0,"Balance":"2051599670468","Account":"rH8yTBLm2SYgcL5HQGDznuNxMiy5ayYcmK"}}}],"TransactionResult":"tesSUCCESS","delivered_amount":"29840000"}}]} + } catch (Exception e) { + // logger.error("==============虚拟币-瑞波币getBalance失败!"); + e.printStackTrace(); + } + return null; + } + + public Long parseTransaction(String startTm) throws ParseException { + try { + HashMap<String, String> params = new HashMap<String, String>(); + if (!StringUtils.isEmpty(startTm)) { + Date d = new Date(BigDecimalUtil.longAdd(Long.parseLong(startTm), 1000L)); + params.put("start", DateUtil.formatDate(d, "yyyy-MM-dd'T'HH:mm:ss")); + } + params.put("result", "tesSUCCESS"); + params.put("type", "Payment"); + params.put("limit", "1"); + String re = HttpUtil.jsonGet(getUrl + MessageFormat.format(METHOD_GET_TRANSACTION, address), params); + if (!StringUtils.isEmpty(re)) { + JSONObject json = JSON.parseObject(re); + if (SUCCESS.equals(json.getString(RESULT))) { + // marker = json.getString("marker"); + JSONArray transactions = json.getJSONArray("transactions"); + if (transactions != null && transactions.size() > 0) { + for (Object object : transactions) { + JSONObject transaction = (JSONObject) object; + String hash = transaction.getString("hash"); + String dateString = transaction.getString("date"); + Date date = DateUtil.parseDate(dateString, "yyyy-MM-dd'T'HH:mm:ss"); + JSONObject tx = transaction.getJSONObject("tx"); + String destinationTag = tx.getString("DestinationTag"); + if (StringUtils.isEmpty(destinationTag)) { + // logger.info("非用户充值记录"); + return date.getTime(); + } + String to = tx.getString("Destination"); + if (!address.equals(to)) { + // logger.info("非用户充值记录,地址不一致"); + return date.getTime(); + } + // 校验用户是否存在 + /* + * UserEntity user = userService.getUserById(Integer.parseInt( destinationTag)); + * if (user == null) { //logger.info("用户不存在:{}",destinationTag); return + * date.getTime(); } + */ + double amount = tx.getDoubleValue("Amount"); + if (amount > 0) { + amount = BigDecimalUtil.div(amount, 1000000, 6); + } else { + // logger.error("交易金额异常:{" + amount + "}"); + return date.getTime(); + } + // 添加充值记录 + } + } + } + } + } catch (Exception e) { + // logger.error("==============虚拟币-瑞波币parseTransaction失败!"); + e.printStackTrace(); + } + return null; + } + + private boolean isError(JSONObject json) { + if (json == null || (!StringUtils.isEmpty(json.getString("error")) && json.get("error") != "null")) { + return true; + } + return false; + } + + private JSONObject doRequest(String method, Object... params) { + JSONObject param = new JSONObject(); + param.put("id", System.currentTimeMillis() + ""); + param.put("jsonrpc", "2.0"); + param.put("method", method); + if (params != null) { + param.put("params", params); + } + String creb = Base64.encodeBase64String((address + ":" + password).getBytes()); + Map<String, String> headers = new HashMap<>(2); + headers.put("Authorization", "Basic " + creb); + String resp = ""; + try { + resp = HttpUtil.jsonPost(postUrl, headers, param.toJSONString()); + } catch (Exception e) { + // logger.info(e.getMessage()); + if (e instanceof IOException) { + resp = "{}"; + } + } + return JSON.parseObject(resp); + } + +} diff --git a/src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java b/src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java index 7fddc94..467d131 100644 --- a/src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java +++ b/src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java @@ -6,10 +6,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.xcong.excoin.common.response.Result; @@ -23,11 +20,15 @@ import com.xcong.excoin.modules.member.parameter.dto.MemberPaymethodDto; import com.xcong.excoin.modules.member.parameter.dto.MemberUpdatePwdDto; import com.xcong.excoin.modules.member.parameter.dto.MemberUpdateTradePwdDto; +import com.xcong.excoin.modules.member.parameter.vo.MemberAuthenticationInfoVo; +import com.xcong.excoin.modules.member.parameter.vo.MemberAvivableCoinInfoVo; import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressCountListVo; import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressListVo; +import com.xcong.excoin.modules.member.parameter.vo.MemberCoinInfoListVo; import com.xcong.excoin.modules.member.parameter.vo.MemberInfoVo; import com.xcong.excoin.modules.member.parameter.vo.MemberPaymethodDetailListVo; import com.xcong.excoin.modules.member.parameter.vo.MemberPaymethodDetailVo; +import com.xcong.excoin.modules.member.parameter.vo.MemberPersonCenterInfoVo; import com.xcong.excoin.modules.member.parameter.vo.MemberSendCodeWayVo; import com.xcong.excoin.modules.member.service.MemberService; @@ -85,6 +86,17 @@ //System.out.println("修改密码:"); return memberService.memberUpdatePwd(memberUpdatePwdDto); } + + /** + * 获取实名认证信息 + * @return + */ + @ApiOperation(value = "获取实名认证信息", notes = "获取实名认证信息") + @ApiResponses({@ApiResponse( code = 200, message = "success", response = MemberAuthenticationInfoVo.class)}) + @GetMapping(value = "/memberAuthenticationInfo") + public Result memberAuthenticationInfo() { + return memberService.memberAuthenticationInfo(); + } /** * 实名认证 @@ -250,40 +262,42 @@ return memberService.memberSendCodeWay(); } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + /** + * 获取个人中心信息 + * @return + */ + @ApiOperation(value = "获取个人中心信息", notes = "获取个人中心信息") + @ApiResponses({@ApiResponse( code = 200, message = "success", response = MemberPersonCenterInfoVo.class)}) + @GetMapping(value = "/memberPersonCenterInfo") + public Result memberPersonCenterInfo() { + return memberService.memberPersonCenterInfo(); + } + + /** + * 提币币种信息 + * @return + */ + @ApiOperation(value = "获取提币币种信息", notes = "获取提币币种信息") + @ApiResponses({@ApiResponse( code = 200, message = "success", response = MemberCoinInfoListVo.class)}) + @GetMapping(value = "/memberCoinInfoList") + public Result memberCoinInfoList() { + return memberService.memberCoinInfoList(); + } + + /** + * 提币币种可用资金 + * @param token + * @param coinVo + * @return + */ + @ApiOperation(value = "提币币种可用资金", notes = "提币币种可用资金") + @ApiResponses({@ApiResponse( code = 200, message = "success", response = MemberAvivableCoinInfoVo.class)}) + @ApiImplicitParams({ + @ApiImplicitParam(name = "symbol", value = "币种", required = true, dataType = "String", paramType="query") + }) + @GetMapping(value = "/memberAvivableCoinInfo") + public Result memberAvivableCoinInfo(String symbol) { + return memberService.memberAvivableCoinInfo(symbol); + } + } diff --git a/src/main/java/com/xcong/excoin/modules/member/dao/AgentReturnDao.java b/src/main/java/com/xcong/excoin/modules/member/dao/AgentReturnDao.java new file mode 100644 index 0000000..9344717 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/member/dao/AgentReturnDao.java @@ -0,0 +1,10 @@ +package com.xcong.excoin.modules.member.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xcong.excoin.modules.member.entity.AgentReturnEntity; + +/** + * @author helius + */ +public interface AgentReturnDao extends BaseMapper<AgentReturnEntity> { +} diff --git a/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java b/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java index 3a7f4e3..ade4d94 100644 --- a/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java +++ b/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java @@ -1,13 +1,17 @@ package com.xcong.excoin.modules.member.dao; +import org.apache.ibatis.annotations.Param; + import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity; public interface MemberCoinAddressDao extends BaseMapper<MemberCoinAddressEntity> { MemberCoinAddressEntity selectAddressByMemberIdAndSymbol(Long memberId, String symbol); + + MemberCoinAddressEntity selectBlockAddressWithTag(@Param("memberId")Long memberId, @Param("symbol")String symbol, @Param("tag")String tag); + MemberCoinAddressEntity selectBlockAddress(@Param("memberId")Long memberId, @Param("symbol")String symbol); - MemberCoinAddressEntity selectBlockAddress(Long memberId, String string); } diff --git a/src/main/java/com/xcong/excoin/modules/member/parameter/dto/MemberPaymethodDto.java b/src/main/java/com/xcong/excoin/modules/member/parameter/dto/MemberPaymethodDto.java index f11ebf0..fa2a3b2 100644 --- a/src/main/java/com/xcong/excoin/modules/member/parameter/dto/MemberPaymethodDto.java +++ b/src/main/java/com/xcong/excoin/modules/member/parameter/dto/MemberPaymethodDto.java @@ -42,11 +42,5 @@ @NotNull(message = "类型不能为空") @ApiModelProperty(value = "类型 1-支付宝2-微信3-银行卡", example = "1") private String paymentType; - /** - * 默认收款方式 - */ - @NotNull(message = "默认收款方式不能为空") - @ApiModelProperty(value = "类型 1-是 0-否", example = "1") - private String isDefualt; } diff --git a/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAuthenticationInfoVo.java b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAuthenticationInfoVo.java new file mode 100644 index 0000000..e1ffeda --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAuthenticationInfoVo.java @@ -0,0 +1,26 @@ +package com.xcong.excoin.modules.member.parameter.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "MemberAuthenticationInfoVo", description = "实名认证信息") +public class MemberAuthenticationInfoVo { + + @ApiModelProperty(value = "实名认证状态 0-审核未通过 1-审核通过 2-等待审核") + private Integer certifyStatus; + + @ApiModelProperty(value = "姓") + private String firstName; + + @ApiModelProperty(value = "名") + private String secondName; + + @ApiModelProperty(value = "身份证卡号") + private String idCardNo; + + @ApiModelProperty(value = "国家") + private String nation; + +} diff --git a/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAvivableCoinInfoVo.java b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAvivableCoinInfoVo.java new file mode 100644 index 0000000..feb201d --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAvivableCoinInfoVo.java @@ -0,0 +1,19 @@ +package com.xcong.excoin.modules.member.parameter.vo; + +import java.math.BigDecimal; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "MemberAvivableCoinInfoVo", description = "提币币种可用资金信息") +public class MemberAvivableCoinInfoVo { + + @ApiModelProperty(value = "可用余额") + private BigDecimal availableBalance; + + @ApiModelProperty(value = "手续费") + private BigDecimal fee; + +} diff --git a/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoListVo.java b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoListVo.java new file mode 100644 index 0000000..a5ac662 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoListVo.java @@ -0,0 +1,16 @@ +package com.xcong.excoin.modules.member.parameter.vo; + +import java.util.List; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "MemberCoinInfoListVo", description = "币种信息") +public class MemberCoinInfoListVo { + + @ApiModelProperty(value = "币种名称") + private List<MemberCoinInfoVo> memberCoinInfoVo; + +} diff --git a/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoVo.java b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoVo.java new file mode 100644 index 0000000..36d950e --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoVo.java @@ -0,0 +1,14 @@ +package com.xcong.excoin.modules.member.parameter.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "MemberCoinInfoVo", description = "币种信息") +public class MemberCoinInfoVo { + + @ApiModelProperty(value = "币种名称") + private String name; + +} diff --git a/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberPersonCenterInfoVo.java b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberPersonCenterInfoVo.java new file mode 100644 index 0000000..827cfb3 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberPersonCenterInfoVo.java @@ -0,0 +1,32 @@ +package com.xcong.excoin.modules.member.parameter.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "MemberPersonCenterInfoVo", description = "个人中心信息") +public class MemberPersonCenterInfoVo { + + @ApiModelProperty(value = "手机号(包含国际手机号)1:有 0没有") + private Integer phone; + + @ApiModelProperty(value = "邮箱1:有 0没有") + private Integer email; + + @ApiModelProperty(value = "交易密码1:有 0没有") + private Integer tradePassword; + + @ApiModelProperty(value = "交易密码时效性设置1:一直需要输入密码 2不需要输入密码") + private Integer tradeAgingSetting; + /** + * 一直需要输入密码 + */ + public static final int PWD_NEED_FORVER = 1; + + /** + * 不需要输入密码 + */ + public static final int PWD_NEED_NO = 2; + +} diff --git a/src/main/java/com/xcong/excoin/modules/member/service/MemberService.java b/src/main/java/com/xcong/excoin/modules/member/service/MemberService.java index e3b1456..df9c240 100644 --- a/src/main/java/com/xcong/excoin/modules/member/service/MemberService.java +++ b/src/main/java/com/xcong/excoin/modules/member/service/MemberService.java @@ -64,6 +64,14 @@ public Result memberDelCoinAddress(@Valid MemberDelCoinAddressDto memberDelCoinAddressDto); + public Result memberAuthenticationInfo(); + + public Result memberPersonCenterInfo(); + + public Result memberCoinInfoList(); + + public Result memberAvivableCoinInfo(String symbol); + public NeedMoneyMemberVo selectFriendRelationUserByMemberId(Long memberId); public List<NeedMoneyMemberVo> selectAllNeedMoneyMember(List<String> list); diff --git a/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java index 31f9b4e..aa2feaa 100644 --- a/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java @@ -26,8 +26,23 @@ import com.xcong.excoin.modules.member.parameter.dto.MemberUpdatePwdDto; import com.xcong.excoin.modules.member.parameter.dto.MemberUpdateTradePwdDto; import com.xcong.excoin.modules.member.parameter.vo.*; +import com.xcong.excoin.modules.member.parameter.vo.MemberAuthenticationInfoVo; +import com.xcong.excoin.modules.member.parameter.vo.MemberAvivableCoinInfoVo; +import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressCountListVo; +import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressCountVo; +import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressListVo; +import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressVo; +import com.xcong.excoin.modules.member.parameter.vo.MemberCoinInfoListVo; +import com.xcong.excoin.modules.member.parameter.vo.MemberCoinInfoVo; +import com.xcong.excoin.modules.member.parameter.vo.MemberInfoVo; +import com.xcong.excoin.modules.member.parameter.vo.MemberPaymethodDetailListVo; +import com.xcong.excoin.modules.member.parameter.vo.MemberPaymethodDetailVo; +import com.xcong.excoin.modules.member.parameter.vo.MemberPersonCenterInfoVo; +import com.xcong.excoin.modules.member.parameter.vo.MemberSendCodeWayVo; import com.xcong.excoin.modules.member.service.MemberService; +import com.xcong.excoin.modules.platform.dao.PlatformFeeSettingDao; import com.xcong.excoin.modules.platform.dao.PlatformSymbolsCoinDao; +import com.xcong.excoin.modules.platform.entity.PlatformFeeSettingEntity; import com.xcong.excoin.modules.platform.entity.PlatformSymbolsCoinEntity; import com.xcong.excoin.utils.MessageSourceUtils; import com.xcong.excoin.utils.RedisUtils; @@ -81,6 +96,9 @@ @Resource PlatformSymbolsCoinDao platformSymbolsCoinDao; + @Resource + PlatformFeeSettingDao platformFeeSettingDao; + @Resource MemberCoinAddressDao memberCoinAddressDao; @@ -435,7 +453,6 @@ String paymentQrcode = memberPaymethodDto.getPaymentQrcode(); String paymentType = memberPaymethodDto.getPaymentType(); String subBank = memberPaymethodDto.getSubBank(); - String isDefualt = memberPaymethodDto.getIsDefualt(); MemberPaymentMethodEntity memberPaymentMethodEntity = new MemberPaymentMethodEntity(); memberPaymentMethodEntity.setMemberId(memberId); memberPaymentMethodEntity.setAccount(account); @@ -444,7 +461,6 @@ memberPaymentMethodEntity.setPaymentQrcode(paymentQrcode); memberPaymentMethodEntity.setPaymentType(paymentType); memberPaymentMethodEntity.setSubBank(subBank); - memberPaymentMethodEntity.setIsDefualt(isDefualt); memberPaymentMethodDao.insert(memberPaymentMethodEntity); return Result.ok(MessageSourceUtils.getString("member_service_0024")); } @@ -650,6 +666,96 @@ } @Override + public Result memberAuthenticationInfo() { + //获取用户ID + Long memberId = LoginUserUtils.getAppLoginUser().getId(); + MemberEntity member = memberDao.selectById(memberId); + + Map<String, Object> columnMap = new HashMap<>(); + columnMap.put("member_id", memberId); + List<MemberAuthenticationEntity> selectByMap = memberAuthenticationDao.selectByMap(columnMap); + + MemberAuthenticationInfoVo memberAuthnticationInfoVo = new MemberAuthenticationInfoVo(); + memberAuthnticationInfoVo.setCertifyStatus(member.getCertifyStatus()); + if(CollUtil.isNotEmpty(selectByMap)) { + for(MemberAuthenticationEntity memberAuthenticationEntity : selectByMap) { + memberAuthnticationInfoVo.setFirstName(memberAuthenticationEntity.getFirstName()); + memberAuthnticationInfoVo.setSecondName(memberAuthenticationEntity.getSecondName()); + memberAuthnticationInfoVo.setNation(memberAuthenticationEntity.getNation()); + memberAuthnticationInfoVo.setIdCardNo(memberAuthenticationEntity.getIdcardNo()); + } + } + return Result.ok(memberAuthnticationInfoVo); + } + + @Override + public Result memberPersonCenterInfo() { + //获取用户ID + Long memberId = LoginUserUtils.getAppLoginUser().getId(); + MemberEntity member = memberDao.selectById(memberId); + + MemberPersonCenterInfoVo memberPersonCenterInfoVo = new MemberPersonCenterInfoVo(); + if(StrUtil.isNotEmpty(member.getPhone())) { + memberPersonCenterInfoVo.setPhone(1); + } + memberPersonCenterInfoVo.setPhone(0); + + if(StrUtil.isNotEmpty(member.getEmail())) { + memberPersonCenterInfoVo.setEmail(1); + } + memberPersonCenterInfoVo.setEmail(0); + + if(StrUtil.isNotEmpty(member.getTradePassword())) { + memberPersonCenterInfoVo.setTradePassword(1); + } + memberPersonCenterInfoVo.setTradePassword(0); + + if(StrUtil.isNotEmpty(member.getTradeAgingSetting().toString())) { + memberPersonCenterInfoVo.setTradeAgingSetting(MemberPersonCenterInfoVo.PWD_NEED_FORVER); + } + memberPersonCenterInfoVo.setTradeAgingSetting(MemberPersonCenterInfoVo.PWD_NEED_FORVER); + + return Result.ok(memberPersonCenterInfoVo); + } + + @Override + public Result memberCoinInfoList() { + //获取用户ID + Long memberId = LoginUserUtils.getAppLoginUser().getId(); + + MemberCoinInfoListVo memberCoinInfoListVo = new MemberCoinInfoListVo(); + List<PlatformSymbolsCoinEntity> selectByMap = platformSymbolsCoinDao.selectByMap(new HashMap<>()); + List<MemberCoinInfoVo> arrayList = new ArrayList<>(); + if(CollUtil.isNotEmpty(selectByMap)) { + for(PlatformSymbolsCoinEntity platformSymbolsCoinEntity : selectByMap) { + MemberCoinInfoVo memberCoinInfoVo = new MemberCoinInfoVo(); + memberCoinInfoVo.setName(platformSymbolsCoinEntity.getName()); + arrayList.add(memberCoinInfoVo); + } + } + memberCoinInfoListVo.setMemberCoinInfoVo(arrayList); + + return Result.ok(memberCoinInfoListVo); + } + + @Override + public Result memberAvivableCoinInfo(String symbol) { + //获取用户ID + Long memberId = LoginUserUtils.getAppLoginUser().getId(); + MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, symbol); + if (ObjectUtil.isEmpty(walletCoin)) { + return Result.fail(MessageSourceUtils.getString("member_service_0087")); + } + + MemberAvivableCoinInfoVo memberAvivableCoinInfoVo = new MemberAvivableCoinInfoVo(); + memberAvivableCoinInfoVo.setAvailableBalance(walletCoin.getAvailableBalance()); + + PlatformFeeSettingEntity feeSetting = platformFeeSettingDao.getFeeSettingByTypeAndSymbol(2,symbol); + memberAvivableCoinInfoVo.setFee(feeSetting.getFeePrice()); + return Result.ok(memberAvivableCoinInfoVo); + } + + @Override public NeedMoneyMemberVo selectFriendRelationUserByMemberId(Long memberId){ return memberDao.selectFriendRelationUserByMemberId(memberId); } diff --git a/src/main/java/com/xcong/excoin/modules/platform/dao/PlatformFeeSettingDao.java b/src/main/java/com/xcong/excoin/modules/platform/dao/PlatformFeeSettingDao.java new file mode 100644 index 0000000..79b6f05 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/platform/dao/PlatformFeeSettingDao.java @@ -0,0 +1,14 @@ +package com.xcong.excoin.modules.platform.dao; + +import org.apache.ibatis.annotations.Param; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xcong.excoin.modules.platform.entity.PlatformFeeSettingEntity; + +public interface PlatformFeeSettingDao extends BaseMapper<PlatformFeeSettingEntity> { + + PlatformFeeSettingEntity getFeeSettingByTypeAndSymbolLable(@Param("type")Integer type,@Param("symbol")String symbol,@Param("lable")String lable); + + PlatformFeeSettingEntity getFeeSettingByTypeAndSymbol(@Param("type")Integer type,@Param("symbol")String symbol); + +} diff --git a/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformCnyUsdtExchangeEntity.java b/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformCnyUsdtExchangeEntity.java index cf89fbb..4afacaf 100644 --- a/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformCnyUsdtExchangeEntity.java +++ b/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformCnyUsdtExchangeEntity.java @@ -1,5 +1,6 @@ package com.xcong.excoin.modules.platform.entity; +import java.io.Serializable; import java.math.BigDecimal; import com.baomidou.mybatisplus.annotation.TableName; @@ -7,7 +8,12 @@ import lombok.Data; @Data @TableName("platform_cny_usdt_exchange") -public class PlatformCnyUsdtExchangeEntity{ +public class PlatformCnyUsdtExchangeEntity implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 1L; private Long id; diff --git a/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformFeeSettingEntity.java b/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformFeeSettingEntity.java new file mode 100644 index 0000000..ecea14f --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/platform/entity/PlatformFeeSettingEntity.java @@ -0,0 +1,53 @@ +package com.xcong.excoin.modules.platform.entity; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.TableName; + +import lombok.Data; + +@Data +@TableName("platform_fee_setting") +public class PlatformFeeSettingEntity implements Serializable { + + private static final long serialVersionUID = 1L; + /** + * 主键ID + */ + private Long id; + /** + * 类型 1-充币2-提币3-充值USDT4-提现USDT + */ + private Integer type; + /** + * 最低价 + */ + private BigDecimal minPrice; + /** + * 最高价 + */ + private BigDecimal maxPrice; + /** + * 手续费价 + */ + private BigDecimal feePrice; + /** + * + */ + private Date createTime; + /** + * 人民币价格 + */ + private BigDecimal cnyPrice; + /** + * 币种 + */ + private String symbol; + /** + * USDT链名 + */ + private String lable; + +} diff --git a/src/main/resources/mapper/member/AgentReturnDao.xml b/src/main/resources/mapper/member/AgentReturnDao.xml new file mode 100644 index 0000000..3c7e7e8 --- /dev/null +++ b/src/main/resources/mapper/member/AgentReturnDao.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.xcong.excoin.modules.member.dao.AgentReturnDao"> + +</mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/member/MemberCoinAddressDao.xml b/src/main/resources/mapper/member/MemberCoinAddressDao.xml index ed64675..7355ec0 100644 --- a/src/main/resources/mapper/member/MemberCoinAddressDao.xml +++ b/src/main/resources/mapper/member/MemberCoinAddressDao.xml @@ -6,7 +6,7 @@ select * from member_coin_address where member_id=#{memberId} and symbol = #{symbol} </select> - <select id="selectBlockAddress" resultType="com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity"> + <select id="selectBlockAddressWithTag" resultType="com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity"> select * from member_coin_address <where> @@ -17,6 +17,23 @@ <if test="symbol != null and symbol != ''"> and symbol = #{symbol} </if> + <if test="tag != null and tag != ''"> + and tag = #{tag} + </if> + </where> + </select> + + <select id="selectBlockAddress" resultType="com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity"> + select * + from member_coin_address + <where> + is_biyict = 1 + <if test="memberId != null and memberId != ''"> + and member_id = #{memberId} + </if> + <if test="symbol != null and symbol != ''"> + and symbol = #{symbol} + </if> </where> </select> diff --git a/src/main/resources/mapper/platform/PlatformFeeSettingDao.xml b/src/main/resources/mapper/platform/PlatformFeeSettingDao.xml new file mode 100644 index 0000000..6df23c2 --- /dev/null +++ b/src/main/resources/mapper/platform/PlatformFeeSettingDao.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.xcong.excoin.modules.platform.dao.PlatformFeeSettingDao"> + + <select id="getFeeSettingByTypeAndSymbolLable" resultType="com.xcong.excoin.modules.platform.entity.PlatformFeeSettingEntity"> + select * from fee_setting + <where> + <if test="type != null and type != ''"> + type = #{type} + </if> + <if test="symbol != null and symbol != ''"> + and symbol = #{symbol} + </if> + <if test="lable != null and lable != ''"> + and lable = #{lable} + </if> + </where> + </select> + + <select id="getFeeSettingByTypeAndSymbol" resultType="com.xcong.excoin.modules.platform.entity.PlatformFeeSettingEntity"> + select * from fee_setting where type = #{type} and symbol = #{symbol} + </select> + +</mapper> \ No newline at end of file -- Gitblit v1.9.1