zainali5120
2020-10-08 f214809a43aa8c1d1c2a6b65942be623aefb720b
ROC提币
6 files modified
3 files added
489 ■■■■ changed files
src/main/java/com/xcong/excoin/modules/member/controller/ViewController.java 1 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/HttpUtil.java 281 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/RocService.java 43 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/TransferModel.java 17 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java 9 ●●●● patch | view | raw | blame | history
src/main/resources/application.yml 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/member/member.html 6 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/member/memberInfoDetail.html 126 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/member/withdrawCoin.html 4 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/controller/ViewController.java
@@ -171,7 +171,6 @@
     * 提币审核管理---个人详情
     */
    @GetMapping("memberInfoDetail/{id}")
    @RequiresPermissions("memberInfoDetail:update")
    public String memberInfoDetail(@PathVariable long id, Model model) {
        MemberInfoDetailVo data = memberService.selectMemberInfoDetailById(id);
        model.addAttribute("member", data);
src/main/java/com/xcong/excoin/modules/member/service/HttpUtil.java
New file
@@ -0,0 +1,281 @@
package com.xcong.excoin.modules.member.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/member/service/RocService.java
New file
@@ -0,0 +1,43 @@
package com.xcong.excoin.modules.member.service;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
/**
 *  ROC币种接入
 */
public class RocService {
    private final static String URL = "http://api.rocwallet.cc";
    private final static String CREATE_WALLET= "/init/createaccount";
    private final static String TRANSFER_METHOD= "/transfer/transferWithPrivateKey";
    private final static String TOTAL_ADDRESS  = "ROC0f23b4d74e63473497d342fe98fcd436";
    private final static String TOTAL_PRIVATE_KEY  = "5dd9f1caa18d46dfa3063e349eff32992b3043f510c645";
    private final static BigDecimal fee = new BigDecimal("0.006");
    public static String transfer(BigDecimal balance,String toAddress,String symbol){
        TransferModel transferModel = new TransferModel();
        transferModel.setAmount(balance);
        transferModel.setFromAddress(TOTAL_ADDRESS);
        transferModel.setPrivateKey(TOTAL_PRIVATE_KEY);
        transferModel.setToAddress(toAddress);
        transferModel.setSymbol(symbol);
        transferModel.setFee(fee);
        String post = HttpUtil.jsonPost(URL+TRANSFER_METHOD, JSONObject.toJSONString(transferModel));
        if(StringUtils.isBlank(post)){
            return null;
        }
        JSONObject jsonObject = JSONObject.parseObject(post);
        Object code = jsonObject.get("code");
        if("0".equals(code.toString())){
            return "success";
        }else{
            Object msg = jsonObject.get("msg");
            return msg.toString();
        }
    }
}
src/main/java/com/xcong/excoin/modules/member/service/TransferModel.java
New file
@@ -0,0 +1,17 @@
package com.xcong.excoin.modules.member.service;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class TransferModel {
    private String fromAddress;
    private String toAddress;
    private String password;
    private String privateKey;
    private String symbol;
    // 转账金额
    private BigDecimal amount;
    private BigDecimal fee;
}
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
@@ -30,6 +30,7 @@
import com.xcong.excoin.modules.member.mapper.MemberQuickBuySaleMapper;
import com.xcong.excoin.modules.member.mapper.MemberWalletCoinMapper;
import com.xcong.excoin.modules.member.service.IMemberService;
import com.xcong.excoin.modules.member.service.RocService;
import com.xcong.excoin.modules.member.vo.MemberAuthenticationVo;
import com.xcong.excoin.modules.member.vo.MemberCoinChargeVo;
import com.xcong.excoin.modules.member.vo.MemberCoinWithdrawVo;
@@ -458,6 +459,7 @@
        String symbol = selectById.getSymbol();
        String address = selectById.getAddress();
        int status = selectById.getStatus();
        BigDecimal amount = selectById.getAmount();
        if(status != 1) {
            return new FebsResponse().fail().message("只有等待审核的状态才能确认!");
        }
@@ -470,7 +472,7 @@
        BigDecimal frozen = walletCoin.getFrozenBalance().subtract(selectById.getAmount());
        walletCoin.setFrozenBalance(frozen);
        
        memberWalletCoinMapper.updateById(walletCoin);
        //memberWalletCoinMapper.updateById(walletCoin);
        
        if ("Y".equals(selectById.getIsInside())) {
            Map<String, Object> columnMap = new HashMap<>();
@@ -526,6 +528,11 @@
        if(StrUtil.isNotBlank(phone)) {
            Sms106Send.sendWithdrawalCoinMsg(phone, time);
        }
        if("ROC".equals(symbol)){
            // 如果是ROC  则自动转
            String transfer = RocService.transfer(amount, address, "ROC");
        }
        /**
        //短信提醒
         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
src/main/resources/application.yml
@@ -5,7 +5,7 @@
spring:
  profiles:
    active: dev
    active: prod
  thymeleaf:
    cache: false
src/main/resources/templates/febs/views/modules/member/member.html
@@ -176,13 +176,9 @@
                            if (d.certifyStatus === 1) {
                                return '<a lay-event="edit" shiro:hasPermission="user:update">审核认证</a>'
                                +'<i class="layui-icon febs-edit-area febs-blue">&#xe7a4;</i>'
                                +'<a lay-event="addCoin" shiro:hasPermission="user:update">拨币</a>'
                            }else if(d.certifyStatus === 2){
                            }else {
                                return '<a lay-event="see" shiro:hasPermission="user:update">'
                                +'<i class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>'
                                +'<a lay-event="addCoin" shiro:hasPermission="user:update">拨币</a>'
                            }else {
                                return '<a lay-event="addCoin" shiro:hasPermission="user:update">拨币</a>'
                            }
                        },minWidth: 200,align:'center'}
                ]]
src/main/resources/templates/febs/views/modules/member/memberInfoDetail.html
@@ -26,41 +26,41 @@
                       lay-verify="range|walletCoinNum" autocomplete="off" class="layui-input" readonly>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label febs-form-item-require">合约余额:</label>
            <div class="layui-input-block">
                <input type="text" name="totalContract" minlength="4" maxlength="10" data-th-id="${member.totalContract}"
                       lay-verify="range|totalContract" autocomplete="off" class="layui-input" readonly>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label febs-form-item-require">代理余额:</label>
            <div class="layui-input-block">
                <input type="text" name="agentNum" minlength="4" maxlength="10" data-th-id="${member.agentNum}"
                       lay-verify="range|agentNum" autocomplete="off" class="layui-input" readonly>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label febs-form-item-require">佣金:</label>
            <div class="layui-input-block">
                <input type="text" name="fee" minlength="4" maxlength="10" data-th-id="${member.fee}"
                       lay-verify="range|fee" autocomplete="off" class="layui-input" readonly>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label febs-form-item-require">充值:</label>
            <div class="layui-input-block">
                <input type="text" name="chargeUsdt" minlength="4" maxlength="10" data-th-id="${member.chargeUsdt}"
                       lay-verify="range|chargeUsdt" autocomplete="off" class="layui-input" readonly>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label febs-form-item-require">提现:</label>
            <div class="layui-input-block">
                <input type="text" name="appealUsdt" minlength="4" maxlength="10" data-th-id="${member.appealUsdt}"
                       lay-verify="range|appealUsdt" autocomplete="off" class="layui-input" readonly>
            </div>
        </div>
        <!--<div class="layui-form-item">-->
            <!--<label class="layui-form-label febs-form-item-require">合约余额:</label>-->
            <!--<div class="layui-input-block">-->
                <!--<input type="text" name="totalContract" minlength="4" maxlength="10" data-th-id="${member.totalContract}"-->
                       <!--lay-verify="range|totalContract" autocomplete="off" class="layui-input" readonly>-->
            <!--</div>-->
        <!--</div>-->
        <!--<div class="layui-form-item">-->
            <!--<label class="layui-form-label febs-form-item-require">代理余额:</label>-->
            <!--<div class="layui-input-block">-->
                <!--<input type="text" name="agentNum" minlength="4" maxlength="10" data-th-id="${member.agentNum}"-->
                       <!--lay-verify="range|agentNum" autocomplete="off" class="layui-input" readonly>-->
            <!--</div>-->
        <!--</div>-->
        <!--<div class="layui-form-item">-->
            <!--<label class="layui-form-label febs-form-item-require">佣金:</label>-->
            <!--<div class="layui-input-block">-->
                <!--<input type="text" name="fee" minlength="4" maxlength="10" data-th-id="${member.fee}"-->
                       <!--lay-verify="range|fee" autocomplete="off" class="layui-input" readonly>-->
            <!--</div>-->
        <!--</div>-->
        <!--<div class="layui-form-item">-->
            <!--<label class="layui-form-label febs-form-item-require">充值:</label>-->
            <!--<div class="layui-input-block">-->
                <!--<input type="text" name="chargeUsdt" minlength="4" maxlength="10" data-th-id="${member.chargeUsdt}"-->
                       <!--lay-verify="range|chargeUsdt" autocomplete="off" class="layui-input" readonly>-->
            <!--</div>-->
        <!--</div>-->
        <!--<div class="layui-form-item">-->
            <!--<label class="layui-form-label febs-form-item-require">提现:</label>-->
            <!--<div class="layui-input-block">-->
                <!--<input type="text" name="appealUsdt" minlength="4" maxlength="10" data-th-id="${member.appealUsdt}"-->
                       <!--lay-verify="range|appealUsdt" autocomplete="off" class="layui-input" readonly>-->
            <!--</div>-->
        <!--</div>-->
        <div class="layui-form-item">
            <label class="layui-form-label febs-form-item-require">充币:</label>
            <div class="layui-input-block">
@@ -75,34 +75,34 @@
                       lay-verify="range|appealCoin" autocomplete="off" class="layui-input" readonly>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label febs-form-item-require">总盈亏:</label>
            <div class="layui-input-block">
                <input type="text" name="platformProfitAndLoss" minlength="4" maxlength="10" data-th-id="${member.platformProfitAndLoss}"
                       lay-verify="range|platformProfitAndLoss" autocomplete="off" class="layui-input" readonly>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label febs-form-item-require">开仓手续费:</label>
            <div class="layui-input-block">
                <input type="text" name="closingPrice" minlength="4" maxlength="10" data-th-id="${member.closingPrice}"
                       lay-verify="range|closingPrice" autocomplete="off" class="layui-input" readonly>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label febs-form-item-require">平仓手续费:</label>
            <div class="layui-input-block">
                <input type="text" name="sellClosingPrice" minlength="4" maxlength="10" data-th-id="${member.sellClosingPrice}"
                       lay-verify="range|sellClosingPrice" autocomplete="off" class="layui-input" readonly>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label febs-form-item-require">持仓手续费:</label>
            <div class="layui-input-block">
                <input type="text" name="doingPrice" minlength="4" maxlength="10" data-th-id="${member.doingPrice}"
                       lay-verify="range|doingPrice" autocomplete="off" class="layui-input" readonly>
            </div>
        </div>
        <!--<div class="layui-form-item">-->
            <!--<label class="layui-form-label febs-form-item-require">总盈亏:</label>-->
            <!--<div class="layui-input-block">-->
                <!--<input type="text" name="platformProfitAndLoss" minlength="4" maxlength="10" data-th-id="${member.platformProfitAndLoss}"-->
                       <!--lay-verify="range|platformProfitAndLoss" autocomplete="off" class="layui-input" readonly>-->
            <!--</div>-->
        <!--</div>-->
        <!--<div class="layui-form-item">-->
            <!--<label class="layui-form-label febs-form-item-require">开仓手续费:</label>-->
            <!--<div class="layui-input-block">-->
                <!--<input type="text" name="closingPrice" minlength="4" maxlength="10" data-th-id="${member.closingPrice}"-->
                       <!--lay-verify="range|closingPrice" autocomplete="off" class="layui-input" readonly>-->
            <!--</div>-->
        <!--</div>-->
        <!--<div class="layui-form-item">-->
            <!--<label class="layui-form-label febs-form-item-require">平仓手续费:</label>-->
            <!--<div class="layui-input-block">-->
                <!--<input type="text" name="sellClosingPrice" minlength="4" maxlength="10" data-th-id="${member.sellClosingPrice}"-->
                       <!--lay-verify="range|sellClosingPrice" autocomplete="off" class="layui-input" readonly>-->
            <!--</div>-->
        <!--</div>-->
        <!--<div class="layui-form-item">-->
            <!--<label class="layui-form-label febs-form-item-require">持仓手续费:</label>-->
            <!--<div class="layui-input-block">-->
                <!--<input type="text" name="doingPrice" minlength="4" maxlength="10" data-th-id="${member.doingPrice}"-->
                       <!--lay-verify="range|doingPrice" autocomplete="off" class="layui-input" readonly>-->
            <!--</div>-->
        <!--</div>-->
    </form>
</div>
src/main/resources/templates/febs/views/modules/member/withdrawCoin.html
@@ -188,9 +188,9 @@
                                return '<a lay-event="confirm" shiro:hasPermission="user:delete">确认</a>'
                                +'<i class="layui-icon febs-edit-area febs-blue">&#xe7a4;</i>'
                                +'<a lay-event="cancel" shiro:hasPermission="user:delete">拒绝</a>'
                                +'<a lay-event="examine" shiro:hasPermission="user:delete">查看</a>'
                                +'<a lay-event="examine" >查看</a>'
                            }else {
                                return '<a lay-event="examine" shiro:hasPermission="user:delete">查看</a>'
                                return '<a lay-event="examine" >查看</a>'
                            }
                        },minWidth: 200,align:'center'}
                ]]