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"></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"></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"></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'} ]]