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