zainali5120
2020-10-09 75edb3440e55f276d453aa393f12a30c239e3e82
cpv提币修复
5 files modified
2 files added
516 ■■■■■ changed files
pom.xml 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/Sms106Send.java 6 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java 3 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/BigDecimalUtil.java 190 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/EthService.java 290 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/IMemberService.java 3 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java 19 ●●●●● patch | view | raw | blame | history
pom.xml
@@ -248,6 +248,11 @@
            <artifactId>httpmime</artifactId>
            <version>4.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.web3j</groupId>
            <artifactId>core</artifactId>
            <version>4.5.5</version>
        </dependency>
        <!-- submail邮件 end -->
    </dependencies>
src/main/java/com/xcong/excoin/modules/Sms106Send.java
@@ -16,8 +16,8 @@
public class Sms106Send {
    private static final String URL = "http://www.qf106.com/sms.aspx";
    private static final String ID = "16580";
    private static final String ACCOUNT = "Biue";
    private static final String ID = "16612";
    private static final String ACCOUNT = "beike";
    private static final String PASSWORD = "123456";
@@ -75,6 +75,6 @@
    }
    public static void main(String[] args) {
        System.out.println(sendVerifyCode("15773002834", "123456", 2));
        System.out.println(sendVerifyCode("17673118578", "123456", 2));
    }
}
src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java
@@ -22,6 +22,7 @@
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
@@ -217,7 +218,7 @@
     */
    @GetMapping("memberWithdrawCoinConfirm/{id}")
    @ControllerEndpoint(operation = "提币记录---确认", exceptionMessage = "划转失败")
    public FebsResponse memberWithdrawCoinConfirm(@NotNull(message = "{required}") @PathVariable Long id) {
    public FebsResponse memberWithdrawCoinConfirm(@NotNull(message = "{required}") @PathVariable Long id) throws ExecutionException, InterruptedException {
        return memberService.memberWithdrawCoinConfirm(id);
    }
    
src/main/java/com/xcong/excoin/modules/member/service/BigDecimalUtil.java
New file
@@ -0,0 +1,190 @@
package com.xcong.excoin.modules.member.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/member/service/EthService.java
New file
@@ -0,0 +1,290 @@
package com.xcong.excoin.modules.member.service;
import org.apache.commons.lang3.StringUtils;
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.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.Convert.Unit;
import org.web3j.utils.Numeric;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import java.util.concurrent.ExecutionException;
/**
 * 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";
    public static final String TOTAL_ADDRESS = "0x8115A796327311e627050d0129C17176A79Dc050";
    public static final String TOTAL_PRIVATE_KEY = "bba4029d67e26ec6b537db986c8500b5bc1c21b53755dd7a3d41d9a4ce84c05e";
    // 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, ExecutionException, InterruptedException {
        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);
        EthService ethService = new EthService();
        String s = ethService.tokenSend("0x0cf5f120ea654f6806038daa6b021e83a9ab07c8", "1.0", null);
        System.out.println(s);
    }
    /**
     *
     * 方法描述:获取代币余额
     *
     * @param fromAddress
     * @param
     * @param
     * @return long
     */
    public BigDecimal tokenGetBalance(String fromAddress) {
        try {
            if(StringUtils.isBlank(fromAddress)){
                fromAddress =  TOTAL_ADDRESS;
            }
            // 合约地址
            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 toAddress, String amount,String gas)
            throws InterruptedException, ExecutionException {
        // Web3j web3j = Web3j.build(new
        // HttpService("https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321"));
        String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";
        Credentials credentials = Credentials.create(TOTAL_PRIVATE_KEY);
        EthGetTransactionCount ethGetTransactionCount = web3j
                .ethGetTransactionCount(TOTAL_ADDRESS, 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);
        if(StringUtils.isBlank(gas)){
            gas = "70";
        }
        RawTransaction rawTransaction = RawTransaction.createTransaction(nonce,
                Convert.toWei(gas, Unit.GWEI).toBigInteger(),// 给矿工开的转账单价 单价越高越快
                Convert.toWei("60000", 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, Unit.ETHER).toBigInteger();
        RawTransaction rawTransaction = RawTransaction.createEtherTransaction(nonce,
                Convert.toWei("50", Unit.GWEI).toBigInteger(),
                Convert.toWei("60000", 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/member/service/IMemberService.java
@@ -1,6 +1,7 @@
package com.xcong.excoin.modules.member.service;
import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
@@ -46,7 +47,7 @@
    IPage<MemberCoinWithdrawVo> findmemberWithdrawCoinListInPage(MemberCoinWithdrawEntity memberCoinWithdrawEntity, QueryRequest request);
    FebsResponse memberWithdrawCoinConfirm(@NotNull(message = "{required}") Long id);
    FebsResponse memberWithdrawCoinConfirm(@NotNull(message = "{required}") Long id) throws ExecutionException, InterruptedException;
    FebsResponse memberWithdrawCoinCancel(@NotNull(message = "{required}") Long id);
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
@@ -29,6 +29,7 @@
import com.xcong.excoin.modules.member.mapper.MemberMapper;
import com.xcong.excoin.modules.member.mapper.MemberQuickBuySaleMapper;
import com.xcong.excoin.modules.member.mapper.MemberWalletCoinMapper;
import com.xcong.excoin.modules.member.service.EthService;
import com.xcong.excoin.modules.member.service.IMemberService;
import com.xcong.excoin.modules.member.service.RocService;
import com.xcong.excoin.modules.member.vo.MemberAuthenticationVo;
@@ -49,6 +50,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
@@ -452,7 +454,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public FebsResponse memberWithdrawCoinConfirm(@NotNull(message = "{required}") Long id) {
    public FebsResponse memberWithdrawCoinConfirm(@NotNull(message = "{required}") Long id) throws ExecutionException, InterruptedException {
        
        MemberCoinWithdrawEntity selectById = memberCoinWithdrawMapper.selectById(id);
        Long memberId = selectById.getMemberId();
@@ -531,6 +533,21 @@
        if("CPV".equals(symbol)){
            // 如果是ROC  则自动转
            String transfer = RocService.transfer(amount, address, "CPV");
        }else if("USDT".equals(symbol) && !"Y".equals(selectById.getIsInside())){
            EthService ethService = new EthService();
            // 查询余额是否足够
            BigDecimal bigDecimal = ethService.tokenGetBalance(EthService.TOTAL_ADDRESS);
            if(bigDecimal==null ||bigDecimal.compareTo(amount)<0 ){
                FebsResponse fail = new FebsResponse().fail();
                fail.message("总钱包余额不足");
                return fail;
            }
            amount = amount.multiply(new BigDecimal("1000000"));
            String usdtStr = amount.toPlainString();
            if (usdtStr.contains(".")) {
                usdtStr = usdtStr.substring(0, usdtStr.lastIndexOf("."));
            }
            String s = ethService.tokenSend(address, usdtStr, null);
        }
        /**