From fa4dd026c0f1d7770f0d824e9335592ecadfb97f Mon Sep 17 00:00:00 2001 From: "DESKTOP-C3M45P4\\dengdan" Date: Fri, 29 Nov 2024 22:33:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0quick=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + .../controller/QuickRechargeController.java | 201 ++++++++++++++++++ src/main/webapp/WEB-INF/web.xml | 45 +--- 3 files changed, 206 insertions(+), 41 deletions(-) create mode 100644 src/main/java/com/ljsd/controller/QuickRechargeController.java diff --git a/build.gradle b/build.gradle index 12d2890..aea1a7b 100644 --- a/build.gradle +++ b/build.gradle @@ -25,4 +25,5 @@ dependencies { compile group: 'io.netty', name: 'netty-all', version: '4.0.21.Final' compile group: 'com.google.protobuf', name: 'protobuf-java', version: '2.5.0' compile group: 'commons-lang', name: 'commons-lang', version: '2.5' + compile group: 'dom4j', name: 'dom4j', version: '1.6.1' } diff --git a/src/main/java/com/ljsd/controller/QuickRechargeController.java b/src/main/java/com/ljsd/controller/QuickRechargeController.java new file mode 100644 index 0000000..e4f7133 --- /dev/null +++ b/src/main/java/com/ljsd/controller/QuickRechargeController.java @@ -0,0 +1,201 @@ +package com.ljsd.controller; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.ljsd.pojo.Pay; +import com.ljsd.util.BaseGlobal; +import com.ljsd.util.HttpUtil; +import com.ljsd.util.MyMD5Util; +import org.apache.commons.lang.ArrayUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xml.sax.InputSource; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringReader; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +/** + * @author dengdan + * @version V1.0 + * @className RechargeController + * @packageName com.ljsd.controller + * @description quick 充值 + * @date 2022-02-21 14:10 + * copyright(c) 2020-2030 蓝鲸时代技术有限公司 + **/ +public class QuickRechargeController extends HttpServlet { + private static final Logger LOGGER = LoggerFactory.getLogger(QuickRechargeController.class); + private static final String callbackkey = "12737719148739508487389450073054"; + private static final String md5key = "ljl71x5cmvvlpuritisdbnhcphuklqc7"; + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + req.setCharacterEncoding("UTF-8"); + resp.setCharacterEncoding("UTF-8"); + resp.setContentType("application/json; charset=utf-8"); + PrintWriter out = resp.getWriter(); + HashMap parameterMap = HttpUtil.getParameterMap(req); + if (parameterMap.isEmpty()) { + LOGGER.info("data is null"); + out.print("FAILED"); + out.flush(); + return; + } + String ntdata0 = parameterMap.get("nt_data"); + String ntdata = decode(ntdata0,callbackkey); + Map map = getData(ntdata); + LOGGER.info("MapInfo: cakey:{},is_test:{},channel:{},channel_uid:{},game_order:{},order_no:{},pay_time:{}",callbackkey,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.isEmpty()) { + out.print("FAILED"); + out.flush(); + return; + } + String consumerid = map.get("channel_uid"); + String sign = parameterMap.get("sign"); + String md5Sign = parameterMap.get("md5Sign"); + if(!sign(ntdata0,sign,md5Sign,md5key)){ + LOGGER.info("callback==>roleUid={},sin derify fail ", consumerid); + out.print("FAILED"); + out.flush(); + return; + } + if(map.get("status").equals("1")){ + LOGGER.info("callback==>status:FAILED "); + out.print("FAILED"); + out.flush(); + return; + } + String orderno = map.get("order_no"); + String amount = map.get("amount"); + //quick的是元 要处理一下 + String amountForward = String.valueOf((int)(Double.parseDouble(amount) * 100)); + String extInfo = map.get("extras_params"); + // 角色id_物品id_orderId + String[] collback = extInfo.split("_"); + LOGGER.info("支付透传参数,分割前:{},分割后:{},长度:{}",extInfo, ArrayUtils.toString(collback,","),collback.length); + String uid = collback.length > 0 ? collback[0] : "0"; + String goodsId = collback.length > 1 ? collback[1] : "0"; + String orderId = collback.length > 2 ? collback[2] : "0"; + String serverId = collback.length > 3 ? collback[3] : "0"; + //init pay + Gson gson = new Gson(); + String[] split = extInfo.split("\\|"); + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("orderId", orderId); + jsonObject.addProperty("goodsId",goodsId); + jsonObject.addProperty("uid",uid); + // 游戏中uid + Map json = gson.fromJson(jsonObject, Map.class); + Pay pay = new Pay(); + pay.roleId = json.get("uid"); + pay.serverId = serverId ; + pay.goodsId = json.get("goodsId"); + pay.money = amountForward; + pay.extension = jsonObject.toString(); + pay.sdkOrderId = orderno; + //存入redis 存入成功就返回成功,后续在游戏服处理 + try { + BaseGlobal.redisApp.hset(pay.serverId, "PAY_KEY", orderId, gson.toJson(pay), -1,false); + } catch (Exception e) { + e.printStackTrace(); + out.print("FAILED"); + out.flush(); + return; + } + LOGGER.info("玩家充值成功,存入redis----roleId={},orderId={},money={}", pay.roleId, pay.sdkOrderId,pay.money); + out.print("SUCCESS"); + out.flush(); + } + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + this.doGet(req, resp); + } + + public static boolean sign(String ntdata0,String sign0,String md5Sign,String md5key){ + String paramStr = ntdata0 + sign0 + md5key; + String sign = MyMD5Util.encrypByMd5(paramStr); +// LOGGER.info("加密前字符串:{}",paramStr); + LOGGER.info("加密后得:{}",sign); + if(sign.equals(md5Sign)){ + return true; + }else{ + LOGGER.info("sign:{} md5Sign:{}",sign,md5Sign); + return false; + } + } + + public static String decode(String src, String key) { + if(src == null || src.isEmpty()){ + 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.isEmpty()) + continue; + list.add(Integer.valueOf(group)); + } catch (Exception e) { + return src; + } + } + if (!list.isEmpty()) { + 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; + } + + public static void main(String[] args) throws Exception { + String info = ""; + String sig = MyMD5Util.encrypByMd5(info); + System.out.println(sig); + } +} diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index a7b6fce..e8d8f75 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -9,34 +9,6 @@ - - - ksPostGift - com.ljsd.controller.KSPostGiftController - - - ksPostGift - /ks/ksPostGift - - - - ksPayNotify - com.ljsd.controller.KSPayNotifyController - - - ksPayNotify - /ks/ksPayNotify - - - - ksGetRoleList - com.ljsd.controller.KSGetRoleListController - - - ksGetRoleList - /ks/ksGetRoleList - - rechargeController com.ljsd.controller.RechargeController @@ -73,21 +45,12 @@ - recharge9kController - com.ljsd.controller.Recharge9kController + quickRechargeController + com.ljsd.controller.QuickRechargeController - recharge9kController - /callback_yy - - - - rebate9kController - com.ljsd.controller.Rebate9kController - - - rebate9kController - /rebate_9K + quickRechargeController + /quickCallBack