using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Sog; using ProtoCSStruct; namespace World { public static class PaySvc { public static void OnGooglePayReq(uint serverId, StructPacket packet) { ref SSPayGoogleReq req = ref packet.GetMessage(); long uid = req.Uid; TraceLog.Debug("PaySvc.OnGooglePayReq uid {0} itemId {1} orderId", req.Uid, req.ItemID, req.OrderId); PlayerInfoWorld player = WorldServerUtils.GetPlayerTableOp().GetPlayerInfo(uid); if(player == null) { TraceLog.Error("PaySvc.OnGooglePayReq can not find player uid {0}", uid); return; } //做一下频率限制等的校验,免得外挂太疯狂 int ret = CheckPayCount(player); if(ret != 0) { TraceLog.Error("PaySvc.OnGooglePayReq uid {0} CheckPayCount failed ret {1}", uid, ret); SSPayGoogleRes res = new SSPayGoogleRes { Uid = req.Uid, Money = req.Money, Diamond = req.Diamond, PayType = req.PayType, GmTestPay = req.GmTestPay, Ret = ret, }; res.ItemID = req.ItemID; res.OrderId.SetString(req.OrderId.GetPtr()); res.PaymentId.SetString(req.PaymentId.GetPtr()); WorldServerUtils.GetPacketSender().SendToServerByID(serverId, (int)SSGameMsgID.PayGoogleRes, ref res, uid); return; } // 转给HttpPay处理, HttpPay需要保存player的worldId //WorldServerUtils.GetPacketSender().SendToHttpProxyPayServer(packet); WorldServerUtils.GetPacketSender().SendToServerByID( AccountServerSelect.SelectFirstAccountServer(), packet, packet.ObjectID); } public static void OnGooglePayRes(uint serverId, StructPacket packet) { ref SSPayGoogleRes res = ref packet.GetMessage(); TraceLog.Debug("PaySvc.OnGooglePayRes uid {0}, orderid {1} ret {2}", res.Uid, res.OrderId, res.Ret); PlayerInfoWorld player = WorldServerUtils.GetPlayerTableOp().GetPlayerInfo(res.Uid); if (player == null) { TraceLog.Error("PaySvc.OnGooglePayRes no player uid {0}", res.Uid); return; } WorldServerUtils.GetPacketSender().SendToServerByID(player.GameServerID, packet); } // worldsvr直接转发给httpPaySvr校验即可 //public static void OnGooglePaySuccessReq(uint serverId, StructPacket packet) //{ // ref SSPayGoogleSuccessReq req = ref packet.GetMessage(); // long uid = req.Uid; // TraceLog.Debug("PaySvc.OnGooglePaySuccessReq uid {0}, Signature {1}", req.Uid, req.Signature); // PlayerInfoWorld player = WorldServerUtils.GetPlayerTableOp().GetPlayerInfo(uid); // if (player == null) // { // TraceLog.Error("PaySvc.OnGooglePaySuccessReq can not find player uid {0}", uid); // return; // } // if (ServerIDUtils.GetServerType(serverId) == (int)ServerType.Game) // { // //配置了不校验,或者是gm指令测试支付,直接转给db // if (WorldServerUtils.GetServerConfig().noCheckGooglePayPublicKey == 1 // || req.GmTestPay == true) // { // //转给HttpPay // WorldServerUtils.GetPacketSender().SendToHttpProxyPayServer(packet); // return; // } // if (req.PayType == (uint)PayType.IAP) // { // //转给HttpPay // WorldServerUtils.GetPacketSender().SendToHttpProxyPayServer(packet); // } // else if (req.PayType == (uint)PayType.Google) // { // //直接在这里校验 // string publicKeyBase64 = WorldServerUtils.GetServerConfig().googlePayPublicKey; // bool bCheckSuccess = GooglePayCheck.CheckGooglePay(req.PurchaseData.ToString(), req.Signature.ToString(), publicKeyBase64); // if (bCheckSuccess == false) // { // player.PayInfo.PayGoogleSuccessReqFailedCount++; // TraceLog.Error("PaySvc.OnGooglePaySuccessReq uid {0}, check purchaseData signature {1} failed PayGoogleSuccessReqFailedCount {2}" // , uid, req.Signature // , player.PayInfo.PayGoogleSuccessReqFailedCount); // SSPayGoogleSuccessRes res = new SSPayGoogleSuccessRes(); // res.Uid = req.Uid; // res.Ret = -1; // WorldServerUtils.GetPacketSender().SendToServerByID(serverId, (int)SSGameMsgID.PayGoogleSuccessRes, ref res, packet.ObjectID); // return; // } // req.OrderId.SetString(Sog.Crypto.GooglePaySecurity.GetOrderIdFromPurchaseData(req.PurchaseData.ToString())); // if (req.OrderId.Count == 0) // { // TraceLog.Error("PaySvc.OnGooglePaySuccessReq uid {0}, GetOrderIdFromPurchaseData failed", uid); // return; // } // //转给HttpPay // WorldServerUtils.GetPacketSender().SendToHttpProxyPayServer(packet); // } // } // else if (ServerIDUtils.GetServerType(serverId) == (int)ServerType.HttpProxyPay) // { // //成功是1,其他都是失败 // if (req.CheckSuccess3rd != 1) // { // TraceLog.Error("PaySvc.OnGooglePaySuccessReq uid {0}, CheckSuccess3Rd failed orderId {1} orderId3rd {2}" // , uid, req.OrderId, req.OrderId3rd); // //失败了,通知game // SSPayGoogleSuccessRes res = new SSPayGoogleSuccessRes // { // Ret = -1, // ItemID = req.ItemID, // OrderId = req.OrderId, // OrderId3rd = req.OrderId3rd, // PayType = req.PayType, // Uid = req.Uid, // PayParam1 = req.PayParam1, // PayParam2 = req.PayParam2, // PayTime3rd = req.PayTime3rd, // Currency = req.Currency, // Amount = req.Amount, // }; // WorldServerUtils.GetPacketSender().SendToServerByID(player.GameServerID, (int)SSGameMsgID.PayGoogleSuccessRes, ref res, req.Uid); // } // } //} public static void OnGooglePaySuccessRes(uint serverId, StructPacket packet) { ref SSPayGoogleSuccessRes res = ref packet.GetMessage(); long uid = res.Uid; TraceLog.Debug("PaySvc.OnGooglePaySuccessRes uid {0} ret {1}", uid, res.Ret); PlayerInfoWorld player = WorldServerUtils.GetPlayerTableOp().GetPlayerInfo(uid); // 如果player不存在, 后续player上线会发起重试 if (player == null) { TraceLog.Trace("PaySvc.OnGooglePaySuccessRes uid {0} no player", uid); return; } // 支付成功 if (res.Ret == 0) { } else { if (res.PayType != (int)PayType.Google) { player.PayInfo.PayGoogleSuccessReqFailedCount++; } TraceLog.Debug("PaySvc.OnGooglePaySuccessRes uid {0} ret {1} PayGoogleSuccessReqFailedCount {2}" , uid, res.Ret, player.PayInfo.PayGoogleSuccessReqFailedCount); } //转给game WorldServerUtils.GetPacketSender().SendToServerByID(player.GameServerID, packet); } public static void OnPayAddDiamondSuccReq(uint serverId, StructPacket packet) { //转给httpProxy WorldServerUtils.GetPacketSender().SendToHttpProxyPayServer(packet); } public static void OnPayAddDiamondSuccRes(uint serverId, StructPacket packet) { PlayerInfoWorld player = WorldServerUtils.GetPlayerTableOp().GetPlayerInfo(packet.ObjectID); if (player == null) { TraceLog.Trace("PaySvc.OnPayAddDiamondSuccRes uid {0} no player", packet.ObjectID); return; } //转给game WorldServerUtils.GetPacketSender().SendToServerByID(player.GameServerID, packet); } public static int CheckPayCount(PlayerInfoWorld player) { ref PayInfoWorld payInfo = ref player.PayInfo; long nowSecond = WorldServerUtils.GetTimeSecond(); //初始化 if(payInfo.LastCheckTime == 0) { payInfo.LastCheckTime = nowSecond; payInfo.PayCountToday++; return 0; } //不是同一天了 if(AppTime.IsSameDay(nowSecond, payInfo.LastCheckTime) == false) { payInfo.LastCheckTime = nowSecond; payInfo.PayCountToday = 1; return 0; } //同一天,每次请求至少间隔几秒吧,玩家动作有这么快吗? if(nowSecond < payInfo.LastCheckTime + 2) { TraceLog.Error("PaySvc.CheckPayCount uid {0} req too frequent", player.UserID); return -1; } //一天最多支付500次 if (payInfo.PayCountToday >= 500) { TraceLog.Error("PaySvc.CheckPayCount uid {0} PayCountToday {1} >= 500" , player.UserID, payInfo.PayCountToday); return -2; } //这个按理说应该为0,搞的这么大应该就是外挂了 if(payInfo.PayGoogleSuccessReqFailedCount >= 20) { TraceLog.Error("PaySvc.CheckPayCount uid {0} PayGoogleSuccessReqFailedCount {1}" , player.UserID, payInfo.PayGoogleSuccessReqFailedCount); //在这里封号处理 return -3; } payInfo.PayCountToday++; return 0; } public static void NotifyGameSvrItemStockInfo(int realmId, ItemStockInfoOne stockInfo) { var notify = new SSNotifyItemStockInfo{RealmId = realmId}; notify.ItemInfo.ItemID = stockInfo.itemId; notify.ItemInfo.Count = stockInfo.remainCount; uint[] serverIDs = WorldServerUtils.GetApp().GetCluster().GetRemoteAppID((int)ServerType.Game); foreach (uint svrId in serverIDs) { WorldServerUtils.GetPacketSender().SendToServerByID(svrId, (int)SSGameMsgID.NotifyItemStockInfo, ref notify, 0); } } } }