lib/ripple-core-0.0.1-SNAPSHOT.jarBinary files differ
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> src/main/java/com/xcong/excoin/modules/blackchain/controller/BlockController.java
New file @@ -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); } } src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransResult.java
New file @@ -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; } } src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransactions.java
New file @@ -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; } } src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTx.java
New file @@ -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; } } src/main/java/com/xcong/excoin/modules/blackchain/service/BchService.java
New file @@ -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")); } } src/main/java/com/xcong/excoin/modules/blackchain/service/BigDecimalUtil.java
New file @@ -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(); } } src/main/java/com/xcong/excoin/modules/blackchain/service/BlockSerive.java
New file @@ -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); } src/main/java/com/xcong/excoin/modules/blackchain/service/BtcService.java
New file @@ -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")); } } src/main/java/com/xcong/excoin/modules/blackchain/service/DateUtil.java
New file @@ -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; } } src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java
New file @@ -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; } } } src/main/java/com/xcong/excoin/modules/blackchain/service/HttpUtil.java
New file @@ -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(); } } src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java
New file @@ -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; } } src/main/java/com/xcong/excoin/modules/blackchain/service/LtcService.java
New file @@ -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); } } src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtService.java
New file @@ -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")); } } src/main/java/com/xcong/excoin/modules/blackchain/service/XrpService.java
New file @@ -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); } } 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); } } 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); } 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; } src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAuthenticationInfoVo.java
New file @@ -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; } src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAvivableCoinInfoVo.java
New file @@ -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; } src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoListVo.java
New file @@ -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; } src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoVo.java
New file @@ -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; } src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberPersonCenterInfoVo.java
New file @@ -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; } src/main/java/com/xcong/excoin/modules/member/service/MemberService.java
@@ -60,5 +60,13 @@ public Result memberDelCoinAddress(@Valid MemberDelCoinAddressDto memberDelCoinAddressDto); public Result memberAuthenticationInfo(); public Result memberPersonCenterInfo(); public Result memberCoinInfoList(); public Result memberAvivableCoinInfo(String symbol); } src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
@@ -25,16 +25,23 @@ 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.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; @@ -89,14 +96,17 @@ PlatformSymbolsCoinDao platformSymbolsCoinDao; @Resource PlatformFeeSettingDao platformFeeSettingDao; @Resource MemberCoinAddressDao memberCoinAddressDao; @Resource private CommonService commonservice; @Resource private MemberWalletContractSimulateDao memberWalletContractSimulateDao; @Transactional() @Override public Result register(RegisterDto registerDto) { @@ -442,7 +452,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); @@ -451,7 +460,6 @@ memberPaymentMethodEntity.setPaymentQrcode(paymentQrcode); memberPaymentMethodEntity.setPaymentType(paymentType); memberPaymentMethodEntity.setSubBank(subBank); memberPaymentMethodEntity.setIsDefualt(isDefualt); memberPaymentMethodDao.insert(memberPaymentMethodEntity); return Result.ok(MessageSourceUtils.getString("member_service_0024")); } @@ -656,4 +664,94 @@ return Result.ok("success"); } @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); } } src/main/java/com/xcong/excoin/modules/platform/dao/PlatformFeeSettingDao.java
New file @@ -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); } 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; src/main/java/com/xcong/excoin/modules/platform/entity/PlatformFeeSettingEntity.java
New file @@ -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; } 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> src/main/resources/mapper/platform/PlatformFeeSettingDao.xml
New file @@ -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>