From f214809a43aa8c1d1c2a6b65942be623aefb720b Mon Sep 17 00:00:00 2001 From: zainali5120 <512061637@qq.com> Date: Thu, 08 Oct 2020 13:59:46 +0800 Subject: [PATCH] ROC提币 --- src/main/java/com/xcong/excoin/modules/member/service/RocService.java | 43 ++++ src/main/java/com/xcong/excoin/modules/member/service/TransferModel.java | 17 + src/main/resources/templates/febs/views/modules/member/withdrawCoin.html | 4 src/main/java/com/xcong/excoin/modules/member/controller/ViewController.java | 1 src/main/resources/templates/febs/views/modules/member/member.html | 6 src/main/java/com/xcong/excoin/modules/member/service/HttpUtil.java | 281 +++++++++++++++++++++++++++++++ src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java | 9 src/main/resources/application.yml | 2 src/main/resources/templates/febs/views/modules/member/memberInfoDetail.html | 126 +++++++------- 9 files changed, 416 insertions(+), 73 deletions(-) diff --git a/src/main/java/com/xcong/excoin/modules/member/controller/ViewController.java b/src/main/java/com/xcong/excoin/modules/member/controller/ViewController.java index b75878d..42e3164 100644 --- a/src/main/java/com/xcong/excoin/modules/member/controller/ViewController.java +++ b/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); diff --git a/src/main/java/com/xcong/excoin/modules/member/service/HttpUtil.java b/src/main/java/com/xcong/excoin/modules/member/service/HttpUtil.java new file mode 100644 index 0000000..6a7fc46 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/member/service/HttpUtil.java @@ -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(); + } +} + + diff --git a/src/main/java/com/xcong/excoin/modules/member/service/RocService.java b/src/main/java/com/xcong/excoin/modules/member/service/RocService.java new file mode 100644 index 0000000..b0e9686 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/member/service/RocService.java @@ -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(); + } + } + +} diff --git a/src/main/java/com/xcong/excoin/modules/member/service/TransferModel.java b/src/main/java/com/xcong/excoin/modules/member/service/TransferModel.java new file mode 100644 index 0000000..14d88b6 --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/member/service/TransferModel.java @@ -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; +} diff --git a/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java index 97b5e76..b9b4bf5 100644 --- a/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java @@ -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"); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 18e42bf..1b5add6 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -5,7 +5,7 @@ spring: profiles: - active: dev + active: prod thymeleaf: cache: false diff --git a/src/main/resources/templates/febs/views/modules/member/member.html b/src/main/resources/templates/febs/views/modules/member/member.html index c7f8eb8..705d83c 100644 --- a/src/main/resources/templates/febs/views/modules/member/member.html +++ b/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'} ]] diff --git a/src/main/resources/templates/febs/views/modules/member/memberInfoDetail.html b/src/main/resources/templates/febs/views/modules/member/memberInfoDetail.html index f4bd0c5..3449c3a 100644 --- a/src/main/resources/templates/febs/views/modules/member/memberInfoDetail.html +++ b/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> diff --git a/src/main/resources/templates/febs/views/modules/member/withdrawCoin.html b/src/main/resources/templates/febs/views/modules/member/withdrawCoin.html index 1f5adcf..795fd2f 100644 --- a/src/main/resources/templates/febs/views/modules/member/withdrawCoin.html +++ b/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'} ]] -- Gitblit v1.9.1