Просмотр исходного кода

Merge branch 'dev0.1' of https://gitee.com/xionghuy/ro_server into dev0.1

lt 1 год назад
Родитель
Сommit
b82a66c98e

+ 33 - 0
RO_Server_Trunk-branch_0.1.39/roserver/baseserver/model/base_config.go

@@ -47,6 +47,8 @@ func BaseConfigInit(sConfig service.ConfigServerNode) {
 		//添加到热更新列表中
 		serverproto.CFGNameList["AdvertisingScreen"] = serverproto.AdvertisingScreenLoad
 		serverproto.CFGNameList["CombinedServiceCfg"] = serverproto.CombinedServiceCfgLoad
+		serverproto.CdkCfgLoad(path + "csv/")
+		convertCdkRewardCfg() //cdk
 
 	case SERVICE_NODE_TYPE_RANK: //rank
 		serverproto.CompetitionCfgLoad(path + "csv/")
@@ -8127,3 +8129,34 @@ func convertBTFirstAnd100RechargeCfg() {
 		})
 	}
 }
+
+type CdkRewardData struct {
+	Id         int32
+	RewardList []*serverproto.KeyValueType
+	Start      time.Time
+	End        time.Time
+	Total      int32
+}
+
+var ConvertCdkRewardMap map[string]*CdkRewardData //key 是code码
+
+func convertCdkRewardCfg() {
+	if ConvertCdkRewardMap == nil {
+		ConvertCdkRewardMap = make(map[string]*CdkRewardData, 0)
+	}
+	for _, val := range serverproto.CdkCfgLoader {
+		convertData := &CdkRewardData{
+			Id:         val.Id,
+			RewardList: []*serverproto.KeyValueType{},
+		}
+		loc := util.GetLoc()
+		StartTime, _ := time.ParseInLocation(util.DATE_FORMAT, val.StartTime, loc)
+		EndTime, _ := time.ParseInLocation(util.DATE_FORMAT, val.EndTime, loc)
+		convertData.Start = StartTime
+		convertData.End = EndTime
+		convertData.RewardList = Str2ResSliceList(val.Reward)
+		convertData.Total = val.Total
+		ConvertCdkRewardMap[val.Cdk] = convertData
+	}
+	//util.InfoF("cdk2 %v", ConvertCdkRewardMap)
+}

+ 1 - 1
RO_Server_Trunk-branch_0.1.39/roserver/baseserver/model/base_config_global.go

@@ -240,7 +240,7 @@ var GlobalWishSlotCost = serverproto.KeyValueType{}
 // 充值钱包
 var GlobalCreditRechargeFactor float32 = 0                  // 充值钱包 免费充值额度神域经验比例
 var GlobalCreditRechargeInitMax int32 = 0                   // 充值钱包 初始化最大额度
-var GlobalRoCoinFactor float32 = 60                         // rmb获得RO币比例系数
+var GlobalRoCoinFactor float32 = 10                         // rmb获得RO币比例系数
 var GlobalFastBattleTime []serverproto.KeyValueType         // 特殊处理使用道具添加战斗倍数时间[道具id:持续时间]
 var GlobalClimbingTowerDayReward []serverproto.KeyValueType // 试炼馈赠(层数:免费充值额度数量)
 var GlobalRoCoinToExp = 1.0                                 // RO币兑换波利商城经验比例

+ 53 - 0
RO_Server_Trunk-branch_0.1.39/roserver/game/model/role.go

@@ -11,6 +11,7 @@ import (
 	"rocommon/util"
 	"roserver/baseserver/model"
 	"roserver/serverproto"
+	"strconv"
 	"strings"
 	"time"
 	"unicode/utf8"
@@ -305,6 +306,7 @@ type RoleLogicOuter interface {
 	DaoChang100SetTips(tipDesc string)
 
 	OnAntiCheatReq(cheatType int32)
+	CodeRewardReq(code string)
 	GiftReward(ackMsg *serverproto.SCGiftRewardAck)
 
 	//问卷奖励获取
@@ -4001,6 +4003,57 @@ func (this *Role) OnAntiCheatReq(cheatType int32) {
 	}
 }
 
+const RoleCdkInfo = "cdk_info_"
+
+func (this *Role) CodeRewardReq(code string) {
+	res := &serverproto.SCGiftRewardAck{
+		Uuid: this.GetUUid(),
+	}
+	if _, ok := model.ConvertCdkRewardMap[code]; !ok {
+		res.Error = int32(serverproto.ErrorCode_ERROR_GIFT_CODE_NOT_FOUND)
+		this.ReplayGate(res, true)
+		return
+	}
+	v := model.ConvertCdkRewardMap[code]
+	if v == nil {
+		util.ErrorF("uid:%v cdk get config is nil", this.GetUUid())
+		res.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
+		this.ReplayGate(res, true)
+		return
+	}
+	now := time.Now()
+	if now.Before(v.Start) || now.After(v.End) {
+		res.Error = int32(serverproto.ErrorCode_ERROR_GIFT_CODE_OUTDATE)
+		this.ReplayGate(res, true)
+		return
+	}
+	key := RoleCdkInfo + strconv.FormatUint(this.GetUUid(), 10)
+	field := strconv.FormatInt(int64(v.Id), 10)
+	b, err := service.GetRedis().HExists(key, field).Result()
+	if err != nil {
+		util.ErrorF("uid:%v cdk get redis err:%v", this.GetUUid(), err)
+		res.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
+		this.ReplayGate(res, true)
+		return
+	}
+	if b {
+		res.Error = int32(serverproto.ErrorCode_ERROR_GIFT_CODE_USED)
+		this.ReplayGate(res, true)
+		return
+	}
+	res.RewardList = v.RewardList
+	_, er := service.GetRedis().HSet(key, field, "11").Result()
+	if er != nil {
+		util.ErrorF("uid:%v cdk set redis err:%v", this.GetUUid(), err)
+		res.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
+		this.ReplayGate(res, true)
+		return
+	}
+	this.GiftReward(res)
+	util.InfoF("uid:%v cdk get reward:%v", this.GetUUid(), res.RewardList)
+	this.ReplayGate(res, true)
+}
+
 func (this *Role) GiftReward(ackMsg *serverproto.SCGiftRewardAck) {
 	if ackMsg == nil {
 		return

+ 1 - 0
RO_Server_Trunk-branch_0.1.39/roserver/game/msg/role_msg.go

@@ -3822,6 +3822,7 @@ func init() {
 
 		util.DebugF("uid=%v receive CSGiftRewardReq ms=%v", role.GetUUid(), msg)
 		msg.Uuid = role.GetUUid()
+		//role.(*model2.Role).CodeRewardReq(msg.GiftCode)
 		role.(*model2.Role).SendSocial(msg)
 	})
 	//from social

+ 65 - 45
RO_Server_Trunk-branch_0.1.39/roserver/gmweb/msg/msg.go

@@ -4,15 +4,18 @@ import (
 	"rocommon"
 	"rocommon/service"
 	"rocommon/util"
-	"roserver/baseserver"
 	"roserver/baseserver/model"
 	gmmodel "roserver/gmweb/model"
 	"roserver/serverproto"
 	"runtime/debug"
 	"strconv"
+	"time"
 )
 
-//other service
+const RoleCdkInfo = "cdk_info_"
+const CdkTotal = "cdk_Total_"
+
+// other service
 func init() {
 	//serverproto.Handle_GMWEB_SSWebGMAddMailAck = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
 	//	msg := ev.Msg().(*serverproto.SSWebGMAddMailAck)
@@ -23,66 +26,83 @@ func init() {
 
 	serverproto.Handle_GMWEB_CSGiftRewardReq = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {
 		msg := ev.Msg().(*serverproto.CSGiftRewardReq)
-		util.InfoF("uid=%v CSGiftRewardReq msg=%v", msg.Uuid, msg)
+		//util.InfoF("uid=%v CSGiftRewardReq msg=%v", msg.Uuid, msg)
 
 		//model2.GetMailUpdateMag().AttachMail2Update()
 
-		uuid := msg.Uuid
-		uidStr := strconv.FormatUint(uuid, 10)
-		zoneStr := strconv.Itoa(service.GetServiceConfig().Node.Zone)
-		urlPath := "?code=" + msg.GiftCode + "&uid=" + uidStr + "&serverid=" + zoneStr
-		go func() {
+		go func(code string, uuid uint64) {
 			defer func() {
 				//打印奔溃信息
 				if err := recover(); err != nil {
 					util.InfoF("onError data=%v \n%s\n", err, string(debug.Stack()))
 				}
 			}()
+			uidStr := strconv.FormatUint(uuid, 10)
+			res := &serverproto.SCGiftRewardAck{
+				Uuid: uuid,
+			}
+			//util.InfoF("aaaa:%v", model.ConvertCdkRewardMap)
+			if _, ok := model.ConvertCdkRewardMap[code]; !ok {
+				res.Error = 3
+				util.ErrorF("uid:%v cdk get config is nil,%v", uuid, model.ConvertCdkRewardMap)
+				gmmodel.SendSocial(res)
+				return
+			}
+			v := model.ConvertCdkRewardMap[code]
+			if v == nil {
+				util.ErrorF("uid:%v cdk get config is nil", uuid)
+				res.Error = 3
+				gmmodel.SendSocial(res)
+				return
+			}
+			now := time.Now()
+			if now.Before(v.Start) || now.After(v.End) {
+				res.Error = 2
+				gmmodel.SendSocial(res)
+				return
+			}
+			if v.Total > 0 {
+				ker := CdkTotal + strconv.Itoa(int(v.Id))
+				num, _ := service.GetRedis().Incr(ker).Result()
+				if num >= int64(v.Total) {
+					res.Error = 1
+					gmmodel.SendSocial(res)
+					return
+				}
+			}
 
-			tmpRequest := &rocommon.HTTPRequest{}
-			tmpRequest.ReqCodecName = "httpjson"
-			//tmpRequest.ReqMsg = OpenIdServeNode{
-			//	ServerId:   zoneId,
-			//	HeadId:     headId,
-			//	Level:      level, //默认1级
-			//	RecordTime: uint32(util.GetTimeSeconds()),
-			//}
-
-			tmpRequest.ResMsg = &gmmodel.GiftSt{}
-			parm := gmmodel.GetHttpNodeParam()
-			httpNode := baseserver.CreateHttpConnector(parm)
-			err := httpNode.(rocommon.HTTPConnector).Request("GET", urlPath, tmpRequest)
+			key := RoleCdkInfo + strconv.FormatUint(uuid, 10)
+			field := strconv.FormatInt(int64(v.Id), 10)
+			b, err := service.GetRedis().HExists(key, field).Result()
 			if err != nil {
-				util.InfoF("uid=%v http Request err=%v", uidStr, err)
-				ackMsg := &serverproto.SCGiftRewardAck{
-					Error: int32(serverproto.ErrorCode_ERROR_GIFT_CODE_USE_FAIL),
-					Uuid:  uuid,
-				}
-				gmmodel.SendSocial(ackMsg)
+				util.ErrorF("uid:%v cdk get redis err:%v", uuid, err)
+				res.Error = 3
+				gmmodel.SendSocial(res)
 				return
 			}
-
+			if b {
+				res.Error = 1
+				gmmodel.SendSocial(res)
+				return
+			}
+			res.RewardList = v.RewardList
+			_, er := service.GetRedis().HSet(key, field, "11").Result()
+			if er != nil {
+				util.ErrorF("uid:%v cdk set redis err:%v", uuid, err)
+				res.Error = 3
+				gmmodel.SendSocial(res)
+				return
+			}
+			//this.GiftReward(res)
+			//util.InfoF("uid:%v cdk get reward:%v", this.GetUUid(), res.RewardList)
+			//this.ReplayGate(res, true)
 			//error
 			//1礼包吗已经使用
 			//2礼包吗已经过期
 			//3 没有找到礼包吗
-			util.InfoF("uid=%v CSGiftRewardReq msg=%v res=%v", uidStr, msg, tmpRequest.ResMsg)
-			ackMsg := &serverproto.SCGiftRewardAck{
-				Error: int32(tmpRequest.ResMsg.(*gmmodel.GiftSt).Error),
-				Uuid:  uuid,
-			}
-			if 0 == ackMsg.Error {
-				for _, data := range tmpRequest.ResMsg.(*gmmodel.GiftSt).Content {
-					itemId, _ := model.Str2Num(data.ItemId)
-					itemCount, _ := model.Str2Num(data.ItemCount)
-					ackMsg.RewardList = append(ackMsg.RewardList, &serverproto.KeyValueType{
-						Key:   int32(itemId),
-						Value: int32(itemCount),
-					})
-				}
-			}
-			gmmodel.SendSocial(ackMsg)
-		}()
+			util.InfoF("uid=%v CSGiftRewardReq msg=%v res=%v", uidStr, msg, res)
+			gmmodel.SendSocial(res)
+		}(msg.GiftCode, msg.Uuid)
 	})
 
 	serverproto.Handle_GMWEB_SSWebGMChatMsgNtf = model.HandleBackendMessage(func(ev rocommon.ProcEvent, cliId model.ClientID) {

+ 56 - 37
RO_Server_Trunk-branch_0.1.39/roserver/gmweb/msg/web_paymsg.go

@@ -156,26 +156,28 @@ func getMd5Sign(callbackKey string, params map[string]string) string {
 
 func getGNMd5Sign(md5Key string, params map[string]string) string {
 	// 删除参数中的 sign 字段
-	delete(params, "md5Sign")
+	//delete(params, "md5Sign")
 
 	// 按参数名进行升序排序
-	var keys []string
-	for key := range params {
-		keys = append(keys, key)
-	}
-	sort.Strings(keys)
+	//var keys []string
+	//for key := range params {
+	//	keys = append(keys, key)
+	//}
+	//sort.Strings(keys)
 
 	// 拼接参数和值
 	var signKey strings.Builder
-	for _, key := range keys {
-		signKey.WriteString(key)
-		signKey.WriteString("=")
-		signKey.WriteString(params[key])
-		signKey.WriteString("&")
-	}
-
+	//for _, key := range keys {
+	//	signKey.WriteString(key)
+	//	signKey.WriteString("=")
+	//	signKey.WriteString(params[key])
+	//	signKey.WriteString("&")
+	//}
+	signKey.WriteString(params["nt_data"])
+	signKey.WriteString(params["sign"])
 	// 添加回调密钥
-	signKey.WriteString("md5key=" + md5Key)
+	signKey.WriteString(md5Key)
+	//util.InfoF("aaaaa:%v", signKey.String())
 
 	// 计算 MD5
 	hash := md5.Sum([]byte(signKey.String()))
@@ -269,6 +271,19 @@ func WebPayHwQuickNotify(c *gin.Context) {
 	c.String(http.StatusOK, "SUCCESS")
 }
 
+type Xml struct {
+	Quick    xml.Name `xml:"quicksdk_message"`
+	Message2 Message  `xml:"message"`
+}
+
+type Message struct {
+	Uid       string `xml:"channel_uid"`
+	CpOrderId string `xml:"game_order"`
+	OrderNo   string `xml:"order_no"`
+	Amount    string `xml:"amount"`
+	Extras    string `xml:"extras_params"`
+}
+
 func WebPayGNQuickNotify(c *gin.Context) {
 	//util.DebugF("支付回调信息:%v", c.Request.PostForm)
 	params := make(map[string]string)
@@ -281,7 +296,7 @@ func WebPayGNQuickNotify(c *gin.Context) {
 	for key, value := range c.Request.PostForm {
 		params[key] = value[0] // 假设每个参数只有一个值
 	}
-	sign := params["sign"]
+	sign := params["md5Sign"]
 	//info2 := params["extrasParams"]
 	//info := strings.ReplaceAll(info2, "\\", "")
 	//var extras Extras
@@ -299,47 +314,51 @@ func WebPayGNQuickNotify(c *gin.Context) {
 	//		return
 	//	}
 	//} else {
-	util.InfoF("android 支付签名认证:%v", sign)
-	newSign := getGNMd5Sign("siqvxn2fs5v59c0ndu1p9vdrc3ccnorf", params)
+	//params["nt_data"] = decryptData(params["nt_data"], "27564251240220692046169876879712")
+	//params["sign"] = decryptData(params["nt_data"], "27564251240220692046169876879712")
+	//params["nt_data"] = decryptData(params["nt_data"], "27564251240220692046169876879712")
+	//util.InfoF("android 支付签名认证:%v", sign)
+	newSign := getGNMd5Sign("o2wamscu5ncshxlhi1qhchca5uy9hsd6", params)
 	if newSign != sign {
-		util.ErrorF("签名错误%v", sign)
+		util.ErrorF("签名错误%v,newSign:%v", sign, newSign)
 		c.String(http.StatusOK, "FAILED")
 		return
 	}
-	data := decryptData(params["nt_data"], "27564251240220692046169876879712")
+	data := decryptData(params["nt_data"], "91741736721678744361414937890230")
 	//}
-	m := make(map[string]string, 0)
-	err := xml.Unmarshal([]byte(data), m)
+	var x Xml
+	err := xml.Unmarshal([]byte(data), &x)
 	if err != nil {
-		util.ErrorF("data解析错误%v", data)
-		c.String(http.StatusOK, "FAILED")
-		return
-	}
-	util.DebugF("data m:%v", m)
-	uid := m["channel_uid"]
-	cpOrderId := m["game_order"]
-	orderNo := m["order_no"]
-	payAmount := m["amount"]
-	status := m["status"]
-	if status != "0" {
-		util.ErrorF("uid:%v 充值失败 status:%v", uid, status)
+		util.ErrorF("data解析错误%v,err:%v", data, err)
 		c.String(http.StatusOK, "FAILED")
 		return
 	}
+	util.InfoF("data m:%v", x)
+	uid := x.Message2.Uid
+	cpOrderId := x.Message2.CpOrderId
+	orderNo := x.Message2.OrderNo
+	payAmount := x.Message2.Amount
+	e := x.Message2.Extras
+	//status := m["status"]
+	//if status != "0" {
+	//	util.ErrorF("uid:%v 充值失败 status:%v", uid, status)
+	//	c.String(http.StatusOK, "FAILED")
+	//	return
+	//}
 	//usdAmount := c.PostForm("usdAmount")
 	ntfData := &WebNotifyData{}
 	ntfData.CpOrderId = cpOrderId
 	ntfData.SdkOrderId = orderNo
 	ntfData.PayTime = uint64(util.GetTimeSeconds())
 	ntfData.PayChannel = "qk_gn"
-	util.InfoF("paycallback uid=%v cpOrderNo=%v orderNo=%v payAmount=%v payCurrency=%v payType=%v",
-		uid, cpOrderId, orderNo, payAmount)
+	util.InfoF("paycallback uid=%v cpOrderNo=%v orderNo=%v payAmount=%v payCurrency=%v payType=%v extras:%v",
+		uid, cpOrderId, orderNo, payAmount, e)
 	f64, err := strconv.ParseFloat(payAmount, 32)
 	if err != nil {
 		fmt.Println("Error:", err)
 		return
 	}
-	webPayNotify(ntfData, float32(f64), c)
+	res := webPayNotify(ntfData, float32(f64), c)
 
 	//// 简单粗暴,直接给其他服转发,不需要确认是哪个服
 	//payPostRouter := service.GetServiceConfig().SDKConfig.PayPostRouter
@@ -357,7 +376,7 @@ func WebPayGNQuickNotify(c *gin.Context) {
 	//util.WarnF("paycallback routerString:%v\n", routerString)
 	//go sendPosts(payPostRouter, routerString)
 
-	c.String(http.StatusOK, "SUCCESS")
+	c.String(http.StatusOK, res)
 }
 
 func encryptData(code_data string, callback_key string) string {

+ 25 - 0
RO_Server_Trunk-branch_0.1.39/roserver/serverproto/config_csv.go

@@ -442,6 +442,7 @@ func ConfigInit(path string) {
 	ShieldedWordCfgLoad(path)
 	ShopCfgLoad(path)
 	HardLevelCfgLoad(path)
+	CdkCfgLoad(path)
 	ShopTypeCfgLoad(path)
 	SignInCfgLoad(path)
 	SkillCfgLoad(path)
@@ -3843,3 +3844,27 @@ func YuanHangTrialRankCfgLoad(path string) {
 		YuanHangTrialRankCfgLoader[row.Id] = row
 	}
 }
+
+var CdkCfgLoader map[int32]*CdkCfg
+
+type CdkCfg struct {
+	Id   int32  `csv:"Id"`   //禮包Id
+	Name string `csv:"Name"` //cdk名字
+	//Type      int32    `csv:"Type"`      //类型 1 全服 ,2 个人
+	Cdk    string   `csv:"Cdk"`    //兑换码
+	Reward []string `csv:"Reward"` //道具
+	//UserId    []string `csv:"UserId"`    //个人uid
+	StartTime string `csv:"StartTime"` //开始時间
+	EndTime   string `csv:"EndTime"`   //结束時间
+	Total     int32  `csv:"Total"`     //总数
+}
+
+func CdkCfgLoad(path string) {
+	cfg := []*CdkCfg{}
+	CdkCfgLoader = map[int32]*CdkCfg{}
+	loadCsvCfg(path+"CdkCfg.csv", &cfg)
+	for _, row := range cfg {
+		CdkCfgLoader[row.Id] = row
+	}
+	//util.InfoF("cdk:%v", CdkCfgLoader)
+}