using Sog; using ProtoCSStruct; namespace DB { public static class PayOp { public static void OnPayGoogleReq(uint remoteAppID, StructPacket packet, DBOperator dbOperator) { ref SSPayGoogleReq req = ref packet.GetMessage(); int ret = dbOperator.InsertPayReq(ref req) ? 0 : -1; TraceLog.Debug("PayOp.OnGooglePayReq uid {0} itemId {1} orderId {2} ret {3}", req.Uid, req.ItemID, req.OrderId, ret); if (ret != 0) { TraceLog.Error("PayOp.OnGooglePayReq uid {0} itemId {1} orderId {2} DBOperator.InsertPayReq failed" , req.Uid, req.ItemID, req.OrderId); } SSPayGoogleRes res = new SSPayGoogleRes(); res.Ret = ret; res.Uid = req.Uid; res.ItemID = req.ItemID; res.OrderId = req.OrderId; res.Diamond = req.Diamond; res.Money = req.Money; res.GmTestPay = req.GmTestPay; res.PayType = req.PayType; res.HttpCtxId = req.HttpCtxId; res.WorldId = req.WorldId; res.PaymentId = req.PaymentId; res.JsApiPay = req.JsApiPay; for (int i = 0; i < req.SelectItems.Count; i++) { res.SelectItems.Add(ref req.SelectItems[i]); } res.SessionKey.CopyFrom(ref req.SessionKey); DBServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.PayGoogleRes, ref res, packet.ObjectID); } public static void OnPayGoogleSuccessReq(uint remoteAppID, StructPacket packet, DBOperator dbOperator) { ref SSPayGoogleSuccessReq req = ref packet.GetMessage(); SSPayGoogleSuccessRes res = new SSPayGoogleSuccessRes { Ret = -1, Uid = req.Uid, PayType = req.PayType, HttpCtxId = req.HttpCtxId, PayParam1 = req.PayParam1, PayParam2 = req.PayParam2, PayTime3rd = req.PayTime3rd, GmTestPay = req.GmTestPay, Amount = req.Amount, SubPayType = req.SubPayType, Sandbox = req.Sandbox, }; res.ItemID = req.ItemID; res.OrderId.SetString(req.OrderId.GetPtr()); res.OrderId3rd.SetString(req.OrderId3rd.GetPtr()); res.Currency.SetString(req.Currency.GetPtr()); res.PurchaseToken.SetString(req.PurchaseToken.GetPtr()); res.CpCustomMsg.SetString(req.CpCustomMsg.GetPtr()); tbpay record = dbOperator.SelectPayRecord(req.Uid, req.OrderId.GetString()); if (record != null && record.ProductID == 0) { // 正常情况DB中的ProductID不会是0, ProductID是0的肯定是之前的bug导致的 string[] split = record.OrderID.Split('-'); int.TryParse(split[4], out int itemId); if (itemId > 0) { record.ProductID = itemId; dbOperator.UpdatePayProductId(req.Uid, req.OrderId.GetString(), itemId); } } res.Ret = ChecktbRecordOnPayGoogleSuccessReq(record, ref req); if (res.Ret != 0) { TraceLog.Error("PayOp.OnPayGoogleSuccessReq ChecktbRecordOnPayGoogleSuccessReq failed uid {0}, orderid {1} ret {2}" , req.Uid, req.OrderId, res.Ret); DBServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.PayGoogleSuccessRes, ref res, packet.ObjectID); return; } TraceLog.Error("PayOp.OnPayGoogleSuccessReq uid {0} orderid {1} status {2} itemid {3} money {4}" , req.Uid, req.OrderId, record.Status, record.ProductID, record.Money); // 这段代码应该是要确保OrderID和OrderId3rd是一对一的关系, 目前是由英雄回调通知, 暂时没用了 //if (req.OrderId3rd.Count > 5) //{ // tbPay record3rd = dbOperator.SelectPayRecordByOrderId3rd(req.OrderId3rd.GetString()); // if (record3rd != null && record3rd.OrderID != req.OrderId.GetString()) // { // res.Ret = -2; // TraceLog.Error("PayOp.OnPayGoogleSuccessReq uid {0}, record3rd {1} already exist, it's orderId is {2}" // , req.Uid, req.OrderId3rd, record3rd.OrderID); // DBServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.PayGoogleSuccessRes, ref res, packet.ObjectID); // return; // } //} //有可能是1,这是允许的,game那边会判断,不会重复加钻石 if (record.Status == 0) { //成功的话更新数据库的状态为1 TraceLog.Error("PayOp.OnPayGoogleSuccessReq UpdatePayStatus uid {0}, orderid {1} orderId3rd {2}" , req.Uid, req.OrderId, res.OrderId3rd); bool bUpdateSuccess = dbOperator.UpdatePayStatus(req.Uid, req.OrderId.GetString(), 1 , res.OrderId3rd.GetString(), req.PayTime3rd, req.Amount, req.GmTestPay , req.Currency.GetString(), req.SubPayType); if (bUpdateSuccess == false) { res.Ret = -99; TraceLog.Error("PayOp.OnPayGoogleSuccessReq UpdatePayStatus failed uid {0}, orderid {1} orderId3rd {2}" , req.Uid, req.OrderId, res.OrderId3rd.GetString()); DBServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.PayGoogleSuccessRes, ref res, packet.ObjectID); return; } record.Status = 1; } res.Status = record.Status; TraceLog.Error("PayOp.OnPayGoogleSuccessReq uid {0} orderid {1} amount {2} status {3} succ" , req.Uid, req.OrderId, res.Amount, res.Status); DBServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.PayGoogleSuccessRes, ref res, packet.ObjectID); } private static int ChecktbRecordOnPayGoogleSuccessReq(tbpay record, ref SSPayGoogleSuccessReq req) { if (record == null) { TraceLog.Error("PayOp.ChecktbRecordOnPayGoogleSuccessReq failed uid {0}, orderid {1}, no record" , req.Uid, req.OrderId); return -1; } //去掉这个校验,签名成功就行了,实际使用中的确存在这种情况,游客换手机支付,但是是相同的google帐号 if (record.Uid != req.Uid) { TraceLog.Error("PayOp.ChecktbRecordOnPayGoogleSuccessReq failed uid {0}, orderid {1}, invalid uid {2}", req.Uid, req.OrderId, record.Uid); //return -2; } if (record.PayType != req.PayType) { TraceLog.Error("PayOp.ChecktbRecordOnPayGoogleSuccessReq failed uid {0}, orderid {1}, payType {2} != req.payType {3}" , req.Uid, req.OrderId, record.PayType, req.PayType); return -4; } // 购买物品不一致 if (req.ItemID != record.ProductID) { TraceLog.Error("PayOp.ChecktbRecordOnPayGoogleSuccessReq failed uid {0}, orderid {1}, item {2} != req.item {3}" , req.Uid, req.OrderId, record.ProductID, req.ItemID); return (int)CSErrCode.PayItemIdNotEqual; } return 0; } public static void OnPayDBAddDiamondStatusReq(uint remoteAppID, StructPacket packet, DBOperator dbOperator) { ref SSPayDBAddDiamondStatusReq req = ref packet.GetMessage(); long uid = req.Uid; var res = new SSPayDBAddDiamondStatusRes { Uid = uid, Diamond = req.Diamond }; res.OrderId.SetString(req.OrderId.GetPtr()); tbpay record = dbOperator.SelectPayRecord(req.Uid, req.OrderId.GetString()); //按理说不可能为空 if (record == null) { TraceLog.Error("PayOp.OnPayDBAddDiamondStatusReq uid {0} orderId {1} not in DB", uid, req.OrderId); res.Ret = -1; DBServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.PayDbAddDiamondStatusRes, ref res, uid); return; } TraceLog.Debug("PayOp.OnPayDBAddDiamondStatusReq uid {0} orderId {1} status {2} select item num {3}" , uid, req.OrderId, record.Status, record.ExData.PlayerSelectItem.Count); for (int i = 0; i < record.ExData.PlayerSelectItem.Count; i++) { if (res.SelectItems.Count < res.SelectItems.GetMaxCount()) { res.SelectItems.Add(ref record.ExData.PlayerSelectItem[i]); } } //按理说不可能为0和2,但是继续,也许是gamesvr回档了或者数据库回档? if (record.Status == 0 || record.Status == 2) { TraceLog.Error("PayOp.OnPayDBAddDiamondStatusReq uid {0} orderId {1} status {2}, should be 1" , uid, req.OrderId, record.Status); } res.Status = record.Status; // 已经添加钻石 if (record.Status == 2) { DBServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.PayDbAddDiamondStatusRes, ref res, uid); return; } // 更新数据库状态为2, 实际添加的钻石数量 bool bUpdateSuccess = dbOperator.UpdatePayStatus(req.Uid, req.OrderId.GetString(), 2, req.AmountExchange, req.DiamondExchange, req.ReplaceItemId, req.Money); if (bUpdateSuccess == false) { TraceLog.Error("PayOp.OnPayDBAddDiamondStatusReq UpdatePayStatus failed, uid {0} orderid {1}", uid, req.OrderId); res.Ret = -1; DBServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.PayDbAddDiamondStatusRes, ref res, uid); return; } TraceLog.Debug("PayOp.OnPayDBAddDiamondStatusReq uid {0} orderId {1} diamond {2} succ" , uid, req.OrderId, req.Diamond); res.Status = 2; DBServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.PayDbAddDiamondStatusRes, ref res, uid); } public static void OnQueryPayGoogleSuccOrder(uint remoteAppID, StructPacket packet, DBOperator dbOperator) { ref SSQueryPayGoogleSuccOrder query = ref packet.GetMessage(); long uid = query.Uid; var paySuccList = dbOperator.SelectPaySuccRecord(uid); if (paySuccList == null || paySuccList.Count == 0) { TraceLog.Trace("PayOp.OnQueryPayGoogleSuccOrder uid {0} no pay succ record", uid); return; } for (int i = 0; i < paySuccList.Count; i++) { tbpay pay = paySuccList[i]; SSPayGoogleSuccessRes res = new SSPayGoogleSuccessRes { Uid = uid, Amount = (uint)pay.Amount, PayType = (uint)pay.PayType, SubPayType = pay.SubPayType, Status = pay.Status, HttpCtxId = 0, PayTime3rd = pay.PayTime3rd, GmTestPay = pay.IsTestPay == 1, }; res.ItemID = pay.ProductID; res.OrderId.SetString(pay.OrderID); res.OrderId3rd.SetString(pay.OrderId3rd); res.Currency.SetString(pay.Currency); var str = res.OrderId.GetString(); var arr = str.Split('-'); if (arr.Length >= 7) { int.TryParse(arr[5], out res.PayParam1); int.TryParse(arr[6], out res.PayParam2); } DBServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.PayGoogleSuccessRes, ref res, uid); } } public static void OnGmQueryUserPayRecordReq(uint remoteAppID, StructPacket packet, DBOperator dbOperator) { ref SSGmQueryUserPayRecordReq req = ref packet.GetMessage(); long uid = packet.ObjectID; TraceLog.Debug("PayOp.OnGmQueryUserPayRecordReq uid {0}", uid); SSGmQueryUserPayRecordRes res = new SSGmQueryUserPayRecordRes(); //最大页大小限制 防止超出 if (req.Pagesize> res.Records.GetMaxCount()) { req.Pagesize = res.Records.GetMaxCount(); } var recordList = dbOperator.SelectAllPayRecords(req); TraceLog.Debug("PayOp.OnGmQueryUserPayRecordReq uid {0}, count {1}" , uid, recordList.Item2); res.Id = req.Guid; res.PageTotal = (ulong)recordList.Item1; foreach (var record in recordList.Item2) { res.Records.Add(record); } DBServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.GmQueryUserPayRecordRes, ref res, packet.ObjectID, packet.ServerID); } public static void OnPaySendDBRefundReq(uint remoteAppID, StructPacket packet, DBOperator dbOperator) { ref var req = ref packet.GetMessage(); SSPaySendDBRefundRes res = new SSPaySendDBRefundRes { Uid = req.Uid, HttpCtxId = req.HttpCtxId, RefundTime = req.RefundTime }; res.OrderId.SetString(req.OrderId.GetPtr()); res.OrderId3rd.SetString(req.OrderId3rd.GetPtr()); if (!dbOperator.SetRefundTime(req.Uid, req.OrderId.GetString(), req.OrderId3rd.GetString(), req.RefundTime)) { res.Ret = -1; } DBServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.PaySendDbRefundRes, ref res, packet.ObjectID); } public static void OnSaveHttpContentReq(uint remoteAppID, StructPacket packet, DBOperator dbOperator) { ref var req = ref packet.GetMessage(); if (dbOperator.ReplacePayHttpContent(ref req)) { string orderId = req.Http.OrderId.GetString(); var res = new SSPayHeroSaveHttpContentRes(); res.Http.Uid = req.Http.Uid; res.Http.Method = req.Http.Method; res.Http.Content.SetString(req.Http.Content.GetPtr()); res.Http.Url.SetString(req.Http.Url.GetPtr()); res.Http.OrderId.SetString(orderId); res.Http.IsTestPay = req.Http.IsTestPay; DBServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.PayHeroSaveHttpContentRes, ref res, req.Http.Uid); } } public static void OnSelectHttpContentReq(uint remoteAppID, StructPacket packet, DBOperator dbOperator) { var res = new SSPayHeroSelectHttpContentRes(); dbOperator.SelectPayHttpContent(ref res); TraceLog.Trace("PayOp.OnSelectHttpContentReq http count {0}", res.Http.Count); if (res.Http.Count > 0) { DBServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.PayHeroSelectHttpContentRes, ref res, 0); } } public static void OnDeleteHttpContentNotify(uint remoteAppID, StructPacket packet, DBOperator dbOperator) { ref var notify = ref packet.GetMessage(); dbOperator.DeletePayHttpContent(ref notify); } } }