diff --git a/src/main/java/com/jmfy/controller/FengtiIOSRechargeController.java b/src/main/java/com/jmfy/controller/FengtiIOSRechargeController.java new file mode 100644 index 0000000..5ac7fc0 --- /dev/null +++ b/src/main/java/com/jmfy/controller/FengtiIOSRechargeController.java @@ -0,0 +1,73 @@ +package com.jmfy.controller; + +import com.jmfy.paramBean.PaySdkEnum; +import com.jmfy.util.JsonUtil; +import com.jmfy.util.MD5Util; +import com.jmfy.util.XmlUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.*; + +/** + * 悠谷游戏 + */ +@RestController +public class FengtiIOSRechargeController { + + @Resource + private PayLogic payLogic; + + private static final String Md5_Key = "69059243697666791013328131742528"; + + private static final Logger LOGGER = LoggerFactory.getLogger(FengtiIOSRechargeController.class); + + @RequestMapping(value = "/Web/fengtiIOSCallback") + public String fengtiIOSCallback(HttpServletRequest request) throws Exception { + String result = "error"; + + HashMap requestMap = JsonUtil.getInstence().getParameterMap2(request); + if (requestMap.isEmpty()) { + LOGGER.info("疯体 request data is null"); + return result; + } + boolean sign = verifySign(requestMap); + if (!sign) { + LOGGER.info("疯体---》sign error"); + return result; + } + + String ntData = requestMap.get("nt_data"); + HashMap data = (HashMap) XmlUtil.readStringXmlOut(ntData); + + String orderno = data.get("out_order_no"); // 支付订单号 + double amount = Double.parseDouble(data.get("amount")) * 100; //充值金额(单位:元)(需要换算成分) + String gameExt = data.get("extras_params"); //透传参数,如CP下单有值提交,则会原样回传,不得超过255个字符 + String[] callback = gameExt.split("_"); + return payLogic.initOrder(gameExt, orderno, String.valueOf(amount), new Date(), callback[0], PaySdkEnum.FENGTIIOS); + } + + /** + * 验证sign + * @param map + * @return + */ + private boolean verifySign(Map map) { + String ntData = map.get("nt_data"); + String sign = map.get("sign"); + String md5Sign = map.get("md5Sign"); + + StringBuilder localSign = new StringBuilder(); + localSign.append(ntData).append(sign).append(Md5_Key); + String mySign = MD5Util.encrypByMd5(localSign.toString()); + if (mySign.equals(md5Sign)) { + return true; + } + LOGGER.error("疯体==>,sign fail, localSign={},md5Sign={},map={}", localSign, md5Sign, map); + return false; + } +} diff --git a/src/main/java/com/jmfy/controller/OhayooRechargeController.java b/src/main/java/com/jmfy/controller/OhayooRechargeController.java index 20fb989..a4163e6 100644 --- a/src/main/java/com/jmfy/controller/OhayooRechargeController.java +++ b/src/main/java/com/jmfy/controller/OhayooRechargeController.java @@ -19,6 +19,7 @@ import java.util.*; * 疯体 ios */ @RestController +@Deprecated public class OhayooRechargeController { @Resource private PayLogic payLogic; diff --git a/src/main/java/com/jmfy/paramBean/PaySdkEnum.java b/src/main/java/com/jmfy/paramBean/PaySdkEnum.java index 9ed16b6..a4526f2 100644 --- a/src/main/java/com/jmfy/paramBean/PaySdkEnum.java +++ b/src/main/java/com/jmfy/paramBean/PaySdkEnum.java @@ -19,7 +19,8 @@ public enum PaySdkEnum { HANFAN(9,"HAOFAN"), FENGTIIOS(10,"FENGTIIOS"), ANJIU(11, "ANJIU"), - YOUGU(12,"YOUGU") + YOUGU(12,"YOUGU"), + FENGTI(13,"FENGTI"), ; private int id; diff --git a/src/main/java/com/jmfy/util/FengTiDesUtil.java b/src/main/java/com/jmfy/util/FengTiDesUtil.java new file mode 100644 index 0000000..c9f1b81 --- /dev/null +++ b/src/main/java/com/jmfy/util/FengTiDesUtil.java @@ -0,0 +1,65 @@ +package com.jmfy.util; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class FengTiDesUtil { + + + private final static Pattern pattern = Pattern.compile("\\d+"); + + private final static String charset="utf-8"; + + public static String encode(String src,String key) { + try { + byte[] data = src.getBytes(charset); + 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(); + }catch (UnsupportedEncodingException e){ + e.printStackTrace(); + } + return src; + } + + public static String decode(String src,String key) { + if(src == null || src.length() == 0){ + return src; + } + Matcher m = pattern.matcher(src); + List list = new ArrayList(); + while (m.find()) { + try { + String group = m.group(); + list.add(Integer.valueOf(group)); + } catch (Exception e) { + e.printStackTrace(); + return src; + } + } + + if (list.size() > 0) { + try { + 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, charset); + } catch (UnsupportedEncodingException e){ + e.printStackTrace(); + } + return src; + } else { + return src; + } + } +} diff --git a/src/main/java/com/jmfy/util/XmlUtil.java b/src/main/java/com/jmfy/util/XmlUtil.java new file mode 100644 index 0000000..d3b90dc --- /dev/null +++ b/src/main/java/com/jmfy/util/XmlUtil.java @@ -0,0 +1,176 @@ +package com.jmfy.util; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public class XmlUtil { + public void readStringXml(String xml) { + Document doc = null; + try { + + // 读取并解析XML文档 + // SAXReader就是一个管道,用一个流的方式,把xml文件读出来 + // + // SAXReader reader = new SAXReader(); //User.hbm.xml表示你要解析的xml文档 + // Document document = reader.read(new File("User.hbm.xml")); + // 下面的是通过解析xml字符串的 + doc = DocumentHelper.parseText(xml); // 将字符串转为XML + + Element rootElt = doc.getRootElement(); // 获取根节点 + System.out.println("根节点:" + rootElt.getName()); // 拿到根节点的名称 + + Iterator iter = rootElt.elementIterator("head"); // 获取根节点下的子节点head + + // 遍历head节点 + while (iter.hasNext()) { + + Element recordEle = (Element) iter.next(); + String title = recordEle.elementTextTrim("title"); // 拿到head节点下的子节点title值 + System.out.println("title:" + title); + + Iterator iters = recordEle.elementIterator("script"); // 获取子节点head下的子节点script + + // 遍历Header节点下的Response节点 + while (iters.hasNext()) { + + Element itemEle = (Element) iters.next(); + + String username = itemEle.elementTextTrim("username"); // 拿到head下的子节点script下的字节点username的值 + String password = itemEle.elementTextTrim("password"); + + System.out.println("username:" + username); + System.out.println("password:" + password); + } + } + Iterator iterss = rootElt.elementIterator("body"); ///获取根节点下的子节点body + // 遍历body节点 + while (iterss.hasNext()) { + + Element recordEless = (Element) iterss.next(); + String result = recordEless.elementTextTrim("result"); // 拿到body节点下的子节点result值 + System.out.println("result:" + result); + + Iterator itersElIterator = recordEless.elementIterator("form"); // 获取子节点body下的子节点form + // 遍历Header节点下的Response节点 + while (itersElIterator.hasNext()) { + + Element itemEle = (Element) itersElIterator.next(); + + String banlce = itemEle.elementTextTrim("banlce"); // 拿到body下的子节点form下的字节点banlce的值 + String subID = itemEle.elementTextTrim("subID"); + + System.out.println("banlce:" + banlce); + System.out.println("subID:" + subID); + } + } + } catch (DocumentException e) { + e.printStackTrace(); + + } catch (Exception e) { + e.printStackTrace(); + + } + } + + /** + * @description 将xml字符串转换成map + * @param xml + * @return Map + */ + public static Map readStringXmlOut(String xml) { + Map map = new HashMap(); + Document doc = null; + try { + // 将字符串转为XML + doc = DocumentHelper.parseText(xml); + // 获取根节点 + Element rootElt = doc.getRootElement(); + // 拿到根节点的名称 + System.out.println("根节点:" + rootElt.getName()); + + // 获取根节点下的子节点head + Iterator iter = rootElt.elementIterator("head"); + // 遍历head节点 + while (iter.hasNext()) { + + Element recordEle = (Element) iter.next(); + // 拿到head节点下的子节点title值 + String title = recordEle.elementTextTrim("title"); + System.out.println("title:" + title); + map.put("title", title); + // 获取子节点head下的子节点script + Iterator iters = recordEle.elementIterator("script"); + // 遍历Header节点下的Response节点 + while (iters.hasNext()) { + Element itemEle = (Element) iters.next(); + // 拿到head下的子节点script下的字节点username的值 + String username = itemEle.elementTextTrim("username"); + String password = itemEle.elementTextTrim("password"); + + System.out.println("username:" + username); + System.out.println("password:" + password); + map.put("username", username); + map.put("password", password); + } + } + + //获取根节点下的子节点body + Iterator iterss = rootElt.elementIterator("body"); + // 遍历body节点 + while (iterss.hasNext()) { + Element recordEless = (Element) iterss.next(); + // 拿到body节点下的子节点result值 + String result = recordEless.elementTextTrim("result"); + System.out.println("result:" + result); + // 获取子节点body下的子节点form + Iterator itersElIterator = recordEless.elementIterator("form"); + // 遍历Header节点下的Response节点 + while (itersElIterator.hasNext()) { + Element itemEle = (Element) itersElIterator.next(); + // 拿到body下的子节点form下的字节点banlce的值 + String banlce = itemEle.elementTextTrim("banlce"); + String subID = itemEle.elementTextTrim("subID"); + + System.out.println("banlce:" + banlce); + System.out.println("subID:" + subID); + map.put("result", result); + map.put("banlce", banlce); + map.put("subID", subID); + } + } + } catch (DocumentException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return map; + } + + public static void main(String[] args) { + + // 下面是需要解析的xml字符串例子 + String xmlString = "" + "" + "dom4j解析一个例子" + + "" + "" + + "" + "0" + "
" + + "1000" + "36242519880716" + + "
" + "" + ""; + + /* + * Test2 test = new Test2(); test.readStringXml(xmlString); + */ + Map map = readStringXmlOut(xmlString); + Iterator iters = map.keySet().iterator(); + while (iters.hasNext()) { + String key = iters.next().toString(); // 拿到键 + String val = map.get(key).toString(); // 拿到值 + System.out.println(key + "=" + val); + } + } +}