goProject/trunk/framework/gameServerMgr/chargeUtil.go

434 lines
12 KiB
Go
Raw Normal View History

2025-01-06 16:01:02 +08:00
package gameServerMgr
import (
"encoding/json"
"fmt"
"math"
"sort"
"strconv"
. "Framework/managecenterModel"
"goutil/logUtil"
"goutil/securityUtil"
"goutil/webUtil"
)
type ChargeUtil struct{}
//获取Int32型的充值金额(充值金额必须大于1否则可能就会无效)
func (this *ChargeUtil) GetInt32ChargeMoney(money float32) int32 {
return int32(money)
}
//获取排好序的充值配置列表
func (this *ChargeUtil) GetOrderedChargeConfigList(partnerId int32, isMonthCard bool) (list []*ChargeConfig, exist bool) {
var tempList []*ChargeConfig
tempList, exist = GetChargeConfigList(partnerId)
//如果不存在,则返回空集合
if !exist {
return
}
//循环遍历集合,找出是月卡的数据
for _, item := range tempList {
if item.IsMonthCard == isMonthCard {
list = append(list, item)
}
}
return
}
// 生成充值订单号
// url:生成订单号的服务器地址
// productId:产品Id
// partnerId:合作商Id
// serverId:服务器Id
// userId:平台用户Id
// playerId:玩家Id
// mac:mac
// idfa:idfa
// ip:ip
// imei:imei
// extra:extra
// isMonthCard:是否月卡
// 返回值:
// 订单号
// 错误对象
func (this *ChargeUtil) GenerateOrderId(url, productId string, partnerId, serverId int32,
userId, playerId, mac, idfa, ip, imei, extra string,
isMonthCard bool) (orderId string, err error) {
if extra == "" {
extra = "FromGameServer"
}
// 定义请求参数
postDict := make(map[string]string)
postDict["ProductId"] = productId
postDict["PartnerId"] = fmt.Sprintf("%d", partnerId)
postDict["ServerId"] = fmt.Sprintf("%d", serverId)
postDict["UserId"] = userId
postDict["PlayerId"] = playerId
postDict["MAC"] = mac
postDict["IDFA"] = idfa
postDict["IP"] = ip
postDict["IMEI"] = imei
postDict["Extra"] = extra
postDict["IsMonthCard"] = strconv.FormatBool(isMonthCard)
//请求url,请求头
header := webUtil.GetFormHeader()
transport := webUtil.NewTransport()
transport.DisableKeepAlives = true
transport = webUtil.GetTimeoutTransport(transport, 30)
statusCode, returnBytes, err1 := webUtil.PostMapData(url, postDict, header, transport)
if err1 != nil {
logUtil.ErrorLog(fmt.Sprintf("生成充值订单号出错url:%s,错误信息为:%s", url, err1))
err = err1
return
}
if statusCode != 200 {
logUtil.ErrorLog(fmt.Sprintf("生成充值订单号出错url:%s,错误码为:%d", url, statusCode))
err = fmt.Errorf("生成充值订单号出错url:%s,错误码为:%d", url, statusCode)
return
}
orderId = string(returnBytes)
if orderId == "" {
err = fmt.Errorf("Order Is Empty")
return
}
return
}
//生成支付订单信息
func (this *ChargeUtil) GeneratePayOrderInfo(url string, partnerId int32, jsonBase64Data string) (returnObject ReturnObject, err error) {
//String requestParam = String.Format(@"PartnerId={0}&JsonBase64Data={1}", partnerId, jsonBase64Data);
postDict := make(map[string]string)
postDict["PartnerId"] = fmt.Sprintf("%d", partnerId)
postDict["JsonBase64Data"] = jsonBase64Data
//请求url,请求头
header := webUtil.GetFormHeader()
transport := webUtil.NewTransport()
transport.DisableKeepAlives = true
transport = webUtil.GetTimeoutTransport(transport, 30)
//通过POST方式请求数据
statusCode, returnBytes, err1 := webUtil.PostMapData(url, postDict, header, transport)
if err1 != nil {
logUtil.ErrorLog(fmt.Sprintf("生成支付订单信息错误:%s,错误信息为:%s", url, err1))
err = err1
return
}
if statusCode != 200 {
logUtil.ErrorLog(fmt.Sprintf("生成支付订单信息出错url:%s,错误码为:%d", url, statusCode))
err = fmt.Errorf("生成支付订单信息出错url:%s,错误码为:%d", url, statusCode)
return
}
err = json.Unmarshal(returnBytes, &returnObject)
return
//return JsonUtil.Deserialize<ReturnObject>(WebUtil.PostWebData(generateOrderIdUrl, requestParam, DataCompress.NotCompress));
}
// 获取充值配置列表
// partnerId合作商Id
// vipLv玩家VIP等级
// isMonthCard是否月卡
// filter过滤器
// 返回值:
// 充值配置列表
// 是否存在
// 错误对象
func (this *ChargeUtil) GetChargeConfigList(partnerId int32, vipLv byte, isMonthCard bool,
filter func(*ChargeConfig) bool) (chargeConfigList []*ChargeConfig, exists bool, err error) {
// 获取排好序的充值配置列表
var tmpList []*ChargeConfig
tmpList, exists, err = this.getSortedChargeConfigList(partnerId, isMonthCard)
if err != nil || !exists {
return
}
// 根据vip和filter进行筛选
for _, item := range tmpList {
if filter != nil {
if vipLv >= item.VipLv && filter(item) {
chargeConfigList = append(chargeConfigList, item)
}
} else {
if vipLv >= item.VipLv {
chargeConfigList = append(chargeConfigList, item)
}
}
}
// 判断是否有符合条件的数据
if len(chargeConfigList) == 0 {
exists = false
return
}
return
}
// 获取有序的充值配置列表
// partnerId合作商Id
// isMonthCard是否月卡
// 返回值:
// 充值配置列表
// 是否存在
// 错误对象
func (this *ChargeUtil) getSortedChargeConfigList(partnerId int32, isMonthCard bool) (chargeConfigList []*ChargeConfig, exists bool, err error) {
// 判断合作商是否存在
//var partnerObj *Partner
//partnerObj, exists = managecenterMgr.GetPartner(partnerId)
//if !exists {
//return
//}
// 反序列化充值配置
var tmpChargeConfigList []*ChargeConfig
tmpChargeConfigList, exists = GetChargeConfigList(partnerId)
if !exists {
return
}
//if err = json.Unmarshal([]byte(partnerObj.ChargeConfig), &tmpChargeConfigList); err != nil {
//return
//}
// 根据isMonthCard进行筛选
for _, item := range tmpChargeConfigList {
if item.IsMonthCard == isMonthCard {
chargeConfigList = append(chargeConfigList, item)
}
}
// 判断是否有符合条件的数据
if len(chargeConfigList) == 0 {
exists = false
return
}
// 按默认规则进行排序
sort.Slice(chargeConfigList, func(i, j int) bool {
return chargeConfigList[i].SortByChargePointAsc(chargeConfigList[j])
})
return
}
// 获取充值配置项
// partnerId合作商Id
// vipLv玩家VIP等级
// isMonthCard是否月卡
// money充值金额
// 返回值:
// 充值配置项
// 是否存在
// 错误对象
func (this *ChargeUtil) GetChargeConfigItem(partnerId int32, vipLv byte, isMonthCard bool, money float64) (chargeConfigItem *ChargeConfig, exists bool, err error) {
// 获取排好序的充值配置列表
var tmpList []*ChargeConfig
tmpList, exists, err = this.getSortedChargeConfigList(partnerId, isMonthCard)
if err != nil || !exists {
return
}
// 获取满足充值金额和VIP条件的最后一条数据
for _, item := range tmpList {
if vipLv >= item.VipLv && money >= item.ChargePoint {
chargeConfigItem = item
}
}
// 如果没有符合条件的,则选择第一条配置
if chargeConfigItem == nil {
chargeConfigItem = tmpList[0]
}
return
}
// 计算充值获得的游戏点数
// partnerId合作商Id
// vipLv玩家VIP等级
// isMonthCard是否月卡
// money充值金额
// 返回值:
// 充值获得的游戏点数
// 是否存在
// 错误对象
func (this *ChargeUtil) CalcChargeGamePoint(partnerId int32, vipLv byte, isMonthCard bool, money float64, productId string) (chargeGamePoint int, exists bool, err error) {
// 获取排好序的充值配置列表
chargeGamePoint = 0
tmpList := make([]*ChargeConfig, 0, 8)
tmpList, exists, err = this.getSortedChargeConfigList(partnerId, isMonthCard)
if err != nil || !exists {
return
}
var chargeConfigItem *ChargeConfig
if money > 0 {
// 获取满足充值金额和VIP条件的最后一条数据
for _, item := range tmpList {
if vipLv >= item.VipLv && money >= item.ChargePoint {
chargeConfigItem = item
}
}
// 如果找不到对应的档位,则选择最低金额档位
if chargeConfigItem == nil {
chargeConfigItem = tmpList[0]
}
// 计算充值对应的ProductId以及获得的游戏货币
if money == chargeConfigItem.ChargePoint {
chargeGamePoint = chargeConfigItem.GamePoint
} else {
chargeGamePoint = int(math.Ceil(money * chargeConfigItem.Ratio))
}
return
} else {
for _, item := range tmpList {
if item.ProductId == productId && item.VipLv <= vipLv {
chargeConfigItem = item
break
} else {
continue
}
}
if chargeConfigItem != nil {
chargeGamePoint = chargeConfigItem.GamePoint
return
}
}
return
}
// 计算充值获得的所有游戏点数
// partnerId合作商Id
// vipLv玩家VIP等级
// isMonthCard是否月卡
// money充值金额
// activityMoney活动金额
// isFirstCharge是否首充
// 返回值:
// 充值获得的游戏点数
// 充值赠送获得的游戏内货币数量
// 充值活动获得的游戏内货币数量
// 总的元宝数量
// 是否存在
// 错误对象
func (this *ChargeUtil) CalcChargeAllGamePoint(partnerId int32, vipLv byte, isMonthCard bool,
money, activityMoney float64, productId string, isFirstCharge bool) (
chargeGamePoint int, giveGamePoint int, activityGamePoint int, totalGamePoint int,
exists bool, err error) {
// 获取排好序的充值配置列表
tmpList := make([]*ChargeConfig, 0, 8)
tmpList, exists, err = this.getSortedChargeConfigList(partnerId, isMonthCard)
if err != nil || !exists {
return
}
var chargeConfigItem *ChargeConfig
if money > 0 {
// 获取满足充值金额和VIP条件的最后一条数据
for _, item := range tmpList {
if vipLv >= item.VipLv && money >= item.ChargePoint {
chargeConfigItem = item
}
}
// 如果找不到对应的档位,则选择最低金额档位
if chargeConfigItem == nil {
chargeConfigItem = tmpList[0]
}
// 计算充值对应的ProductId以及获得的游戏货币
if money == chargeConfigItem.ChargePoint {
chargeGamePoint = chargeConfigItem.GamePoint
if isFirstCharge {
giveGamePoint = chargeConfigItem.FirstGiveGamePoint
} else {
giveGamePoint = chargeConfigItem.GiveGamePoint
}
} else {
chargeGamePoint = int(math.Ceil(money * chargeConfigItem.Ratio))
if isFirstCharge {
giveGamePoint = chargeConfigItem.FirstGiveGamePoint
} else {
giveGamePoint = int(math.Ceil(money * chargeConfigItem.Ratio * chargeConfigItem.GiveRatio))
}
}
activityGamePoint = int(math.Ceil(activityMoney * chargeConfigItem.Ratio))
} else {
// 获取满足充值金额和VIP条件的最后一条数据
for _, item := range tmpList {
if vipLv >= item.VipLv && item.ProductId == productId {
chargeConfigItem = item
}
}
if chargeConfigItem != nil {
chargeGamePoint = chargeConfigItem.GamePoint
if isFirstCharge {
giveGamePoint = chargeConfigItem.FirstGiveGamePoint
} else {
giveGamePoint = chargeConfigItem.GiveGamePoint
}
activityGamePoint = int(math.Ceil(activityMoney * chargeConfigItem.Ratio))
}
}
// 计算总和
totalGamePoint = chargeGamePoint + giveGamePoint + activityGamePoint
return
}
// 验证充值签名
// partnerId:合作商Id
// serverId:区服Id
// playerId:玩家Id
// orderId:订单Id
// productId:产品Id
// deviceIdentifier:设备唯一标识
// sign:签名
// 返回值:
// bool:签名验证情况
func (this *ChargeUtil) CheckChargeSign(partnerId int32, serverId int32, playerId string, orderId string, productId string, deviceIdentifier string, sign string) bool {
partnerObj, exist := GetPartnerItem(partnerId)
if exist == false {
return false
}
rawString := fmt.Sprintf("%v%v%v%v%v%v%v", partnerId, serverId, playerId, orderId, productId, deviceIdentifier, partnerObj.LoginKey)
if securityUtil.Md5String(rawString, false) != sign {
return false
}
return true
}
// ------------------类型定义和业务逻辑的分隔符-------------------------
var (
ChargeUtilObj = new(ChargeUtil)
)