liuchaojie %!s(int64=4) %!d(string=hai) anos
pai
achega
fe90460456

+ 24 - 0
src/main/java/com/xc/controller/PayApiController.java

@@ -1,12 +1,15 @@
 package com.xc.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.google.common.base.Strings;
 import com.xc.common.CmcPayConfig;
 import com.xc.common.ServerResponse;
 
 import com.xc.service.IPayService;
 
+import java.io.BufferedReader;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.net.URLDecoder;
 
 import javax.servlet.http.HttpServletRequest;
@@ -44,6 +47,27 @@ public class PayApiController {
     @Autowired
     IUserRechargeService iUserRechargeService;
 
+
+    @RequestMapping({"gpayNotify365.do"})
+    @ResponseBody
+    public String gpayNotify365(HttpServletRequest request){
+        String param= null;
+        try {
+            BufferedReader streamReader = new BufferedReader( new InputStreamReader(request.getInputStream(), "UTF-8"));
+            StringBuilder responseStrBuilder = new StringBuilder();
+            String inputStr;
+            while ((inputStr = streamReader.readLine()) != null)
+                responseStrBuilder.append(inputStr);
+            JSONObject jsonObject = JSONObject.parseObject(responseStrBuilder.toString());
+            param= jsonObject.toJSONString();
+            log.info(param);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        String str = iUserRechargeService.doNotify365(param);
+        return str;
+    }
+
     @RequestMapping({"juhe1Notify.do"})
     @ResponseBody
     public void juhe1Notify(HttpServletRequest request, HttpServletResponse response) throws IOException {

+ 3 - 2
src/main/java/com/xc/controller/protol/UserRechargeController.java

@@ -41,10 +41,11 @@ public class UserRechargeController {
     //账户线下充币转账 创建充币订单
     @RequestMapping({"inMoney.do"})
     @ResponseBody
-    public ServerResponse inMoney(String amtRMB, String amt, String payType,String orderDesc, HttpServletRequest request) {
+    public ServerResponse inMoney(Integer id ,String amtRMB, String amt, String payType,HttpServletRequest request) {
         User user = this.iUserService.getCurrentRefreshUser(request);
         messageService.sendTopicMessage(String.format("%s充币了%s", user.getRealName(), amt));
-        return this.iUserRechargeService.inMoney(amtRMB, amt, payType,orderDesc , request);
+        return this.iUserRechargeService.inMoney(id ,amtRMB, amt, payType, request);
+
     }
 }
 

+ 14 - 12
src/main/java/com/xc/dao/UserRechargeMapper.java

@@ -8,28 +8,30 @@ import org.apache.ibatis.annotations.Param;
 
 public interface UserRechargeMapper {
   int deleteByPrimaryKey(Integer paramInteger);
-  
+
   int insert(UserRecharge paramUserRecharge);
-  
+
   int insertSelective(UserRecharge paramUserRecharge);
-  
+
   UserRecharge selectByPrimaryKey(Integer paramInteger);
-  
+
   int updateByPrimaryKeySelective(UserRecharge paramUserRecharge);
-  
+
   int updateByPrimaryKey(UserRecharge paramUserRecharge);
-  
+
   int checkInMoney(@Param("status") int paramInt, @Param("userId") Integer paramInteger);
-  
+
   UserRecharge findUserRechargeByOrderSn(String paramString);
-  
+
   List findUserChargeList(@Param("uid") Integer paramInteger, @Param("payChannel") String paramString1, @Param("orderStatus") String paramString2);
-  
+
   List listByAdmin(@Param("agentId") Integer paramInteger1, @Param("userId") Integer paramInteger2, @Param("realName") String paramString, @Param("state") Integer paramInteger3, @Param("begin_time") Date paramDate1, @Param("end_time") Date paramDate2);
-  
+
   int deleteByUserId(@Param("userId") Integer paramInteger);
-  
+
   List listByAgent(@Param("searchId") Integer paramInteger1, @Param("realName") String paramString1, @Param("payChannel") String paramString2, @Param("state") Integer paramInteger2);
-  
+
   BigDecimal CountChargeSumAmt(Integer paramInteger);
+
+  UserRecharge selectByOrderSn(@Param("orderSn")String orderSn);
 }

+ 3 - 1
src/main/java/com/xc/service/IUserRechargeService.java

@@ -11,7 +11,7 @@ import javax.servlet.http.HttpServletRequest;
 public interface IUserRechargeService {
   ServerResponse checkInMoney(int paramInt, Integer paramInteger);
 
-  ServerResponse inMoney(String amtRMB, String paramString1, String paramString2, String orderDesc ,HttpServletRequest paramHttpServletRequest);
+  ServerResponse inMoney(Integer id , String amtRMB, String paramString1, String paramString2,HttpServletRequest paramHttpServletRequest);
 
   ServerResponse findUserRechargeByOrderSn(String paramString);
 
@@ -36,4 +36,6 @@ public interface IUserRechargeService {
   int deleteByUserId(Integer paramInteger);
 
   BigDecimal CountChargeSumAmt(Integer paramInteger);
+
+  String doNotify365(String data);
 }

+ 129 - 15
src/main/java/com/xc/service/impl/UserRechargeServiceImpl.java

@@ -1,34 +1,31 @@
 package com.xc.service.impl;
 
 
-import com.xc.dao.UserRechargeMapper;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.xc.dao.*;
+import com.xc.pojo.*;
 import com.xc.pub.redismessage.service.MessageService;
 import com.xc.service.*;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.xc.common.ServerResponse;
-import com.xc.dao.AgentUserMapper;
-import com.xc.dao.UserCashDetailMapper;
-import com.xc.dao.UserMapper;
-import com.xc.pojo.AgentUser;
-import com.xc.pojo.SiteInfo;
-import com.xc.pojo.SiteSetting;
-import com.xc.pojo.User;
-import com.xc.pojo.UserCashDetail;
-import com.xc.pojo.UserRecharge;
 import com.xc.service.*;
 import com.xc.utils.DateTimeUtil;
 import com.xc.utils.KeyUtils;
 import com.xc.utils.email.SendHTMLMail;
+import com.xc.utils.pay.GpayUtil;
 import com.xc.utils.redis.RedisShardedPoolUtils;
 
 import java.math.BigDecimal;
 import java.sql.Timestamp;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import javax.servlet.http.HttpServletRequest;
 
-import com.xc.vo.stockfutures.CoinAdminListVO;
+import com.xc.vo.pay.GPayVO;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -65,6 +62,12 @@ public class UserRechargeServiceImpl implements IUserRechargeService {
     @Autowired
     private MessageService messageService;
 
+    @Autowired
+    SitePayMapper sitePayMapper;
+
+    @Autowired
+    SiteTaskLogMapper siteTaskLogMapper;
+
     public ServerResponse checkInMoney(int maxOrder, Integer userId) {
         int count = this.userRechargeMapper.checkInMoney(0, userId);
 
@@ -75,7 +78,7 @@ public class UserRechargeServiceImpl implements IUserRechargeService {
     }
 
 
-    public ServerResponse inMoney(String amtRMB, String amt, String payType,String orderDesc, HttpServletRequest request) {
+    public ServerResponse inMoney( Integer id ,String amtRMB, String amt, String payType, HttpServletRequest request) {
         if (StringUtils.isBlank(amtRMB) || StringUtils.isBlank(amt) || StringUtils.isBlank(payType)) {
             return ServerResponse.createByErrorMsg("参数不能为空");
         }
@@ -105,6 +108,8 @@ public class UserRechargeServiceImpl implements IUserRechargeService {
         if (!serverResponse.isSuccess()) {
             return serverResponse;
         }
+        //查询支付通道
+        SitePay sitePay = sitePayMapper.selectByPrimaryKey(id);
         UserRecharge userRecharge = new UserRecharge();
         userRecharge.setUserId(user.getId());
         userRecharge.setNickName(user.getRealName());
@@ -113,13 +118,13 @@ public class UserRechargeServiceImpl implements IUserRechargeService {
         userRecharge.setPhone(user.getPhone());
         String ordersn = KeyUtils.getRechargeOrderSn();
         userRecharge.setOrderSn(ordersn);
+        userRecharge.setPaySn(id.toString());
         userRecharge.setPayChannel(payType);
         userRecharge.setPayAmtRMB(new BigDecimal(amtRMB));
         userRecharge.setPayAmt(new BigDecimal(amt));
         userRecharge.setOrderStatus(0);
         userRecharge.setAddTime(new Date());
-        //商家名称
-        userRecharge.setOrderDesc(orderDesc);
+        userRecharge.setOrderDesc(sitePay.getChannelType());
 //        BigDecimal payAmt = new BigDecimal(amt);
         // 账户充币
         //汇率
@@ -130,6 +135,33 @@ public class UserRechargeServiceImpl implements IUserRechargeService {
 //            userRecharge.setPayAmt(new BigDecimal(amt));
 //        }
         int insertCount = this.userRechargeMapper.insert(userRecharge);
+        JSONObject jb;
+        if("公户".equals(sitePay.getChannelName())){
+            jb = GpayUtil.gPay(amtRMB , ordersn , user.getRealName());
+        }else if("365支付".equals(sitePay.getChannelName())){
+            jb = GpayUtil.gPay365(amtRMB , ordersn , user.getRealName(),user.getId()+"");
+        }else {
+            jb = GpayUtil.gPay2(amtRMB , ordersn , user.getRealName());
+        }
+        String msg = jb.getString("msg");
+        String payUrl = null;
+        if("365支付".equals(sitePay.getChannelName())){
+            if("200".equals(jb.get("code")+"")){
+                payUrl =  jb.get("data")+"";
+            }else{
+                return ServerResponse.createByErrorMsg("创建支付订单失败");
+            }
+        }else {
+            if("success".equals(msg)){
+                JSONObject data = (JSONObject) jb.get("data");
+                JSONObject jbb = JSON.parseObject(data.getString("result"));
+                payUrl = jbb.getString("url");
+            }else{
+                return ServerResponse.createByErrorMsg("创建支付订单失败");
+            }
+        }
+        GPayVO gPayVO = new GPayVO();
+        gPayVO.setUrl(payUrl);
         if (insertCount > 0) {
             String email_token = KeyUtils.getUniqueKey();
             String redisSetExResult = RedisShardedPoolUtils.setEx(email_token, email_token, 300);
@@ -138,7 +170,7 @@ public class UserRechargeServiceImpl implements IUserRechargeService {
 //                    .getSiteHost(), siteInfo.getSiteEmailTo());
 //            log.info("用户充币,发送审核邮件成功");
             messageService.sendTopicMessage(String.format("%s充币了%s", user.getRealName(), amt));
-            return ServerResponse.createBySuccessMsg("创建支付订单成功!");
+            return ServerResponse.createBySuccess(gPayVO);
         }
         return ServerResponse.createByErrorMsg("创建支付订单失败");
     }
@@ -295,6 +327,88 @@ public class UserRechargeServiceImpl implements IUserRechargeService {
         return ServerResponse.createBySuccess(pageInfo);
     }
 
+
+    public String doNotify365(String data){
+        Map<String, Object> mapc = new HashMap();
+        String code = "0";
+        String message = "";
+        String data11 = "";
+        JSONObject json = JSONObject.parseObject(data);
+        Map<String, Object> map = (Map<String, Object>) json;
+        // 验证签名
+        String sign = GpayUtil.notify365(data);
+        if (!map.get("sign").toString().equals(sign)) {
+            message =  "签名不一致";
+        }else {
+            code = "200" ;
+        }
+        String amount = map.get("amount").toString();
+        String orderSn = map.get("orderno").toString();
+        String tradeid = map.get("seller_name").toString();
+        String usdt = map.get("qty").toString();
+        try {
+            payNotify(amount , orderSn ,tradeid ,usdt);
+        }catch (Exception e){
+            code =  "0";
+        }
+        mapc.put("code",code);
+        mapc.put("message",message);
+        mapc.put("data",data);
+        JSONObject jsonc = new JSONObject(mapc);
+        return jsonc.toString();
+    }
+
+    public ServerResponse payNotify(String amount, String orderSn ,String tradeid ,String usdt) throws Exception {
+        UserRecharge userRecharge = this.userRechargeMapper.selectByOrderSn(orderSn);
+        if (userRecharge == null) {
+            return ServerResponse.createByErrorMsg("充值订单不存在");
+        }
+        if (userRecharge.getOrderStatus() != 0) {
+            return ServerResponse.createByErrorMsg("订单状态不是下单状态不能更改");
+        }
+        User user = this.userMapper.selectByPrimaryKey(userRecharge.getUserId());
+        if (user == null) {
+            return ServerResponse.createByErrorMsg("用户不存在");
+        }
+        //总资金 = 原总资金 + 充值金额
+        BigDecimal user_amt =user.getUserAmt()== null ? BigDecimal.ZERO : user.getUserAmt();
+        user_amt = user_amt.add(new BigDecimal(usdt));
+        log.info("支付回调确认订单成功,增加用户 {} 总资金,原金额 = {} , 增加后 = {},实际充值人民币={}", user.getId(), usdt, user_amt ,amount);
+        user.setUserAmt(user_amt);
+        //可用资金 = 原可用资金 + (充值金额*杠杆)
+        BigDecimal user_enable_amt = user.getEnableAmt()== null ? BigDecimal.ZERO :user.getEnableAmt();
+        user_enable_amt =  user_enable_amt.add(new BigDecimal(usdt));
+        log.info("支付回调确认订单成功,增加用户 {} 可用资金,原金额 = {} , 增加后 = {}", user.getId(), usdt, user_enable_amt);
+        user.setEnableAmt(user_enable_amt);
+        int update = this.userMapper.updateByPrimaryKeySelective(user);
+        if (update > 0) {
+            log.info("修改用户资金成功!");
+        } else {
+            log.error("修改用户资金出错,抛出异常");
+            throw new Exception("修改用户资金出错,抛出异常");
+        }
+        userRecharge.setPayAmt(new BigDecimal(usdt));
+        userRecharge.setPayAmtRMB(new BigDecimal(amount));
+        userRecharge.setOrderStatus(1);
+        userRecharge.setPayTime(new Date());
+        userRecharge.setOrderDesc(tradeid);
+        int updateCount = this.userRechargeMapper.updateByPrimaryKeySelective(userRecharge);
+        if (updateCount > 0) {
+            SiteTaskLog siteTaskLog = new SiteTaskLog();
+            siteTaskLog.setTaskType("修改充值记录");
+            String target = "GPAY回调:修改充值记录" + userRecharge.getId() +"充值金额" + amount + "用户" + userRecharge.getUserId();
+            siteTaskLog.setTaskTarget(target);
+            siteTaskLog.setIsSuccess(0);
+            siteTaskLog.setAddTime(new Date());
+            this.siteTaskLogMapper.insert(siteTaskLog);
+            return ServerResponse.createBySuccessMsg("修改订单状态成功!");
+        }
+        return ServerResponse.createByErrorMsg("修改订单状态失败!");
+    }
+
+
+
+
     @Transactional
     public ServerResponse updateState(Integer chargeId, Integer state) throws Exception {
         UserRecharge userRecharge = this.userRechargeMapper.selectByPrimaryKey(chargeId);

+ 269 - 0
src/main/java/com/xc/utils/pay/GpayUtil.java

@@ -0,0 +1,269 @@
+package com.xc.utils.pay;
+
+import com.alibaba.fastjson.JSONObject;
+import com.xc.utils.PropertiesUtil;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class GpayUtil {
+
+	//公户
+	final static String UID = PropertiesUtil.getProperty("gpay.uid");
+	final static String MCHID = PropertiesUtil.getProperty("gpay.mchid");
+	final static String SECRET = PropertiesUtil.getProperty("gpay.secret");
+	final static String ORDER_URL= PropertiesUtil.getProperty("gpay.url") + "/payapi/v3/orders";
+	final static String NOTIFY_URL= PropertiesUtil.getProperty("gpay.notify.url");
+	//私户
+	final static String UID2 = PropertiesUtil.getProperty("gpay.uid2");
+	final static String MCHID2 = PropertiesUtil.getProperty("gpay.mchid2");
+	final static String SECRET2 = PropertiesUtil.getProperty("gpay.secret2");
+
+
+	final static String shopid365 = PropertiesUtil.getProperty("gpay.shopid");
+	final static String key365 = PropertiesUtil.getProperty("gpay.key");
+	final static String return_url365 = PropertiesUtil.getProperty("gpay.return_url");
+	final static String callback_url365 = PropertiesUtil.getProperty("gpay.callback_url");
+	final static String url365 = PropertiesUtil.getProperty("gpay.url365");
+
+
+//	public static void main(String[] args) {
+//		Map<String, Object> map = new HashMap<String, Object>();
+//		map.put("uid", UID);
+//		map.put("mchid", MCHID);
+//		map.put("mch_orderid", "test123456");
+//		map.put("amount", "10.00");
+//		map.put("channel", "300"); // 100 支付寶 200 微信 300 銀行卡; 開通請聯繫運營
+//		map.put("notify_url", "http://0.0.0.0:8081/test/notify"); // 回調地址
+//		map.put("return_url", "http://0.0.0.0:8081/test/return"); // 支付成功後跳轉地址
+//		map.put("product_name", "商品1");
+//		map.put("member_name", "會員1");
+//		map.put("extra", "透傳");
+//		map.put("timestamp", "2020-12-17 13:18:36");
+//		// 签名
+//		String sign = sign(map, SECRET);
+//		JSONObject json = new JSONObject(map);
+//		json.put("sign", sign);
+//		// 下单
+//		JSONObject response = doPost(ORDER_URL, json);
+//		System.out.println("ORDER_URL: "+ORDER_URL);
+//		System.out.println("response: "+response);
+//		// 回调
+//		String data = "{'tradeid':'5fc49d05e5bf59cbad7f92ec', 'uid':'5fc4843fe5bf59cbad7f8ff2', 'mchid':'5fc4843fe5bf59cbad7f8ff3', 'mch_orderid':'123','channel':'300', 'currency':'CNY', 'amount':'10.00', 'timestamp':'2020-11-30 15:20:41', 'extra':'透傳', 'status':'success', 'sign':'3a2ac4dfc1456c2301b2227d6b303045'}";
+//		notify(data);
+//	}
+
+	public static void main(String[] args) {
+//		JSONObject jb = gPay("19.00" , "778899" , "55555");
+//		System.out.println(jb.getString("msg"));
+//		JSONObject data = (JSONObject) jb.get("data");
+//		JSONObject jbb = JSON.parseObject(data.getString("result"));
+//		System.out.println(jbb.getString("url"));
+
+//		JSONArray result = data.getJSONArray("result");
+//		String url = (String)jb.get("result");
+//		System.out.println(result);
+//		String data = "{'tradeid':'5fdb22d04ff77f70fef29523', 'uid':'5fc5ae01ae8c2dea7a6eea55', 'mchid':'5fc5ae01ae8c2dea7a6eea56', 'mch_orderid':'778899','channel':'300',  'amount':'19.00', 'timestamp':'2020-12-17 17:20:17', 'extra':'extra', 'status':'success', 'sign':'2c87ce12af764362115f442b0a596cc2'}";
+//		JSONObject json = JSONObject.parseObject(data);
+//		Map<String, Object> map = (Map<String, Object>) json;
+//		String sign = sign(map, SECRET);
+//
+		//回调
+//		if (!map.get("sign").toString().equals(sign)) {
+//			System.out.println("签名不一致:"+map.get("sign").toString());
+//		}
+
+//		notify365("{\"order_status\":4,\"amount\":\"110.00\",\"orderno\":\"21123\",\"seller_name\":\"200\",\"price\":\"6.56\",\"qty\":\"16.768292\",\"sign\":\"D55BF386C8E1DC24151B014E915DCB70\",\"buyer_name\":\"无\"}");
+
+//		gPay365("130.00","202012241515","测试12241514","1211");
+	}
+
+	public static JSONObject gPay(String amount , String ordersn , String phone){
+		Map<String, Object> map = new HashMap();
+		map.put("uid", UID);
+		map.put("mchid", MCHID);
+		map.put("mch_orderid", ordersn);
+		map.put("amount", amount);
+		map.put("channel", "300");
+		map.put("notify_url", NOTIFY_URL);
+		map.put("member_name", phone);
+		map.put("extra", "extra");
+		map.put("timestamp", generateTime());
+		// 签名
+		String sign = sign(map, SECRET);
+		JSONObject json = new JSONObject(map);
+		json.put("sign", sign);
+//		System.out.println("uid:" + UID);
+//		System.out.println("mchid:" + MCHID);
+//		System.out.println("notify_url:" + NOTIFY_URL);
+//		System.out.println("SECRET:" + SECRET);
+		// 下单
+		JSONObject response = doPost(ORDER_URL, json);
+		return response;
+	}
+
+	public static JSONObject gPay2(String amount , String ordersn , String phone){
+		Map<String, Object> map = new HashMap();
+		map.put("uid", UID2);
+		map.put("mchid", MCHID2);
+		map.put("mch_orderid", ordersn);
+		map.put("amount", amount);
+		map.put("channel", "300");
+		map.put("notify_url", NOTIFY_URL);
+		map.put("member_name", phone);
+		map.put("extra", "extra");
+		map.put("timestamp", generateTime());
+		// 签名
+		String sign = sign(map, SECRET2);
+		JSONObject json = new JSONObject(map);
+		json.put("sign", sign);
+		// 下单
+		JSONObject response = doPost(ORDER_URL, json);
+//		System.out.println(response.toString());
+		return response;
+	}
+
+	// sign
+	public static String sign(Map<String, Object> map, String signKey) {
+		if (map == null) {
+			return null;
+		}
+		List<String> keyList = new ArrayList<>(map.keySet());
+		Collections.sort(keyList);
+		StringBuffer sb = new StringBuffer();
+		for (int i = 0; i < keyList.size(); i++) {
+			String key = keyList.get(i);
+			Object value = map.get(key);
+			if (key.equals("sign") || value.equals("")) {
+				continue;
+			}
+			sb.append(key + "=" + value + "&");
+		}
+		String signStr = sb.substring(0, sb.length() - 1) + signKey;
+//		System.out.println("before sign: " + signStr);
+		String md5Str = DigestUtils.md5Hex(signStr);
+//		System.out.println("after sign: " + md5Str);
+		return md5Str;
+	}
+
+	// http request
+	public static JSONObject doPost(String url, JSONObject jsonObject) {
+		HttpClient client = HttpClientBuilder.create().build();
+		HttpPost post = new HttpPost(url);
+		JSONObject response = null;
+		try {
+			StringEntity s = new StringEntity(jsonObject.toString(), "utf-8");
+			s.setContentType("application/json;utf-8");
+			post.setEntity(s);
+			HttpResponse res = client.execute(post);
+			HttpEntity entity = res.getEntity();
+			String result = EntityUtils.toString(entity);
+			response = JSONObject.parseObject(result);
+			if (res.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
+				throw new Error(response.toJSONString());
+			}
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+		return response;
+	}
+
+
+	// 回调通知
+	public String notify(String data) {
+		System.out.println(data);
+		JSONObject json = JSONObject.parseObject(data);
+		Map<String, Object> map = (Map<String, Object>) json;
+		System.out.println(json.toString());
+		System.out.println(map.toString());
+		// 验证签名
+		String sign = sign(map, SECRET);
+		if (!map.get("sign").toString().equals(sign)) {
+			System.out.println("签名不一致:"+map.get("sign").toString());
+			return "签名不一致";
+		}
+		String amount = map.get("amount").toString();
+		String orderSn = map.get("mch_orderid").toString();
+		String tradeid = map.get("tradeid").toString();
+		System.out.println(amount +"@" + orderSn +"@"+ tradeid);
+		try {
+		}catch (Exception e){
+			return "fail";
+		}
+		// TODO: timestamp, 如回调超时N小时后,是否处理依据具体业务
+		return "success";
+	}
+
+	public static String generateTime() {
+		return (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
+	}
+
+
+
+
+	/*--------- pay365 相关接口Start------------ */
+
+	// 回调通知  验证签名
+	public static String notify365(String data) {
+		JSONObject json = JSONObject.parseObject(data);
+		Map<String, Object> map = (Map<String, Object>) json;
+		// 验证签名
+		return getPay365Sign(map, key365);
+	}
+
+
+	public static JSONObject gPay365(String amount,String ordersn , String phone,String userid){
+		Map<String, Object> map = new HashMap();
+		map.put("amount", amount); // 金额
+		map.put("kyc_name", phone); // 姓名 -
+		map.put("orderno", ordersn); // 订单号 mch_orderid
+		map.put("shopid", shopid365);  // 商户id
+		map.put("exid", userid);  //买家id
+		map.put("return_url", return_url365); //订单完成后跳转地址
+		map.put("callback_url",callback_url365);  //异步回调地址
+		// 签名
+		String sign = getPay365Sign(map, key365);
+		map.put("sign", sign);
+		JSONObject json = new JSONObject(map);
+		JSONObject response  = doPost(url365, json);
+		return response;
+	}
+
+
+	public static String getPay365Sign(Map<String ,Object> $params , String key){
+		String $signData = ksort($params);
+		$signData = $signData+"&key="+key;
+		$signData = DigestUtils.md5Hex($signData);
+		$signData = $signData.toUpperCase();
+		return  $signData ;
+	}
+
+	public static String ksort(Map<String, Object> map)  {
+		List<String> keyList = new ArrayList<>(map.keySet());
+		Collections.sort(keyList);
+		StringBuffer sb = new StringBuffer();
+		for (int i = 0; i < keyList.size(); i++) {
+			String key = keyList.get(i);
+			Object value = map.get(key);
+			if (key.equals("sign")) {
+				continue;
+			}
+			sb.append(key + "=" + value + "&");
+		}
+		return  sb.toString().substring(0, sb.toString().length() - 1) ;
+
+	}
+
+
+
+	/*--------- pay365 相关接口end ------------ */
+}

+ 9 - 0
src/main/java/com/xc/vo/pay/GPayVO.java

@@ -0,0 +1,9 @@
+package com.xc.vo.pay;
+
+import lombok.Data;
+
+@Data
+public class GPayVO {
+
+    private String url;
+}

+ 10 - 0
src/main/java/mappers/UserRechargeMapper.xml

@@ -30,6 +30,16 @@
     from user_recharge
     where id = #{id,jdbcType=INTEGER}
   </select>
+
+
+  <select id="selectByOrderSn" resultMap="BaseResultMap">
+    select
+    <include refid="Base_Column_List" />
+    from user_recharge
+    where order_sn = #{orderSn,jdbcType=VARCHAR}
+  </select>
+
+
   <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
     delete from user_recharge
     where id = #{id,jdbcType=INTEGER}

+ 2 - 2
src/main/resources/datasource.properties

@@ -5,8 +5,8 @@ db.driverClassName=com.mysql.jdbc.Driver
 #db.url=jdbc:mysql://127.0.0.1:3306/zhishu?characterEncoding=utf-8
 #db.username=zhishu
 #db.password=stock2chen
-#db.url=jdbc:mysql://127.0.0.1:3306/stock2coin?characterEncoding=utf-8
-db.url=jdbc:mysql://101.32.39.134:3306/stock2coin?characterEncoding=utf-8
+db.url=jdbc:mysql://127.0.0.1:3306/stock2coin?characterEncoding=utf-8
+#db.url=jdbc:mysql://101.32.39.134:3306/stock2coin?characterEncoding=utf-8
 db.username=root
 db.password=S5Y2M8MtsRx5RcJG
 

+ 16 - 2
src/main/resources/stock2guo.properties

@@ -153,12 +153,26 @@ jisuapi.appkey=eebe6cf3838a5395
 jisuapi.news.url=https://api.jisuapi.com/news/get
 jisuapi.news.channel=股票
 
+
+#365pay
+#商户id
+gpay.shopid=618
+#key
+gpay.key=002772406c000396fd4704af816b075f
+#订单完成后跳转地址
+gpay.return_url=http://btdct.com/homes
+#异步回调地址
+gpay.callback_url=http://btdct.com/api/pay/gpayNotify365.do
+#url
+gpay.url365=https://api.pay-365.xyz/api/Ct/createOrder
+
+
 #websocket 订阅地址 (数据解析服务器)
-ws.url=ws://127.0.0.1:8080/websocket/zxdata987654
+#ws.url=ws://101.32.215.72:8080/websocket/zxdata987654
 #测试
 #ws.url=ws://101.32.215.72:8080/data_server_java/websocket/zxdata987654
 #正式
-#ws.url=ws://101.32.215.72:8080/data_server_java/websocket/zxdata987654+
+ws.url=ws://101.32.215.72:8080/data_server_java/websocket/zxdata987654+
 
 httpdata.url=http://101.32.215.72:8080/data_server_java/