diff --git a/pom.xml b/pom.xml index 3aece90..9444a17 100644 --- a/pom.xml +++ b/pom.xml @@ -87,6 +87,12 @@ org.springframework.boot spring-boot-starter-web + + dom4j + dom4j + 1.6.1 + + diff --git a/src/main/java/com/jmfy/controller/QuickRechargeController.java b/src/main/java/com/jmfy/controller/QuickRechargeController.java new file mode 100644 index 0000000..fb8ed09 --- /dev/null +++ b/src/main/java/com/jmfy/controller/QuickRechargeController.java @@ -0,0 +1,257 @@ +package com.jmfy.controller; + +import com.jmfy.dto.CPayOrder; +import com.jmfy.dto.CUserDao; +import com.jmfy.dto.CUserInfo; +import com.jmfy.thrift.idl.RPCRequestIFace; +import com.jmfy.thrift.idl.Result; +import com.jmfy.thrift.pool.ClientAdapterPo; +import com.jmfy.thrift.pool.ServiceKey; +import com.jmfy.util.JsonUtil; +import com.jmfy.util.MD5Util; +import org.springframework.web.bind.annotation.RestController; +import org.xml.sax.InputSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.RequestMapping; +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.dom4j.DocumentException; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.io.StringReader; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@RestController +public class QuickRechargeController { + @Resource + private CUserDao cuserDao; + private static final Logger LOGGER = LoggerFactory.getLogger(QuickRechargeController.class); + private static final String callbackkey = "95443521616386247430552526885495"; + private static final String md5key = "zr2i1hqfp54iijlvk8yjhopxrdq23nb3"; + + @RequestMapping(value = "/QUICKCallback") + public String QuickGnCallback(HttpServletRequest request) throws Exception { + return process(request,callbackkey); + } + + private String process(HttpServletRequest request,String appsecret) throws Exception{ + HashMap parameterMap = JsonUtil.getInstence().getParameterMap2(request); + if (parameterMap.isEmpty()) { + LOGGER.info("data is null"); + return "FAILED"; + } + String ntdata0 = parameterMap.get("nt_data"); + + String ntdata = decode(ntdata0,callbackkey); + Map map = getData(ntdata); + LOGGER.info("MapInfo: is_test:{},channel:{},channel_uid:{},game_order:{},order_no:{},pay_time:{}," + + "amount:{},atatus:{}",map.get("is_test"),map.get("channel"),map.get("channel_uid"), + map.get("game_order"),map.get("order_no"),map.get("pay_time")); + if (map.size() == 0) { + LOGGER.info("data is null"); + return "FAILED"; + } + + + String response = "SUCCESS"; + try { + String consumerid = map.get("channel_uid"); + String sign = parameterMap.get("sign"); + String md5Sign = parameterMap.get("md5Sign"); + if(!sign(ntdata0,sign,md5Sign)){ + LOGGER.info("callback==>roleUid={},sin derify fail ", consumerid); + return "FAILED"; + } + if(map.get("status").equals("1")){ + LOGGER.info("callback==>status:FAILED "); + return "FAILED"; + } + response = insertOrder(map); + + } catch (Exception e) { + e.printStackTrace(); + LOGGER.info("callback==>err " + e.toString()); + response = "FAILED"; + } + + return response; + } + + private String insertOrder(Map map) { + try { + // 角色id_物品id_cc值 + String callbackInfo = map.get("extras_params"); + String[] callback = callbackInfo.split("_"); + String uid,goodid,cc_id; + if (callback.length >= 3){ + uid = callback[0]; + goodid = callback[1]; + cc_id = callback[2]; + }else { + uid = callback[0]; + goodid = callback[1]; + cc_id = ""; + } + + String orderNo = map.get("order_no"); + String amount = map.get("amount"); + CUserInfo cUserInfo = cuserDao.findUserInfo(Integer.valueOf(uid)); + if (cUserInfo == null) { + LOGGER.info("该用户无此角色" + uid); + return "FAILED"; + } + + CPayOrder cPayOrder = cuserDao.getCpayOrderByOrderId(orderNo); + + if (cPayOrder != null) { + LOGGER.info("callback==>creditId={},uId={} orderId is exit!!!", cUserInfo.getId(), cUserInfo.getOpenId()); + return "FAILED"; + } else { + DateFormat dateTimeformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String date = dateTimeformat.format(new Date(System.currentTimeMillis())); + cPayOrder = new CPayOrder(); + cPayOrder.setOrderId(orderNo); + cPayOrder.setServerId(cUserInfo.getServerid()); + cPayOrder.setDelivery_time(date); + cPayOrder.setUserId(uid); + cPayOrder.setAmount(amount); + cPayOrder.setGoodsId(goodid); + cPayOrder.setCc_id(cc_id); + + Result result = null; + String userAddress = cuserDao.findUserAddress(cUserInfo.getId()); + if (userAddress != null) { + LOGGER.info("callback==>userAddress={} ", userAddress); + String[] split = userAddress.split(":"); + String ip = split[0]; + String port = split[1]; + LOGGER.info("RPC address --> IP : " + ip + "; PORT : " + port); + ClientAdapterPo rPCClient = null; + String serviceKey = JsonUtil.getServiceKey(ServiceKey.RPCCore, ip, port); + LOGGER.info("serviceKey : " + serviceKey); + try { + rPCClient = ClientAdapterPo.getClientAdapterPo(serviceKey); + result = rPCClient.getClient().deliveryRecharge(cUserInfo.getId(), goodid, uid, orderNo, 0, Integer.parseInt(amount)); + } catch (Exception e) { + LOGGER.info("callback=>", e); + } finally { + if (rPCClient != null) { + rPCClient.returnObject(serviceKey); + } else { + LOGGER.info("callback=> rPCClient is null "); + } + } + } else { + LOGGER.info("not get the user url,the openID={} ", uid); + return "FAILED"; + } + if (result != null && result.getResultCode() == 1) { + LOGGER.info(" callback==>RPC result : ResultCode : " + result.getResultCode() + "; ResultMsg : " + result.getResultMsg()); + cuserDao.addCpayOrder(cPayOrder); + } else { + System.out.println("测试代码"); + return "FAILED"; + } + } + + } catch (Exception e) { + e.printStackTrace(); + LOGGER.info("callback==>err " + e.toString()); + return "FAILED"; + } + return "SUCCESS"; + } + + public boolean sign(String ntdata0,String sign0,String md5Sign){ + String paramStr = ntdata0+sign0+md5key; + String sign = MD5Util.encrypByMd5(paramStr); + LOGGER.info("加密前字符串:{}",paramStr); + LOGGER.info("加密后得:{}",sign); + if(sign.equals(md5Sign)){ + return true; + }else{ + LOGGER.info("sign:{} md5Sign:{}",sign,md5Sign); + return false; + } + } + + public String encode(String src,String key) { + byte[] data = src.getBytes(); + byte[] keys = key.getBytes(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < data.length; i++) { + int n = (0xff & data[i]) + (0xff & keys[i % keys.length]); + sb.append("@" + n); + } + return sb.toString(); + } + + public String decode(String src,String key) { + if(src == null || src.length() == 0){ + return src; + } + Pattern pattern = Pattern.compile("@([^@]*)"); + Matcher m = pattern.matcher(src); + List list = new ArrayList(); + while (m.find()) { + try { + String group = m.group(1); + if(group.equals("")) + continue; + list.add(Integer.valueOf(group)); + } catch (Exception e) { + e.printStackTrace(); + return src; + } + } + if (list.size() > 0) { + byte[] data = new byte[list.size()]; + byte[] keys = key.getBytes(); + for (int i = 0; i < data.length; i++) { + data[i] = (byte) (list.get(i) - (0xff & keys[i % keys.length])); + } + return new String(data); + } else { + return src; + } + } + + + + public static Map getData(String xml){ + //1.创建Reader对象 + SAXReader reader = new SAXReader(); + StringReader sr = new StringReader(xml); + InputSource is = new InputSource(sr); + Map map = new HashMap<>(); + //2.加载xml + try { + Document document = reader.read(is); + //3.获取根节点 + Element rootElement = document.getRootElement(); + Iterator iterator = rootElement.elementIterator(); + while (iterator.hasNext()){ + Element stu = (Element) iterator.next(); + LOGGER.info("======遍历子节点======"); + Iterator iterator1 = stu.elementIterator(); + while (iterator1.hasNext()){ + Element stuChild = (Element) iterator1.next(); + map.put(stuChild.getName(),stuChild.getStringValue()); + LOGGER.info("节点名:"+stuChild.getName()+"---节点值:"+stuChild.getStringValue()); + } + } + }catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return map; + } +}