diff --git a/call/config.go b/call/config.go index 381fe3d..095b206 100644 --- a/call/config.go +++ b/call/config.go @@ -648,6 +648,15 @@ func GetConfigGameProvider(provider int) *common.ConfigGameProvider { return nil } +func GetConfigGameListByGameID(provider, gameID int) *common.ConfigGameList { + for _, v := range configGameList { + if v.GameProvider == provider && v.GameID == gameID { + return v + } + } + return nil +} + // 游戏列表配置 // func LoadConfigGameList() (err error) { // one := []*common.ConfigGameList{} diff --git a/call/currency.go b/call/currency.go index 401eca1..bda16a2 100644 --- a/call/currency.go +++ b/call/currency.go @@ -312,7 +312,7 @@ func WriteBalance(b *common.CurrencyBalance, d ...*gorm.DB) error { // 汇率转换(转成美元) func Rate(t common.CurrencyType, amount int64) int64 { switch t { - case common.CurrencyBrazil: + case common.CurrencyINR: // 汇率每天刷新一次 rate := GetConfigCurrencyRateUSD(t) if rate == 0 { @@ -326,11 +326,11 @@ func Rate(t common.CurrencyType, amount int64) int64 { func RateBRL(t common.CurrencyType, amount int64) int64 { switch t { - case common.CurrencyBrazil: + case common.CurrencyINR: return amount case common.CurrencyUSDT: // 汇率每天刷新一次 - rate := GetConfigCurrencyRateUSD(common.CurrencyBrazil) + rate := GetConfigCurrencyRateUSD(common.CurrencyINR) if rate == 0 { rate = 2000 } diff --git a/call/pay.go b/call/pay.go index 8aee0cb..4a6ddb6 100644 --- a/call/pay.go +++ b/call/pay.go @@ -284,7 +284,7 @@ func RechargeCallback(r *common.RechargeOrder, success bool, payAccount, extra s // 24小时内注册的用户所有付费事件上报 if now-user.Birth <= 24*60*60 { uploads = append(uploads, func() { - UploadAdjust(common.AdjustEventNewPay, user, map[string]string{"revenue": util.RoundFloat(float64(amount/1e6)/100, 2), "currency": "BRL"}) + UploadAdjust(common.AdjustEventNewPay, user, map[string]string{"revenue": util.RoundFloat(float64(amount/1e6)/100, 2), "currency": "INR"}) }) // 上报fb @@ -597,7 +597,7 @@ func ActivityBreakGift(r *common.RechargeOrder, product *common.ConfigPayProduct UID: r.UID, Value: product.Value, Event: common.CurrencyEventActivityBreakGift, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, NeedBet: GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, product.Value), ChannelID: r.ChannelID, Exi1: product.ProductID, @@ -642,7 +642,7 @@ func ActivityWeekCard(r *common.RechargeOrder, product *common.ConfigPayProduct) UID: r.UID, Value: product.Value, Event: common.CurrencyEventActivityWeekCard, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, NeedBet: GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, product.Value), ChannelID: r.ChannelID, Exi1: product.ProductID, diff --git a/call/redpoint.go b/call/redpoint.go index 9fa4a41..f459111 100644 --- a/call/redpoint.go +++ b/call/redpoint.go @@ -48,6 +48,6 @@ func PushRed(uid int) { db.Mysql().Get(redPoints) checkMail(uid, redPoints) one := new(pb.RedPoint) - one.Mail = uint32(redPoints.Mail) + one.List = append(one.List, &pb.RedInfo{ModuleName: "mail", Num: uint32(redPoints.Mail)}) SendNR(uid, int(pb.ServerCommonResp_CommonRedPointResp), one, "common") } diff --git a/call/user.go b/call/user.go index fe7695c..3cf418d 100644 --- a/call/user.go +++ b/call/user.go @@ -96,7 +96,7 @@ func initPlayer(uid, channel int) { if initCoin < 0 { initCoin = 0 } - db.Mysql().Create(&common.PlayerCurrency{UID: uid, ChannelID: channel, BRL: initCoin}) + db.Mysql().Create(&common.PlayerCurrency{UID: uid, ChannelID: channel, INR: initCoin}) // db.Mysql().C().Table(common.PlayerRechargeTableName).Create(&common.PlayerCurrency{UID: uid, ChannelID: channel}) db.Mysql().Create(&common.PlayerProfile{UID: uid, ChannelID: channel, NeedBet: GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, initCoin)}) } @@ -180,7 +180,7 @@ func NewUser(info *common.PlayerDBInfo, ip, share, fbc, fbp, agent string) error UID: uid, Value: first, ChannelID: info.ChannelID, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, Event: common.CurrencyEventActivityFreeSpin, NeedBet: GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, first), }, diff --git a/common/config.go b/common/config.go index dc26a4a..d9e4f8f 100644 --- a/common/config.go +++ b/common/config.go @@ -237,12 +237,20 @@ type ConfigWithdrawChannels struct { PayUp int64 `gorm:"column:pay_up;type:bigint(20);default:1;comment:代收上限" json:"PayUp" web:"pay_up"` CurrencyType CurrencyType `gorm:"column:currency_type;type:bigint(20);default:1;uniqueIndex:channel_id;comment:货币类型" json:"CurrencyType" web:"currency_type"` Kind int64 `gorm:"column:kind;type:bigint(20);default:1;comment:协议类型" json:"Kind" web:"kind"` + Per int64 `gorm:"column:per;type:bigint(20);default:30;comment:渠道费率,千分位" json:"Per" web:"per"` + Per2 int64 `gorm:"column:per2;type:bigint(20);default:600;comment:单笔费率,单位分" json:"Per2" web:"per2"` + Amount int64 `gorm:"column:amount;type:bigint(20);default:10000000;comment:渠道余额,单位分" json:"Amount" web:"amount"` } func (c *ConfigWithdrawChannels) TableName() string { return "config_withdraw_channels" } +// CalAmount 计算费率 +func (c *ConfigWithdrawChannels) CalAmount(amount int64) int64 { + return amount*(1000+c.Per)/1000 + c.Per2 +} + // ConfigVIP vip配置 // Exp 该等级需要的经验值 // WithdrawCount 每日可代付次数 @@ -339,6 +347,8 @@ type ConfigGameList struct { Demo int `gorm:"column:demo;type:int(11);default:1;comment:是否支持demo 1支持 2不支持" web:"demo"` SubID string `gorm:"column:subid;type:varchar(255);default:'';comment:一些游戏有子id" web:"subid"` Jackpot int64 `gorm:"-" web:"-"` + MaxReward int64 `gorm:"-" web:"-" json:"max_reward"` // 最大奖励 + Number int64 `gorm:"-" web:"-" json:"number"` // 游玩人数 } func (c *ConfigGameList) TableName() string { diff --git a/common/currency.go b/common/currency.go index a558e4e..0b17b8e 100644 --- a/common/currency.go +++ b/common/currency.go @@ -14,7 +14,7 @@ type CurrencyType int const ( CurrencyTypeZero CurrencyType = iota - CurrencyBrazil + CurrencyINR CurrencyUSDT CurrencyAll ) @@ -196,8 +196,8 @@ func GetGameOutEvents() []interface{} { // RoundCurrency 去除法币的无意义小数位数 func RoundCurrency(t CurrencyType, amount int64) int64 { switch t { - case CurrencyBrazil: - return amount / 1e6 * 1e6 + case CurrencyINR: + return amount / 100 * 100 case CurrencyUSDT: return amount / 100 * 100 default: diff --git a/common/game.go b/common/game.go index d71f108..50c4ee2 100644 --- a/common/game.go +++ b/common/game.go @@ -76,6 +76,7 @@ const ( GameTypeSpecial GameTypeESport GameTypeSportBook + GameTypeFish ) type PlayerFavorite struct { diff --git a/common/player.go b/common/player.go index f9e4a15..0c3ab39 100644 --- a/common/player.go +++ b/common/player.go @@ -198,7 +198,7 @@ var ( type PlayerCurrency struct { UID int `gorm:"primary_key;column:uid;type:int(11)"` ChannelID int `gorm:"column:channel_id;type:bigint(20);default:1;comment:渠道id"` - BRL int64 `gorm:"column:brl;type:bigint(20);default:0;comment:雷亚尔"` + INR int64 `gorm:"column:inr;type:bigint(20);default:0;comment:卢比"` USDT int64 `gorm:"column:usdt;type:bigint(20);default:0;comment:usdt"` } diff --git a/common/provider.go b/common/provider.go index 8580e8c..5cf39f1 100644 --- a/common/provider.go +++ b/common/provider.go @@ -31,6 +31,10 @@ const ( ProviderSlotXo ProviderBTI ProviderEzugi + ProviderJili + ProviderJDB + ProviderCMD368 + ProviderSBO ProviderAll ) diff --git a/common/recharge.go b/common/recharge.go index 4e1fd3d..918074b 100644 --- a/common/recharge.go +++ b/common/recharge.go @@ -14,13 +14,20 @@ const ( type PayType int // 支付类型,巴西代表cpf|cnpj|email|phone|evp +// const ( +// PayTypeInvalid PayType = iota +// PayTypeCPF +// PayTypeCNPJ +// PayTypePhone +// PayTypeEmail +// PayTypeEVP +// PayTypeAll +// ) + const ( PayTypeInvalid PayType = iota - PayTypeCPF - PayTypeCNPJ - PayTypePhone - PayTypeEmail - PayTypeEVP + PayTypeBank + PayTypeUPI PayTypeAll ) @@ -28,22 +35,22 @@ func (p PayType) Isvalid() bool { return p > PayTypeInvalid && p < PayTypeAll } -func (p PayType) String() string { - switch p { - case PayTypeCPF: - return "CPF" - case PayTypeCNPJ: - return "CNPJ" - case PayTypePhone: - return "PHONE" - case PayTypeEmail: - return "EMAIL" - case PayTypeEVP: - return "EVP" - default: - return "" - } -} +// func (p PayType) String() string { +// switch p { +// case PayTypeCPF: +// return "CPF" +// case PayTypeCNPJ: +// return "CNPJ" +// case PayTypePhone: +// return "PHONE" +// case PayTypeEmail: +// return "EMAIL" +// case PayTypeEVP: +// return "EVP" +// default: +// return "" +// } +// } // ProductTypeRechargeWait 商品类型id const ( diff --git a/modules/backend/handler/common/common.go b/modules/backend/handler/common/common.go index 6f91ef6..bfba2cd 100644 --- a/modules/backend/handler/common/common.go +++ b/modules/backend/handler/common/common.go @@ -2,6 +2,7 @@ package handler import ( "server/call" + "server/common" "server/modules/backend/app" "server/modules/backend/bdb" "server/modules/backend/values" @@ -32,10 +33,8 @@ func ChannelList(c *gin.Context) { return } resp := values.ChannelListResp{} + resp.List = make([]*common.Channel, 0) for _, v := range ret { - if v.Show != 2 { - continue - } if len(a.User.SChannels) > 0 { if !util.SliceContain(a.User.SChannels, v.ChannelID) { continue diff --git a/modules/backend/handler/examine/examine.go b/modules/backend/handler/examine/examine.go index 67602c6..908daf9 100644 --- a/modules/backend/handler/examine/examine.go +++ b/modules/backend/handler/examine/examine.go @@ -316,7 +316,7 @@ func ShareOrderExamine(c *gin.Context) { UID: order.UID, Value: order.Amount, Event: common.CurrencyEventShareWithdraw, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, }, }) } else if req.Opt == 2 { // 拒绝 diff --git a/modules/backend/handler/firstpage.go b/modules/backend/handler/firstpage.go index 4ed5ea6..b655ef8 100644 --- a/modules/backend/handler/firstpage.go +++ b/modules/backend/handler/firstpage.go @@ -98,7 +98,7 @@ func GetFirstPageData(start, end int64, channels ...*int) *values.FirstPageData ret.RechargeTotal = models.GetAmountTotalBySQLs(start, end, channels...) // 赠送总额 - ret.WithdrawTotal = models.GetWithdrawAmountTotalBySQLs(start, end, common.CurrencyBrazil, channels...) + ret.WithdrawTotal = models.GetWithdrawAmountTotalBySQLs(start, end, common.CurrencyINR, channels...) // 发起充值订单数 ret.RechargeOrderCreate = models.GetOrderCount(start, end, common.StatusROrderCreate, 1, channels...) diff --git a/modules/backend/handler/gm/control.go b/modules/backend/handler/gm/control.go index 857ec25..70a2db9 100644 --- a/modules/backend/handler/gm/control.go +++ b/modules/backend/handler/gm/control.go @@ -91,7 +91,7 @@ func ConfigPayWeight(c *gin.Context) { list = reflect.ValueOf(list).Elem().Interface() retList := []common.ConfigPayChannels{} for _, v := range list.([]common.ConfigPayChannels) { - if v.CurrencyType == common.CurrencyBrazil { + if v.CurrencyType == common.CurrencyINR { retList = append(retList, v) } } @@ -145,7 +145,7 @@ func ConfigWithdrawWeight(c *gin.Context) { list = reflect.ValueOf(list).Elem().Interface() retList := []common.ConfigWithdrawChannels{} for _, v := range list.([]common.ConfigWithdrawChannels) { - if v.CurrencyType == common.CurrencyBrazil { + if v.CurrencyType == common.CurrencyINR { retList = append(retList, v) } } diff --git a/modules/backend/handler/gm/gm.go b/modules/backend/handler/gm/gm.go index 141ae58..e9b0bce 100644 --- a/modules/backend/handler/gm/gm.go +++ b/modules/backend/handler/gm/gm.go @@ -77,7 +77,7 @@ func GMRecharge(c *gin.Context) { } order.ProductID = req.ProductID order.Amount = product.Amount - order.CurrencyType = common.CurrencyBrazil + order.CurrencyType = common.CurrencyINR } else { if !req.CurrencyType.IsValid() { log.Error("unknow CurrencyType:%v", req.CurrencyType) diff --git a/modules/backend/handler/guser/getGameUserInfo.go b/modules/backend/handler/guser/getGameUserInfo.go index dfdba9c..2d6aa73 100644 --- a/modules/backend/handler/guser/getGameUserInfo.go +++ b/modules/backend/handler/guser/getGameUserInfo.go @@ -84,9 +84,9 @@ func GetGameUserInfo(c *gin.Context) { db.Mysql().Get(currency) // currencyRecharge := &common.PlayerCurrency{UID: uid} // db.Mysql().C().Table(common.PlayerRechargeTableName).Where("uid = ?", uid).Scan(currencyRecharge) - // resp.CashBrl = currency.BRL + currencyRecharge.BRL - resp.CashBrl = currency.BRL - resp.WithdrawalBrl = currency.BRL + // resp.CashBrl = currency.INR + currencyRecharge.INR + resp.CashBrl = currency.INR + resp.WithdrawalBrl = currency.INR // resp.CashUsdt = currency.USDT + currencyRecharge.USDT // resp.WithdrawalUsdt = currency.USDT brlInfo := call.GetRechargeInfo(uid) diff --git a/modules/backend/handler/statistics/platformData.go b/modules/backend/handler/statistics/platformData.go index d6d122b..30666d1 100644 --- a/modules/backend/handler/statistics/platformData.go +++ b/modules/backend/handler/statistics/platformData.go @@ -141,7 +141,7 @@ func GetPlatformData(start, end int64, platform ...*int) *values.PlatformData { // 新户复充率 ret.NewPayMultiPer = utils.GetPer(models.GetNewMultiPayCountBySqls(start, end, platform...), ret.NewPayCount) // 新增充值总额 - ret.NewPayAmount = models.GetNewPayAmountBySqls(start, end, common.CurrencyBrazil, platform...) + ret.NewPayAmount = models.GetNewPayAmountBySqls(start, end, common.CurrencyINR, platform...) // 新增arppu ret.NewPayARPPU = utils.GetPoint(ret.NewPayAmount, ret.NewPayCount*common.DecimalDigits) // 新增赠送人数 @@ -157,7 +157,7 @@ func GetPlatformData(start, end int64, platform ...*int) *values.PlatformData { // 老户复充率 ret.OldPayMultiPer = utils.GetPer(models.GetOldMultiPayCountBySqls(start, end, platform...), ret.OldPayCount) // 老用户付费金额 - ret.OldPayAmount = models.GetOldPayAmountBySqls(start, end, common.CurrencyBrazil, platform...) + ret.OldPayAmount = models.GetOldPayAmountBySqls(start, end, common.CurrencyINR, platform...) // 老户ARPPU ret.OldPayARPPU = utils.GetPoint(ret.OldPayAmount, ret.OldPayCount*common.DecimalDigits) // 老户赠送人数 diff --git a/modules/backend/handler/statistics/reviewData.go b/modules/backend/handler/statistics/reviewData.go index 71c2c67..edab3f0 100644 --- a/modules/backend/handler/statistics/reviewData.go +++ b/modules/backend/handler/statistics/reviewData.go @@ -253,9 +253,9 @@ func GetReviewPlatformData(start, end int64, platform ...*int) *values.ReviewDat // 新增用户平均玩牌时长 // ret.NewPlayTime = utils.GetPoint(newPlayTime, ret.NewPlayCount) - newRechargeBrl := models.GetNewPayAmountBySqls(start, end, common.CurrencyBrazil, platform...) + newRechargeBrl := models.GetNewPayAmountBySqls(start, end, common.CurrencyINR, platform...) // newRechargeUsdt := models.GetNewPayAmountBySqls(start, end, common.CurrencyUSDT, platform...) - // oldRechargeBrl := models.GetOldPayAmountBySqls(start, end, common.CurrencyBrazil, platform...) + // oldRechargeBrl := models.GetOldPayAmountBySqls(start, end, common.CurrencyINR, platform...) // oldRechargeUsdt := models.GetOldPayAmountBySqls(start, end, common.CurrencyUSDT, platform...) // ret.RechargeBrl = newRechargeBrl + oldRechargeBrl @@ -266,12 +266,12 @@ func GetReviewPlatformData(start, end int64, platform ...*int) *values.ReviewDat // 新增付费率 = 新增付费人数/新增注册人数 ret.NewPayPer = utils.GetPer(ret.NewPayCount, ret.NewCount) // 首次付费人数 - ret.FirstPayCount = models.GetFirstPayCount(start, end, common.CurrencyBrazil, platform...) + ret.FirstPayCount = models.GetFirstPayCount(start, end, common.CurrencyINR, platform...) // 首充付费率 ret.FirstPayPer = utils.GetPer(ret.FirstPayCount, ret.NewCount) // 新增付费总额 - ret.NewPayAmount = call.RateBRL(common.CurrencyBrazil, newRechargeBrl) + ret.NewPayAmount = call.RateBRL(common.CurrencyINR, newRechargeBrl) // 新增ARPU = 新增付费总额/新增注册人数 // ret.NewARPU = utils.GetPoint(ret.NewPayAmount/common.DecimalDigits, ret.NewCount) @@ -283,7 +283,7 @@ func GetReviewPlatformData(start, end int64, platform ...*int) *values.ReviewDat // ret.OldPayCount = models.GetOldPayCountBySqls(start, end, platform...) // 老用户付费总额(预估成美元) - // ret.OldPayAmount = call.RateBRL(common.CurrencyBrazil, oldRechargeBrl) + oldRechargeUsdt + // ret.OldPayAmount = call.RateBRL(common.CurrencyINR, oldRechargeBrl) + oldRechargeUsdt // 老用户玩牌人数 // ret.OldPlayCount = models.GetPlayGameUserCounts(&start, &end, &oldFlag, platform...) @@ -337,9 +337,9 @@ func GetReviewPlatformData(start, end int64, platform ...*int) *values.ReviewDat sql += fmt.Sprintf(" and status = %v", common.StatusROrderFinish) // 退出总额 当天所有退出成功总额 - withdrawBrl := models.GetWithdrawAmountTotalBySQLs(start, end, common.CurrencyBrazil, platform...) + withdrawBrl := models.GetWithdrawAmountTotalBySQLs(start, end, common.CurrencyINR, platform...) // withdrawUsdt := models.GetWithdrawAmountTotalBySQLs(start, end, common.CurrencyUSDT, platform...) - ret.WithdrawTotal = call.RateBRL(common.CurrencyBrazil, withdrawBrl) + ret.WithdrawTotal = call.RateBRL(common.CurrencyINR, withdrawBrl) // ret.WithdrawBrl = withdrawBrl // ret.WithdrawUsdt = withdrawUsdt @@ -415,9 +415,9 @@ func GetCompaireData(channels []int) *values.Compaire { // 充值总额 brl := []int64{} usdt := []int64{} - brl = append(brl, db.Mysql().Sum(&common.RechargeOrder{}, sql2+sqlRe2+fmt.Sprintf(" and currency_type = %v", common.CurrencyBrazil), "amount")) - brl = append(brl, db.Mysql().Sum(&common.RechargeOrder{}, sqly2+sqlRe2+fmt.Sprintf(" and currency_type = %v", common.CurrencyBrazil), "amount")) - compair.Recharge[common.CurrencyBrazil] = brl + brl = append(brl, db.Mysql().Sum(&common.RechargeOrder{}, sql2+sqlRe2+fmt.Sprintf(" and currency_type = %v", common.CurrencyINR), "amount")) + brl = append(brl, db.Mysql().Sum(&common.RechargeOrder{}, sqly2+sqlRe2+fmt.Sprintf(" and currency_type = %v", common.CurrencyINR), "amount")) + compair.Recharge[common.CurrencyINR] = brl usdt = append(usdt, db.Mysql().Sum(&common.RechargeOrder{}, sql2+sqlRe2+fmt.Sprintf(" and currency_type = %v", common.CurrencyUSDT), "amount")) usdt = append(usdt, db.Mysql().Sum(&common.RechargeOrder{}, sqly2+sqlRe2+fmt.Sprintf(" and currency_type = %v", common.CurrencyUSDT), "amount")) compair.Recharge[common.CurrencyUSDT] = usdt @@ -433,9 +433,9 @@ func GetCompaireData(channels []int) *values.Compaire { brlWithdraw := []int64{} usdtWithdraw := []int64{} - brlWithdraw = append(brlWithdraw, db.Mysql().Sum(&common.WithdrawOrder{}, sql+sqlWi2+fmt.Sprintf(" and currency_type = %v", common.CurrencyBrazil), "amount")) - brlWithdraw = append(brlWithdraw, db.Mysql().Sum(&common.WithdrawOrder{}, sqly+sqlWi2+fmt.Sprintf(" and currency_type = %v", common.CurrencyBrazil), "amount")) - compair.Withdraw[common.CurrencyBrazil] = brlWithdraw + brlWithdraw = append(brlWithdraw, db.Mysql().Sum(&common.WithdrawOrder{}, sql+sqlWi2+fmt.Sprintf(" and currency_type = %v", common.CurrencyINR), "amount")) + brlWithdraw = append(brlWithdraw, db.Mysql().Sum(&common.WithdrawOrder{}, sqly+sqlWi2+fmt.Sprintf(" and currency_type = %v", common.CurrencyINR), "amount")) + compair.Withdraw[common.CurrencyINR] = brlWithdraw usdtWithdraw = append(usdtWithdraw, db.Mysql().Sum(&common.WithdrawOrder{}, sql+sqlWi2+fmt.Sprintf(" and currency_type = %v", common.CurrencyUSDT), "amount")) usdtWithdraw = append(usdtWithdraw, db.Mysql().Sum(&common.WithdrawOrder{}, sqly+sqlWi2+fmt.Sprintf(" and currency_type = %v", common.CurrencyUSDT), "amount")) compair.Withdraw[common.CurrencyUSDT] = usdtWithdraw @@ -470,7 +470,7 @@ func ReviewDataEdit(c *gin.Context) { u["ADFee"] = *req.ADFee if *req.ADFee > 0 { // 计算毛利、roi - profit := call.Rate(common.CurrencyBrazil, data.RechargeTotal*(1000-data.ChannelFee)/1000-data.WithdrawTotal) + profit := call.Rate(common.CurrencyINR, data.RechargeTotal*(1000-data.ChannelFee)/1000-data.WithdrawTotal) u["Profit"] = util.FormatFloat(float64(profit)/common.DecimalDigits, 2) roi := utils.GetPer(profit, *req.ADFee*common.DecimalDigits) u["ROI"] = roi diff --git a/modules/common/timer.go b/modules/common/timer.go index 90718a0..867f1ce 100644 --- a/modules/common/timer.go +++ b/modules/common/timer.go @@ -324,7 +324,7 @@ func ActivitySlotsSettleTimer() { // UID: v.UID, // Time: now.Unix(), // Value: reward, - // Type: common.CurrencyBrazil, + // Type: common.CurrencyINR, // Event: common.CurrencyEventActivitySlots, // NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, reward), // }, @@ -609,7 +609,7 @@ func recordCurrency() { // db.ES().InsertToESGO(common.ESIndexBackDailyData, &common.ESDailySysData{ // Date: date, // Channel: v.ChannelID, - // BRL: brl, + // INR: brl, // USDT: usdt, // }) // } diff --git a/modules/pay/allpay/all.go b/modules/pay/allpay/all.go index 58dab76..23c1729 100644 --- a/modules/pay/allpay/all.go +++ b/modules/pay/allpay/all.go @@ -3,32 +3,67 @@ package allpay import ( "reflect" "server/modules/pay/base" - "server/modules/pay/bfpay" + "server/modules/pay/gopay" "server/modules/pay/grepay" - "server/modules/pay/igeekpay" - "server/modules/pay/luckinpay" - "server/modules/pay/pluspay" + "server/modules/pay/mlpay" + "server/modules/pay/moonpay2" "github.com/liangdas/mqant/log" ) type AllPay struct { - Invalid struct{} - Igeek func(b *base.Base) - Plus func(b *base.Base) - Luckin func(b *base.Base) - BF func(b *base.Base) - Grepay func(b *base.Base) + FunzonePay func(b *base.Base) + WellPay func(b *base.Base) + OctroPay func(b *base.Base) + IGeekPay func(b *base.Base) + CloudPay func(b *base.Base) + VSPay func(b *base.Base) + JoyPay func(b *base.Base) + FFPay func(b *base.Base) + BestPay func(b *base.Base) + HXPay func(b *base.Base) + MGPay func(b *base.Base) + OOPay func(b *base.Base) + ZWPay func(b *base.Base) + FastPay func(b *base.Base) + HaoPay func(b *base.Base) + QPPay func(b *base.Base) + OwlPay func(b *base.Base) + SkyPay func(b *base.Base) + GrePay func(b *base.Base) + MoonPay func(b *base.Base) + AcePay func(b *base.Base) + MccPay func(b *base.Base) + YoduPay func(b *base.Base) + WordPay func(b *base.Base) + HWPay func(b *base.Base) + JJPay func(b *base.Base) + AntPay func(b *base.Base) + MLPay func(b *base.Base) + RojPay func(b *base.Base) + QuantaPay func(b *base.Base) + InnoPay func(b *base.Base) + PePay func(b *base.Base) + FF8Pay func(b *base.Base) + FlaPay func(b *base.Base) + DidaPay func(b *base.Base) + CYGGPay func(b *base.Base) + ZPay func(b *base.Base) + HappyPay func(b *base.Base) + FastPlusPay func(b *base.Base) + GoPay func(b *base.Base) + LemonPay func(b *base.Base) + CamelPay func(b *base.Base) + Moonpay2 func(b *base.Base) } var All = &AllPay{} func init() { - All.Igeek = igeekpay.NewSub - All.Plus = pluspay.NewSub - All.Luckin = luckinpay.NewSub - All.BF = bfpay.NewSub - All.Grepay = grepay.NewSub + All.GoPay = gopay.NewSub + All.Moonpay2 = moonpay2.NewSub + All.GrePay = grepay.NewSub + All.MLPay = mlpay.NewSub } func NewSub(b *base.Base, index int) { diff --git a/modules/pay/base/base.go b/modules/pay/base/base.go index cb539a9..5196bec 100644 --- a/modules/pay/base/base.go +++ b/modules/pay/base/base.go @@ -1,9 +1,12 @@ package base import ( + "bytes" "encoding/json" "errors" "fmt" + "io" + "mime/multipart" "net/http" "net/url" "reflect" @@ -17,31 +20,48 @@ import ( ) type HttpType int +type OPTType int const ( - HttpTypeInvalid = iota + HttpTypeInvalid HttpType = iota HttpTypeJson HttpTypeForm + HttpTypeMultiPartForm + HttpTypeGet // get请求 HttpTypeAll ) +const ( + OPTPay OPTType = iota + 1 + OPTWithdraw + OPTPayCB + OPTWithdrawCB + OPTQueryWithdraw + OPTQueryPay +) + type Base struct { - Channel values.PayWay - PayReq *pb.InnerRechargeReq - WithdrawReq *pb.InnerWithdrawReq - SignKey string - ShouldSignUpper bool - HttpType HttpType - ReqURL string - Opt int // 1支付 2退出 - Status int // 返回的状态 - Resp interface{} - CallbackReq interface{} - CallbackResp CallbackResp - SignPassStr []string // 不参与签名的字段 - WhiteIPs []string // ip白名单 + Channel values.PayWay + PayReq *pb.InnerRechargeReq + WithdrawReq *pb.InnerWithdrawReq + SignKey string + ShouldSignUpper bool + HttpType HttpType + ReqURL string + Opt OPTType // 1支付 2退出 3支付回调 4退出回调 5退出查询 6支付查询 + Status int // 返回的状态 + GetResp url.Values + Resp interface{} + CallbackReq interface{} + CallbackResp CallbackResp + QueryWithdrawResp QueryResp + QueryPayResp QueryResp Sub - C *gin.Context + SubReq func() ([]byte, error) // 特殊处理一些非常规请求 + SubCallbackDecode func([]byte) (string, error) // 特殊处理回调解析的方法 + SignPassStr []string // 不参与签名的字段 + KeyName string // 有时候有些渠道签名字段不一样 + C *gin.Context } type CallbackResp struct { @@ -52,6 +72,13 @@ type CallbackResp struct { Success bool } +type QueryResp struct { + Msg string + OrderID string + APIOrderID string + Status int // 1成功 2失败 3处理中 +} + type Sub interface { PackHeader(header http.Header) // 生成请求头 PackReq() interface{} // 生成支付请求体 @@ -62,9 +89,10 @@ type Sub interface { func NewRechargeBase(req *pb.InnerRechargeReq) *Base { values.PackPay(req) base := &Base{ - Channel: values.PayWay(req.Channel), - PayReq: req, - Opt: 1, + Channel: values.PayWay(req.Channel), + PayReq: req, + Opt: OPTPay, + SignPassStr: []string{"sign"}, } return base } @@ -74,12 +102,30 @@ func NewWithdrawBase(req *pb.InnerWithdrawReq) *Base { base := &Base{ Channel: values.PayWay(req.Channel), WithdrawReq: req, - Opt: 2, + Opt: OPTWithdraw, + } + return base +} + +func NewQueryWithdrawBase(req *pb.InnerWithdrawReq) *Base { + base := &Base{ + Channel: values.PayWay(req.Channel), + WithdrawReq: req, + Opt: OPTQueryWithdraw, + } + return base +} + +func NewQueryPayBase(req *pb.InnerWithdrawReq) *Base { + base := &Base{ + Channel: values.PayWay(req.Channel), + WithdrawReq: req, + Opt: OPTQueryPay, } return base } -func NewCallbackBase(opt int) *Base { +func NewCallbackBase(opt OPTType) *Base { base := &Base{ Opt: opt, } @@ -97,16 +143,27 @@ func (b *Base) PackHeader(header http.Header) { } func (b *Base) Req() ([]byte, error) { + if b.SubReq != nil { + return b.SubReq() + } send := b.Sub.PackReq() - reqData := b.PackReq(send) - log.Debug("Req to:%v,req:%v", b.ReqURL, reqData) - req, err := http.NewRequest("POST", b.ReqURL, strings.NewReader(reqData)) - if err != nil { - log.Error("err:%v", err) + if send == nil { return nil, errors.New("pay fail") } + var req *http.Request + var err error + if b.HttpType == HttpTypeGet { + req, _ = http.NewRequest("GET", b.ReqURL, nil) + } else { + reqData := b.PackReq(send) + req, err = http.NewRequest("POST", b.ReqURL, reqData) + if err != nil { + log.Error("err:%v", err) + return nil, errors.New("pay fail") + } + } b.PackHeader(req.Header) - b.Status = values.Post(req, b.Resp) + b.Status = Request(req, b.Resp) ret, err := b.Sub.GetResp() if err != nil { log.Error("err:%v", err) @@ -116,7 +173,7 @@ func (b *Base) Req() ([]byte, error) { return data, nil } -func (b *Base) PackReq(send interface{}) string { +func (b *Base) PackReq(send interface{}) io.Reader { ref := reflect.ValueOf(send) reft := reflect.TypeOf(send) if ref.Kind() == reflect.Ptr { @@ -126,7 +183,8 @@ func (b *Base) PackReq(send interface{}) string { switch b.HttpType { case HttpTypeJson: reqData, _ := json.Marshal(send) - return string(reqData) + log.Debug("post to:%v,req:%v", b.ReqURL, string(reqData)) + return bytes.NewBuffer(reqData) case HttpTypeForm: data := url.Values{} for i := 0; i < ref.NumField(); i++ { @@ -135,7 +193,20 @@ func (b *Base) PackReq(send interface{}) string { } data.Set(reft.Field(i).Tag.Get("json"), fmt.Sprintf("%v", ref.Field(i).Interface())) } - return data.Encode() + str := data.Encode() + log.Debug("post to:%v,req:%v", b.ReqURL, str) + return strings.NewReader(str) + case HttpTypeMultiPartForm: + data := &bytes.Buffer{} + writer := multipart.NewWriter(data) + for i := 0; i < ref.NumField(); i++ { + if ref.Field(i).IsZero() { + continue + } + writer.WriteField(reft.Field(i).Tag.Get("json"), fmt.Sprintf("%v", ref.Field(i).Interface())) + } + log.Debug("post to:%v,req:%v", b.ReqURL, data.String()) + return data } - return "" + return nil } diff --git a/modules/pay/base/callback.go b/modules/pay/base/callback.go index fd5eef8..ee8f214 100644 --- a/modules/pay/base/callback.go +++ b/modules/pay/base/callback.go @@ -3,49 +3,31 @@ package base import ( "encoding/json" "io" - "net" "net/http" + "net/url" "reflect" "server/call" "server/common" "server/db" "server/modules/pay/values" - "strings" "github.com/gin-gonic/gin" "github.com/liangdas/mqant/log" - iptool "github.com/liangdas/mqant/utils/ip" ) func (b *Base) PayCallback(c *gin.Context) { - b.C = c - if len(b.WhiteIPs) > 0 { - ip := iptool.RealIP(c.Request) - if strings.Contains(ip, ":") { - ip, _, _ = net.SplitHostPort(ip) - } - white := false - for _, v := range b.WhiteIPs { - if v == ip { - white = true - break - } - } - if !white { - return - } - } - var str string - var err error - if b.HttpType == HttpTypeJson { - str, err = b.CallbackJson(c) - } else if b.HttpType == HttpTypeForm { - str, err = b.CallbackForm(c) - } + str, err := b.Callback(c) defer func() { c.String(http.StatusOK, b.CallbackResp.Msg) }() - if err != nil || !b.CheckSign(str) { + if err != nil { + log.Error("err:%v", err) + b.CallbackResp.Msg = "callback fail" + return + } + b.C = c + if !b.CheckSign(str) { + log.Error("check sign fail") b.CallbackResp.Msg = "callback fail" return } @@ -71,18 +53,18 @@ func (b *Base) PayCallback(c *gin.Context) { } func (b *Base) WithdrawCallback(c *gin.Context) { - b.C = c - var str string - var err error - if b.HttpType == HttpTypeJson { - str, err = b.CallbackJson(c) - } else if b.HttpType == HttpTypeForm { - str, err = b.CallbackForm(c) - } + str, err := b.Callback(c) defer func() { c.String(http.StatusOK, b.CallbackResp.Msg) }() - if err != nil || !b.CheckSign(str) { + if err != nil { + log.Error("err:%v", err) + b.CallbackResp.Msg = "callback fail" + return + } + b.C = c + if !b.CheckSign(str) { + log.Error("check sign fail") b.CallbackResp.Msg = "callback fail" return } @@ -93,6 +75,10 @@ func (b *Base) WithdrawCallback(c *gin.Context) { log.Error("order:%v not exist", orderID) return } + if or.PayChannel != int(b.Channel) { + log.Error("order:%v,pay channel:%v,this channel:%v", orderID, or.PayChannel, b.Channel) + return + } if or.APIPayID == "" { or.APIPayID = b.CallbackResp.APIOrderID } @@ -107,10 +93,23 @@ func (b *Base) WithdrawCallback(c *gin.Context) { b.CallbackResp.Msg = "callback fail" return } + if !success { + values.WithdrawAmount(values.PayWay(or.PayChannel), false, or.Amount*100) + } +} + +func (b *Base) Callback(c *gin.Context) (str string, err error) { + if b.HttpType == HttpTypeJson { + str, err = b.CallbackJson(c) + } else if b.HttpType == HttpTypeForm { + str, err = b.CallbackForm(c) + } else if b.HttpType == HttpTypeGet { + str, err = b.CallbackGet(c) + } + return } func (b *Base) CallbackJson(c *gin.Context) (str string, err error) { - log.Debug("CallbackJson:%+v", *c.Request) var tmp []byte tmp, err = io.ReadAll(c.Request.Body) defer func() { @@ -121,7 +120,10 @@ func (b *Base) CallbackJson(c *gin.Context) (str string, err error) { return } str = string(tmp) - log.Debug("CallbackJson body:%v", str) + log.Debug("Callback body:%v", str) + if b.SubCallbackDecode != nil { + return b.SubCallbackDecode(tmp) + } err = json.Unmarshal(tmp, b.CallbackReq) if err != nil { log.Error("err:%v", err) @@ -131,12 +133,39 @@ func (b *Base) CallbackJson(c *gin.Context) (str string, err error) { } func (b *Base) CallbackForm(c *gin.Context) (str string, err error) { + if err = c.ShouldBind(b.CallbackReq); err != nil { + return "", err + } + // req := b.CallbackReq + // typ := reflect.TypeOf(req).Elem() + // val := reflect.ValueOf(req).Elem() + // for i := 0; i < typ.NumField(); i++ { + // if val.Field(i).Kind() == reflect.Int64 { + // tmp, _ := strconv.ParseInt(c.Query(typ.Field(i).Tag.Get("json")), 10, 64) + // val.Field(i).SetInt(tmp) + // } else { + // val.Field(i).SetString(c.Query(typ.Field(i).Tag.Get("json"))) + // } + // } + str = values.GetSignStrForm(c, b.SignPassStr...) + return +} + +func (b *Base) CallbackGet(c *gin.Context) (str string, err error) { + raw, err := url.ParseQuery(c.Request.URL.RawQuery) + if err != nil { + log.Error("err:%v", err) + } + b.GetResp = raw req := b.CallbackReq typ := reflect.TypeOf(req).Elem() val := reflect.ValueOf(req).Elem() for i := 0; i < typ.NumField(); i++ { - val.Field(i).SetString(c.PostForm(typ.Field(i).Tag.Get("json"))) + if val.Field(i).Kind() != reflect.String { + continue + } + val.Field(i).SetString(b.GetResp.Get(typ.Field(i).Tag.Get("json"))) } - str = values.GetSignStrForm(c, b.SignPassStr...) + str = GetSignStrGet(b.GetResp, "sign") return } diff --git a/modules/pay/base/http.go b/modules/pay/base/http.go new file mode 100644 index 0000000..69cfe9d --- /dev/null +++ b/modules/pay/base/http.go @@ -0,0 +1,36 @@ +package base + +import ( + "encoding/json" + "io/ioutil" + "net/http" + "time" + + "github.com/liangdas/mqant/log" +) + +// status=1时,属于不知道第三方是什么情况的报错,不能当成业务中断 +// status=0时,可以根据返回判断是否是业务错误 +func Request(req *http.Request, ret interface{}) int { + client := &http.Client{ + Timeout: 30 * time.Second, + Transport: &http.Transport{ + DisableKeepAlives: true, + }, + } + req.Close = true + log.Debug("req:%+v", req) + resp, err := client.Do(req) + if err != nil { + log.Error("http post call err:%v", err) + return 1 + } + defer resp.Body.Close() + body, _ := ioutil.ReadAll(resp.Body) + log.Debug("response Body:%v", string(body)) + if err := json.Unmarshal(body, ret); err != nil { + log.Error("unmarshal fail err:%v", err) + return 1 + } + return 0 +} diff --git a/modules/pay/base/signaes.go b/modules/pay/base/signaes.go new file mode 100644 index 0000000..328cffa --- /dev/null +++ b/modules/pay/base/signaes.go @@ -0,0 +1,148 @@ +package base + +import ( + "bytes" + "crypto/aes" + "crypto/cipher" + "crypto/hmac" + "crypto/sha512" + "encoding/base64" + "encoding/hex" + "strings" + + "github.com/liangdas/mqant/log" +) + +func SignCBC(dataStr string, key []byte, iv ...byte) string { + data := []byte(dataStr) + // 创建cipher.Block接口 + block, err := aes.NewCipher(key) + if err != nil { + return "" + } + // 填充 + blockSize := block.BlockSize() + if iv == nil { + iv = make([]byte, blockSize) + } + data = pad(data, blockSize) + // CBC模式加密 + ciphertext := make([]byte, len(data)) + mode := cipher.NewCBCEncrypter(block, iv) + mode.CryptBlocks(ciphertext, data) + + return base64.StdEncoding.EncodeToString(ciphertext) +} + +func SignCBCDecode(dataStr string, key []byte, iv ...byte) string { + data, err := base64.StdEncoding.DecodeString(dataStr) + if err != nil { + log.Error("err:%v", err) + return "" + } + // + // 创建cipher.Block接口 + block, err := aes.NewCipher(key) + if err != nil { + log.Error("err:%v", err) + return "" + } + // 填充 + blockSize := block.BlockSize() + if iv == nil { + iv = make([]byte, blockSize) + } + + // CBC模式加密 + mode := cipher.NewCBCDecrypter(block, iv) + ciphertext := make([]byte, len(data)) + mode.CryptBlocks(ciphertext, data) + + return string(ciphertext) +} + +func SignCBCBase64(data string, okey string, aesIv string) string { + // 将Base64编码的密钥解码 + key, err := base64.StdEncoding.DecodeString(okey) + if err != nil { + return "" + } + + // 创建AES加密算法实例 + block, err := aes.NewCipher(key) + if err != nil { + return "" + } + + // 将Base64编码的IV解码 + iv, err := base64.StdEncoding.DecodeString(aesIv) + if err != nil { + return "" + } + + // 创建CBC加密模式实例 + mode := cipher.NewCBCEncrypter(block, iv) + + // 对数据进行填充操作 + paddedData := pad([]byte(data), block.BlockSize()) + + // 加密数据 + encryptedData := make([]byte, len(paddedData)) + mode.CryptBlocks(encryptedData, paddedData) + + // 将加密结果进行Base64编码 + encodedResult := base64.StdEncoding.EncodeToString(encryptedData) + + return encodedResult +} + +func pad(data []byte, blockSize int) []byte { + padLen := blockSize - len(data)%blockSize + padding := bytes.Repeat([]byte{byte(padLen)}, padLen) + return append(data, padding...) +} + +func GetApiCheckSum(saltKey string, dataString string) string { + saltKeyBytes := []byte(saltKey) + saltKeyEncoded := base64.StdEncoding.EncodeToString(saltKeyBytes) + hash := hmac.New(sha512.New, []byte(saltKeyEncoded)) + hash.Write([]byte(dataString)) + hashValue := hash.Sum(nil) + hashValueHex := hex.EncodeToString(hashValue) + hashValueHex = strings.ToUpper(hashValueHex) + return hashValueHex +} + +func SignCBCBase64Decode(data string, okey string, aesIv string) string { + d, err := base64.StdEncoding.DecodeString(data) + if err != nil { + log.Error("err:%v", err) + return "" + } + key, err := base64.StdEncoding.DecodeString(okey) + if err != nil { + log.Error("err:%v", err) + return "" + } + iv, err := base64.StdEncoding.DecodeString(aesIv) + if err != nil { + log.Error("err:%v", err) + return "" + } + block, err := aes.NewCipher(key) // 分组秘钥 + if err != nil { + log.Error("err:%v", err) + return "" + } + blockMode := cipher.NewCBCDecrypter(block, iv) // 加密模式 + blockMode.CryptBlocks(d, d) // 解密 + d = pkcs5UnPadding(d) // 去除补全码 + + return string(d) +} + +func pkcs5UnPadding(origData []byte) []byte { + length := len(origData) + unpadding := int(origData[length-1]) + return origData[:(length - unpadding)] +} diff --git a/modules/pay/base/signmd5.go b/modules/pay/base/signmd5.go index f38bfa3..82a5935 100644 --- a/modules/pay/base/signmd5.go +++ b/modules/pay/base/signmd5.go @@ -7,7 +7,11 @@ import ( func (b *Base) SignMD5(send interface{}) string { signStr := GetSignStr(send) - signStr += "&key=" + b.SignKey + if b.KeyName == "" { + signStr += "&key=" + b.SignKey + } else { + signStr += "&" + b.KeyName + "=" + b.SignKey + } ret := util.CalculateMD5(signStr) if b.ShouldSignUpper { ret = strings.ToUpper(ret) diff --git a/modules/pay/base/util.go b/modules/pay/base/util.go index 6e15ece..414a5a3 100644 --- a/modules/pay/base/util.go +++ b/modules/pay/base/util.go @@ -1,21 +1,67 @@ package base import ( + "crypto/sha512" + "encoding/json" "fmt" + "net/url" "reflect" "sort" "strings" + "github.com/gin-gonic/gin" "github.com/liangdas/mqant/log" ) -func GetSignStr(send interface{}) string { +func GetSignStr(send interface{}, pass ...string) string { m := StructToMapJson(send) str := []string{} for i := range m { if i == "sign" { continue } + shouldPass := false + for _, v := range pass { + if v == i { + shouldPass = true + break + } + } + if shouldPass { + continue + } + str = append(str, i) + } + sort.Strings(str) + signStr := "" + for i, v := range str { + signStr += fmt.Sprintf("%v=%v", v, m[v]) + if i != len(str)-1 { + signStr += "&" + } + } + log.Debug("signStr:%s", signStr) + return signStr +} + +// 包含空字段 +func GetSignStrEmpty(send interface{}, pass ...string) string { + m := StructToMapJsonEmpty(send) + str := []string{} + for i := range m { + if i == "sign" { + continue + } + shouldPass := false + for _, v := range pass { + if v == i { + shouldPass = true + break + } + } + if shouldPass { + continue + } str = append(str, i) } sort.Strings(str) @@ -30,6 +76,35 @@ func GetSignStr(send interface{}) string { return signStr } +// 连接参数时不加&符号,且不加key值,直接value拼接 +func GetSignStr2(send interface{}, pass ...string) string { + m := StructToMapJson(send) + str := []string{} + for i := range m { + if i == "sign" { + continue + } + shouldPass := false + for _, v := range pass { + if v == i { + shouldPass = true + break + } + } + if shouldPass { + continue + } + str = append(str, i) + } + sort.Strings(str) + signStr := "" + for _, v := range str { + signStr += fmt.Sprintf("%v", m[v]) + } + log.Debug("signStr:%s", signStr) + return signStr +} + func StructToMapJson(obj interface{}) map[string]interface{} { t := reflect.TypeOf(obj) v := reflect.ValueOf(obj) @@ -55,3 +130,182 @@ func StructToMapJson(obj interface{}) map[string]interface{} { return result } + +func StructToMapJsonEmpty(obj interface{}) map[string]interface{} { + t := reflect.TypeOf(obj) + v := reflect.ValueOf(obj) + if t.Kind() == reflect.Ptr { + t = t.Elem() + v = v.Elem() + } + var result = make(map[string]interface{}) + for i := 0; i < t.NumField(); i++ { + if v.Field(i).Kind() == reflect.Ptr && v.Field(i).IsNil() { + continue + } + tagName := t.Field(i).Tag.Get("json") + if tagName != "" && tagName != "-" { + data := v.Field(i).Interface() + if v.Field(i).Kind() == reflect.Struct { + data = GetSignStr(data) + } + name := strings.Split(tagName, ",") + result[name[0]] = data + } + } + + return result +} + +// 根据body里的字段直接拼接出签名字符串(去除null) +func GetSignStrNull(str string, pass ...string) string { + m := map[string]json.RawMessage{} + sortStrs := []string{} + json.Unmarshal([]byte(str), &m) + for i := range m { + sortStrs = append(sortStrs, i) + } + signStr := "" + sort.Strings(sortStrs) + for _, v := range sortStrs { + shouldPass := false + for _, s := range pass { + if v == s { + shouldPass = true + break + } + } + if shouldPass { + continue + } + if len(m[v]) > 1 && m[v][0] == 34 { + m[v] = m[v][1 : len(m[v])-1] + } + if len(m[v]) == 0 || string(m[v]) == "null" { + continue + } + signStr += fmt.Sprintf("%v=%v", v, string(m[v])) + signStr += "&" + } + signStr = signStr[:len(signStr)-1] + log.Debug("signStr:%v", signStr) + return signStr +} + +func SHA512(data string) string { + hash := sha512.Sum512([]byte(data)) + return fmt.Sprintf("%x", hash) +} + +func GetSignStrGet(vals url.Values, pass ...string) string { + sortStrs := []string{} + for k := range vals { + sortStrs = append(sortStrs, k) + } + signStr := "" + sort.Strings(sortStrs) + for _, v := range sortStrs { + shouldPass := false + for _, s := range pass { + if v == s { + shouldPass = true + break + } + } + if shouldPass { + continue + } + if len(vals.Get(v)) == 0 { + continue + } + signStr += fmt.Sprintf("%v=%v", v, vals.Get(v)) + signStr += "&" + } + signStr = signStr[:len(signStr)-1] + log.Debug("signStr:%v", signStr) + return signStr +} + +func GetSignStrFormURLEncode(c *gin.Context, model interface{}, pass ...string) string { + sortStrs := []string{} + for k := range c.Request.URL.Query() { + sortStrs = append(sortStrs, k) + } + // ref := reflect.ValueOf(model) + reft := reflect.TypeOf(model) + if reft.Kind() == reflect.Ptr { + // ref = ref.Elem() + reft = reft.Elem() + } + signStr := "" + sort.Strings(sortStrs) + for _, v := range sortStrs { + shouldPass := false + for _, s := range pass { + if v == s { + shouldPass = true + break + } + } + if shouldPass { + continue + } + param := c.Query(v) + if len(param) == 0 { + continue + } + first := v[0] + tmpName := strings.ToUpper(string(first)) + v[1:] + field, ok := reft.FieldByName(tmpName) + if ok && field.Tag.Get("encode") == "1" { // 需要urlencode + param, _ = url.QueryUnescape(param) + } + + signStr += fmt.Sprintf("%v=%v", v, param) + signStr += "&" + } + fmt.Println(signStr) + signStr = signStr[:len(signStr)-1] + log.Debug("signStr:%v", signStr) + return signStr +} + +// 根据body里的字段直接拼接出签名字符串 +func GetSignStrURLEncode(str string, pass ...string) string { + sortStrs := []string{} + all, err := url.ParseQuery(str) + if err != nil { + log.Error("err:%e", err) + return "" + } + for k := range all { + sortStrs = append(sortStrs, k) + } + + signStr := "" + sort.Strings(sortStrs) + for _, v := range sortStrs { + shouldPass := false + for _, s := range pass { + if v == s { + shouldPass = true + break + } + } + if shouldPass { + continue + } + tmp := all.Get(v) + if len(tmp) > 1 && tmp[0] == 34 { + tmp = tmp[1 : len(tmp)-1] + } + if len(tmp) == 0 { + continue + } + signStr += fmt.Sprintf("%v=%v", v, string(tmp)) + signStr += "&" + } + signStr = signStr[:len(signStr)-1] + log.Debug("signStr:%v", signStr) + return signStr +} diff --git a/modules/pay/bfpay/base.go b/modules/pay/bfpay/base.go deleted file mode 100644 index 8e16ab9..0000000 --- a/modules/pay/bfpay/base.go +++ /dev/null @@ -1,181 +0,0 @@ -package bfpay - -import ( - "encoding/json" - "errors" - "fmt" - "net/http" - "server/common" - "server/modules/pay/base" - "server/modules/pay/values" - "server/pb" - "server/util" - "strings" - "time" - - "github.com/gogo/protobuf/proto" - "github.com/liangdas/mqant/log" -) - -func NewSub(b *base.Base) { - sub := &Sub{ - Base: b, - } - b.SignKey = key - b.HttpType = base.HttpTypeJson - b.ShouldSignUpper = false - if b.Opt == 1 { - b.Resp = new(PayResp) - b.ReqURL = baseURL + payURL - } else if b.Opt == 2 { - b.Resp = new(WithdrawResp) - b.ReqURL = baseURL + withdrawURL - } else if b.Opt == 3 { - b.SignPassStr = []string{"sign"} - b.CallbackResp.Msg = "SUCCESS" - b.CallbackReq = new(PayCallbackReq) - } else if b.Opt == 4 { - b.SignPassStr = []string{"sign", "msg"} - b.CallbackResp.Msg = "SUCCESS" - b.CallbackReq = new(WithdrawCallbackReq) - } - b.Sub = sub -} - -type Sub struct { - Base *base.Base -} - -func (s *Sub) PackHeader(header http.Header) { - // header.Set("mchtId", mid) - // header.Set("version", "20") - // if s.Base.Opt == 1 { - // header.Set("biz", "bq102") - // } else if s.Base.Opt == 2 { - // header.Set("biz", "df104") - // } -} - -func (s *Sub) PackReq() interface{} { - if s.Base.Opt == 1 { - return s.PackPayReq() - } - return s.PackWithdrawReq() -} - -func (s *Sub) GetResp() (proto.Message, error) { - if s.Base.Opt == 1 { - resp := s.Base.Resp.(*PayResp) - if resp.Head.RespCode != "0000" || resp.Body.PayUrl == "" { - return nil, errors.New("pay fail") - } - return &pb.InnerRechargeResp{APIOrderID: resp.Body.TradeId, URL: resp.Body.PayUrl, Channel: uint32(values.BFPay)}, nil - } - resp := s.Base.Resp.(*WithdrawResp) - if s.Base.Status == 0 && resp.Head.RespCode != "0000" { - return nil, errors.New("withdraw fail") - } - withdrawRespBody := &WithdrawRespBody{} - err := Decode(resp.Body, withdrawRespBody) - if err != nil { - log.Error("err:%v", err) - } - return &pb.InnerWithdrawResp{APIOrderID: withdrawRespBody.TradeId, Channel: uint32(values.BFPay)}, nil -} - -func (s *Sub) PackPayReq() interface{} { - r := s.Base.PayReq - send := &PayReq{ - Head: Head{ - MchtId: mid, - Version: "20", - Biz: "bq101", - }, - - Body: Body{ - OrderId: r.OrderID, - OrderTime: time.Now().Format("20060102150405"), - Amount: fmt.Sprintf("%d", r.Amount/1e6), - CurrencyType: "BRL", - Goods: "baxipix", - NotifyUrl: values.GetPayCallback(values.BFPay), - CallBackUrl: values.GetFrontCallback(), - }, - } - send.Sign = s.Base.SignMD5(send.Body) - return send -} - -func (s *Sub) PackWithdrawReq() interface{} { - r := s.Base.WithdrawReq - if common.PayType(r.PayType) == common.PayTypeCPF { - r.Number = strings.ReplaceAll(r.Number, "-", "") - r.Number = strings.ReplaceAll(r.Number, ".", "") - } - send := &WithdrawReq{ - Head: Head{ - MchtId: mid, - Version: "20", - Biz: "df104", - }, - } - amount := fmt.Sprintf("%d", r.Amount/1e6) - withdrawReqBody := WithdrawBody{ - BatchOrderNo: r.OrderID, - TotalNum: 1, - TotalAmount: amount, - NotifyUrl: values.GetWithdrawCallback(values.BFPay), - CurrencyType: "BRL", - } - detail := []Detail{{ - Seq: "0", - Amount: amount, - AccType: "0", - CertType: fmt.Sprintf("%d", r.PayType-1), - CertId: r.Number, - BankCardName: r.Name, - }} - withdrawReqBody.Detail = detail - jsonStr, _ := json.Marshal(withdrawReqBody) - encodeStr := string(jsonStr) - log.Debug("encodeStr:%s", encodeStr) - send.Body = Encode(encodeStr) - return send -} - -func (s *Sub) CheckSign(str string) bool { - // signStr := values.GetSignStr(str, "sign") - s.Base.CallbackResp.Msg = "success" - if s.Base.Opt == 3 { - req := s.Base.CallbackReq.(*PayCallbackReq) - log.Debug("checkSign pay:%+v", *req) - s.Base.CallbackResp.OrderID = req.Body.OrderId - s.Base.CallbackResp.Success = req.Body.Status == "SUCCESS" - return util.CalculateMD5(base.GetSignStr(req.Body)+"&key="+key) == req.Sign - } - req := s.Base.CallbackReq.(*WithdrawCallbackReq) - log.Debug("checkSign withdraw:%+v", *req) - if req.Head.RespCode != "0000" { - return false - } - withdrawCallbackBody := &WithdrawCallbackBody{} - err := Decode(req.Body, withdrawCallbackBody) - if err != nil { - log.Error("err:%v", err) - return false - } - log.Debug("withdrawCallbackBody:%+v", withdrawCallbackBody) - if len(withdrawCallbackBody.Detail) == 0 { - return false - } - detail := withdrawCallbackBody.Detail[0] - if detail.Status == "AUDIT_DOING" || detail.Status == "AUDIT_SUCCESS" || detail.Status == "COMMITTED" || detail.Status == "COMMITTED_SUCCESS" || - detail.Status == "DOING" { - return false - } - s.Base.CallbackResp.OrderID = withdrawCallbackBody.BatchOrderNo - s.Base.CallbackResp.Success = detail.Status == "SUCCESS" - s.Base.CallbackResp.APIOrderID = withdrawCallbackBody.TradeId - s.Base.CallbackResp.FailMessage = req.Head.RespMsg - return true -} diff --git a/modules/pay/bfpay/values.go b/modules/pay/bfpay/values.go deleted file mode 100644 index 851febf..0000000 --- a/modules/pay/bfpay/values.go +++ /dev/null @@ -1,250 +0,0 @@ -package bfpay - -import ( - "encoding/json" - "net/url" - "server/util" - - "github.com/liangdas/mqant/log" -) - -const ( - baseURL = "https://brl.bf-pay.com" - payURL = "/gateway/api/commPay" - withdrawURL = "/df/gateway/proxyrequest" - mid = "2000611000770152" - key = "afca030583d24e6faceceed3cddff3c9" -) - -var privateKeyPkCs8 = []byte(`-----BEGIN RSA PRIVATE KEY----- -MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJ5hQDWLXdURqCIc -Er3ID1D/ovQw2K+UaXP4vJ5t8d56gzFitOeCx92Qeu4wO8rINH599AZyiO3HuQM+ -P7ueBqJyDmv/vOAOld+PwiTk42DVHlEj/h9kuGXV8vZfsU6BhgNGlq9bsSn0olbM -kz2WX8Qw2CRnGbMZvYK73yEl83E1AgMBAAECgYA+9p6WKs+k0x4qYUq6E/yy0M4x -kfGy66d4qVwjB8ZuEfpx+bG9j+pxFO0qIBbFKQ5lcyE+Ju50yT+uIGMp7UrpTYuX -aU55OVFrUaLAt/XeyaKcOSPB9xK+ObRnKUrZ92FN/PU/tHkaRjFxPaNiZGqwbBcQ -RdtcHpo/ZkooRvbWyQJBAM/tLpvLIwnC6Gi8JhGunSDwZFxbLyLW/S3x4b6S0IaC -Uor/AsplshWs8VQ0L0edyShnyYcFpxw4t5oP0RtHCaMCQQDC/30hiwPJMfRZ/6oF -ljV4nyN47rQssHG2EYo/HfL7tZn+URlcZ5oSSoM2Qe6cmzg4Vaoo+CRWwKbjsh/n -d3dHAkA2uAV/DHuBEyEUhwdBugEx7PGMeJa0BX4FfFVbUMm9zEgquiei2hZ+q8+q -yDz1DOomTwHzHaK3w5lV2vm9wvkfAkA7or1XI9e9kWyElb8exEiIIktL8dziiffM -0eJw2Sz1tB1rfMv/yaOCEo28az+ZX5M7D1/h9bnPWk3v9wrw1EWDAkBZNzIZ47TS -Mj9ipSQDsSklZYPGquqlRsjRm7OcDZXC7zW6qs3mTPPuISRuMVhmFr3Lz3YMT1o/ -S0Agrn9Dq3fM ------END RSA PRIVATE KEY-----`) - -// var privateKey = []byte(`-----BEGIN RSA PRIVATE KEY----- -// MIICXgIBAAKBgQDgIesHgi+Qj0kkhwvJdGzt/QZDYR8VFzDxVgt5KdA8Ec1WCrhv -// GrmIEF2aKaqnPesv4/xn/0cLrXizYnF7wbgy/rrSzDmbWKEB6GZZc8Xz9iTxqoDT -// 2TpZclSUwKjeicdnw35PDGdBKKCbfLJeg9pXMs/L9VnY/QtDp03a3760owIDAQAB -// AoGBANQkZoA54elzJej0Bd0NXNk5x8bY04Gz7LhRGBT71cQ1mWQaS42l/vvheack -// TwlzGvu+UDbjMgzEid1IjV908XFVAnmJQxFxsHJt3HUz9qK5caXtqzwqP7Vt0Bl/ -// Nt7wXhn1xq9gljLRuVV9+MoaF6punFuksqp4Qh/AAZ/zGVcJAkEA/ITUGawSY+AX -// Gz1uAYadEnkA/Ce1rk/uL5OCSHxIvBLL3DmFp68E7+NTwyf2ilsnB0jtqOgBqrZ8 -// KoVfUjsxtwJBAOM46RGxijUhcDEoIZYUE+M+ugWskekdpwq4W9y1sNFULUjdXkwn -// UKeSlwTis8zFCw8mkZDOgNQzRsd0eFjm5HUCQQCt2MipD/TtO7bMsyML++Ahepr5 -// /mCvLCpAKN62BpKQoKQm7pcclXrhqHDfV6D9KboZ4tRzx552KAIdyAqS81vLAkB7 -// CVLy+L7MvDmC9KcTG/YU499YuTQdFahg3qknXt7Kypjmzq+D7vn2cyMBSzxu0feG -// Ea1ayubpgIZ/9CpCgWwNAkEA+f/5Ilnb3Dn9fRhGAuhttUIA9+vec3BH6rKc9oW/ -// JvLtLxuSpfg2D2D74nsZd48OVk+BJ0DqVeMb7sw6zjzH9A== -// -----END RSA PRIVATE KEY-----`) -var publicKey = []byte(`-----BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrTw3IoR3Q6oRukb6q0LR6dc/GRXVh0ngRPZzRsq87j6817v4HNjfsf2gYkefWK3AcEGyZT7uqji1C0drDfVy82HE68hYjmxgyXQO2YRjNZkYNHNPHD9EO4y5fr4qQsSMCYA1a7fgWqbqZiGPQgCSUvrpbFbJh53QxOWqpkrKoowIDAQAB-----END PUBLIC KEY-----`) -var myPublicKey = []byte(`-----BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCeYUA1i13VEagiHBK9yA9Q/6L0 -MNivlGlz+LyebfHeeoMxYrTngsfdkHruMDvKyDR+ffQGcojtx7kDPj+7ngaicg5r -/7zgDpXfj8Ik5ONg1R5RI/4fZLhl1fL2X7FOgYYDRpavW7Ep9KJWzJM9ll/EMNgk -ZxmzGb2Cu98hJfNxNQIDAQAB ------END PUBLIC KEY-----`) - -// Head represents the header of the request -type Head struct { - MchtId string `json:"mchtId"` // 商户编号,不参与签名 - Version string `json:"version"` // 固定值“20”,不参与签名 - Biz string `json:"biz"` // 固定值,支付方式,不参与签名 -} - -// Body represents the body of the request -type Body struct { - OrderId string `json:"orderId"` // 订单号 - OrderTime string `json:"orderTime"` // 订单时间yyyyMMddHHmmss - Amount string `json:"amount"` // 总金额,以分为单位 - CurrencyType string `json:"currencyType"` // 货币种类,三位字母代码 - Goods string `json:"goods"` // 商品名称(不要带中文元素) - NotifyUrl string `json:"notifyUrl"` // 接收推送通知的URL - CallBackUrl string `json:"callBackUrl"` // 网页回调地址 - Desc string `json:"desc,omitempty"` // 商品描述,logo地址 - AppId string `json:"appId,omitempty"` // 产品标识 - AppName string `json:"appName,omitempty"` // 产品名称 - Operator string `json:"operator,omitempty"` // 印度UPI支付,用户的VPA账号 - ExpireTime string `json:"expireTime,omitempty"` // 订单超时时间yyyyMMddHHmmss - IP string `json:"ip,omitempty"` // 请求IP地址 - Param string `json:"param,omitempty"` // 保留字段 - UserId string `json:"userId,omitempty"` // 要求:小于32位 - Phone string `json:"phone,omitempty"` // 手机号(币种是BRL,USDT,THB,PHP,USD,此参数可不传) - Name string `json:"name,omitempty"` // 姓名(币种是BRL,USDT,THB,PHP,USD,此参数可不传) - Email string `json:"email,omitempty"` // 邮箱(币种是BRL,USDT,THB,PHP,USD,此参数可不传) -} - -type PayReq struct { - Head Head `json:"head"` - Body Body `json:"body"` - Sign string `json:"sign"` // 签名信息 -} - -type PayResp struct { - Head struct { - RespCode string `json:"respCode"` // 返回Code - RespMsg string `json:"respMsg"` // 返回信息 - } `json:"head"` // 响应报文头 - Body struct { - MchtId string `json:"mchtId"` // 商户ID - OrderId string `json:"orderId"` // 商户订单号 - PayUrl string `json:"payUrl"` // 支付URL地址 - TradeId string `json:"tradeId,omitempty"` // 支付平台返回的交易流水号 - Param string `json:"param,omitempty"` // 保留字段 - } `json:"body,omitempty"` // 响应报文体, 在respCode为"0000"时返回 - Sign string `json:"sign"` // 签名信息 -} - -type PayCallbackReq struct { - Head struct { - RespCode string `json:"respCode"` // 返回Code - RespMsg string `json:"respMsg"` // 返回信息 - } `json:"head"` // 响应报文头 - Body struct { - Amount string `json:"amount"` // 金额 - Biz string `json:"biz"` // 业务类型 - ChargeTime string `json:"chargeTime"` // 充值时间 - MchtId string `json:"mchtId"` // 商户ID - OrderId string `json:"orderId"` // 商户订单号 - Seq string `json:"seq"` // 序号 - Status string `json:"status"` // 状态 - TradeId string `json:"tradeId"` // 交易流水号 - PayType string `json:"payType"` // 支付类型 - } `json:"body"` // 响应报文体 - Sign string `json:"sign"` // 签名信息 -} - -type WithdrawReq struct { - Head Head `json:"head"` - Body string `json:"body"` -} - -type WithdrawBody struct { - BatchOrderNo string `json:"batchOrderNo"` // 商户代付批次号,值唯一 - TotalNum int `json:"totalNum"` // 商户代付笔数,与detail代付明细集合数一致 - TotalAmount string `json:"totalAmount"` // 商户代付总金额,单位:分,为detail代付明细集合中金额总和 - NotifyUrl string `json:"notifyUrl,omitempty"` // 异步通知地址 - Detail []Detail `json:"detail"` // 代付订单明细,Json数组格式 - // AppId string `json:"appId,omitempty"` // 产品Id - CurrencyType string `json:"currencyType"` // 币种BRL -} - -type Detail struct { - Seq string `json:"seq"` // 序号,商户自定义 - Amount string `json:"amount"` // 金额,单位:分 - AccType string `json:"accType"` // 固定值 0 - CertType string `json:"certType"` // PIX账号类型或银行卡代付固定值 - CertId string `json:"certId"` // PIX账号或银行卡相关值 - // BankCardNo string `json:"bankCardNo,omitempty"` // 收款人的CPF或CNPJ(PIX代付必填) - BankCardName string `json:"bankCardName"` // 收款用户姓名 - // BankCode string `json:"bankCode,omitempty"` // 银行编码(银行卡代付时必传) - // Mobile string `json:"mobile,omitempty"` // 银行账户绑定的手机号码 - // Email string `json:"email,omitempty"` // 邮箱 - // BankCardType string `json:"bankCardType,omitempty"` // 银行卡类型,1:借记卡2:信用卡 - // CreditValid string `json:"creditValid,omitempty"` // 信用卡有效期,MMyy(信用卡时必填) - // CreditCvv string `json:"creditCvv,omitempty"` // 卡背面后3位数字(信用卡时必填) - // BankProvince string `json:"bankProvince,omitempty"` // 开户行所属省份 - // BankCity string `json:"bankCity,omitempty"` // 开户行所属市 - // BankLineCode string `json:"bankLineCode,omitempty"` // 联行号 - // BankName string `json:"bankName,omitempty"` // 银行名称 - // Remark string `json:"remark,omitempty"` // 备注 - // FirstName string `json:"firstName,omitempty"` // 收款人名 - // LastName string `json:"lastName,omitempty"` // 收款人姓 - // CardYear string `json:"cardYear,omitempty"` // 卡年份 - // CardMonth string `json:"cardMonth,omitempty"` // 卡月份 -} - -type WithdrawResp struct { - Head struct { - RespCode string `json:"respCode"` // 返回Code - } `json:"head"` // 响应报文头 - Body string `json:"body,omitempty"` // 响应报文体,以字符串表示 - Sign string `json:"sign,omitempty"` // 签名信息,假设存在时 -} - -type WithdrawRespBody struct { - Status string `json:"status"` // 订单受理状态 - TradeId string `json:"tradeId"` // 平台批次号 - BatchOrderNo string `json:"batchOrderNo"` // 商户批次号 - MchtId string `json:"mchtId"` // 商户编号 - Desc string `json:"desc,omitempty"` // 描述, 可选字段 -} - -type WithdrawCallbackReq struct { - Head struct { - RespCode string `json:"respCode"` // 返回Code - RespMsg string `json:"respMsg"` // 返回信息 - } `json:"head"` // 响应报文头 - Body string `json:"body,omitempty"` // 响应报文体,以字符串表示 - Sign string `json:"sign,omitempty"` // 签名信息,假设存在时 -} - -type WithdrawCallbackBody struct { - BatchOrderNo string `json:"batchOrderNo"` // 商户批次号 - TradeId string `json:"tradeId"` // 平台批次号 - TotalNum string `json:"totalNum"` // 代付笔数 - TotalAmount string `json:"totalAmount"` // 代付总金额 - Status string `json:"status"` // 状态 - Desc string `json:"desc,omitempty"` // 结果描述,可选字段 - Detail []WithdrawCallbackDetail `json:"detail"` // 代付明细订单详情 - -} - -type WithdrawCallbackDetail struct { - DetailId string `json:"detailId"` // 平台明细号 - Seq string `json:"seq"` // 序号 - Amount string `json:"amount"` // 金额 单位:分 - Status string `json:"status"` // 状态 - Desc string `json:"desc,omitempty"` // 结果描述 - FinishTime string `json:"finishTime,omitempty"` // 代付完成时间(币种时间)格式: yyyyMMddHHmmss -} - -func Decode(str string, ret interface{}) error { - str2, err := url.QueryUnescape(str) - if err != nil { - log.Error("err:%v", err) - return err - } - res, err := util.NewXRsa(publicKey, privateKeyPkCs8) - if err != nil { - log.Error("err:%v", err) - return err - } - tmp, err := res.PrivateDecrypt(str2) - if err != nil { - log.Error("err:%v", err) - return err - } - err = json.Unmarshal([]byte(tmp), ret) - if err != nil { - log.Error("err:%v", err) - return err - } - return nil -} - -func Encode(str string) string { - res, err := util.NewXRsa(publicKey, privateKeyPkCs8) - if err != nil { - log.Error("err:%v", err) - return "" - } - tmp, err := res.PublicEncrypt(str) - if err != nil { - log.Error("err:%v", err) - return "" - } - return url.QueryEscape(tmp) -} diff --git a/modules/pay/gopay/base.go b/modules/pay/gopay/base.go new file mode 100644 index 0000000..8ee51c6 --- /dev/null +++ b/modules/pay/gopay/base.go @@ -0,0 +1,137 @@ +package gopay + +import ( + "errors" + "fmt" + "net/http" + "server/common" + "server/config" + "server/modules/pay/base" + "server/modules/pay/values" + "server/pb" + + "github.com/gogo/protobuf/proto" + "github.com/liangdas/mqant/log" +) + +func NewSub(b *base.Base) { + sub := &Sub{ + Base: b, + } + b.SignKey = key + b.HttpType = base.HttpTypeJson + b.ShouldSignUpper = true + b.Channel = values.GoPay + if b.Opt == 1 { + b.Resp = new(PayResp) + b.ReqURL = payURL + } else if b.Opt == 2 { + b.Resp = new(WithdrawResp) + b.ReqURL = withdrawURL + } else if b.Opt == 3 { + b.SignPassStr = []string{"sign"} + b.CallbackResp.Msg = "SUCCESS" + b.CallbackReq = new(PayCallbackReq) + } else if b.Opt == 4 { + b.SignPassStr = []string{"sign", "msg"} + b.CallbackResp.Msg = "SUCCESS" + b.CallbackReq = new(WithdrawCallbackReq) + } + b.Sub = sub +} + +type Sub struct { + Base *base.Base +} + +func (s *Sub) PackHeader(header http.Header) { + header.Set("Merchant-Id", config.GetConfig().Pay.IGeek.MID) +} + +func (s *Sub) PackReq() interface{} { + if s.Base.Opt == 1 { + return s.PackPayReq() + } + return s.PackWithdrawReq() +} + +func (s *Sub) GetResp() (proto.Message, error) { + if s.Base.Opt == 1 { + resp := s.Base.Resp.(*PayResp) + if resp.Code != 200 || resp.Data.PayLink == "" { + return nil, errors.New("pay fail") + } + return &pb.InnerRechargeResp{APIOrderID: fmt.Sprintf("%v", resp.Data.ID), URL: resp.Data.PayLink, Channel: uint32(values.GoPay)}, nil + } + resp := s.Base.Resp.(*WithdrawResp) + if s.Base.Status == 0 && resp.Code != 200 { + return nil, errors.New("withdraw fail") + } + return &pb.InnerWithdrawResp{APIOrderID: fmt.Sprintf("%v", resp.Data.ID), Channel: uint32(values.GoPay)}, nil +} + +func (s *Sub) PackPayReq() interface{} { + r := s.Base.PayReq + send := &PayReq{ + Amount: r.Amount * 100, + Currency: "INR", + MerID: mid, + NotifyURL: values.GetPayCallback(values.GoPay), + OrderID: r.OrderID, + Type: 1, + ReturnURL: values.GetFrontCallback(), + UserName: r.Name, + Email: r.Email, + Mobile: r.Phone, + } + send.Sign = s.Base.SignMD5(send) + return send +} + +func (s *Sub) PackWithdrawReq() interface{} { + r := s.Base.WithdrawReq + if r.PayType != int64(common.PayTypeBank) { + return nil + } + send := &WithdrawReq{ + Amount: r.Amount * 100, + Currency: "INR", + MerID: mid, + NotifyURL: values.GetWithdrawCallback(values.GoPay), + OrderID: r.OrderID, + Type: 1, + BankCode: r.PayCode, + Account: r.CardNo, + UserName: r.Name, + Email: r.Email, + Mobile: r.Phone, + } + + send.Sign = s.Base.SignMD5(send) + return send +} + +func (s *Sub) CheckSign(str string) bool { + // str += "&key=" + key + checkSign := "" + s.Base.CallbackResp.Msg = "success" + mySign := "" + if s.Base.Opt == 3 { + req := s.Base.CallbackReq.(*PayCallbackReq) + log.Debug("checkSign pay:%+v", *req) + checkSign = req.Data.Sign + s.Base.CallbackResp.OrderID = req.Data.OrderID + s.Base.CallbackResp.Success = req.Code == 200 + mySign = s.Base.SignMD5(req.Data) + } else if s.Base.Opt == 4 { + req := s.Base.CallbackReq.(*WithdrawCallbackReq) + log.Debug("checkSign withdraw:%+v", *req) + checkSign = req.Data.Sign + s.Base.CallbackResp.OrderID = req.Data.OrderID + s.Base.CallbackResp.Success = req.Code == 200 + s.Base.CallbackResp.APIOrderID = req.Data.ID + s.Base.CallbackResp.FailMessage = req.Message + mySign = s.Base.SignMD5(req.Data) + } + return mySign == checkSign +} diff --git a/modules/pay/gopay/values.go b/modules/pay/gopay/values.go new file mode 100644 index 0000000..45dc903 --- /dev/null +++ b/modules/pay/gopay/values.go @@ -0,0 +1,91 @@ +package gopay + +const ( + payURL = "https://gooopay.online/api/recharge/create" + withdrawURL = "https://gooopay.online/api/deposit/create" + mid = "2024100038" + key = "326eb5a2f78a4dacb4780104ba16030c" +) + +type PayReq struct { + Amount int64 `json:"amount"` // 订单金额,整数,单位分,举例:10000 + Currency string `json:"currency"` // 货币,举例:INR + MerID string `json:"merId"` // 商户号,举例:2023100001 + NotifyURL string `json:"notifyUrl"` // 异步回调通知地址 + OrderID string `json:"orderId"` // 商户订单号 + Type int `json:"type"` // 类型,默认: 1 + ReturnURL string `json:"returnUrl"` // 订单完成同步跳转地址 + Sign string `json:"sign"` // 签名值,详情见1 签名说明 + UserName string `json:"userName,omitempty"` // 用户名 (可选) + Email string `json:"email,omitempty"` // 邮箱 (可选) + Mobile string `json:"mobile,omitempty"` // 手机号 (可选) +} + +type PayResp struct { + Code int `json:"code"` // 状态码,200 表示提单成功,400 表示提单失败 + Message string `json:"message"` // 状态信息,"SUCCESS" 表示成功,"FAIL" 表示失败 + Data struct { + ID int `json:"id"` // 平台订单号 + MerID string `json:"merId"` // 商户号 + OrderID string `json:"orderId"` // 商户订单号 + Amount int `json:"amount"` // 金额 + Fee int `json:"fee"` // 手续费 + PayLink string `json:"payLink"` // 支付链接地址 + } `json:"data"` // 数据字段 +} + +type PayCallbackReq struct { + Code int `json:"code"` // 状态码,200 表示支付成功 + Message string `json:"message"` // 状态信息,"SUCCESS" 表示成功,"FAIL" 表示失败 + Data struct { + MerID string `json:"merId"` // 商户号 + ID string `json:"id"` // 平台订单号 + OrderID string `json:"orderId"` // 商户订单号 + OperatorNum string `json:"operatorNum,omitempty"` // UTR,此参数有可能不参与回调,建议判空是否参与验签 (可选) + Amount string `json:"amount"` // 金额 + Fee string `json:"fee"` // 手续费 + Currency string `json:"currency"` // 货币类型 + Sign string `json:"sign"` // 签名值,详情见1 签名说明 + } `json:"data"` // 数据字段 +} + +type WithdrawReq struct { + Amount int64 `json:"amount"` // 订单金额,整数,单位分,举例:10000 + Currency string `json:"currency"` // 货币,举例:INR + MerID string `json:"merId"` // 商户号,举例:2023100001 + NotifyURL string `json:"notifyUrl"` // 异步回调通知地址 + OrderID string `json:"orderId"` // 商户订单号 + Type int `json:"type"` // 类型,默认: 1 + BankCode string `json:"bankCode"` // IFSC码,11位 + Account string `json:"account"` // 收款账号 + Sign string `json:"sign"` // 签名值,详情见1 签名说明 + UserName string `json:"userName"` // 用户名 + Email string `json:"email"` // 邮箱 + Mobile string `json:"mobile"` // 手机号 +} + +type WithdrawResp struct { + Code int `json:"code"` // 状态码,200 表示提单成功,400 表示提单失败 + Message string `json:"message"` // 状态信息,"SUCCESS" 表示成功,"FAIL" 表示失败 + Data struct { + ID int `json:"id"` // 平台订单号 + MerID string `json:"merId"` // 商户号 + OrderID string `json:"orderId"` // 商户订单号 + Amount int `json:"amount"` // 金额 + Fee int `json:"fee"` // 手续费 + } `json:"data"` // 数据字段 +} + +type WithdrawCallbackReq struct { + Code int `json:"code"` // 状态码,200 表示提现成功,400 表示提现失败 + Message string `json:"message"` // 状态信息,"SUCCESS" 表示成功,"FAIL" 表示失败 + Data struct { + MerID string `json:"merId"` // 商户号 + ID string `json:"id"` // 平台订单号 + OrderID string `json:"orderId"` // 商户订单号 + Amount string `json:"amount"` // 金额 + Fee string `json:"fee"` // 手续费 + Currency string `json:"currency"` // 货币类型 + Sign string `json:"sign"` // 签名值,详情见1 签名说明 + } `json:"data"` // 数据字段 +} diff --git a/modules/pay/grepay/base.go b/modules/pay/grepay/base.go index 8c81285..b4884f5 100644 --- a/modules/pay/grepay/base.go +++ b/modules/pay/grepay/base.go @@ -2,6 +2,7 @@ package grepay import ( "errors" + "fmt" "net/http" "server/common" "server/config" @@ -19,23 +20,31 @@ func NewSub(b *base.Base) { sub := &Sub{ Base: b, } - b.SignKey = key b.HttpType = base.HttpTypeForm - b.ShouldSignUpper = true - if b.Opt == 1 { + b.Channel = values.GrePay + // b.ShouldSignUpper = true + b.SignPassStr = []string{"sign"} + b.SignKey = config.GetConfig().Pay.GrePay.Key + if b.Opt == base.OPTPay { b.Resp = new(PayResp) b.ReqURL = payURL - } else if b.Opt == 2 { + } else if b.Opt == base.OPTWithdraw { b.Resp = new(WithdrawResp) b.ReqURL = withdrawURL - } else if b.Opt == 3 { - b.SignPassStr = []string{"sign"} - b.CallbackResp.Msg = "SC000000" + } else if b.Opt == base.OPTPayCB { b.CallbackReq = new(PayCallbackReq) - } else if b.Opt == 4 { - b.SignPassStr = []string{"sign", "msg"} - b.CallbackResp.Msg = "SC000000" + b.CallbackResp.Msg = "success" + } else if b.Opt == base.OPTWithdrawCB { b.CallbackReq = new(WithdrawCallbackReq) + b.CallbackResp.Msg = "success" + // } else if b.Opt == base.OPTQueryWithdraw { // 查询 + // b.Resp = new(QueryWithdrawResp) + // b.ReqURL = queryWithdrawURL + // } else if b.Opt == base.OPTQueryPay { // 查询 + // b.Resp = new(QueryPayResp) + // b.ReqURL = queryPayURL + } else { + return } b.Sub = sub } @@ -45,51 +54,60 @@ type Sub struct { } func (s *Sub) PackHeader(header http.Header) { - header.Set("Merchant-Id", config.GetConfig().Pay.IGeek.MID) } func (s *Sub) PackReq() interface{} { - if s.Base.Opt == 1 { + if s.Base.Opt == base.OPTPay { return s.PackPayReq() + } else if s.Base.Opt == base.OPTWithdraw { + return s.PackWithdrawReq() } - return s.PackWithdrawReq() + return nil } func (s *Sub) GetResp() (proto.Message, error) { - if s.Base.Opt == 1 { + log.Debug("resp:%v", s.Base.Resp) + if s.Base.Opt == base.OPTPay { resp := s.Base.Resp.(*PayResp) - if resp.Code != "000000" || resp.BusContent == "" { + if resp.BusContent == "" { return nil, errors.New("pay fail") } - return &pb.InnerRechargeResp{APIOrderID: resp.PrdOrdNo, URL: resp.BusContent, Channel: uint32(values.Grepay)}, nil - } - resp := s.Base.Resp.(*WithdrawResp) - if s.Base.Status == 0 && (resp.Code != "000000" || resp.OrdStatus == "08" || resp.OrdStatus == "09") { - return nil, errors.New("withdraw fail") + return &pb.InnerRechargeResp{APIOrderID: resp.CustOrderNo, URL: resp.BusContent, Channel: uint32(values.GrePay)}, nil + } else if s.Base.Opt == base.OPTWithdraw { + resp := s.Base.Resp.(*WithdrawResp) + if s.Base.Status == 0 && resp.OrdStatus == "08" || (resp.Code != "000000" && (resp.OrdStatus == "" || resp.OrdStatus == "null")) { + return nil, errors.New("withdraw fail") + } + return &pb.InnerWithdrawResp{APIOrderID: resp.CasOrdNo, Channel: uint32(values.GrePay)}, nil } - return &pb.InnerWithdrawResp{APIOrderID: resp.CasOrdNo, Channel: uint32(values.Grepay)}, nil + return nil, errors.New("unknown opt") } func (s *Sub) PackPayReq() interface{} { r := s.Base.PayReq + tranType := "0412" + if r.Amount > config.GetConfig().Pay.GrePay.MIDAmount { + tranType = config.GetConfig().Pay.GrePay.BigChannel + } send := &PayReq{ - Version: "2.1", - OrgNo: oid, - CustId: mid, - CustOrderNo: r.OrderID, - TranType: "0512", - ClearType: "01", - PayAmt: int(r.Amount) / 1e6, - BackUrl: values.GetPayCallback(values.Grepay), - FrontUrl: values.GetFrontCallback(), - GoodsName: "shopbuy", - OrderDesc: "pix", - BuyIp: r.IP, - UserName: r.Name, - UserEmail: r.Email, - UserPhone: r.Phone, - CountryCode: "BR", - Currency: "BRL", + Version: "2.1", + OrgNo: orgNo, + CustId: mid, + CustOrderNo: r.OrderID, + TranType: tranType, + ClearType: "01", + PayAmt: r.Amount * 100, + BackUrl: values.GetPayCallback(values.GrePay), + FrontUrl: values.GetFrontCallback(), + GoodsName: "shopbuy", + OrderDesc: "payorder", + BuyIp: r.IP, + UserName: r.Name, + UserEmail: r.Email, + UserPhone: r.Phone, + UserCitizenID: fmt.Sprintf("%v", r.UID), + CountryCode: "IN", + Currency: "INR", } send.Sign = s.Base.SignMD5(send) return send @@ -97,56 +115,64 @@ func (s *Sub) PackPayReq() interface{} { func (s *Sub) PackWithdrawReq() interface{} { r := s.Base.WithdrawReq - if common.PayType(r.PayType) == common.PayTypeCPF { - r.Number = strings.ReplaceAll(r.Number, "-", "") - r.Number = strings.ReplaceAll(r.Number, ".", "") - } - // bc := strings.ToLower(common.PayType(r.PayType).String()) send := &WithdrawReq{ Version: "2.1", - OrgNo: oid, + OrgNo: orgNo, CustId: mid, - CustOrdNo: r.OrderID, + CustOrderNo: r.OrderID, CasType: "00", - Country: "BR", - Currency: "BRL", - CasAmt: r.Amount / 1e6, + Country: "IN", + Currency: "INR", + CasAmt: r.Amount * 100, DeductWay: "02", - CallBackUrl: values.GetWithdrawCallback(values.Grepay), - Account: "2406120000279502155", - PayoutType: "PIX", + CallBackUrl: values.GetWithdrawCallback(values.GrePay), + Account: config.GetConfig().Pay.GrePay.WithdrawAccount, + // PayoutType: , AccountName: r.Name, - PanNum: r.Number, - WalletId: r.Number, - Phone: r.Phone, - Email: r.Email, - CasDesc: "pix", + // PayeeBankCode: , + // CardType: , + // CnapsCode: , + // CardNo: , + // UpiId: , + Phone: r.Phone, + Email: r.Email, + } + if r.PayType == int64(common.PayTypeUPI) { + send.PayoutType = "UPI" + send.UpiId = r.PayCode + } else if r.PayType == int64(common.PayTypeBank) { + send.PayoutType = "Card" + send.PayeeBankCode = r.PayCode + send.CardType = "IMPS" + send.CnapsCode = r.PayCode + send.CardNo = r.CardNo + } else { + return nil } send.Sign = s.Base.SignMD5(send) return send } func (s *Sub) CheckSign(str string) bool { - str += "&key=" + key - checkSign := "" - s.Base.CallbackResp.Msg = "success" - if s.Base.Opt == 3 { + log.Debug("callback:%v", s.Base.CallbackReq) + if s.Base.Opt == base.OPTPayCB { req := s.Base.CallbackReq.(*PayCallbackReq) - log.Debug("checkSign pay:%+v", *req) - checkSign = req.Sign s.Base.CallbackResp.OrderID = req.CustOrderNo + s.Base.CallbackResp.APIOrderID = req.PrdOrdNo + // if req.Status == 1 { + // return false + // } s.Base.CallbackResp.Success = req.OrdStatus == "01" - } else if s.Base.Opt == 4 { + + return strings.ToUpper(util.CalculateMD5(str+"&key="+s.Base.SignKey)) == req.Sign + } else if s.Base.Opt == base.OPTWithdrawCB { req := s.Base.CallbackReq.(*WithdrawCallbackReq) - log.Debug("checkSign withdraw:%+v", *req) - if req.OrdStatus == "00" || req.OrdStatus == "01" || req.OrdStatus == "06" { - return false - } - checkSign = req.Sign s.Base.CallbackResp.OrderID = req.CustOrderNo + // if req.Status == 1 { + // return false + // } s.Base.CallbackResp.Success = req.OrdStatus == "07" - s.Base.CallbackResp.APIOrderID = req.PrdOrdNo - s.Base.CallbackResp.FailMessage = req.CasDesc + return strings.ToUpper(util.CalculateMD5(str+"&key="+s.Base.SignKey)) == req.Sign } - return strings.ToUpper(util.CalculateMD5(str)) == checkSign + return false } diff --git a/modules/pay/grepay/values.go b/modules/pay/grepay/values.go index 88cef1d..c0da428 100644 --- a/modules/pay/grepay/values.go +++ b/modules/pay/grepay/values.go @@ -1,116 +1,134 @@ package grepay +import ( + "fmt" + "server/config" + "server/util" + "sort" + + "github.com/liangdas/mqant/log" +) + const ( - payURL = "https://api.metagopayments.com/cashier/pay.ac" - withdrawURL = "https://paypout.metagopayments.com/cashier/TX0001.ac" - oid = "8240601257" - mid = "24061200002795" - key = "1B5B3E0FE86054BD16F15C29CF4AC0B3" + payURL = "https://api.metagopayments.com/cashier/pay.ac" + payCallbackURL = "/grepay/pay/callback" + withdrawURL = "https://payout.metagopayments.com/cashier/TX0001.ac" + withdrawCallbackURL = "/grepay/withdraw/callback" + orgNo = "8220800959" + mid = "22081000002504" + // key = "FF5D557F6AC9EF26212B482B23AD7F07" ) type PayReq struct { - Version string `json:"version"` // 版本号,固定值:2.1 - OrgNo string `json:"orgNo"` // 机构号,平台下发的机构编号 - CustId string `json:"custId"` // 商户编号,平台提供的商户编号 - CustOrderNo string `json:"custOrderNo"` // 商户订单编号,客户方生成的订单编号,不能重复 - TranType string `json:"tranType"` // 交易类型(传数字编码) 0512 - ClearType string `json:"clearType"` // 清算方式,传数字编码,默认为01 - PayAmt int `json:"payAmt"` // 支付金额, 单位是分(整数) - BackUrl string `json:"backUrl"` // 后台回调地址,支付完成时回调客户方结果接收地址 - FrontUrl string `json:"frontUrl"` // 前台回调地址,支付结果同步通知到前端 - // BankCode string `json:"bankCode"` // 银行编码,可选字段 - GoodsName string `json:"goodsName"` // 商品名称,不可使用中文 - OrderDesc string `json:"orderDesc"` // 订单描述,不可使用中文 - BuyIp string `json:"buyIp"` // 购买者IP,商户提交订单的IP - UserName string `json:"userName"` // 付款人姓名,不可用中国的用户名 - UserEmail string `json:"userEmail"` // 付款人邮箱,不可用中国的邮箱 - UserPhone string `json:"userPhone"` // 付款人手机号,不可用中国的手机号 - // UserCitizenId string `json:"userCitizenId,omitempty"` // 巴西唯一税号(CPF/CNPJ),特殊交易类型必填 - // UserDeviceId string `json:"userDeviceId,omitempty"` // 用户设备ID,可选字段 - CountryCode string `json:"countryCode"` // 国家编码,固定值: BR - Currency string `json:"currency"` // 币种,固定值: BRL - // City string `json:"city,omitempty"` // 商户用户的城市名称,可选字段 - // Street string `json:"street,omitempty"` // 商户用户的街道名称,可选字段 - // HouseNumber string `json:"houseNumber,omitempty"` // 商户用户的门牌号,可选字段 - Sign string `json:"sign"` // 签名,根据规则加签后的结果 + Version string `json:"version"` + OrgNo string `json:"orgNo"` + CustId string `json:"custId"` + CustOrderNo string `json:"custOrderNo"` + TranType string `json:"tranType"` + ClearType string `json:"clearType"` + PayAmt int64 `json:"payAmt"` + BackUrl string `json:"backUrl"` + FrontUrl string `json:"frontUrl"` + GoodsName string `json:"goodsName"` + OrderDesc string `json:"orderDesc"` + BuyIp string `json:"buyIp"` + UserName string `json:"userName"` + UserEmail string `json:"userEmail"` + UserPhone string `json:"userPhone"` + UserCitizenID string `json:"userCitizenId"` + CountryCode string `json:"countryCode"` + Currency string `json:"currency"` + Sign string `json:"sign"` } type PayResp struct { - OrgNo string `json:"orgNo"` // 机构编号,平台下发的机构编号 - OrdStatus string `json:"ordStatus,omitempty"` // 订单状态,可选字段 - Code string `json:"code"` // 请求接口状态返回码 - Msg string `json:"msg"` // 返回描述 - CustId string `json:"custId"` // 平台提供的商户编号 - CustOrderNo string `json:"custOrderNo"` // 商户订单编号 - PrdOrdNo string `json:"prdOrdNo,omitempty"` // 平台订单号,可作为查询依据的订单号,订单处理成功时返回 - ContentType string `json:"contentType,omitempty"` // 业务内容类型,可选字段 - BusContent string `json:"busContent,omitempty"` // 订单处理成功时返回的业务内容,如支付页面的URL链接 - OrdDesc string `json:"ordDesc,omitempty"` // 状态描述,订单状态存在时,描述状态代表的含义 - Sign string `json:"sign"` // 签名,根据规则加签后的结果 + OrgNo string `json:"orgNo"` + CustId string `json:"custId"` + Code string `json:"code"` // 000000 表示请求该接口正常 + Msg string `json:"msg"` + CustOrderNo string `json:"custOrderNo"` + ContentType string `json:"contentType"` + BusContent string `json:"busContent"` + Sign string `json:"sign"` } type PayCallbackReq struct { - Version string `json:"version"` // 版本号,返回和支付接口上送的一致 - OrgNo string `json:"orgNo"` // 机构编号,平台下发的机构编号 - CustId string `json:"custId"` // 平台提供的商户编号 - CustOrderNo string `json:"custOrderNo"` // 商户订单编号,客户方生成的订单编号, 不能重复 - PrdOrdNo string `json:"prdOrdNo"` // 平台订单号,可作为查询依据 - OrdAmt string `json:"ordAmt"` // 订单金额,单位为分 - OrdTime string `json:"ordTime"` // 订单时间,格式: yyyyMMddHHmmss - PayAmt string `json:"payAmt"` // 支付金额,单位为分 - OrdStatus string `json:"ordStatus"` // 订单状态 - Sign string `json:"sign"` // 签名,根据规则加签以后的结果 + Version string `json:"version" form:"version"` + OrgNo string `json:"orgNo" form:"orgNo"` + CustId string `json:"custId" form:"custId"` + CustOrderNo string `json:"custOrderNo" form:"custOrderNo"` + PrdOrdNo string `json:"prdOrdNo" form:"prdOrdNo"` + OrdAmt string `json:"ordAmt" form:"ordAmt"` + OrdTime string `json:"ordTime" form:"ordTime"` + PayAmt string `json:"payAmt" form:"payAmt"` + OrdStatus string `json:"ordStatus" form:"ordStatus"` // 00:未交易01:成功02:失败03:被拒绝04:处理中05:取消支付06:未支付07:已退款08:退款中 + Sign string `json:"sign" form:"sign"` } type WithdrawReq struct { - Version string `json:"version"` // 版本号,固定值:2.1 - OrgNo string `json:"orgNo"` // 机构编号,平台下发的机构编号 - CustId string `json:"custId"` // 平台提供的商户编号 - CustOrdNo string `json:"custOrdNo"` // 商户订单编号,客户方生成的订单编号,不能重复 - CasType string `json:"casType"` // 清算类型,固定值00(T0结算) - Country string `json:"country"` // 国家编码,固定值:BR - Currency string `json:"currency"` // 币种编码,固定值:BRL - CasAmt int64 `json:"casAmt"` // 代付金额,单位是分 - DeductWay string `json:"deductWay"` // 手续费扣除方式,固定值02:账户余额中扣除 - CallBackUrl string `json:"callBackUrl"` // 回调地址 - Account string `json:"account"` // 代付子账户名称 - PayoutType string `json:"payoutType"` // 代付类型,可选值:Card, PIX - AccountName string `json:"accountName"` // 收款人姓名 - // PayeeBankCode string `json:"payeeBankCode,omitempty"` // 银行编码,payoutType为Card时必填 - CardType string `json:"cardType"` // 代付类型的收款方式 cpf - // CnapsCode string `json:"cnapsCode,omitempty"` // 巴西通道分行代码 - // CardNo string `json:"cardNo,omitempty"` // 银行卡号,payoutType为Card时必填 - PanNum string `json:"panNum"` // PAN Card 编码,必须传CPF(个人) - WalletId string `json:"walletId"` // 电子钱包收款账号,payoutType为PIX时必填 - // UpiId string `json:"upiId,omitempty"` // UPI 的收款账号,对接巴西渠道时为空 - AccountType string `json:"accountType"` // 账户类型,默认值1:对私 - Phone string `json:"phone"` // 收款人手机号 - Email string `json:"email"` // 收款人邮箱 - CasDesc string `json:"casDesc"` // 代付备注(禁止使用中文) - // AccountDigit string `json:"accountDigit,omitempty"` // 账户校验位,一般为银行卡最后一位校验位 - Sign string `json:"sign"` // 签名,根据规则加签以后的结果 + Version string `json:"version"` + OrgNo string `json:"orgNo"` + CustId string `json:"custId"` + CustOrderNo string `json:"custOrdNo"` + CasType string `json:"casType"` // 清算类型(请传数字编码)00(T0 结算)01(T1 结算)默认为00 + Country string `json:"country"` + Currency string `json:"currency"` + CasAmt int64 `json:"casAmt"` + DeductWay string `json:"deductWay"` + CallBackUrl string `json:"callBackUrl"` + Account string `json:"account"` + PayoutType string `json:"payoutType"` // Card: 代付到银行卡UPI: 代付到UPI 账户 + AccountName string `json:"accountName"` + PayeeBankCode string `json:"payeeBankCode"` + CardType string `json:"cardType"` // PayoutType为card时,填IMPS + CnapsCode string `json:"cnapsCode"` // IFSC + CardNo string `json:"cardNo"` + UpiId string `json:"upiId"` + Phone string `json:"phone"` + Email string `json:"email"` + Sign string `json:"sign"` } type WithdrawResp struct { - OrgNo string `json:"orgNo"` // 机构编号,平台下发的机构编号 - OrdStatus string `json:"ordStatus,omitempty"` // 订单状态 - Code string `json:"code"` // 请求接口返回码 - Msg string `json:"msg"` // 返回描述 - CustId string `json:"custId"` // 平台提供的商户编号 - CustOrdNo string `json:"custOrdNo"` // 客户订单编号,原样返回 - CasOrdNo string `json:"casOrdNo,omitempty"` // 平台订单号,可作为查询依据 - CasAmt string `json:"casAmt"` // 代付金额,该字段值为100时则为1雷亚尔 - CasTime string `json:"casTime"` // 代付时间,格式:yyyyMMddHHmmss - Sign string `json:"sign"` // 签名,根据规则加签以后的结果 + OrgNo string `json:"orgNo"` + OrdStatus string `json:"ordStatus"` // 00:未交易01:成功02:失败03:被拒绝04:处理中05:取消支付06:未支付07:已退款08:退款中 + Code string `json:"code"` // 000000 表示请求该接口正常 + Msg string `json:"msg"` + CustId string `json:"custId"` + CustOrderNo string `json:"custOrderNo"` + CasOrdNo string `json:"casOrdNo"` + CasAmt string `json:"casAmt"` + CasTime string `json:"casTime"` + Sign string `json:"sign"` } type WithdrawCallbackReq struct { - OrgNo string `json:"orgNo"` // 机构编号,平台下发的机构编号 - CustId string `json:"custId"` // 平台提供的商户编号 - CustOrderNo string `json:"custOrderNo"` // 商户订单编号,客户方生成的订单编号,不能重复 - PrdOrdNo string `json:"prdOrdNo"` // 平台订单号,作为查询依据 - PayAmt string `json:"payAmt"` // 代付订单金额,单位是分 - OrdStatus string `json:"ordStatus"` // 代付订单状态 - CasDesc string `json:"casDesc"` // 代付单描述 - Sign string `json:"sign"` // 签名,根据规则加签以后的结果 + OrgNo string `json:"orgNo" form:"orgNo"` + CustId string `json:"custId" form:"custId"` + CustOrderNo string `json:"custOrderNo" form:"custOrderNo"` + PrdOrdNo string `json:"prdOrdNo" form:"prdOrdNo"` + PayAmt int64 `json:"payAmt" form:"payAmt"` + OrdStatus string `json:"ordStatus" form:"ordStatus"` // 00:未交易01:成功02:失败03:被拒绝04:处理中05:取消支付06:未支付07:已退款08:退款中 + CasDesc string `json:"casDesc" form:"casDesc"` + Sign string `json:"sign" form:"sign"` +} + +func Sign(m map[string]interface{}) string { + str := []string{} + for i := range m { + if i == "sign" { + continue + } + str = append(str, i) + } + sort.Strings(str) + signStr := "" + for _, v := range str { + mv := m[v] + signStr += fmt.Sprintf("%v=%v", v, mv) + signStr += "&" + } + signStr += "key=" + config.GetConfig().Pay.GrePay.Key + log.Debug("signStr:%v", signStr) + return util.CalculateMD5(signStr) } diff --git a/modules/pay/handler.go b/modules/pay/handler.go index 71ffbe8..539cdd5 100644 --- a/modules/pay/handler.go +++ b/modules/pay/handler.go @@ -30,7 +30,7 @@ func Recharge(req *pb.InnerRechargeReq) (ret []byte, err error) { // } if req.Channel == 0 { for _, v := range call.GetConfigPayChannels() { - if req.Amount <= v.PayUp && req.Amount >= v.PayDown && v.CurrencyType == common.CurrencyBrazil { + if req.Amount <= v.PayUp && req.Amount >= v.PayDown && v.CurrencyType == common.CurrencyINR { req.Channel = uint32(v.ChannelID) break } @@ -63,9 +63,9 @@ func Withdraw(req *pb.InnerWithdrawReq) ([]byte, error) { // req.Amount /= common.DecimalDigits var channel *common.ConfigWithdrawChannels if req.Channel >= 0 { - channel = call.GetConfigWithdrawChannelsByID(int(req.Channel), common.CurrencyBrazil) + channel = call.GetConfigWithdrawChannelsByID(int(req.Channel), common.CurrencyINR) } else { - channel = call.GetConfigWithdrawChannelsBest(common.CurrencyBrazil) + channel = call.GetConfigWithdrawChannelsBest(common.CurrencyINR) } log.Debug("withdraw req:%+v,channel:%+v", req, channel) if channel == nil || channel.WithdrawPer <= 0 { diff --git a/modules/pay/igeekpay/base.go b/modules/pay/igeekpay/base.go deleted file mode 100644 index 9d91e33..0000000 --- a/modules/pay/igeekpay/base.go +++ /dev/null @@ -1,147 +0,0 @@ -package igeekpay - -import ( - "errors" - "fmt" - "net/http" - "server/common" - "server/config" - "server/modules/pay/base" - "server/modules/pay/values" - "server/pb" - "server/util" - "strings" - - "github.com/gogo/protobuf/proto" -) - -func NewSub(b *base.Base) { - sub := &Sub{ - Base: b, - } - b.SignKey = config.GetConfig().Pay.IGeek.Key - b.HttpType = base.HttpTypeJson - b.ShouldSignUpper = true - if b.Opt == 1 { - b.Resp = new(PayResp) - b.ReqURL = config.GetConfig().Pay.IGeek.APIURL + payURL - } else if b.Opt == 2 { - b.Resp = new(WithdrawResp) - b.ReqURL = config.GetConfig().Pay.IGeek.APIURL + withdrawURL - } else if b.Opt == 3 { - b.CallbackResp.Msg = "success" - b.CallbackReq = new(PayCallbackReq) - } else if b.Opt == 4 { - b.CallbackResp.Msg = "success" - b.CallbackReq = new(WithdrawCallbackReq) - } - b.Sub = sub -} - -type Sub struct { - Base *base.Base -} - -func (s *Sub) PackHeader(header http.Header) { - header.Set("Merchant-Id", config.GetConfig().Pay.IGeek.MID) -} - -func (s *Sub) PackReq() interface{} { - if s.Base.Opt == 1 { - return s.PackPayReq() - } - return s.PackWithdrawReq() -} - -func (s *Sub) GetResp() (proto.Message, error) { - if s.Base.Opt == 1 { - resp := s.Base.Resp.(*PayResp) - if resp.Status != 200 { - return nil, errors.New("pay fail") - } - return &pb.InnerRechargeResp{APIOrderID: resp.Data.TradeNo, URL: resp.Data.CashierUrl, Channel: uint32(values.IGeekPay)}, nil - } - resp := s.Base.Resp.(*WithdrawResp) - if s.Base.Status == 0 && resp.Status != 200 { - return nil, errors.New("withdraw fail") - } - return &pb.InnerWithdrawResp{APIOrderID: resp.Data.TradeNo, Channel: uint32(values.IGeekPay)}, nil -} - -func (s *Sub) PackPayReq() interface{} { - r := s.Base.PayReq - send := &PayReq{ - Version: "V1", - BizType: "LOCAL", - AppId: config.GetConfig().Pay.IGeek.APPID, - OrderNo: r.OrderID, - ProductCode: "CASHIER", - Currency: "BRL", - Amount: util.Decimal(float64(r.Amount)/common.DecimalDigits, 2), - PaymentDetail: PaymentDetail{ - PayMode: "PIX", - }, - ProductName: fmt.Sprintf("goods%v", r.Amount), - UserDetail: UserDetail{ - ID: fmt.Sprintf("%v", r.UID), - Name: r.Name, - Mobile: r.Phone, - Email: r.Email, - CpfNumber: util.CheckCPF(r.Number), - }, - FrontCallUrl: values.GetFrontCallback(), - BackCallUrl: values.GetPayCallback(values.IGeekPay), - } - send.Sign = s.Base.SignMD5(send) - return send -} - -func (s *Sub) PackWithdrawReq() interface{} { - r := s.Base.WithdrawReq - if common.PayType(r.PayType) == common.PayTypeCPF { - r.Number = strings.ReplaceAll(r.Number, "-", "") - r.Number = strings.ReplaceAll(r.Number, ".", "") - } - send := &WithdrawReq{ - Version: "V1", - BizType: "LOCAL", - AppId: config.GetConfig().Pay.IGeek.APPID, - OrderNo: r.OrderID, - ProductCode: "PAYOUT", - Currency: "BRL", - Amount: util.Decimal(float64(r.Amount)/common.DecimalDigits, 2), - PayMode: "PIX", - PayeeName: r.Name, - IDType: common.PayType(r.PayType).String(), - IDNumber: r.Number, - PayeeMobile: "55" + r.Phone, - UserId: fmt.Sprintf("%v", r.UID), - PayeeEmail: r.Email, - CpfNumber: r.Number, - PayeeAddress: r.Address, - BackCallUrl: values.GetWithdrawCallback(values.IGeekPay), - } - send.Sign = s.Base.SignMD5(send) - return send -} - -func (s *Sub) CheckSign(str string) bool { - str = values.GetSignStrNull(str, "sign") - str += "&key=" + config.GetConfig().Pay.IGeek.Key - checkSign := "" - s.Base.CallbackResp.Msg = "success" - if s.Base.Opt == 3 { - req := s.Base.CallbackReq.(*PayCallbackReq) - checkSign = req.Sign - s.Base.CallbackResp.OrderID = req.OrderNo - s.Base.CallbackResp.Success = req.PayStatus == "Success" - } else if s.Base.Opt == 4 { - req := s.Base.CallbackReq.(*WithdrawCallbackReq) - checkSign = req.Sign - s.Base.CallbackResp.OrderID = req.OrderNo - s.Base.CallbackResp.Success = req.PayStatus == "Success" - s.Base.CallbackResp.APIOrderID = req.TradeNo - s.Base.CallbackResp.FailMessage = req.FailMessage - } - return strings.ToUpper(util.CalculateMD5(str)) == checkSign -} diff --git a/modules/pay/igeekpay/values.go b/modules/pay/igeekpay/values.go deleted file mode 100644 index 46d2e55..0000000 --- a/modules/pay/igeekpay/values.go +++ /dev/null @@ -1,126 +0,0 @@ -package igeekpay - -const ( - payURL = "/collect/v1/order" - withdrawURL = "/payout/v1/brl" -) - -type PayReq struct { - Version string `json:"version,omitempty"` - BizType string `json:"bizType,omitempty"` - AppId string `json:"appId,omitempty"` - OrderNo string `json:"orderNo,omitempty"` - ProductCode string `json:"productCode,omitempty"` - Currency string `json:"currency,omitempty"` - Amount float64 `json:"amount,omitempty"` - // PaymentDetail PaymentDetail `json:"paymentDetail,omitempty"` - ProductName string `json:"productName,omitempty"` - ProductDesc string `json:"productDesc,omitempty"` - PaymentDetail PaymentDetail `json:"paymentDetail,omitempty"` - UserDetail UserDetail `json:"userDetail,omitempty"` - FrontCallUrl string `json:"frontCallUrl,omitempty"` - BackCallUrl string `json:"backCallUrl,omitempty"` - Lang string `json:"lang,omitempty"` - AttachField string `json:"attachField,omitempty"` - Sign string `json:"sign"` -} - -type PaymentDetail struct { - PayMode string `json:"payMode,omitempty"` // 支付模式 UPI/IMPS/WALLET - // AccountNo string `json:"accountNo,omitempty"` // 支付账户 - // BankIfsc string `json:"bankIfsc,omitempty"` // 银行ifsc编码 -} - -type UserDetail struct { - ID string `json:"id,omitempty"` // 用户uid - Name string `json:"name,omitempty"` // 名字 - Mobile string `json:"mobile,omitempty"` // 手机号 - Email string `json:"email,omitempty"` // 邮箱 - Address string `json:"address,omitempty"` // 地址 - IP string `json:"ip,omitempty"` - DeviceId string `json:"deviceId,omitempty"` - CpfNumber string `json:"cpfNumber,omitempty"` -} - -type PayResp struct { - Status int `json:"status,omitempty"` - Rel bool `json:"rel,omitempty"` - Data struct { - TradeNo string `json:"tradeNo,omitempty"` - OrderNo string `json:"orderNo,omitempty"` - ApplicationId string `json:"applicationId,omitempty"` // 商户appid - CashierUrl string `json:"cashierUrl,omitempty"` // 支付地址 - Sign string `json:"sign,omitempty"` - } `json:"data"` - Message string `json:"message"` -} - -type PayCallbackReq struct { - MerchantId string `json:"merchantId,omitempty"` - ApplicationId string `json:"applicationId,omitempty"` - TradeNo string `json:"tradeNo,omitempty"` - OrderNo string `json:"orderNo,omitempty"` - PayStatus string `json:"payStatus,omitempty"` - Amount float64 `json:"amount,omitempty"` - Currency string `json:"currency,omitempty"` - PayAmount float64 `json:"payAmount,omitempty"` - ServiceFee float64 `json:"serviceFee,omitempty"` - FailMessage string `json:"failMessage,omitempty"` - PayCurrency string `json:"payCurrency,omitempty"` - PayTime string `json:"payTime,omitempty"` - PayTimestamp int64 `json:"payTimestamp,omitempty"` - Attach string `json:"attach,omitempty"` - Sign string `json:"sign"` -} - -type WithdrawReq struct { - Version string `json:"version,omitempty"` - BizType string `json:"bizType,omitempty"` - AppId string `json:"appId,omitempty"` - OrderNo string `json:"orderNo,omitempty"` - ProductCode string `json:"productCode,omitempty"` - Currency string `json:"currency,omitempty"` - Amount float64 `json:"amount,omitempty"` - PayMode string `json:"payMode,omitempty"` // PIX - PayeeName string `json:"payeeName,omitempty"` - IDType string `json:"idType,omitempty"` - IDNumber string `json:"idNumber,omitempty"` - PayeeMobile string `json:"payeeMobile,omitempty"` - UserId string `json:"userId,omitempty"` - PayeeEmail string `json:"payeeEmail,omitempty"` - CpfNumber string `json:"cpfNumber,omitempty"` - PayeeAddress string `json:"payeeAddress,omitempty"` - BackCallUrl string `json:"backCallUrl,omitempty"` - // AttachField string `json:"attachField,omitempty"` - Sign string `json:"sign"` -} - -type WithdrawResp struct { - Status int `json:"status,omitempty"` - Rel bool `json:"rel,omitempty"` - Data struct { - ApplicationId string `json:"applicationId,omitempty"` - TradeNo string `json:"tradeNo,omitempty"` - OrderNo string `json:"orderNo,omitempty"` - Sign string `json:"sign,omitempty"` - } `json:"data,omitempty"` - Message string `json:"message,omitempty"` -} - -type WithdrawCallbackReq struct { - MerchantId string `json:"merchantId,omitempty"` - ApplicationId string `json:"applicationId,omitempty"` - TradeNo string `json:"tradeNo,omitempty"` - OrderNo string `json:"orderNo,omitempty"` - PayStatus string `json:"payStatus,omitempty"` - Amount float64 `json:"amount,omitempty"` - Currency string `json:"currency,omitempty"` - PayAmount float64 `json:"payAmount,omitempty"` - ServiceFee float64 `json:"serviceFee,omitempty"` - FailMessage string `json:"failMessage,omitempty"` - PayCurrency string `json:"payCurrency,omitempty"` - PayTime string `json:"payTime,omitempty"` - PayTimestamp int64 `json:"payTimestamp,omitempty"` - Attach string `json:"attach,omitempty"` - Sign string `json:"sign"` -} diff --git a/modules/pay/luckinpay/base.go b/modules/pay/luckinpay/base.go deleted file mode 100644 index 423a713..0000000 --- a/modules/pay/luckinpay/base.go +++ /dev/null @@ -1,147 +0,0 @@ -package luckinpay - -import ( - "errors" - "fmt" - "net/http" - "server/common" - "server/config" - "server/modules/pay/base" - "server/modules/pay/values" - "server/pb" - "server/util" - "strings" - "time" - - "github.com/gogo/protobuf/proto" - "github.com/liangdas/mqant/log" -) - -func NewSub(b *base.Base) { - sub := &Sub{ - Base: b, - } - b.SignKey = key - b.HttpType = base.HttpTypeJson - // b.ShouldSignUpper = true - if b.Opt == 1 { - b.Resp = new(PayResp) - b.ReqURL = payURL - } else if b.Opt == 2 { - b.Resp = new(WithdrawResp) - b.ReqURL = withdrawURL - } else if b.Opt == 3 { - // b.SignPassStr = []string{"sign"} - b.CallbackResp.Msg = "success" - b.CallbackReq = new(PayCallbackReq) - } else if b.Opt == 4 { - // b.SignPassStr = []string{"sign", "msg"} - b.CallbackResp.Msg = "success" - b.CallbackReq = new(WithdrawCallbackReq) - } - b.Sub = sub -} - -type Sub struct { - Base *base.Base -} - -func (s *Sub) PackHeader(header http.Header) { - header.Set("Merchant-Id", config.GetConfig().Pay.IGeek.MID) -} - -func (s *Sub) PackReq() interface{} { - if s.Base.Opt == 1 { - return s.PackPayReq() - } - return s.PackWithdrawReq() -} - -func (s *Sub) GetResp() (proto.Message, error) { - if s.Base.Opt == 1 { - resp := s.Base.Resp.(*PayResp) - if resp.Code != "00000" || resp.Data.PayData == "" { - return nil, errors.New("pay fail") - } - return &pb.InnerRechargeResp{APIOrderID: resp.Data.PayOrderNo, URL: resp.Data.PayData, Channel: uint32(values.LuckinPay)}, nil - } - resp := s.Base.Resp.(*WithdrawResp) - if s.Base.Status == 0 && resp.Code != "00000" { - return nil, errors.New("withdraw fail") - } - return &pb.InnerWithdrawResp{APIOrderID: resp.Data.PayOrderNo, Channel: uint32(values.LuckinPay)}, nil -} - -func (s *Sub) PackPayReq() interface{} { - r := s.Base.PayReq - send := &PayReq{ - MchNo: mid, - MchOrderNo: r.OrderID, - Currency: "BRL", - PayAmount: util.RoundFloat(float64(r.Amount)/common.DecimalDigits, 2), - AccountName: r.Name, - AccountEmail: r.Email, - AccountPhone: r.Phone, - CustomerIP: r.IP, - NotifyUrl: values.GetPayCallback(values.LuckinPay), - SuccessPageUrl: values.GetFrontCallback(), - ReqTime: fmt.Sprintf("%d", time.Now().UnixMilli()), - } - send.Sign, _ = base.SignWithSHA256([]byte(base.GetSignStr(send)), string(privateKey)) - return send -} - -func (s *Sub) PackWithdrawReq() interface{} { - r := s.Base.WithdrawReq - if common.PayType(r.PayType) == common.PayTypeCPF { - r.Number = strings.ReplaceAll(r.Number, "-", "") - r.Number = strings.ReplaceAll(r.Number, ".", "") - } - send := &WithdrawReq{ - MchNo: mid, - MchOrderNo: r.OrderID, - Currency: "BRL", - PayAmount: util.RoundFloat(float64(r.Amount)/common.DecimalDigits, 2), - AccountType: common.PayType(r.PayType).String(), - AccountCode: r.Number, - AccountNo: r.Number, - AccountName: r.Name, - AccountEmail: r.Email, - AccountPhone: r.Phone, - CustomerIP: r.IP, - NotifyUrl: values.GetWithdrawCallback(values.LuckinPay), - ReqTime: fmt.Sprintf("%d", time.Now().UnixMilli()), - } - send.Sign, _ = base.SignWithSHA256([]byte(base.GetSignStr(send)), string(privateKey)) - return send -} - -func (s *Sub) CheckSign(str string) bool { - signStr := values.GetSignStr(str, "sign") - checkSign := "" - s.Base.CallbackResp.Msg = "success" - if s.Base.Opt == 3 { - req := s.Base.CallbackReq.(*PayCallbackReq) - log.Debug("checkSign pay:%+v", *req) - checkSign = req.Sign - s.Base.CallbackResp.OrderID = req.MchOrderNo - s.Base.CallbackResp.Success = req.PayState == 2 - } else if s.Base.Opt == 4 { - req := s.Base.CallbackReq.(*WithdrawCallbackReq) - log.Debug("checkSign withdraw:%+v", *req) - if req.PayState == 1 { - return false - } - checkSign = req.Sign - s.Base.CallbackResp.OrderID = req.MchOrderNo - s.Base.CallbackResp.Success = req.PayState == 2 - s.Base.CallbackResp.APIOrderID = req.PayOrderNo - s.Base.CallbackResp.FailMessage = req.ErrMsg - } - pass, err := base.VerifyWithSHA256([]byte(signStr), checkSign, string(publicKey)) - if err != nil { - log.Error("err:%v", err) - return false - } - return pass -} diff --git a/modules/pay/luckinpay/values.go b/modules/pay/luckinpay/values.go deleted file mode 100644 index e111303..0000000 --- a/modules/pay/luckinpay/values.go +++ /dev/null @@ -1,147 +0,0 @@ -package luckinpay - -const ( - payURL = "https://api.luckyinpay.online/api/pay/createPayinOrder" - withdrawURL = "https://api.luckyinpay.online/api/pay/createPayoutOrder" - mid = "M1704341111" - key = "O4HWRE7LH3HFDU6YTZJJKW7AGCIEICBR2KT1BR8JJVSNBBVUGLV6RA8ECGR82RMLDAOW8SUZW5YHPARCZQVRQE8MS8GGNWQ3PCIDKNIIIS7MOT8AEKESTMCUTRVZYQW7" -) - -var privateKeyPkCs8 = []byte(`-----BEGIN RSA PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCdQYMybS8v6qy9uqTycOH2mRK4aLh4Pzvv530u5eBwY42I+bZO63fUXkXBnecPMgVnlcovPMpPtKa6ocQSAgW2vYmxO+gX0MKPPHcv7UfdmgtC8nUtNoJTfvNOgmElZD64lSJqSGSp2bEE1s6BLH9rLFAr61FzHCHvJFHBlycabXLbByDpLgU/aIDSc0Q8fvSUoS5TacUPSoyAnFZw6k4yX8IAgPZXO3I99CcjsgFjR0b5dXUDaGY4luU13Rg5s7n3iE6mDakiAQ8DJYQNc+I10EgFvoxuviWndiW3zoa1+VLGPsiif7E6X8nfqgOPaexd3E0H7JmUd6JRD0ge8HtXAgMBAAECggEAaI0J4Rjeaokn1+yjhdyvHviejaRyIOBJxTKu8+M52P8XNp5vKwE6ZiNXVWbaHCwxk7Du/4D3MQ72Wtb6OM7HZbuWNBOUN2FAOWMGCwNC6H5mRlhUt36qH0EkGmpslCOV37qnauo+ov5sxr7aBN/Ex0hq9Qg62sE1fn0zLfaEtPhMRqbHHJ9+Jfz7J2Fp69nSxpMfs0h/gOg2Eu2eX+tkgK6G99UJgN+D60XEWqofeUtTu/FVVrKYBLXY1Lzb0nv9XpYXtN4MJa+Xdct2FtHMDUgebCzlVZN/sVlLoSqm+nxdGJD6IbZB0GghW+YZMnimDZ47o+KD7CRXk3fjcvBnYQKBgQDUxvcyfmlcxQdwvOqxXcVW1YvgPSQTFpOc8LEZGwjzs+NjfAbS7tJE7mLImZwon8wHMzuZ2LGwSN+CdpgXiUlTAbcwkyKE9BT4X0GHwp/WD0MPl82EQR6M2bN/71zg+PQc4Sh03JgSC57YGIqVkT55OLlIF3xyriKuApZWMCuVgwKBgQC9M0cOGbJhnOJcRfdl+ZyxslubjocDNRdYH+nSZTddqpR7z04o00/6miCuvzURQ6QorULlh9+WSMB+xOBd4DHn5Zqmw4VN2UujW6dgUvXfXMqtmvldtWK+lsLsge0xbHAq5Ap9fuGnvrYfmvGGbk6m1a1XOnpmUHBVxIXUhBLunQKBgQCZ33Ew4N4NKqdgzh3jOm7VhwTqmwyViUQiwKUyBK0KoFKWxUCiFfeVxddGPmABuN3xbwlxDpYhZ/HLBTyj+LJABwOVazIRd/oaS7i2FvdD9DGI+zyyoe0X6u+2W0GNqDvRDrsVF9oZYrHykHzYAPtu6qiDDAkBXhDSSiiyF4/NRQKBgB59IekqyO0j+/JEsB51wAN+q3aA3E7vAkkIM4TdHLPyZiUhfgXkL5JBvhyK4YFbtht7+DjG0YgFR0fmcAWQuFoXTPmsrlGiP6cegPVryQVqjZq2S5MHRNdTsiussE1znQu8XdhlVvXSLMUhEeTI59HIwzs4SDsuoTuhBLP/aJGdAoGBAJ8ZCNGThSVcQijk1J1Sw0ZelGe2tsgb+2rTl8kiLDOQOgnGKaErGGAyzZBmESqq677vXwbQ+Xn7HWz6HnC+WVoAhxZCLTKXs4YdiMzOiCKeDNWky899OK3qG/6E9CqaO2Pn5F1xlYKVxIUfkwt7aQedFEIcSVN6op2V+JK4fEFX ------END RSA PRIVATE KEY-----`) -var privateKey = []byte(`-----BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEAnUGDMm0vL+qsvbqk8nDh9pkSuGi4eD877+d9LuXgcGONiPm2 -Tut31F5FwZ3nDzIFZ5XKLzzKT7SmuqHEEgIFtr2JsTvoF9DCjzx3L+1H3ZoLQvJ1 -LTaCU37zToJhJWQ+uJUiakhkqdmxBNbOgSx/ayxQK+tRcxwh7yRRwZcnGm1y2wcg -6S4FP2iA0nNEPH70lKEuU2nFD0qMgJxWcOpOMl/CAID2VztyPfQnI7IBY0dG+XV1 -A2hmOJblNd0YObO594hOpg2pIgEPAyWEDXPiNdBIBb6Mbr4lp3Ylt86GtflSxj7I -on+xOl/J36oDj2nsXdxNB+yZlHeiUQ9IHvB7VwIDAQABAoIBAGiNCeEY3mqJJ9fs -o4Xcrx74no2kciDgScUyrvPjOdj/FzaebysBOmYjV1Vm2hwsMZOw7v+A9zEO9lrW -+jjOx2W7ljQTlDdhQDljBgsDQuh+ZkZYVLd+qh9BJBpqbJQjld+6p2rqPqL+bMa+ -2gTfxMdIavUIOtrBNX59My32hLT4TEamxxyffiX8+ydhaevZ0saTH7NIf4DoNhLt -nl/rZICuhvfVCYDfg+tFxFqqH3lLU7vxVVaymAS12NS829J7/V6WF7TeDCWvl3XL -dhbRzA1IHmws5VWTf7FZS6Eqpvp8XRiQ+iG2QdBoIVvmGTJ4pg2eO6Pig+wkV5N3 -43LwZ2ECgYEA1Mb3Mn5pXMUHcLzqsV3FVtWL4D0kExaTnPCxGRsI87PjY3wG0u7S -RO5iyJmcKJ/MBzM7mdixsEjfgnaYF4lJUwG3MJMihPQU+F9Bh8Kf1g9DD5fNhEEe -jNmzf+9c4Pj0HOEodNyYEgue2BiKlZE+eTi5SBd8cq4irgKWVjArlYMCgYEAvTNH -DhmyYZziXEX3ZfmcsbJbm46HAzUXWB/p0mU3XaqUe89OKNNP+pogrr81EUOkKK1C -5YfflkjAfsTgXeAx5+WapsOFTdlLo1unYFL131zKrZr5XbVivpbC7IHtMWxwKuQK -fX7hp762H5rxhm5OptWtVzp6ZlBwVcSF1IQS7p0CgYEAmd9xMODeDSqnYM4d4zpu -1YcE6psMlYlEIsClMgStCqBSlsVAohX3lcXXRj5gAbjd8W8JcQ6WIWfxywU8o/iy -QAcDlWsyEXf6Gku4thb3Q/QxiPs8sqHtF+rvtltBjag70Q67FRfaGWKx8pB82AD7 -buqogwwJAV4Q0kooshePzUUCgYAefSHpKsjtI/vyRLAedcADfqt2gNxO7wJJCDOE -3Ryz8mYlIX4F5C+SQb4ciuGBW7Ybe/g4xtGIBUdH5nAFkLhaF0z5rK5Roj+nHoD1 -a8kFao2atkuTB0TXU7IrrLBNc50LvF3YZVb10izFIRHkyOfRyMM7OEg7LqE7oQSz -/2iRnQKBgQCfGQjRk4UlXEIo5NSdUsNGXpRntrbIG/tq05fJIiwzkDoJximhKxhg -Ms2QZhEqquu+718G0Pl5+x1s+h5wvllaAIcWQi0yl7OGHYjMzogingzVpMvPfTit -6hv+hPQqmjtj5+RdcZWClcSFH5MLe2kHnRRCHElTeqKdlfiSuHxBVw== ------END RSA PRIVATE KEY-----`) -var publicKey = []byte(`-----BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAh/nLyajLky2rGA1rKJD/CYi0BK1onauzcjbDTth9tGeypwZoFLHIlJw3vY1KMIkayBwCVYZK+9X7FpoIcBwcd3mfzFpQA0WIE7gDH+qdtlx/NVKpSyp/6c7l+iKEwxvt8fHbrN/QHMh9xehroS/f8cKxEA8/dC/DAmQQ284ydJ81Ft8pUksWEyL4s3cqbMZSQsbam86U5aU55qWvPvMGqHx/5tfr9dyQ1Pytvr1H9oRPvVXmFRSLofY8GlYapbchSsViyGfAWERs3hYQvAOGB62TEKJfeYTiQyd7/Akn0XCS1S2kS4KllRqq1pIU0XKVjFqXuLf69z05fGZDkytAawIDAQAB ------END PUBLIC KEY----- -`) -var myPublicKey = []byte(`-----BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnUGDMm0vL+qsvbqk8nDh9pkSuGi4eD877+d9LuXgcGONiPm2Tut31F5FwZ3nDzIFZ5XKLzzKT7SmuqHEEgIFtr2JsTvoF9DCjzx3L+1H3ZoLQvJ1LTaCU37zToJhJWQ+uJUiakhkqdmxBNbOgSx/ayxQK+tRcxwh7yRRwZcnGm1y2wcg6S4FP2iA0nNEPH70lKEuU2nFD0qMgJxWcOpOMl/CAID2VztyPfQnI7IBY0dG+XV1A2hmOJblNd0YObO594hOpg2pIgEPAyWEDXPiNdBIBb6Mbr4lp3Ylt86GtflSxj7Ion+xOl/J36oDj2nsXdxNB+yZlHeiUQ9IHvB7VwIDAQAB ------END PUBLIC KEY-----`) - -// var ( -// whiteIPs = []string{"52.67.100.247", "15.228.167.245", "54.207.16.136"} -// ) - -type PayReq struct { - MchNo string `json:"mchNo"` - MchOrderNo string `json:"mchOrderNo"` - Currency string `json:"currency"` - PayAmount string `json:"payAmount"` - AccountName string `json:"accountName"` - AccountEmail string `json:"accountEmail"` - AccountPhone string `json:"accountPhone"` - CustomerIP string `json:"customerIp"` - NotifyUrl string `json:"notifyUrl"` - SuccessPageUrl string `json:"successPageUrl"` - Summary string `json:"summary,omitempty"` - ReqTime string `json:"reqTime"` - Sign string `json:"sign"` -} - -type PayResp struct { - Code string `json:"code"` - Message string `json:"message"` - Sign string `json:"sign"` - Data PaymentData `json:"data"` -} - -// PaymentData 包含在支付响应中的数据体定义 -type PaymentData struct { - PayOrderNo string `json:"payOrderNo"` - MchOrderNo string `json:"mchOrderNo"` - MchNo string `json:"mchNo"` - Currency string `json:"currency"` - PayAmount string `json:"payAmount"` - PayInitiateTime string `json:"payInitiateTime"` - PayData string `json:"payData"` - PayReference string `json:"payReference,omitempty"` - PayState int `json:"payState"` -} - -type PayCallbackReq struct { - PayOrderNo string `json:"payOrderNo"` - MchOrderNo string `json:"mchOrderNo"` - MchNo string `json:"mchNo"` - Currency string `json:"currency"` - PayAmount string `json:"payAmount"` - PayState int `json:"payState"` - PayInitiateTime string `json:"payInitiateTime"` - PayFinishTime string `json:"payFinishTime"` - ErrMsg string `json:"errMsg,omitempty"` - Sign string `json:"sign"` -} - -type WithdrawReq struct { - MchNo string `json:"mchNo"` - MchOrderNo string `json:"mchOrderNo"` - Currency string `json:"currency"` - PayAmount string `json:"payAmount"` - AccountType string `json:"accountType"` - AccountCode string `json:"accountCode"` - AccountNo string `json:"accountNo"` - AccountName string `json:"accountName"` - AccountEmail string `json:"accountEmail"` - AccountPhone string `json:"accountPhone"` - CustomerIP string `json:"customerIp"` - NotifyUrl string `json:"notifyUrl"` - Summary string `json:"summary,omitempty"` - ReqTime string `json:"reqTime"` - Sign string `json:"sign"` -} - -type WithdrawResp struct { - Code string `json:"code"` - Message string `json:"message"` - Sign string `json:"sign"` - Data PayoutData `json:"data"` -} - -type PayoutData struct { - PayOrderNo string `json:"payOrderNo"` - MchOrderNo string `json:"mchOrderNo"` - MchNo string `json:"mchNo"` - Currency string `json:"currency"` - PayAmount string `json:"payAmount"` - PayInitiateTime string `json:"payInitiateTime"` - PayState int `json:"payState"` -} - -type WithdrawCallbackReq struct { - PayOrderNo string `json:"payOrderNo"` - MchOrderNo string `json:"mchOrderNo"` - MchNo string `json:"mchNo"` - Currency string `json:"currency"` - PayAmount string `json:"payAmount"` - PayState int `json:"payState"` - PayInitiateTime string `json:"payInitiateTime"` - PayFinishTime string `json:"payFinishTime"` - ErrMsg string `json:"errMsg,omitempty"` - Sign string `json:"sign"` -} diff --git a/modules/pay/mlpay/base.go b/modules/pay/mlpay/base.go new file mode 100644 index 0000000..38e21df --- /dev/null +++ b/modules/pay/mlpay/base.go @@ -0,0 +1,166 @@ +package mlpay + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" + "server/common" + "server/modules/pay/base" + "server/modules/pay/values" + "server/pb" + "server/util" + "strings" + + "github.com/gogo/protobuf/proto" + "github.com/liangdas/mqant/log" +) + +func NewSub(b *base.Base) { + sub := &Sub{ + Base: b, + } + b.HttpType = base.HttpTypeForm + b.ShouldSignUpper = true + b.SignKey = key + b.Channel = values.MLPay + if b.Opt == base.OPTPay { + b.Resp = new(PayResp) + b.ReqURL = baseUrl + payURL + } else if b.Opt == base.OPTWithdraw { + b.SignKey = withdrawKey + b.Resp = new(WithdrawResp) + b.ReqURL = baseUrl + withdrawURL + } else if b.Opt == base.OPTPayCB { + b.HttpType = base.HttpTypeForm + b.CallbackReq = new(PayCallbackReq) + b.CallbackResp.Msg = "0" + } else if b.Opt == base.OPTWithdrawCB { + b.SignKey = withdrawKey + b.HttpType = base.HttpTypeForm + b.CallbackReq = new(WithdrawCallbackReq) + b.CallbackResp.Msg = "0" + // } else if b.Opt == base.OPTQueryWithdraw { // 查询 + // b.Resp = new(QueryWithdrawResp) + // b.ReqURL = queryWithdrawURL + // } else if b.Opt == base.OPTQueryPay { // 查询 + // b.Resp = new(QueryPayResp) + // b.ReqURL = queryPayURL + } else { + return + } + b.Sub = sub +} + +type Sub struct { + Base *base.Base +} + +func (s *Sub) PackHeader(header http.Header) { +} + +func (s *Sub) PackReq() interface{} { + if s.Base.Opt == base.OPTPay { + return s.PackPayReq() + } else if s.Base.Opt == base.OPTWithdraw { + return s.PackWithdrawReq() + } + return nil +} + +func (s *Sub) GetResp() (proto.Message, error) { + log.Debug("resp:%v", s.Base.Resp) + if s.Base.Opt == base.OPTPay { + resp := s.Base.Resp.(*PayResp) + if resp.Data == "" { + return nil, errors.New("pay fail") + } + return &pb.InnerRechargeResp{APIOrderID: s.Base.PayReq.OrderID, URL: resp.Data, Channel: uint32(values.MLPay)}, nil + } else if s.Base.Opt == base.OPTWithdraw { + resp := s.Base.Resp.(*WithdrawResp) + if s.Base.Status == 0 && resp.Code == "0000" { + return nil, errors.New("withdraw fail") + } + return &pb.InnerWithdrawResp{APIOrderID: resp.Data, Channel: uint32(values.MLPay)}, nil + } + return nil, errors.New("unknown opt") +} + +func (s *Sub) PackPayReq() interface{} { + r := s.Base.PayReq + userDataStr, _ := json.Marshal(UserData{UserName: r.Name, UserEmail: r.Email, UserPhone: r.Phone}) + send := &PayReq{ + PartnerID: PartnerId, + ApplicationID: ApplicationId, + PayWay: 2, + PartnerOrderNo: r.OrderID, + Amount: r.Amount * 100, + Currency: "INR", + Name: r.Name, + GameId: int(r.UID), + ClientIP: r.IP, + NotifyURL: values.GetPayCallback(values.MLPay), + Subject: "Shop", + Body: "product", + CallbackUrl: values.GetPayCallback(values.MLPay), + Extra: string(userDataStr), + Version: "1.0", + } + send.Sign = s.Base.SignMD5(send) + return send +} + +func (s *Sub) PackWithdrawReq() interface{} { + r := s.Base.WithdrawReq + send := &WithdrawReq{ + PartnerID: PartnerId, + PartnerWithdrawNo: r.OrderID, + Amount: r.Amount * 100, + Currency: "INR", + GameId: fmt.Sprintf("%d", r.UID), + NotifyURL: values.GetWithdrawCallback(values.MLPay), + AccountName: r.Name, + AccountPhone: r.Phone, + AccountEmail: r.Email, + Version: "1.0", + } + if r.PayType == int64(common.PayTypeBank) { + send.ReceiptMode = 1 + send.AccountNumber = r.CardNo + send.AccountExtra1 = r.PayCode + send.AccountExtra2 = r.PayCode[:4] + } else if r.PayType == int64(common.PayTypeUPI) { + send.ReceiptMode = 0 + send.AccountNumber = r.PayCode + } else { + return nil + } + send.Sign = s.Base.SignMD5(send) + return send +} + +func (s *Sub) CheckSign(str string) bool { + log.Debug("callback:%v", s.Base.CallbackReq) + sign := "" + if s.Base.Opt == base.OPTPayCB { + req := s.Base.CallbackReq.(*PayCallbackReq) + s.Base.CallbackResp.OrderID = req.PartnerOrderNo + s.Base.CallbackResp.APIOrderID = req.OrderNo + // if req.Status == 1 { + // return false + // } + s.Base.CallbackResp.Success = req.Status == 1 + sign = req.Sign + } else if s.Base.Opt == base.OPTWithdrawCB { + req := s.Base.CallbackReq.(*WithdrawCallbackReq) + s.Base.CallbackResp.OrderID = req.PartnerWithdrawNo + // if req.Status == 1 { + // return false + // } + s.Base.CallbackResp.Success = req.Status == 1 + sign = req.Sign + } + signStr := base.GetSignStrFormURLEncode(s.Base.C, s.Base.CallbackReq, "sign") + signStr2 := base.GetSignStrURLEncode(signStr, "sign") + "&key=" + s.Base.SignKey + return strings.ToUpper(util.CalculateMD5(signStr2)) == sign +} diff --git a/modules/pay/mlpay/values.go b/modules/pay/mlpay/values.go new file mode 100644 index 0000000..910cb9a --- /dev/null +++ b/modules/pay/mlpay/values.go @@ -0,0 +1,137 @@ +package mlpay + +import ( + "fmt" + "server/util" + "sort" + "strings" + + "github.com/liangdas/mqant/log" +) + +const ( + baseUrl = "https://api.lovetigervip.com" + payURL = "/pay/order" + payCallbackURL = "/mlpay/pay/callback" + withdrawURL = "/pay/withdraw" + withdrawCallbackURL = "/mlpay/withdraw/callback" + PartnerId = 1000100020003074 + ApplicationId = 69 + key = "83EF99E9E32C4B70832A4DB779BA01C7" + withdrawKey = "82BD667CE13049C4A881B52218A4F935" +) + +type PayReq struct { + PartnerID int64 `json:"partnerId"` + ApplicationID int64 `json:"applicationId"` + PayWay int `json:"payWay"` // 支付方式ID 固定值 2 + PartnerOrderNo string `json:"partnerOrderNo"` + Amount int64 `json:"amount"` + Currency string `json:"currency"` + Name string `json:"name"` + GameId int `json:"gameId"` + ClientIP string `json:"clientIp"` + NotifyURL string `json:"notifyUrl" encode:"1"` + Subject string `json:"subject"` + Body string `json:"body"` + CallbackUrl string `json:"callbackUrl" encode:"1"` + Extra string `json:"extra" encode:"1"` + Version string `json:"version"` // 接口版本号,固定:1.0 + Sign string `json:"sign"` +} + +type UserData struct { + UserName string `json:"userName"` + UserEmail string `json:"userEmail"` + UserPhone string `json:"userPhone"` +} + +type PayResp struct { + Code string `json:"code"` + Msg string `json:"msg"` + Data string `json:"data"` +} + +type PayData struct { + Amount string `json:"amount"` + MchOrder string `json:"mch_order"` + OrderNo string `json:"order_no"` // 平台订单号 + PayLink string `json:"pay_link"` // 支付链接 + Timestamp int64 `json:"timestamp"` // 时间戳 +} + +type PayCallbackReq struct { + Status int64 `json:"status" form:"status"` // 0失败 1成功 + ApplicationID int64 `json:"applicationId" form:"applicationId"` + PayWay int64 `json:"payWay" form:"payWay"` + PartnerOrderNo string `json:"partnerOrderNo" form:"partnerOrderNo"` // 商户订单号 + OrderNo string `json:"orderNo" form:"orderNo"` // 平台订单号 + ChannelOrderNo string `json:"channelOrderNo" form:"channelOrderNo"` // 上游生成的代收号 + Amount int64 `json:"amount" form:"amount"` + Sign string `json:"sign" form:"sign"` +} + +type WithdrawReq struct { + PartnerID int64 `json:"partnerId"` + PartnerWithdrawNo string `json:"partnerWithdrawNo"` + Amount int64 `json:"amount"` + Currency string `json:"currency"` + GameId string `json:"gameId"` + NotifyURL string `json:"notifyUrl" encode:"1"` + ReceiptMode int `json:"receiptMode"` // currency=INR时收款方式0:UPI;1:IMPS;currency=BRL时收款方式 0:CPF;1:CNPJ;2:PHONE;3:EMAIL;4:EVP + AccountNumber string `json:"accountNumber" encode:"1"` // 收款账户(URLENCODE编码,计算签名使用编码前数值) + AccountName string `json:"accountName" encode:"1"` // 收款姓名(URLENCODE编码,计算签名使用编码前数值) + AccountPhone string `json:"accountPhone" encode:"1"` // 收款电话(URLENCODE编码,计算签名使用编码前数值) + AccountEmail string `json:"accountEmail" encode:"1"` // 收款邮箱(URLENCODE编码,计算签名使用编码前数值) + AccountExtra1 string `json:"accountExtra1"` // currency=INR时,收款特殊参数1(当receiptMode为1时,此参数必填)(IFSC CODE) + AccountExtra2 string `json:"accountExtra2"` // currency=INR时,收款特殊参数2(当receiptMode为1时,此参数在某些通道下必填,具体联系运营)(银行代码) + Version string `json:"version"` // 接口版本号,固定:1.0 + Sign string `json:"sign"` +} + +type WithdrawResp struct { + Code string `json:"code"` + Msg string `json:"msg"` + Data string `json:"data"` +} + +type WithdrawData struct { + Amount string `json:"amount"` + MchOrder string `json:"mch_order"` + OrderNo string `json:"order_no"` // 平台订单号 + Timestamp int64 `json:"timestamp"` // 时间戳 +} + +type WithdrawCallbackReq struct { + Status int64 `json:"status" form:"status"` // 0失败 1成功 + ErrorMsg int64 `json:"errorMsg" form:"errorMsg" encode:"1"` + PartnerWithdrawNo string `json:"partnerWithdrawNo" form:"partnerWithdrawNo"` // 商户订单号 + WithdrawNo string `json:"withdrawNo" form:"withdrawNo"` // 平台订单号 + ChannelWithdrawNo string `json:"channelWithdrawNo" form:"channelWithdrawNo"` // 上游生成的代收号 + Amount int64 `json:"amount" form:"amount"` + Sign string `json:"sign" form:"sign"` +} + +func Sign(m map[string]interface{}, t int) string { + str := []string{} + for i := range m { + if i == "sign" { + continue + } + str = append(str, i) + } + sort.Strings(str) + signStr := "" + for _, v := range str { + mv := m[v] + signStr += fmt.Sprintf("%v=%v", v, mv) + signStr += "&" + } + if t == 0 { + signStr += "key=" + key + } else { + signStr += "key=" + withdrawKey + } + log.Debug("signStr:%v", signStr) + return strings.ToUpper(util.CalculateMD5(signStr)) +} diff --git a/modules/pay/moonpay2/base.go b/modules/pay/moonpay2/base.go new file mode 100644 index 0000000..9049fb5 --- /dev/null +++ b/modules/pay/moonpay2/base.go @@ -0,0 +1,233 @@ +package moonpay2 + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" + "server/common" + "server/modules/pay/base" + "server/modules/pay/values" + "server/pb" + "server/util" + "strings" + + "github.com/gogo/protobuf/proto" + "github.com/liangdas/mqant/log" +) + +func NewSub(b *base.Base) { + sub := &Sub{ + Base: b, + } + b.HttpType = base.HttpTypeJson + b.ShouldSignUpper = true + b.Channel = values.MoonPay2 + if b.Opt == base.OPTPay { + b.Resp = new(PayResp) + b.ReqURL = payURL + } else if b.Opt == base.OPTWithdraw { + b.Resp = new(WithdrawResp) + b.ReqURL = withdrawURL + } else if b.Opt == base.OPTPayCB { + b.CallbackReq = new(PayCallbackReq) + b.CallbackResp.Msg = "success" + } else if b.Opt == base.OPTWithdrawCB { + b.CallbackReq = new(WithdrawCallbackReq) + b.CallbackResp.Msg = "success" + } else if b.Opt == base.OPTQueryWithdraw { // 查询 + b.Resp = new(QueryWithdrawResp) + b.ReqURL = queryWithdrawURL + } else if b.Opt == base.OPTQueryPay { // 查询 + b.Resp = new(QueryPayResp) + b.ReqURL = queryPayURL + } else { + return + } + b.Sub = sub +} + +type Sub struct { + Base *base.Base +} + +func (s *Sub) PackHeader(header http.Header) { +} + +func (s *Sub) PackReq() interface{} { + if s.Base.Opt == base.OPTPay { + return s.PackPayReq() + } else if s.Base.Opt == base.OPTWithdraw { + return s.PackWithdrawReq() + } else if s.Base.Opt == base.OPTQueryWithdraw { + return s.PackQueryWithdrawReq() + } else if s.Base.Opt == base.OPTQueryPay { + return s.PackQueryPayReq() + } + return nil +} + +func (s *Sub) GetResp() (proto.Message, error) { + log.Debug("resp:%v", s.Base.Resp) + if s.Base.Opt == base.OPTPay { + resp := s.Base.Resp.(*PayResp) + if resp.Data.PayURL == "" { + return nil, errors.New("pay fail") + } + return &pb.InnerRechargeResp{APIOrderID: resp.Data.PlatNumber, URL: resp.Data.PayURL, Channel: uint32(values.MoonPay2)}, nil + } else if s.Base.Opt == base.OPTWithdraw { + resp := s.Base.Resp.(*WithdrawResp) + if s.Base.Status == 0 && resp.Code != 100 { + return nil, errors.New("withdraw fail") + } + data := &WithdrawData{} + tmp, ok := resp.Data.(map[string]interface{}) + if ok { + str, _ := json.Marshal(tmp) + json.Unmarshal([]byte(str), data) + } + return &pb.InnerWithdrawResp{APIOrderID: data.PlatNumber, Channel: uint32(values.MoonPay2)}, nil + } else if s.Base.Opt == base.OPTQueryWithdraw { + resp := s.Base.Resp.(*QueryWithdrawResp) + ret := &pb.InnerQueryWithdrawResp{Msg: resp.Msg} + if len(resp.Data) == 0 { + ret.Status = 2 + return ret, nil + } + ret.OrderID = resp.Data[0].OrderNumber + s.Base.QueryWithdrawResp.OrderID = resp.Data[0].OrderNumber + // ret.APIOrderID=resp.Data[0]. + // s.Base.QueryWithdrawResp.APIOrderID = resp.Data.OrderID + s.Base.QueryWithdrawResp.Msg = resp.Msg + if s.Base.Status != 0 { + s.Base.QueryWithdrawResp.Status = 3 + } else { + if resp.Code == 100 && resp.Data[0].Status == 4 { + s.Base.QueryWithdrawResp.Status = 1 + } else if resp.Data[0].Status == 2 || resp.Data[0].Status == 3 || resp.Data[0].Status == 5 { + s.Base.QueryWithdrawResp.Status = 2 + } else { + s.Base.QueryWithdrawResp.Status = 3 + } + } + return ret, nil + } else if s.Base.Opt == base.OPTQueryPay { + resp := s.Base.Resp.(*QueryPayResp) + ret := &pb.InnerQueryWithdrawResp{Msg: resp.Msg} + if len(resp.Data) == 0 { + ret.Status = 2 + return ret, nil + } + s.Base.QueryPayResp.APIOrderID = resp.Data[0].OrderNumber + // s.Base.QueryPayResp.OrderID = resp.Data.MOrderID + s.Base.QueryPayResp.Msg = resp.Msg + if s.Base.Status != 0 { + s.Base.QueryPayResp.Status = 3 + } else { + if resp.Code == 100 && resp.Data[0].Status == 4 { + s.Base.QueryPayResp.Status = 1 + } else if resp.Data[0].Status == 3 { + s.Base.QueryPayResp.Status = 2 + } else { + s.Base.QueryPayResp.Status = 3 + } + } + return ret, nil + } + return nil, errors.New("unknown opt") +} + +func (s *Sub) PackPayReq() interface{} { + r := s.Base.PayReq + send := &PayReq{ + MerchantID: mid, + OrderNumber: r.OrderID, + OrderAmount: fmt.Sprintf("%d", r.Amount), + Email: r.Email, + Name: r.Name, + Phone: r.Phone, + Deeplink: "0", + NotifyURL: values.GetPayCallback(values.MoonPay2), + } + send.Sign = strings.ToUpper(util.CalculateMD5(send.OrderNumber + mid + signKey)) + return send +} + +func (s *Sub) PackWithdrawReq() interface{} { + r := s.Base.WithdrawReq + send := &WithdrawReq{ + MerchantID: mid, + OrderNumber: r.OrderID, + OrderAmount: fmt.Sprintf("%d", r.Amount), + // Type: , + // VPA: , + Email: r.Email, + // Account: , + Name: r.Name, + // IFSC: , + Phone: r.Phone, + NotifyURL: values.GetWithdrawCallback(values.MoonPay2), + } + if r.PayType == int64(common.PayTypeBank) { + send.Type = "BANK" + send.Account = r.CardNo + send.IFSC = r.PayCode + } else if r.PayType == int64(common.PayTypeUPI) { + send.Type = "UPI" + send.VPA = r.PayCode + } else { + return nil + } + signData, _ := json.Marshal(send) + sign, _ := base.SignWithSHA256(signData, string(privateKey)) + send.Sign = sign + return send +} + +func (s *Sub) CheckSign(str string) bool { + log.Debug("callback:%v", s.Base.CallbackReq) + if s.Base.Opt == base.OPTPayCB { + req := s.Base.CallbackReq.(*PayCallbackReq) + s.Base.CallbackResp.OrderID = req.OrderNumber + s.Base.CallbackResp.APIOrderID = req.PlatNumber + if req.Status == 1 { + return false + } + s.Base.CallbackResp.Success = req.Status == 4 + + return strings.ToUpper(util.CalculateMD5(req.OrderNumber+mid+signKey)) == req.Sign + } else if s.Base.Opt == base.OPTWithdrawCB { + req := s.Base.CallbackReq.(*WithdrawCallbackReq) + s.Base.CallbackResp.OrderID = req.OrderNumber + if req.Status == 1 { + return false + } + s.Base.CallbackResp.Success = req.Status == 4 + err := base.RsaDecode(req.Sign, string(publicKey)) + if err != nil { + log.Error("err:%v", err) + } + return err == nil + } + return false +} + +func (s *Sub) PackQueryWithdrawReq() interface{} { + r := s.Base.WithdrawReq + send := &QueryWithdrawReq{ + MerchantID: mid, + OrderList: []string{r.OrderID}, + } + send.Sign = strings.ToUpper(util.CalculateMD5(mid + signKey)) + return send +} + +func (s *Sub) PackQueryPayReq() interface{} { + r := s.Base.PayReq + send := &QueryPayReq{ + MerchantID: mid, + OrderList: []string{r.OrderID}, + } + send.Sign = strings.ToUpper(util.CalculateMD5(mid + signKey)) + return send +} diff --git a/modules/pay/moonpay2/values.go b/modules/pay/moonpay2/values.go new file mode 100644 index 0000000..ac15739 --- /dev/null +++ b/modules/pay/moonpay2/values.go @@ -0,0 +1,146 @@ +package moonpay2 + +const ( + payURL = "https://api.apayindiag.com/v1/pay/payin" + withdrawURL = "https://api.apayindiag.com/v1/payout/withdraw" + queryWithdrawURL = "https://api.apayindiag.com/v1/pay/check_payout_order" + queryPayURL = "https://api.apayindiag.com/v1/pay/check_payin_order" + signKey = "0b513f511e35dd5c3e1f6a8cdbc8db04" + mid = "190" +) + +var privateKeyPkCs8 = []byte(`-----BEGIN RSA PRIVATE KEY----- +MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJpzh86YFNMBwgJehf9zOukX+4h1qvwEq2l0Vh3YQzwhGnT7xBSMG6uhXafnSSUvAa0MSFnZfvz37WsavL8d5BgI0+7mZT/CHGL6jKJul5go3thQAuNW3odBfhCy+zOMV7BSt6PgY580cuNesMCYGQGPodMI+a6nQ6jMWp+xMeW9AgMBAAECgYBZ3tupFMkZNq6jHkkuKOigdToBXyaM2lK7W9w4JXyJ4mE4rL6djiETryOF7YicQEvjW4BF985yd/kIF1i4hDYR9C0UR3V+gh++1h0ko1KpzgMlGxef2BNhYjFxy7gKat2uYic91+PeHaqfYkR50FK8cgHEeoYP+r0+19nJrtx56QJBAOaa2wdSo16xUz8MQqNkQ8rskE0ADAbDnOnN5yOY7QSFBV/Yc8JQr0tTUbgTf2xEVtPD3mJqqnlDAjb5KK1zwhsCQQCrdcZpRYKnEmMxBbgz+/32xaUHIMn4GccdW8qTCXWY4xtNKp39tHuZ9OgLGRJck/yyWKfdCgL6uBj7Y8pxCDUHAkEAnr4W7JGMeJDk10/fR46rxDLYmsjffoCFscTVygFpl2TicDoWZbsZEGdIp8h0PNlGU/xPR7xZoaPpEGKwB8bZ5QJAX00wQlUjgM+kmJvwPdzD1YUX7DVabW+OkA/0MfQhDCC3jRWyCVFnHjTVQU3nOdP7sfm7HA4zh74KDLjzzg3cwwJBAOaCNF7gkvFTdcJgnplBqSlJjPJuGcKcoD6obVD1iSLFa70y9OrAErFLeOrME5bkWuD7FKjajytV7vXmGfQLtAM=-----END RSA PRIVATE KEY-----`) +var privateKey = []byte(`-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQCac4fOmBTTAcICXoX/czrpF/uIdar8BKtpdFYd2EM8IRp0+8QU +jBuroV2n50klLwGtDEhZ2X789+1rGry/HeQYCNPu5mU/whxi+oyibpeYKN7YUALj +Vt6HQX4QsvszjFewUrej4GOfNHLjXrDAmBkBj6HTCPmup0OozFqfsTHlvQIDAQAB +AoGAWd7bqRTJGTauox5JLijooHU6AV8mjNpSu1vcOCV8ieJhOKy+nY4hE68jhe2I +nEBL41uARffOcnf5CBdYuIQ2EfQtFEd1foIfvtYdJKNSqc4DJRsXn9gTYWIxccu4 +CmrdrmInPdfj3h2qn2JEedBSvHIBxHqGD/q9PtfZya7ceekCQQDmmtsHUqNesVM/ +DEKjZEPK7JBNAAwGw5zpzecjmO0EhQVf2HPCUK9LU1G4E39sRFbTw95iaqp5QwI2 ++Sitc8IbAkEAq3XGaUWCpxJjMQW4M/v99sWlByDJ+BnHHVvKkwl1mOMbTSqd/bR7 +mfToCxkSXJP8slin3QoC+rgY+2PKcQg1BwJBAJ6+FuyRjHiQ5NdP30eOq8Qy2JrI +336AhbHE1coBaZdk4nA6FmW7GRBnSKfIdDzZRlP8T0e8WaGj6RBisAfG2eUCQF9N +MEJVI4DPpJib8D3cw9WFF+w1Wm1vjpAP9DH0IQwgt40VsglRZx401UFN5znT+7H5 +uxwOM4e+Cgy4884N3MMCQQDmgjRe4JLxU3XCYJ6ZQakpSYzybhnCnKA+qG1Q9Yki +xWu9MvTqwBKxS3jqzBOW5Frg+xSo2o8rVe715hn0C7QD +-----END RSA PRIVATE KEY----- +`) +var publicKey = []byte(`-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpsjT2KM439eEZteEsejLVS8phCvPbFb93UvS6KdAPt+381Bvdbff3AejQs5n3+089DnG5e8n53udNxftd+OEnSO3bMmYX/ylN9ul0oXpybUM1wXAfzfXmWeb5rIelSgxy8RoGQGP9o/iOr3n+eFJdvzoYTZvGDrcEjPGIZP9N4wIDAQAB +-----END PUBLIC KEY-----`) +var myPublicKey = []byte(`-----BEGIN PUBLIC KEY----- +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCac4fOmBTTAcICXoX/czrpF/uIdar8BKtpdFYd2EM8IRp0+8QUjBuroV2n50klLwGtDEhZ2X789+1rGry/HeQYCNPu5mU/whxi+oyibpeYKN7YUALjVt6HQX4QsvszjFewUrej4GOfNHLjXrDAmBkBj6HTCPmup0OozFqfsTHlvQIDAQAB +-----END PUBLIC KEY-----`) + +type PayReq struct { + MerchantID string `json:"merchant_id"` + OrderNumber string `json:"order_number"` + OrderAmount string `json:"order_amount"` + Email string `json:"email"` + Name string `json:"name"` + Phone string `json:"phone"` + Deeplink string `json:"deeplink"` + NotifyURL string `json:"notify_url"` + Sign string `json:"sign"` +} + +type PayResp struct { + Code int `json:"code"` // code=100时 为响应成功 + Data struct { + PayURL string `json:"pay_url"` + PlatNumber string `json:"plat_number"` + OrderNumber string `json:"order_number"` + OrderAmount string `json:"order_amount"` + } `json:"data"` + Msg string `json:"msg"` + Time int64 `json:"time"` +} + +type PayCallbackReq struct { + Status int `json:"status"` // 状态1=处理中,3=失败,4=成功 + Message string `json:"message"` + Money string `json:"money"` + PlatNumber string `json:"plat_number"` + OrderNumber string `json:"order_number"` + Sign string `json:"sign"` +} + +type QueryPayReq struct { + MerchantID string `json:"merchant_id"` + OrderList []string `json:"order_list"` + Sign string `json:"sign"` +} + +type QueryPayResp struct { + Code int `json:"code"` + Data []QueryPayData `json:"data"` + Msg string `json:"msg"` + Time int64 `json:"time"` +} + +type QueryPayData struct { + Status int `json:"status"` // 状态:0是待处理,1=处理中,3=失败,4=成功(代付订单状态以此为准吗,切勿以code值做订单状态判断) + OrderNumber string `json:"order_number"` + Utr string `json:"utr"` + OrderAmount string `json:"order_amount"` +} + +type WithdrawReq struct { + MerchantID string `json:"merchant_id"` + OrderNumber string `json:"order_number"` + OrderAmount string `json:"order_amount"` + Type string `json:"type"` + VPA string `json:"vpa"` + Email string `json:"email"` + Account string `json:"account"` + Name string `json:"name"` + IFSC string `json:"ifsc"` + Phone string `json:"phone"` + NotifyURL string `json:"notify_url"` + Sign string `json:"sign"` +} + +type WithdrawResp struct { + Code int `json:"code"` // code=100即为成功;其他值为失败(若万一出现无返回值的情况,请将您的订单状态转换为处理中,以免引起不必要的损失) + Data interface{} `json:"data"` + Msg string `json:"msg"` + Time int `json:"time"` +} + +type WithdrawData struct { + Status int `json:"status"` + PlatNumber string `json:"plat_number"` + OrderNumber string `json:"order_number"` + OrderAmount string `json:"order_amount"` +} + +type WithdrawCallbackReq struct { + Status int `json:"status"` + Message string `json:"message"` + Money string `json:"money"` + PlatNumber string `json:"plat_number"` + OrderNumber string `json:"order_number"` + Sign string `json:"sign"` +} + +type QueryWithdrawReq struct { + MerchantID string `json:"merchant_id"` + OrderList []string `json:"order_list"` + Sign string `json:"sign"` +} + +type QueryWithdrawResp struct { + Code int `json:"code"` + Data []QueryWithdrawData `json:"data"` + Msg string `json:"msg"` + Time int64 `json:"time"` +} + +type QueryWithdrawData struct { + Status int `json:"status"` // 状态:0是待处理,1=处理中,2=拒绝,3=失败,4=成功,5=撤销(代付订单状态以此为准吗,切勿以code值做订单状态判断) + OrderNumber string `json:"order_number"` + Utr string `json:"utr"` + OrderAmount string `json:"order_amount"` +} diff --git a/modules/pay/pluspay/base.go b/modules/pay/pluspay/base.go deleted file mode 100644 index bbace99..0000000 --- a/modules/pay/pluspay/base.go +++ /dev/null @@ -1,139 +0,0 @@ -package pluspay - -import ( - "errors" - "fmt" - "net/http" - "server/common" - "server/config" - "server/modules/pay/base" - "server/modules/pay/values" - "server/pb" - "server/util" - "strings" - - "github.com/gogo/protobuf/proto" - "github.com/liangdas/mqant/log" -) - -func NewSub(b *base.Base) { - sub := &Sub{ - Base: b, - } - b.SignKey = key - b.HttpType = base.HttpTypeForm - b.ShouldSignUpper = true - b.WhiteIPs = whiteIPs - if b.Opt == 1 { - b.Resp = new(PayResp) - b.ReqURL = payURL - } else if b.Opt == 2 { - b.Resp = new(WithdrawResp) - b.ReqURL = withdrawURL - } else if b.Opt == 3 { - b.SignPassStr = []string{"sign"} - b.CallbackResp.Msg = "success" - b.CallbackReq = new(PayCallbackReq) - } else if b.Opt == 4 { - b.SignPassStr = []string{"sign", "msg"} - b.CallbackResp.Msg = "success" - b.CallbackReq = new(WithdrawCallbackReq) - } - b.Sub = sub -} - -type Sub struct { - Base *base.Base -} - -func (s *Sub) PackHeader(header http.Header) { - header.Set("Merchant-Id", config.GetConfig().Pay.IGeek.MID) -} - -func (s *Sub) PackReq() interface{} { - if s.Base.Opt == 1 { - return s.PackPayReq() - } - return s.PackWithdrawReq() -} - -func (s *Sub) GetResp() (proto.Message, error) { - if s.Base.Opt == 1 { - resp := s.Base.Resp.(*PayResp) - if resp.RetCode != "SUCCESS" || resp.PayURL == "" { - return nil, errors.New("pay fail") - } - return &pb.InnerRechargeResp{APIOrderID: resp.PlatOrder, URL: resp.PayURL, Channel: uint32(values.PlusPay)}, nil - } - resp := s.Base.Resp.(*WithdrawResp) - if s.Base.Status == 0 && resp.RetCode != "SUCCESS" { - return nil, errors.New("withdraw fail") - } - return &pb.InnerWithdrawResp{APIOrderID: resp.PlatOrder, Channel: uint32(values.PlusPay)}, nil -} - -func (s *Sub) PackPayReq() interface{} { - r := s.Base.PayReq - send := &PayReq{ - MchID: mid, - OrderNo: r.OrderID, - Amount: util.RoundFloat(float64(r.Amount)/common.DecimalDigits, 2), - Product: "baxipix", - BankCode: "all", - Goods: fmt.Sprintf("email:%v/name:%v/phone:%v", r.Email, r.Name, r.Phone), // email:520155@gmail.com/name:tom/phone:7894561230 - // Goods: "testtests", - NotifyURL: values.GetPayCallback(values.PlusPay), - // NotifyURL: "asdasd", - // ReturnURL: "testtest", - ReturnURL: values.GetFrontCallback(), - } - send.Sign = s.Base.SignMD5(send) - return send -} - -func (s *Sub) PackWithdrawReq() interface{} { - r := s.Base.WithdrawReq - if common.PayType(r.PayType) == common.PayTypeCPF { - r.Number = strings.ReplaceAll(r.Number, "-", "") - r.Number = strings.ReplaceAll(r.Number, ".", "") - } - bc := strings.ToLower(common.PayType(r.PayType).String()) - send := &WithdrawReq{ - Type: "api", - MchID: mid, - MchTransNo: r.OrderID, - Amount: util.RoundFloat(float64(r.Amount)/common.DecimalDigits, 2), - NotifyURL: values.GetWithdrawCallback(values.PlusPay), - AccountName: r.Name, - AccountNo: r.Number, - BankCode: bc, - RemarkInfo: fmt.Sprintf("email:%v/phone:%v/mode:pix/%v:%v", r.Email, r.Phone, bc, r.Number), // email:520155@gmail.com/phone:9784561230/mode:pix/cpf:555555555(必须是真实的) - } - send.Sign = s.Base.SignMD5(send) - return send -} - -func (s *Sub) CheckSign(str string) bool { - str += "&key=" + key - checkSign := "" - s.Base.CallbackResp.Msg = "success" - if s.Base.Opt == 3 { - req := s.Base.CallbackReq.(*PayCallbackReq) - log.Debug("checkSign pay:%+v", *req) - checkSign = req.Sign - s.Base.CallbackResp.OrderID = req.OrderNo - s.Base.CallbackResp.Success = req.Status == "2" - } else if s.Base.Opt == 4 { - req := s.Base.CallbackReq.(*WithdrawCallbackReq) - log.Debug("checkSign withdraw:%+v", *req) - if req.Status == "1" { - return false - } - checkSign = req.Sign - s.Base.CallbackResp.OrderID = req.MchTransNo - s.Base.CallbackResp.Success = req.Status == "2" - s.Base.CallbackResp.APIOrderID = req.MchTransNo - s.Base.CallbackResp.FailMessage = req.Msg - } - return strings.ToUpper(util.CalculateMD5(str)) == checkSign -} diff --git a/modules/pay/pluspay/values.go b/modules/pay/pluspay/values.go deleted file mode 100644 index fe1143f..0000000 --- a/modules/pay/pluspay/values.go +++ /dev/null @@ -1,73 +0,0 @@ -package pluspay - -const ( - payURL = "http://api.fatpag.org/apipay" - withdrawURL = "http://api.fatpag.org/apitrans" - mid = "1686993516524" - key = "O4HWRE7LH3HFDU6YTZJJKW7AGCIEICBR2KT1BR8JJVSNBBVUGLV6RA8ECGR82RMLDAOW8SUZW5YHPARCZQVRQE8MS8GGNWQ3PCIDKNIIIS7MOT8AEKESTMCUTRVZYQW7" -) - -var ( - whiteIPs = []string{"52.67.100.247", "15.228.167.245", "54.207.16.136"} -) - -type PayReq struct { - MchID string `json:"mchId"` // 商户号,必填,填写商户的开户号。巴西 baxipix - OrderNo string `json:"orderNo"` // 订单号,必填,至少6位字符,最多22位。 - Amount string `json:"amount"` // 金额,必填,单位为元,保留两位小数。 - Product string `json:"product"` // 产品号,必填,支付产品说明。 - BankCode string `json:"bankcode"` // 银行代号(小写),必填,没有明确说明填写"all",具体填写见1.3订单说明。 - Goods string `json:"goods"` // 物品说明,必填,本字段是扩展字段,参考后面的说明进行对应格式要求进行字符串拼接。一般情况下提交email、name、phone等参数,格式举例:email:520155@gmail.com/name:tom/phone:7894561230。特殊情况在1.3订单说明中有具体描述。 - NotifyURL string `json:"notifyUrl"` // 异步通知,必填,支持HTTP和HTTPS通知,通知方式为POST。 - ReturnURL string `json:"returnUrl"` // 同步通知,必填,支持HTTP和HTTPS通知,通知方式为POST。 - Sign string `json:"sign"` // 签名,必填,MD5签名,签名顺序是字典排序。 -} - -type PayResp struct { - RetCode string `json:"retCode"` - PayURL string `json:"payUrl"` - OrderNo string `json:"orderNo"` - PlatOrder string `json:"platOrder"` - Code string `json:"code"` -} - -type PayCallbackReq struct { - MchID string `json:"mchId"` // 商户号,商户的开户号。 - OrderNo string `json:"orderNo"` // 订单号,至少6位字符,最多22位。 - Amount string `json:"amount"` // 金额,单位为元,保留两位小数。 - Product string `json:"product"` // 产品号,参考product支付产品说明。 - PaySuccTime string `json:"paySuccTime"` // 支付成功时间。 - Status string `json:"status"` // 成功状态,1:支付中,2:成功,5:失效,-1:失败。 - Sign string `json:"sign"` // 签名,商户返回数据得到签名与返回的签名进行验签名。 -} - -type WithdrawReq struct { - Type string `json:"type"` // 转账类型,必填,必填字符小写固定字符"api"。 - MchID string `json:"mchId"` // 商户号,必填,填写商户的开户号。 - MchTransNo string `json:"mchTransNo"` // 转账订单号,必填,至少6位字符,最多22位。 - Amount string `json:"amount"` // 金额,必填,单位为元,保留两位小数。 - NotifyURL string `json:"notifyUrl"` // 通知地址,必填,支持HTTP和HTTPS通知,通知方式为POST。 - AccountName string `json:"accountName"` // 账户名,必填,持卡人姓名。 - AccountNo string `json:"accountNo"` // 账号,必填,持卡人卡号。 - BankCode string `json:"bankCode"` // 银行代号(驼峰法),必填,见章节五各个国家银行代号。 - RemarkInfo string `json:"remarkInfo"` // 备注,必填,见章节五具体说明。 - Sign string `json:"sign"` // 签名,必填,MD5签名,签名顺序是字典排序。 -} - -type WithdrawResp struct { - RetCode string `json:"retCode"` // 成功 SUCCESS 失败 FAIL - RetMsg string `json:"retMsg"` - MchTransNo string `json:"mchTransNo"` - PlatOrder string `json:"platOrder"` - Status string `json:"status"` -} - -type WithdrawCallbackReq struct { - MchID string `json:"mchId"` // 商户号,商户的开户号。 - MchTransNo string `json:"mchTransNo"` // 转账订单号,至少6位字符,最多22位。 - Amount string `json:"amount"` // 金额,单位为元,保留两位小数。 - Status string `json:"status"` // 状态,1:处理中,2:成功,3:失败。 - TransSuccTime string `json:"transSuccTime"` // 成功时间。 - Sign string `json:"sign"` // 签名,商户返回数据得到签名与返回的签名进行验签名。 - Msg string `json:"msg"` // 信息描述,不参与签名,信息描述。 -} diff --git a/modules/pay/timer.go b/modules/pay/timer.go index c6793d9..4865791 100644 --- a/modules/pay/timer.go +++ b/modules/pay/timer.go @@ -263,15 +263,15 @@ func TryWithdraw(or *common.WithdrawOrder) { Name: send.Name, Email: send.Email, PayType: int64(send.PayType), - Number: send.Number, + // Number: send.Number, UID: uint32(or.UID), Channel: int64(or.UPI), Address: send.Address, IP: send.IP, } - channel := call.GetConfigWithdrawChannelsByID(int(req.Channel), common.CurrencyBrazil) + channel := call.GetConfigWithdrawChannelsByID(int(req.Channel), common.CurrencyINR) if channel == nil || channel.WithdrawPer <= 0 { - con := call.GetConfigWithdrawChannelsBest(common.CurrencyBrazil) + con := call.GetConfigWithdrawChannelsBest(common.CurrencyINR) if con == nil { return } diff --git a/modules/pay/values/values.go b/modules/pay/values/values.go index 1b947ee..7edd81a 100644 --- a/modules/pay/values/values.go +++ b/modules/pay/values/values.go @@ -24,12 +24,49 @@ import ( type PayWay int const ( - InvalidPay PayWay = iota + FunzonePay PayWay = iota + WellPay + OctroPay IGeekPay - PlusPay - LuckinPay - BFPay - Grepay + CloudPay + VSPay + JoyPay + FFPay + BestPay + HXPay + MGPay + OOPay + ZWPay + FastPay + HaoPay + QPPay + OwlPay + SkyPay + GrePay + MoonPay + AcePay + MccPay + YoduPay + WordPay + HWPay + JJPay + AntPay + MLPay + RojPay + QuantaPay + InnoPay + PePay + FF8Pay + FlaPay + DidaPay + CYGGPay + ZPay + HappyPay + FastPlusPay + GoPay + LemonPay + CamelPay + MoonPay2 PayAll ) @@ -39,7 +76,8 @@ const ( ) var ( - PayWeightLock = new(sync.RWMutex) + PayWeightLock = new(sync.RWMutex) + WithdrawWeightLock = new(sync.RWMutex) ) // SelectPayWay 特定条件为玩家优先选择渠道 @@ -430,3 +468,21 @@ func IsTopChannel(cid, top int, amount int64) bool { } return false } + +func WithdrawAmount(w PayWay, success bool, amount int64) { + WithdrawWeightLock.Lock() + defer WithdrawWeightLock.Unlock() + con := call.GetConfigWithdrawChannelsByID(int(w), common.CurrencyINR) + if con == nil { + return + } + fee := con.CalAmount(amount) + // 成功扣除余额,失败的情况,余额退回 + if success { + fee = -fee + } + con.Amount += fee + util.Go(func() { + db.Mysql().UpdateW(&common.ConfigWithdrawChannels{}, map[string]interface{}{"amount": gorm.Expr("amount + ?", fee)}, fmt.Sprintf("channel_id = %d", int(w))) + }) +} diff --git a/modules/web/handler/account.go b/modules/web/handler/account.go index 2ebed57..279098d 100644 --- a/modules/web/handler/account.go +++ b/modules/web/handler/account.go @@ -44,7 +44,7 @@ func onLogin(user *common.PlayerDBInfo, a *app.Gin, isNew bool) { } // log.Debug("scheme:%v", a.Context.GetHeader("X-Forwarded-Proto")) // if a.Context.Request.URL.Scheme == "https" { - gateURL = "wss://" + gateURL + gateURL = "wss://" + gateURL + ":26615" // } else { // gateURL = "ws://" + gateURL // } @@ -337,7 +337,7 @@ func BindingAccount(c *gin.Context) { CurrencyBalance: &common.CurrencyBalance{ UID: a.UID, Event: common.CurrencyEventBindPhone, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, Value: reward, NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, reward), }, diff --git a/modules/web/handler/activity.go b/modules/web/handler/activity.go index c22a28e..3d872f7 100644 --- a/modules/web/handler/activity.go +++ b/modules/web/handler/activity.go @@ -336,7 +336,7 @@ func ActivityPddWithdraw(c *gin.Context) { CurrencyBalance: &common.CurrencyBalance{ UID: a.UID, Value: con.WithdrawAmount, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, Event: common.CurrencyEventActivityPdd, NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, con.WithdrawAmount), }, @@ -497,7 +497,7 @@ func ActivityFreeSpinDraw(c *gin.Context) { // } // _, err = call.UpdateCurrencyPro(&common.UpdateCurrency{ // CurrencyBalance: &common.CurrencyBalance{ - // Type: common.CurrencyBrazil, + // Type: common.CurrencyINR, // UID: a.UID, // Event: common.CurrencyEventActivityFreeSpin, // Value: resp.Reward, @@ -544,7 +544,7 @@ func ActivityFreeSpinDraw(c *gin.Context) { } _, err = call.UpdateCurrencyPro(&common.UpdateCurrency{ CurrencyBalance: &common.CurrencyBalance{ - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, UID: a.UID, Event: common.CurrencyEventActivityFreeSpin, Value: resp.Reward, @@ -588,7 +588,7 @@ func ActivityFirstRechargeBackInfo(c *gin.Context) { if data.Amount < call.GetConfigActivityFirstRechargeBack().MinRecharge { return } - val := data.Amount - call.GetUserCurrencyTotal(a.UID, common.CurrencyBrazil) + val := data.Amount - call.GetUserCurrencyTotal(a.UID, common.CurrencyINR) if val < 0 { val = 0 } @@ -611,7 +611,7 @@ func ActivityFirstRechargeBackDraw(c *gin.Context) { return } data := call.GetUserFirstRechargeBackData(a.UID) - val := data.Amount - call.GetUserCurrencyTotal(a.UID, common.CurrencyBrazil) + val := data.Amount - call.GetUserCurrencyTotal(a.UID, common.CurrencyINR) if val <= 0 { return } @@ -640,7 +640,7 @@ func ActivityFirstRechargeBackDraw(c *gin.Context) { CurrencyBalance: &common.CurrencyBalance{ UID: a.UID, ChannelID: a.Channel, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, Value: val, Event: common.CurrencyEventActivityFirstRechargeBack, }, @@ -756,7 +756,7 @@ func ActivityLuckyCodeDraw(c *gin.Context) { _, err := call.UpdateCurrencyPro(&common.UpdateCurrency{ CurrencyBalance: &common.CurrencyBalance{ UID: a.UID, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, Value: reward, Event: common.CurrencyEventTask, Exs1: fmt.Sprintf("%d", t), @@ -939,7 +939,7 @@ func ActivitySignDraw(c *gin.Context) { _, err = call.UpdateCurrencyPro(&common.UpdateCurrency{ CurrencyBalance: &common.CurrencyBalance{ UID: a.UID, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, ChannelID: a.Channel, Value: reward, Event: common.CurrencyEventActivitySign, @@ -969,7 +969,7 @@ func ActivityBreakGiftInfo(c *gin.Context) { if limit <= 0 { limit = 1 * common.DecimalDigits } - if call.GetUserCurrency(a.UID, common.CurrencyBrazil) > limit { + if call.GetUserCurrency(a.UID, common.CurrencyINR) > limit { return } @@ -1084,7 +1084,7 @@ func ActivityWeekCardDraw(c *gin.Context) { call.UpdateCurrencyPro(&common.UpdateCurrency{ CurrencyBalance: &common.CurrencyBalance{ UID: a.UID, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, Value: card.DayReward, Event: common.CurrencyEventActivityWeekCard, ChannelID: a.Channel, @@ -1287,7 +1287,7 @@ func ActivitySlotsDrawLast(c *gin.Context) { UID: a.UID, Time: time.Now().Unix(), Value: record.Reward, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, Event: common.CurrencyEventActivitySlots, NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, record.Reward), }, @@ -1424,7 +1424,7 @@ func ActivitySevenDayBoxDraw(c *gin.Context) { CurrencyBalance: &common.CurrencyBalance{ UID: a.UID, Event: common.CurrencyEventActivityAppSpin, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, Value: reward, NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, reward), }, @@ -1531,7 +1531,7 @@ func ActivitySuperDraw(c *gin.Context) { UID: a.UID, Event: common.CurrencyEventActivitySuper, Value: reward.Reward, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, reward.Reward), }, }) diff --git a/modules/web/handler/firstpage.go b/modules/web/handler/firstpage.go index b9318df..348ccb9 100644 --- a/modules/web/handler/firstpage.go +++ b/modules/web/handler/firstpage.go @@ -68,6 +68,9 @@ func FirstPage(c *gin.Context) { resp.Games = append(resp.Games, one) } for i := common.CurrencyTypeZero + 1; i < common.CurrencyAll; i++ { + if i == common.CurrencyUSDT { + continue + } resp.Currencys = append(resp.Currencys, values.OneCurrency{ ID: i, Name: strings.ToUpper(i.GetCurrencyName()), diff --git a/modules/web/handler/game.go b/modules/web/handler/game.go index e3cfa40..a822809 100644 --- a/modules/web/handler/game.go +++ b/modules/web/handler/game.go @@ -219,3 +219,43 @@ func GameProfile(c *gin.Context) { resp.TopWins = append(resp.TopWins, one) } } + +func GameSearch(c *gin.Context) { + a := app.NewApp(c) + defer func() { + a.Response() + }() + req := new(values.GameSearchReq) + if !a.S(req) { + return + } + resp := &values.GameSearchResp{} + a.Data = resp + // var list, tmp []*common.ConfigGameList + // tmp = call.GetConfigGameList(0, req.Name) + // + // if len(req.Name) > 0 { + // reqName := strings.ToLower(req.Name) + // for _, v := range tmp { + // if strings.Contains(strings.ToLower(v.Name), reqName) { + // list = append(list, v) + // } + // } + // } else { + // list = tmp + // } + // + // start := req.Page * req.Num + // end := (req.Page + 1) * req.Num + // + // if start > len(list)-1 { + // return + // } + // if end > len(list) { + // end = len(list) + // } + // resp.List = list[start:end] + // for _, v := range resp.List { + // v.Jackpot = call.GetJackpot(common.JackpotTypeGame, v.GameID) + // } +} diff --git a/modules/web/handler/recharge.go b/modules/web/handler/recharge.go index 79893f7..4c99404 100644 --- a/modules/web/handler/recharge.go +++ b/modules/web/handler/recharge.go @@ -76,9 +76,9 @@ func RechargeInfo(c *gin.Context) { } } resp.List = append(resp.List, one) - } else if v.Type == common.CurrencyBrazil { + } else if v.Type == common.CurrencyINR { for _, j := range resp.Channels { - if j.CurrencyType == common.CurrencyBrazil { + if j.CurrencyType == common.CurrencyINR { if j.PayDown <= v.Amount && j.PayUp >= v.Amount { one.Channels = append(one.Channels, j.ChannelID) } @@ -165,7 +165,7 @@ func PlayerRecharge(c *gin.Context) { log.Debug("player %v recharge:%+v", a.UID, *req) if req.CurrencyType == 0 { - req.CurrencyType = common.CurrencyBrazil + req.CurrencyType = common.CurrencyINR } if req.ProductID > 0 { product := call.GetConfigPayProductByID(req.ProductID) @@ -281,7 +281,7 @@ func NewRechargeImp(req *values.RechargeReq, uid, cid int, ip string) *RechargeI ticketData := common.ActivityRechargeData{ID: common.ItemDiscountTicket, I1: ticket.Exi1, I2: req.Amount} ticketByte, _ := json.Marshal(ticketData) order.Extra = string(ticketByte) - req.Amount = common.RoundCurrency(common.CurrencyBrazil, req.Amount*int64(discount)/100) + req.Amount = common.RoundCurrency(common.CurrencyINR, req.Amount*int64(discount)/100) order.Amount = req.Amount } } @@ -295,7 +295,7 @@ func NewRechargeImp(req *values.RechargeReq, uid, cid int, ip string) *RechargeI p.req = new(pb.InnerRechargeReq) p.req.Amount = req.Amount p.req.PlayerChannel = uint32(cid) - if req.CurrencyType == common.CurrencyBrazil { + if req.CurrencyType == common.CurrencyINR { // 判断黑名单 if call.BlackListAndKick(uid, &common.BlackList{Phone: info.Mobile}) { return nil @@ -370,7 +370,7 @@ func (p *PayImp) Recharge() int { // product := p.base.product var resp *pb.InnerRechargeResp var err error - if p.CurrencyType == common.CurrencyBrazil { + if p.CurrencyType == common.CurrencyINR { req := &pb.InnerRechargeReq{OrderID: orderID, Amount: p.req.Amount, Phone: p.req.Phone, Name: p.req.Name, UID: uint32(p.base.UID), Channel: uint32(p.base.PayChannel), IsPersonalCard: false, PaySource: common.PaySourceModulePay} p.base.Order.PaySource = common.PaySourceModulePay diff --git a/modules/web/handler/share.go b/modules/web/handler/share.go index 6f5c743..1459724 100644 --- a/modules/web/handler/share.go +++ b/modules/web/handler/share.go @@ -208,7 +208,7 @@ func ShareWithdraw(c *gin.Context) { call.UpdateCurrencyPro(&common.UpdateCurrency{ CurrencyBalance: &common.CurrencyBalance{ UID: a.UID, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, ChannelID: a.Channel, Value: req.Amount, Event: common.CurrencyEventShareWithdraw, @@ -257,7 +257,7 @@ func ShareWithdraw(c *gin.Context) { vipCon := call.GetVipCon(a.UID) realAmount := req.Amount // 实际打款 if con != nil && vipCon.Fee > 0 { - realAmount = common.RoundCurrency(common.CurrencyBrazil, (1000-int64(vipCon.Fee))*realAmount/1000) + realAmount = common.RoundCurrency(common.CurrencyINR, (1000-int64(vipCon.Fee))*realAmount/1000) } rows, err := db.Mysql().UpdateResW(&common.ShareInfo{}, map[string]interface{}{"available_reward": gorm.Expr("available_reward - ?", req.Amount)}, fmt.Sprintf("available_reward = %d and uid = %d", availableReward, a.UID)) @@ -282,7 +282,7 @@ func ShareWithdraw(c *gin.Context) { Status: uint8(common.StatusROrderCreate), PaySource: common.PaySourceModulePay, Event: int(common.CurrencyEventWithDraw), - CurrencyType: common.CurrencyBrazil, + CurrencyType: common.CurrencyINR, PayAccount: payInfo, ChannelID: a.Channel, UPI: -1, diff --git a/modules/web/handler/task.go b/modules/web/handler/task.go index cd85591..e057d7c 100644 --- a/modules/web/handler/task.go +++ b/modules/web/handler/task.go @@ -82,7 +82,7 @@ func DrawTask(c *gin.Context) { UID: a.UID, Value: con.Reward, Event: common.CurrencyEventTask, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, Exi1: req.TaskID, NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, con.Reward), }, diff --git a/modules/web/handler/vip.go b/modules/web/handler/vip.go index 85c9124..88c43c7 100644 --- a/modules/web/handler/vip.go +++ b/modules/web/handler/vip.go @@ -159,7 +159,7 @@ func DrawVipBonus(c *gin.Context) { CurrencyBalance: &common.CurrencyBalance{ UID: a.UID, Event: common.CurrencyEventVIPBonus, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, ChannelID: a.Channel, Value: bonus, NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, bonus), @@ -237,7 +237,7 @@ func DrawVipCashback(c *gin.Context) { CurrencyBalance: &common.CurrencyBalance{ UID: a.UID, Event: common.CurrencyEventVIPCashback, - Type: common.CurrencyBrazil, + Type: common.CurrencyINR, ChannelID: a.Channel, Value: cashback, NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, cashback), diff --git a/modules/web/handler/withdraw.go b/modules/web/handler/withdraw.go index 45eb548..8ca2d6e 100644 --- a/modules/web/handler/withdraw.go +++ b/modules/web/handler/withdraw.go @@ -60,9 +60,9 @@ func WithdrawInfo(c *gin.Context) { } } resp.List = append(resp.List, one) - } else if v.Type == common.CurrencyBrazil { + } else if v.Type == common.CurrencyINR { for _, j := range resp.Channels { - if j.CurrencyType == common.CurrencyBrazil { + if j.CurrencyType == common.CurrencyINR { if j.PayDown <= v.Amount && j.PayUp >= v.Amount { one.Channels = append(one.Channels, j.ChannelID) } @@ -249,7 +249,7 @@ func PlayerWithdrawCheck(c *gin.Context) { if !a.S(req) { return } - a.CheckWithdrawCondition(req.Amount, common.CurrencyBrazil) + a.CheckWithdrawCondition(req.Amount, common.CurrencyINR) } func PlayerWithdraw(c *gin.Context) { @@ -265,9 +265,9 @@ func PlayerWithdraw(c *gin.Context) { if !a.S(req) { return } - if req.CurrencyType != common.CurrencyBrazil { + if req.CurrencyType != common.CurrencyINR { log.Error("invalid type:%v", req.CurrencyType) - req.CurrencyType = common.CurrencyBrazil + req.CurrencyType = common.CurrencyINR } uid := a.UID log.Debug("player %v withdraw %+v", uid, *req) @@ -585,7 +585,6 @@ func (p *PayWithdraw) Withdraw() error { req.Email = send.Email req.PayType = int64(send.PayType) req.Address = send.Address - req.Number = send.Number } ret, err := call.Withdraw(req) if ret != nil { @@ -631,7 +630,7 @@ func (p *PayWithdraw) AutoWithdraw() error { req.Email = send.Email req.PayType = int64(send.PayType) req.Address = send.Address - req.Number = send.Number + // req.Number = send.Number } else { req.Address = order.PayAccount } diff --git a/modules/web/providers/all/all.go b/modules/web/providers/all/all.go index a1847c5..cbb3720 100644 --- a/modules/web/providers/all/all.go +++ b/modules/web/providers/all/all.go @@ -5,7 +5,6 @@ import ( "server/call" "server/common" "server/db" - "server/modules/web/providers/awc" "server/modules/web/providers/base" "server/modules/web/providers/gs" "server/modules/web/providers/pgsoft" @@ -44,13 +43,17 @@ type AllProvider struct { SlotXo func(b *base.Base) BTI func(b *base.Base) Ezugi func(b *base.Base) + Jili func(b *base.Base) + JDB func(b *base.Base) + CMD368 func(b *base.Base) + SBO func(b *base.Base) } var All = &AllProvider{} func initAll() { All.Tada = tada.NewSub - All.Sexy = awc.NewSub + All.Sexy = gs.NewSub pg := call.GetConfigGameProvider(common.ProviderPGSoft) if pg != nil && pg.Callback == "gs" { All.PGSoft = gs.NewSub @@ -80,6 +83,10 @@ func initAll() { All.SlotXo = gs.NewSub All.BTI = gs.NewSub All.Ezugi = gs.NewSub + All.Jili = gs.NewSub + All.JDB = gs.NewSub + All.CMD368 = gs.NewSub + All.SBO = gs.NewSub } func InitRouter(r *gin.RouterGroup) { diff --git a/modules/web/providers/awc/api.go b/modules/web/providers/awc/api.go index 55331ad..44c3a48 100644 --- a/modules/web/providers/awc/api.go +++ b/modules/web/providers/awc/api.go @@ -36,7 +36,8 @@ func CreateMember(uid int, ct common.CurrencyType) bool { Language: "en", UserName: p.Nick, } - if ct == common.CurrencyBrazil { + // to do + if ct == common.CurrencyINR { if !config.GetBase().Release { req.BetLimit = `{"SEXYBCRT":{"LIVE":{"limitId":[284901,284902,284903]}}}` } else { diff --git a/modules/web/providers/awc/base.go b/modules/web/providers/awc/base.go index 9f30f0c..7ed5aaa 100644 --- a/modules/web/providers/awc/base.go +++ b/modules/web/providers/awc/base.go @@ -24,14 +24,14 @@ func (s *Sub) Init() { AgentID = AgentIDTest Cert = CertTest APIKey = APIKeyTest - BetLimitBrl = BetLimitBrlTest + BetLimitINR = BetLimitINRTest BetLimitUsdt = BetLimitUsdtTest if config.GetBase().Release { API = APIRlease AgentID = AgentIDRelease Cert = CertRelease APIKey = APIKeyRelease - BetLimitBrl = BetLimitBrlRelease + BetLimitINR = BetLimitINRRelease BetLimitUsdt = BetLimitUsdtRelease } } @@ -58,7 +58,7 @@ func (s *Sub) EnterGame() string { ct := s.Base.EnterGameReq.CurrencyType gameid := s.Base.EnterGameReq.GameID subID := s.Base.EnterGameReq.SubID - // lang := s.Base.EnterGameReq.Lang + lang := s.Base.EnterGameReq.Lang req := &EnterGameReq{ Cert: Cert, AgentId: AgentID, @@ -69,7 +69,7 @@ func (s *Sub) EnterGame() string { GameType: "LIVE", GameCode: fmt.Sprintf("MX-LIVE-%03d", gameid), Hall: "SEXY", - Language: "en", + Language: lang, // BetLimit: , AutoBetMode: "1", // IsLaunchGameTable: true, @@ -79,8 +79,8 @@ func (s *Sub) EnterGame() string { req.IsLaunchGameTable = true req.GameTableId = fmt.Sprintf("%d", subID) } - if ct == common.CurrencyBrazil { - req.BetLimit = BetLimitBrl + if ct == common.CurrencyINR { + req.BetLimit = BetLimitINR } else { req.BetLimit = BetLimitUsdt } diff --git a/modules/web/providers/awc/handler.go b/modules/web/providers/awc/handler.go index cbf2ff7..ef49998 100644 --- a/modules/web/providers/awc/handler.go +++ b/modules/web/providers/awc/handler.go @@ -132,7 +132,22 @@ func placeBet(a *app.Gin) { } else { betTime = t.Unix() } - betAmount := common.CashFloat64ToInt64(v.BetAmount) + betAmount := int64(v.BetAmount * common.DecimalDigits) + // betResp = base.SessionBet(&base.BetReq{ + // UID: uid, + // CurrencyType: ct, + // // SettleAmount: int64(req.WinLoseAmount * common.DecimalDigits), + // BetAmount: betAmount, + // // TurnOver: int64(req.TurnOver * common.DecimalDigits), + // // Preserve: int64(req.Preserve * common.DecimalDigits), + // SessionType: base.SessionTypeBet, + // GameID: gameID, + // Provider: provider, + // BetID: v.PlatformTxId, + // SessionID: v.RoundId, + // Time: betTime, + // }) + record := &common.ProviderBetRecord{ UID: uid, Provider: provider.ProviderID, @@ -151,9 +166,8 @@ func placeBet(a *app.Gin) { GameID: gameID, UUID: v.PlatformTxId, MyUUID: myUUID, - Type: common.SessionTypeBet, - Time: now, - ProviderTime: betTime, + Type: base.SessionTypeBet, + Time: betTime, Amount: betAmount, SessionID: v.RoundId, // TurnOver: req.TurnOver, @@ -226,8 +240,13 @@ func cancelBet(a *app.Gin) { betTime = t.Unix() } betResp = base.CancelSessionBet(&base.BetReq{ - UID: uid, - SessionType: common.SessionTypeBet, + UID: uid, + // CurrencyType: ct, + // SettleAmount: int64(req.WinLoseAmount * common.DecimalDigits), + // BetAmount: int64(v.BetAmount * common.DecimalDigits), + // TurnOver: int64(req.TurnOver * common.DecimalDigits), + // Preserve: int64(req.Preserve * common.DecimalDigits), + SessionType: base.SessionTypeBet, GameID: gameID, Provider: provider, BetID: v.PlatformTxId, @@ -285,11 +304,24 @@ func settle(a *app.Gin) { } else { settleTime = t.Unix() } + // settleResp = base.Settle(&base.SettleReq{ + // UID: uid, + // // CurrencyType: ct, + // SettleAmount: int64(v.WinAmount * common.DecimalDigits), + // BetAmount: int64(v.BetAmount * common.DecimalDigits), + // TurnOver: int64(v.TurnOver * common.DecimalDigits), + // // Preserve: int64(v.Preserve * common.DecimalDigits), + // GameID: gameID, + // Provider: provider, + // BetID: v.PlatformTxId, + // SessionID: v.RoundId, + // Time: settleTime, + // }) record := &common.ProviderBetRecord{ UID: uid, Provider: provider.ProviderID, UUID: v.PlatformTxId, - Type: common.SessionTypeBet, + Type: base.SessionTypeBet, } db.Mysql().Get(record) if record.ID == 0 { @@ -301,15 +333,15 @@ func settle(a *app.Gin) { UID: uid, Provider: provider.ProviderID, UUID: v.PlatformTxId, - Type: common.SessionTypeSettle, + Type: base.SessionTypeSettle, }) { continue } ct = record.CurrencyType uuid = v.PlatformTxId - settleAmount := common.CashFloat64ToInt64(v.WinAmount) - betAmount := common.CashFloat64ToInt64(v.BetAmount) - turnOver := common.CashFloat64ToInt64(v.TurnOver) + settleAmount := int64(v.WinAmount * common.DecimalDigits) + betAmount := int64(v.BetAmount * common.DecimalDigits) + turnOver := int64(v.TurnOver * common.DecimalDigits) if err := db.Mysql().Create(&common.ProviderBetRecord{ UID: uid, Provider: provider.ProviderID, @@ -317,9 +349,8 @@ func settle(a *app.Gin) { CurrencyType: ct, GameID: gameID, UUID: v.PlatformTxId, - Type: common.SessionTypeSettle, - Time: now, - ProviderTime: settleTime, + Type: base.SessionTypeSettle, + Time: settleTime, Amount: betAmount, SessionID: v.RoundId, MyUUID: myUUID, @@ -367,6 +398,19 @@ func settle(a *app.Gin) { } // balance = pro.Balance } + // else { + // balance = call.GetUserCurrency(uid, ct) + // } + // call.UpdatePlayerProfile(&common.ESGameData{ + // UID: thisUID, + // Provider: provider.ProviderID, + // GameID: gameID, + // UUID: uuid, + // Type: ct, + // BetAmount: v.TotalTurnover, + // SettleAmount: v.TotalSettle, + // MyUUID: fmt.Sprintf("%d", myUUID), + // }) util.IndexTryS(func() error { return call.Publish(natsClient.TopicInnerAfterSettle, &pb.InnerAfterSettle{ @@ -464,11 +508,11 @@ func give(a *app.Gin) { Time: txTime, UID: uid, CurrencyType: ct, - Amount: common.CashFloat64ToInt64(v.Amount), + Amount: int64(v.Amount * common.DecimalDigits), Provider: provider, BetID: v.PromotionTxId + v.PromotionId, Ess: v.PromotionTypeId, - Type: common.SessionTypeActivity, + Type: base.SessionTypeActivity, }) } resp.Status = "0000" @@ -498,7 +542,7 @@ func resettle(a *app.Gin) { } settleResp = base.Resettle(&base.ReSettleReq{ UID: uid, - SettleAmount: common.CashFloat64ToInt64(v.WinAmount), + SettleAmount: int64(v.WinAmount * common.DecimalDigits), Provider: provider, BetID: v.PlatformTxId, }) diff --git a/modules/web/providers/awc/values.go b/modules/web/providers/awc/values.go index 97dbd65..33819c7 100644 --- a/modules/web/providers/awc/values.go +++ b/modules/web/providers/awc/values.go @@ -14,9 +14,9 @@ const ( // LoginAPI = "/wallet/login" TimeFormatString = "2006-01-02T15:04:05.000-07:00" - BetLimitBrlTest = `{"SEXYBCRT":{"LIVE":{"limitId":[284901,284902,284903]}}}` + BetLimitINRTest = `{"SEXYBCRT":{"LIVE":{"limitId":[284901,284902,284903]}}}` BetLimitUsdtTest = `{"SEXYBCRT":{"LIVE":{"limitId":[280701,280702,280703]}}}` - BetLimitBrlRelease = `{"SEXYBCRT":{"LIVE":{"limitId":[154902,154903,154904]}}}` + BetLimitINRRelease = `{"SEXYBCRT":{"LIVE":{"limitId":[154902,154903,154904]}}}` BetLimitUsdtRelease = `{"SEXYBCRT":{"LIVE":{"limitId":[150703,150704,150705]}}}` ) @@ -25,7 +25,7 @@ var ( AgentID = "" Cert = "" APIKey = "" - BetLimitBrl = "" + BetLimitINR = "" BetLimitUsdt = "" ) diff --git a/modules/web/providers/base/base.go b/modules/web/providers/base/base.go index 0774e26..d8520cf 100644 --- a/modules/web/providers/base/base.go +++ b/modules/web/providers/base/base.go @@ -8,7 +8,6 @@ import ( "server/natsClient" "server/pb" "server/util" - "time" "github.com/gin-gonic/gin" "github.com/liangdas/mqant/log" @@ -22,6 +21,16 @@ const ( CodeInnerError // 内部错误 CodeBetNotExist // 结算时,判断下注不存在 ) +const ( + SessionTypeBet = iota + 1 + SessionTypeSettle + SessionTypeActivity + SessionTypeAdjustment // 调整玩家余额 + SessionTypeJackpot + SessionTypeBonus + SessionTypeBuyIn // 直接扣钱操作 + SessionTypeBuyOut // 直接加钱操作 +) const ( SessionSuccess = iota + 1 @@ -45,6 +54,7 @@ type Sub interface { type EnterGameReq struct { ProviderID int GameID int + GameType int UID int Token string Lang string @@ -210,7 +220,7 @@ func Bet(req *BetReq) (resp BetResp) { betAmount := req.BetAmount uid := req.UID ct := req.CurrencyType - amount := call.GetUserCurrencyTotal(uid, ct) + amount := call.GetUserCurrency(uid, ct) if amount < betAmount { resp.Balance = amount resp.Code = CodeNotEnoughAmount @@ -235,13 +245,11 @@ func Bet(req *BetReq) (resp BetResp) { Provider: provider.ProviderID, Currency: ct.GetCurrencyName(), CurrencyType: ct, - Type: common.SessionTypeSettle, GameID: req.GameID, GameName: req.GameName, UUID: req.BetID, MyUUID: uuid, - Time: time.Now().Unix(), - ProviderTime: req.Time, + Time: req.Time, Amount: betAmount, Settle: settle, Esi: SessionSuccess, @@ -323,7 +331,7 @@ func SessionBet(req *BetReq) (resp BetResp) { resp.Code = CodeAccepted return } - amount := call.GetUserCurrencyTotal(uid, ct) + amount := call.GetUserCurrency(uid, ct) if amount < betAmount { resp.Balance = amount resp.Code = CodeNotEnoughAmount @@ -341,8 +349,7 @@ func SessionBet(req *BetReq) (resp BetResp) { UUID: req.BetID, MyUUID: uuid, Type: req.SessionType, - Time: time.Now().Unix(), - ProviderTime: req.Time, + Time: req.Time, Amount: betAmount, Settle: settle, SessionID: req.SessionID, @@ -354,42 +361,38 @@ func SessionBet(req *BetReq) (resp BetResp) { resp.Code = CodeInnerError return } - if betAmount == 0 && req.SessionType == common.SessionTypeBet { + if betAmount == 0 && req.SessionType == SessionTypeBet { resp.Balance = amount resp.MyUUID = uuid return } - if betAmount > 0 { - pro := call.MineCurrencyProReal( - &common.UpdateCurrency{ - CurrencyBalance: &common.CurrencyBalance{ - UID: uid, - Type: ct, - Event: common.CurrencyEventGameBet, - Value: -betAmount, - Exi1: req.Provider.ProviderID, - Exi2: req.GameID, - Exs1: fmt.Sprintf("%d", uuid), - Exs2: req.BetID, - Exs3: req.SessionID, - }, + pro := call.MineCurrencyProReal( + &common.UpdateCurrency{ + CurrencyBalance: &common.CurrencyBalance{ + UID: uid, + Type: ct, + Event: common.CurrencyEventGameBet, + Value: -betAmount, + Exi1: req.Provider.ProviderID, + Exi2: req.GameID, + Exs1: fmt.Sprintf("%d", uuid), + Exs2: req.BetID, + Exs3: req.SessionID, }, - ) - if pro.Err != nil { - log.Error("err:%v", pro.Err) - resp.Code = CodeInnerError - if pro.Err == call.ErrNotEnoughBalance { - resp.Code = CodeNotEnoughAmount - } - return - } - if req.SessionType == common.SessionTypeBet { - resp.Balance = pro.Balance - resp.MyUUID = uuid - return + }, + ) + if pro.Err != nil { + log.Error("err:%v", pro.Err) + resp.Code = CodeInnerError + if pro.Err == call.ErrNotEnoughBalance { + resp.Code = CodeNotEnoughAmount } } - var pro *call.ProRes + if req.SessionType == SessionTypeBet { + resp.Balance = pro.Balance + resp.MyUUID = uuid + return + } setValue := settle + req.Preserve if setValue != 0 { cb := &common.CurrencyBalance{ @@ -427,11 +430,7 @@ func SessionBet(req *BetReq) (resp BetResp) { MyUUID: fmt.Sprintf("%d", uuid), }) }) - if pro != nil { - resp.Balance = pro.Balance - } else { - resp.Balance = call.GetUserCurrencyTotal(uid, ct) - } + resp.Balance = pro.Balance resp.MyUUID = uuid return } @@ -444,14 +443,14 @@ func CancelSessionBet(req *BetReq) (resp BetResp) { UID: uid, Provider: provider.ProviderID, UUID: req.BetID, - Type: common.SessionTypeBet, + Type: SessionTypeBet, } db.Mysql().Get(record) ct := record.CurrencyType if record.Esi == SessionFail { resp.MyUUID = record.MyUUID resp.Code = CodeAccepted - resp.Balance = call.GetUserCurrencyTotal(uid, ct) + resp.Balance = call.GetUserCurrency(uid, ct) return } betAmount := record.Amount @@ -459,7 +458,7 @@ func CancelSessionBet(req *BetReq) (resp BetResp) { uuid := call.SnowNode().Generate().Int64() // 说明已下注需要取消 if record.ID > 0 { - res, err := db.Mysql().UpdateRes(&common.ProviderBetRecord{UID: uid, Provider: provider.ProviderID, UUID: req.BetID, Esi: SessionSuccess, Type: common.SessionTypeBet}, + res, err := db.Mysql().UpdateRes(&common.ProviderBetRecord{UID: uid, Provider: provider.ProviderID, UUID: req.BetID, Esi: SessionSuccess, Type: SessionTypeBet}, map[string]interface{}{"esi": SessionFail, "esi1": req.VoidType}) if err != nil { log.Error("res:%v,err:%v", res, err) @@ -501,9 +500,9 @@ func CancelSessionBet(req *BetReq) (resp BetResp) { ct = lastRecord.CurrencyType } if !ct.IsValid() { - ct = common.CurrencyBrazil + ct = common.CurrencyINR } - amount := call.GetUserCurrencyTotal(uid, ct) + amount := call.GetUserCurrency(uid, ct) if err := db.Mysql().Create(&common.ProviderBetRecord{ UID: uid, Provider: provider.ProviderID, @@ -513,8 +512,7 @@ func CancelSessionBet(req *BetReq) (resp BetResp) { GameName: req.GameName, UUID: req.BetID, Type: req.SessionType, - Time: time.Now().Unix(), - ProviderTime: req.Time, + Time: req.Time, Amount: betAmount, SessionID: req.SessionID, MyUUID: uuid, @@ -538,7 +536,7 @@ func Settle(req *SettleReq) (resp SettleResp) { UID: uid, Provider: provider.ProviderID, SessionID: req.SessionID, - Type: common.SessionTypeBet, + Type: SessionTypeBet, } db.Mysql().Get(record) if record.ID == 0 { @@ -557,9 +555,8 @@ func Settle(req *SettleReq) (resp SettleResp) { GameID: req.GameID, GameName: req.GameName, UUID: req.BetID, - Type: common.SessionTypeSettle, - Time: time.Now().Unix(), - ProviderTime: req.Time, + Type: SessionTypeSettle, + Time: req.Time, Amount: betAmount, SessionID: req.SessionID, MyUUID: uuid, @@ -594,7 +591,7 @@ func Settle(req *SettleReq) (resp SettleResp) { } balance = pro.Balance } else { - balance = call.GetUserCurrencyTotal(uid, ct) + balance = call.GetUserCurrency(uid, ct) } util.IndexTryS(func() error { return call.Publish(natsClient.TopicInnerAfterSettle, &pb.InnerAfterSettle{ @@ -621,7 +618,7 @@ func VoidSettle(req *VoidSettleReq) (resp VoidSettleResp) { record := &common.ProviderBetRecord{ UID: uid, Provider: provider.ProviderID, - Type: common.SessionTypeSettle, + Type: SessionTypeSettle, UUID: req.BetID, } db.Mysql().Get(record) @@ -670,7 +667,7 @@ func Resettle(req *ReSettleReq) (resp ReSettleResp) { record := &common.ProviderBetRecord{ UID: uid, Provider: provider.ProviderID, - Type: common.SessionTypeSettle, + Type: SessionTypeSettle, UUID: req.BetID, } db.Mysql().Get(record) @@ -683,7 +680,7 @@ func Resettle(req *ReSettleReq) (resp ReSettleResp) { return } res, err := db.Mysql().UpdateResW(&common.ProviderBetRecord{}, map[string]interface{}{"settle": req.SettleAmount}, - fmt.Sprintf("uid = %v and provider = %v and uuid = '%v' and settle <> %v and type = %d", uid, provider.ProviderID, req.BetID, req.SettleAmount, common.SessionTypeSettle)) + fmt.Sprintf("uid = %v and provider = %v and uuid = '%v' and settle <> %v and type = %d", uid, provider.ProviderID, req.BetID, req.SettleAmount, SessionTypeSettle)) if err != nil || res == 0 { log.Error("res:%v,err:%v", res, err) resp.Code = CodeInnerError @@ -754,13 +751,13 @@ func Resettle(req *ReSettleReq) (resp ReSettleResp) { // Exs2: req.BetID, // }, // } -// if req.GiftType == common.SessionTypeJackpot { +// if req.GiftType == SessionTypeJackpot { // uc.Event = common.CurrencyEventGameJackpot -// } else if req.GiftType == common.SessionTypeBonus { +// } else if req.GiftType == SessionTypeBonus { // uc.Event = common.CurrencyEventGameBonus -// } else if req.GiftType == common.SessionTypeBuyIn { +// } else if req.GiftType == SessionTypeBuyIn { // uc.Event = common.CurrencyEventGameBuyIn -// } else if req.GiftType == common.SessionTypeBuyOut { +// } else if req.GiftType == SessionTypeBuyOut { // uc.Event = common.CurrencyEventGameBuyOut // } // if req.Amount != 0 { @@ -775,7 +772,7 @@ func Resettle(req *ReSettleReq) (resp ReSettleResp) { // resp.Balance = pro.Balance // resp.BeforeBalance = pro.Balance - req.Amount // } else { -// resp.Balance = call.GetUserCurrencyTotal(req.UID, req.CurrencyType) +// resp.Balance = call.GetUserCurrency(req.UID, req.CurrencyType) // resp.BeforeBalance = resp.Balance // } // return @@ -785,7 +782,7 @@ func Resettle(req *ReSettleReq) (resp ReSettleResp) { func Adjustment(req *AdjustmentReq) (resp AdjustmentResp) { uid := req.UID if req.Amount < 0 { - amount := call.GetUserCurrencyTotal(uid, req.CurrencyType) + amount := call.GetUserCurrency(uid, req.CurrencyType) if amount < -req.Amount { resp.Balance = amount resp.Code = CodeNotEnoughAmount @@ -806,7 +803,7 @@ func Adjustment(req *AdjustmentReq) (resp AdjustmentResp) { return } uuid := call.SnowNode().Generate().Int64() - NewRecord := &common.ProviderBetRecord{ + if err := db.Mysql().Create(&common.ProviderBetRecord{ UID: uid, Provider: provider.ProviderID, Currency: req.CurrencyType.GetCurrencyName(), @@ -816,18 +813,12 @@ func Adjustment(req *AdjustmentReq) (resp AdjustmentResp) { UUID: req.BetID, SessionID: req.SessionID, Type: req.Type, - Time: time.Now().Unix(), - ProviderTime: req.Time, + Settle: req.Amount, + Time: req.Time, MyUUID: uuid, Esi: SessionSuccess, Ess: req.Ess, - } - if req.Type == common.SessionTypeBuyIn { - NewRecord.Amount = util.Abs(req.Amount) - } else { - NewRecord.Settle = req.Amount - } - if err := db.Mysql().Create(NewRecord); err != nil { + }); err != nil { log.Error("err:%v", err) resp.Code = CodeInnerError } @@ -844,17 +835,17 @@ func Adjustment(req *AdjustmentReq) (resp AdjustmentResp) { Exs2: req.BetID, }, } - if req.Type == common.SessionTypeActivity { + if req.Type == SessionTypeActivity { uc.Event = common.CurrencyEventGameActivity - } else if req.Type == common.SessionTypeAdjustment { + } else if req.Type == SessionTypeAdjustment { uc.Event = common.CurrencyEventGameAdjustment - } else if req.Type == common.SessionTypeJackpot { + } else if req.Type == SessionTypeJackpot { uc.Event = common.CurrencyEventGameJackpot - } else if req.Type == common.SessionTypeBonus { + } else if req.Type == SessionTypeBonus { uc.Event = common.CurrencyEventGameBonus - } else if req.Type == common.SessionTypeBuyIn { + } else if req.Type == SessionTypeBuyIn { uc.Event = common.CurrencyEventGameBuyIn - } else if req.Type == common.SessionTypeBuyOut { + } else if req.Type == SessionTypeBuyOut { uc.Event = common.CurrencyEventGameBuyOut } if req.Amount != 0 { @@ -869,7 +860,7 @@ func Adjustment(req *AdjustmentReq) (resp AdjustmentResp) { resp.Balance = pro.Balance resp.BeforeBalance = pro.Balance - req.Amount } else { - resp.Balance = call.GetUserCurrencyTotal(req.UID, req.CurrencyType) + resp.Balance = call.GetUserCurrency(req.UID, req.CurrencyType) resp.BeforeBalance = resp.Balance } return @@ -882,7 +873,7 @@ func AdjustBet(req *AdjustBetReq) (resp AdjustBetResp) { record := &common.ProviderBetRecord{ UID: uid, Provider: provider.ProviderID, - Type: common.SessionTypeBet, + Type: SessionTypeBet, UUID: req.BetID, } db.Mysql().Get(record) @@ -896,7 +887,7 @@ func AdjustBet(req *AdjustBetReq) (resp AdjustBetResp) { resp.Code = CodeAccepted return } - res, err := db.Mysql().UpdateRes(&common.ProviderBetRecord{UID: uid, Provider: provider.ProviderID, UUID: req.BetID, Type: common.SessionTypeBet, Amount: originAmount}, + res, err := db.Mysql().UpdateRes(&common.ProviderBetRecord{UID: uid, Provider: provider.ProviderID, UUID: req.BetID, Type: SessionTypeBet, Amount: originAmount}, map[string]interface{}{"amount": req.AdjustAmount}) if err != nil { log.Error("res:%v,err:%v", res, err) @@ -949,16 +940,16 @@ func PushDetail(req *PushDetailReq) (resp PushDetailResp) { "session_id": req.SessionID, "turnover": req.TurnOver, } - if record.Type == common.SessionTypeBuyIn { - update["type"] = common.SessionTypeBet + if record.Type == SessionTypeBuyIn { + update["type"] = SessionTypeBet update["amount"] = req.BetAmount } else { - update["type"] = common.SessionTypeSettle + update["type"] = SessionTypeSettle update["settle"] = req.SettleAmount } db.Mysql().UpdateW(&common.ProviderBetRecord{}, update, fmt.Sprintf("uuid = '%s'", req.BetID)) - resp.Balance = call.GetUserCurrencyTotal(uid, req.CurrencyType) + resp.Balance = call.GetUserCurrency(uid, req.CurrencyType) resp.MyUUID = record.MyUUID return } diff --git a/modules/web/providers/gs/api.go b/modules/web/providers/gs/api.go index 3e27445..97f375b 100644 --- a/modules/web/providers/gs/api.go +++ b/modules/web/providers/gs/api.go @@ -37,9 +37,9 @@ type GameListResp struct { ProviderGames []ProviderGame `json:"ProviderGames,omitempty"` // 供应商游戏列表 (No) } -func GetGameList(provider int) { - opCode := AgentMap["E386"].OperatorCode - sk := AgentMap["E386"].SecretKey +func GetGameList(provider int) *GameListResp { + opCode := AgentMap["E467"].OperatorCode + sk := AgentMap["E467"].SecretKey req := &GameListReq{ OperatorCode: opCode, MemberName: "user2144", @@ -55,5 +55,6 @@ func GetGameList(provider int) { log.Debug("%d GetGameList:%+v,url:%s", provider, *req, url) ret := new(GameListResp) util.HttpPost(url, req, &ret, nil) - log.Debug("%d GetGameList resp:%+v", provider, ret) + // log.Debug("%d GetGameList resp:%+v", provider, ret) + return ret } diff --git a/modules/web/providers/gs/base.go b/modules/web/providers/gs/base.go index 8f8a309..4bd9078 100644 --- a/modules/web/providers/gs/base.go +++ b/modules/web/providers/gs/base.go @@ -59,14 +59,20 @@ func (s *Sub) EnterGame() string { // ct := s.Base.EnterGameReq.CurrencyType gameID := s.Base.EnterGameReq.GameID // subID := s.Base.EnterGameReq.SubID + gameType := s.Base.GameType lang := s.Base.EnterGameReq.Lang providerID := s.Base.EnterGameReq.ProviderID ip := s.Base.EnterGameReq.IP cid := s.Base.EnterGameReq.ChannelID - - game := call.GetConfigGameListByID(providerID, gameID) - if game == nil { - return "" + game := new(common.ConfigGameList) + if providerID != 0 && gameID == 0 && gameType != 0 { + // 读取信息 + game.GameType = gameType + } else { + game = call.GetConfigGameListByGameID(providerID, gameID) + if game == nil { + return "" + } } currency, err := db.Redis().GetInt(common.GetRedisKeyGameCurrency(uid)) if err != nil { @@ -86,7 +92,7 @@ func (s *Sub) EnterGame() string { } req := &EnterGameReq{ OperatorCode: agent.OperatorCode, - MemberName: common.GetProviderUserName(fmt.Sprintf("%d", uid)), + MemberName: fmt.Sprintf("%d", uid), // DisplayName: p.Nick, GameID: game.GameCode, // ProviderGameType: , @@ -103,7 +109,6 @@ func (s *Sub) EnterGame() string { req.OperatorLobbyURL = "https://" + channel.URL } req.Sign = util.CalculateMD5(agent.OperatorCode + req.RequestTime + "launchgame" + agent.SecretKey) - url := API + LaunchGameURL log.Debug("%d EnterGame:%+v,url:%s", providerID, *req, url) ret := new(EnterGameResp) diff --git a/modules/web/providers/gs/handler.go b/modules/web/providers/gs/handler.go index d4bff5a..2745075 100644 --- a/modules/web/providers/gs/handler.go +++ b/modules/web/providers/gs/handler.go @@ -61,10 +61,6 @@ func GetBalance(c *gin.Context) { } log.Debug("GetBalance:%+v", req) - if a.ShouldRoute(req, "MemberName", common.ProviderAPITypeJson) { - return - } - if !VerifySign(req.OperatorCode, req.RequestTime, "getbalance", req.Sign) { resp.ErrorCode = CodeAPIInvalidSign return @@ -101,10 +97,6 @@ func PlaceBet(c *gin.Context) { } log.Debug("PlaceBet:%+v", req) - if a.ShouldRoute(req, "MemberName", common.ProviderAPITypeJson) { - return - } - if !VerifySign(req.OperatorCode, req.RequestTime, "placebet", req.Sign) { resp.ErrorCode = CodeAPIInvalidSign return @@ -144,9 +136,9 @@ func PlaceBet(c *gin.Context) { betReq := &base.BetReq{ UID: uid, CurrencyType: ct, - BetAmount: -common.CashFloat64ToInt64(v.TransactionAmount), - TurnOver: common.CashFloat64ToInt64(v.ValidBetAmount), - SessionType: common.SessionTypeBet, + BetAmount: -int64(v.TransactionAmount * common.DecimalDigits), + TurnOver: int64(v.ValidBetAmount * common.DecimalDigits), + SessionType: base.SessionTypeBet, GameID: GetGameID(providerID, v.GameID), GameName: v.GameID, Provider: provider, @@ -185,10 +177,6 @@ func GameResult(c *gin.Context) { } log.Debug("GameResult:%+v", req) - if a.ShouldRoute(req, "MemberName", common.ProviderAPITypeJson) { - return - } - if !VerifySign(req.OperatorCode, req.RequestTime, "gameresult", req.Sign) { resp.ErrorCode = CodeAPIInvalidSign return @@ -221,9 +209,9 @@ func GameResult(c *gin.Context) { settleReq := &base.SettleReq{ UID: uid, CurrencyType: ct, - SettleAmount: common.CashFloat64ToInt64(v.TransactionAmount), - BetAmount: common.CashFloat64ToInt64(v.BetAmount), - TurnOver: common.CashFloat64ToInt64(v.ValidBetAmount), + SettleAmount: int64(v.TransactionAmount * common.DecimalDigits), + BetAmount: int64(v.BetAmount * common.DecimalDigits), + TurnOver: int64(v.ValidBetAmount * common.DecimalDigits), GameID: GetGameID(provider.ProviderID, v.GameID), GameName: v.GameID, Provider: provider, @@ -262,10 +250,6 @@ func Rollback(c *gin.Context) { } log.Debug("Rollback:%+v", req) - if a.ShouldRoute(req, "MemberName", common.ProviderAPITypeJson) { - return - } - if !VerifySign(req.OperatorCode, req.RequestTime, "rollback", req.Sign) { resp.ErrorCode = CodeAPIInvalidSign return @@ -294,14 +278,14 @@ func Rollback(c *gin.Context) { adjustResp := base.Adjustment(&base.AdjustmentReq{ UID: uid, CurrencyType: ct, - Amount: common.CashFloat64ToInt64(v.TransactionAmount), + Amount: int64(v.TransactionAmount * common.DecimalDigits), GameID: GetGameID(provider.ProviderID, v.GameID), GameName: v.GameID, Provider: provider, BetID: v.TransactionID, Time: time.Now().Unix(), SessionID: v.GameRoundID, - Type: common.SessionTypeAdjustment, + Type: base.SessionTypeAdjustment, }) if adjustResp.Code != base.CodeOk { resp.ErrorCode = CodeAPIError @@ -331,10 +315,6 @@ func CancelBet(c *gin.Context) { } log.Debug("CancelBet:%+v", req) - if a.ShouldRoute(req, "MemberName", common.ProviderAPITypeJson) { - return - } - if !VerifySign(req.OperatorCode, req.RequestTime, "cancelbet", req.Sign) { resp.ErrorCode = CodeAPIInvalidSign return @@ -363,14 +343,16 @@ func CancelBet(c *gin.Context) { adjustResp := base.Adjustment(&base.AdjustmentReq{ UID: uid, CurrencyType: ct, - Amount: common.CashFloat64ToInt64(v.TransactionAmount), - GameID: GetGameID(provider.ProviderID, v.GameID), - GameName: v.GameID, - Provider: provider, - BetID: v.TransactionID, - SessionID: v.GameRoundID, - Time: time.Now().Unix(), - Type: common.SessionTypeAdjustment, + // TurnOver: int64(v.ValidBetAmount * common.DecimalDigits), + // SessionType: base.SessionTypeBet, + Amount: int64(v.TransactionAmount * common.DecimalDigits), + GameID: GetGameID(provider.ProviderID, v.GameID), + GameName: v.GameID, + Provider: provider, + BetID: v.TransactionID, + SessionID: v.GameRoundID, + Time: time.Now().Unix(), + Type: base.SessionTypeAdjustment, }) if adjustResp.Code != base.CodeOk { resp.ErrorCode = CodeAPIError @@ -400,10 +382,6 @@ func Bonus(c *gin.Context) { } log.Debug("Bonus:%+v", req) - if a.ShouldRoute(req, "MemberName", common.ProviderAPITypeJson) { - return - } - if !VerifySign(req.OperatorCode, req.RequestTime, "bonus", req.Sign) { resp.ErrorCode = CodeAPIInvalidSign return @@ -435,14 +413,14 @@ func Bonus(c *gin.Context) { giftResp := base.Adjustment(&base.AdjustmentReq{ UID: uid, CurrencyType: common.CurrencyType(ct), - Amount: common.CashFloat64ToInt64(v.TransactionAmount), + Amount: int64(v.TransactionAmount * common.DecimalDigits), GameID: GetGameID(provider.ProviderID, v.GameID), GameName: v.GameID, Provider: provider, BetID: v.TransactionID, SessionID: v.GameRoundID, Time: now, - Type: common.SessionTypeBonus, + Type: base.SessionTypeBonus, }) if giftResp.Code != base.CodeOk { resp.ErrorCode = CodeAPIError @@ -472,10 +450,6 @@ func Jackpot(c *gin.Context) { } log.Debug("Jackpot:%+v", req) - if a.ShouldRoute(req, "MemberName", common.ProviderAPITypeJson) { - return - } - if !VerifySign(req.OperatorCode, req.RequestTime, "jackpot", req.Sign) { resp.ErrorCode = CodeAPIInvalidSign return @@ -507,14 +481,14 @@ func Jackpot(c *gin.Context) { giftResp := base.Adjustment(&base.AdjustmentReq{ UID: uid, CurrencyType: common.CurrencyType(ct), - Amount: common.CashFloat64ToInt64(v.TransactionAmount), + Amount: int64(v.TransactionAmount * common.DecimalDigits), GameID: GetGameID(provider.ProviderID, v.GameID), GameName: v.GameID, Provider: provider, BetID: v.TransactionID, SessionID: v.GameRoundID, Time: now, - Type: common.SessionTypeJackpot, + Type: base.SessionTypeJackpot, }) if giftResp.Code != base.CodeOk { resp.ErrorCode = CodeAPIError @@ -544,10 +518,6 @@ func MobileLogin(c *gin.Context) { } log.Debug("MobileLogin:%+v", req) - if a.ShouldRoute(req, "MemberName", common.ProviderAPITypeJson) { - return - } - if !VerifySign(req.OperatorCode, req.RequestTime, "mobilelogin", req.Sign) { resp.ErrorCode = CodeAPIInvalidSign return @@ -583,10 +553,6 @@ func BuyIn(c *gin.Context) { } log.Debug("BuyIn:%+v", req) - if a.ShouldRoute(req, "MemberName", common.ProviderAPITypeJson) { - return - } - if !VerifySign(req.OperatorCode, req.RequestTime, "buyin", req.Sign) { resp.ErrorCode = CodeAPIInvalidSign return @@ -618,14 +584,14 @@ func BuyIn(c *gin.Context) { giftResp := base.Adjustment(&base.AdjustmentReq{ UID: uid, CurrencyType: common.CurrencyType(ct), - Amount: common.CashFloat64ToInt64(req.Transaction.TransactionAmount), + Amount: int64(req.Transaction.TransactionAmount * common.DecimalDigits), GameID: GetGameID(provider.ProviderID, req.Transaction.GameID), GameName: req.Transaction.GameID, Provider: provider, BetID: req.Transaction.TransactionID, SessionID: req.Transaction.GameRoundID, Time: now, - Type: common.SessionTypeBuyIn, + Type: base.SessionTypeBuyIn, }) if giftResp.Code != base.CodeOk { resp.ErrorCode = CodeAPIError @@ -654,10 +620,6 @@ func BuyOut(c *gin.Context) { } log.Debug("BuyOut:%+v", req) - if a.ShouldRoute(req, "MemberName", common.ProviderAPITypeJson) { - return - } - if !VerifySign(req.OperatorCode, req.RequestTime, "buyout", req.Sign) { resp.ErrorCode = CodeAPIInvalidSign return @@ -689,14 +651,14 @@ func BuyOut(c *gin.Context) { giftResp := base.Adjustment(&base.AdjustmentReq{ UID: uid, CurrencyType: common.CurrencyType(ct), - Amount: common.CashFloat64ToInt64(req.Transaction.TransactionAmount), + Amount: int64(req.Transaction.TransactionAmount * common.DecimalDigits), GameID: GetGameID(provider.ProviderID, req.Transaction.GameID), GameName: req.Transaction.GameID, Provider: provider, BetID: req.Transaction.TransactionID, SessionID: req.Transaction.GameRoundID, Time: now, - Type: common.SessionTypeBuyOut, + Type: base.SessionTypeBuyOut, }) if giftResp.Code != base.CodeOk { resp.ErrorCode = CodeAPIError @@ -723,10 +685,6 @@ func PushBet(c *gin.Context) { } log.Debug("PushBet:%+v", req) - if a.ShouldRoute(req, "MemberName", common.ProviderAPITypeJson) { - return - } - if !VerifySign(req.OperatorCode, req.RequestTime, "pushbet", req.Sign) { resp.ErrorCode = CodeAPIInvalidSign return @@ -759,9 +717,9 @@ func PushBet(c *gin.Context) { pushReq := &base.PushDetailReq{ UID: uid, CurrencyType: ct, - SettleAmount: common.CashFloat64ToInt64(v.PayoutAmount), - BetAmount: common.CashFloat64ToInt64(v.BetAmount), - TurnOver: common.CashFloat64ToInt64(v.ValidBetAmount), + SettleAmount: int64(v.PayoutAmount * common.DecimalDigits), + BetAmount: int64(v.BetAmount * common.DecimalDigits), + TurnOver: int64(v.ValidBetAmount * common.DecimalDigits), GameID: GetGameID(provider.ProviderID, v.GameID), GameName: v.GameID, Provider: provider, diff --git a/modules/web/providers/gs/values.go b/modules/web/providers/gs/values.go index 6ca307c..a52f1e3 100644 --- a/modules/web/providers/gs/values.go +++ b/modules/web/providers/gs/values.go @@ -3,10 +3,10 @@ package gs import "server/common" const ( - APIRlease = "https://prodmd.9977997.com" - APITest = "https://swmd.6633663.com" - OperatorCode = "E387" - SecretKey = "qqmruv" + APIRlease = "https://prodmd.9977997.com" + APITest = "https://swmd.6633663.com" + // OperatorCode = "E387" + // SecretKey = "qqmruv" LaunchGameURL = "/Seamless/LaunchGame" GetGameListURL = "/Seamless/GetGameList" ) @@ -39,10 +39,13 @@ var ( GameTypeMap = map[int]int{ common.GameTypeSlots: 1, common.GameTypeLive: 2, + common.GameTypeTable: 4, common.GameTypeESport: 13, common.GameTypeSportBook: 3, + common.GameTypeFish: 8, } ProductIDMap = map[int]int{ + common.ProviderSexy: 1022, common.ProviderPGSoft: 1007, common.ProviderEvolutionGaming: 1002, common.ProviderAllBet: 1003, @@ -67,8 +70,13 @@ var ( common.ProviderNexus4D: 1053, common.ProviderSlotXo: 1075, common.ProviderBTI: 1081, + common.ProviderJili: 1091, + common.ProviderJDB: 1085, + common.ProviderCMD368: 1078, + common.ProviderSBO: 1012, } ProviderIDMap = map[int]int{ + 1022: common.ProviderSexy, 1007: common.ProviderPGSoft, 1002: common.ProviderEvolutionGaming, 1003: common.ProviderAllBet, @@ -93,21 +101,31 @@ var ( 1053: common.ProviderNexus4D, 1075: common.ProviderSlotXo, 1081: common.ProviderBTI, + 1091: common.ProviderJili, + 1085: common.ProviderJDB, + 1078: common.ProviderCMD368, + 1012: common.ProviderSBO, } CurrencyIDMap = map[int]common.CurrencyType{ 2: common.CurrencyUSDT, + 3: common.CurrencyINR, 33: common.CurrencyUSDT, - 36: common.CurrencyBrazil, + 36: common.CurrencyINR, } LangMap = map[string]int{ "en": 1, "pt": 28, } AgentMapTest = map[string]*Agent{ + "E467": { + OperatorCode: "E467", + SecretKey: "ixurJZ", + Currency: common.CurrencyINR, + }, "E386": { OperatorCode: "E386", SecretKey: "56EcfZ", - Currency: common.CurrencyBrazil, + Currency: common.CurrencyINR, }, "E387": { OperatorCode: "E387", @@ -116,10 +134,10 @@ var ( }, } AgentMapRelease = map[string]*Agent{ - "E386": { - OperatorCode: "E386", - SecretKey: "XF8A4Y", - Currency: common.CurrencyBrazil, + "E467": { + OperatorCode: "E467", + SecretKey: "COKxg3", + Currency: common.CurrencyINR, }, "E387": { OperatorCode: "E387", diff --git a/modules/web/providers/pgsoft/base.go b/modules/web/providers/pgsoft/base.go index 1ff2e28..e419ea6 100644 --- a/modules/web/providers/pgsoft/base.go +++ b/modules/web/providers/pgsoft/base.go @@ -3,7 +3,6 @@ package pgsoft import ( "fmt" "net/url" - "server/common" "server/config" "server/modules/web/providers/base" @@ -36,7 +35,7 @@ func (s *Sub) Init() { func (s *Sub) EnterGame() string { gameid := s.Base.EnterGameReq.GameID - token := common.GetProviderUserToken(s.Base.EnterGameReq.Token) + token := s.Base.EnterGameReq.Token lang := s.Base.EnterGameReq.Lang // reqURL := fmt.Sprintf("https://m.pgr-nmga.com/%d/index.html?btt=1&ot=%s&ops=%s&l=%s&oc=1", gameid, OperatorToken, token, lang) // return reqURL diff --git a/modules/web/providers/pgsoft/handler.go b/modules/web/providers/pgsoft/handler.go index 7c711d5..d27599f 100644 --- a/modules/web/providers/pgsoft/handler.go +++ b/modules/web/providers/pgsoft/handler.go @@ -29,12 +29,7 @@ func verifySession(c *gin.Context) { a.RetData = resp thisRet := new(verifySessionResp) errCode := "" - flag := false defer func() { - if flag { - a.ResponseB() - return - } if errCode != "" { resp.Error = &Error{ Code: errCode, @@ -44,18 +39,14 @@ func verifySession(c *gin.Context) { } a.ResponseB() }() + log.Debug("pgsoft VerifySession req:%+v,traceID:%v", c.Request.Form, c.Query("trace_id")) req := new(verifySessionReq) c.Request.ParseForm() util.ParseFormReq(c.Request.PostForm, req) - log.Debug("pgsoft VerifySession req:%+v,traceID:%v", c.Request.Form, c.Query("trace_id")) if req.OperatorToken != OperatorToken || req.SecretKey != SecretKey { errCode = "1034" return } - if a.ShouldRoute(req, "OperatorPlayerSession", common.ProviderAPITypePostform) { - flag = true - return - } // 验证token uid, _ := db.Redis().GetInt(common.GetRedisKeyToken(req.OperatorPlayerSession)) if uid == 0 { @@ -69,7 +60,7 @@ func verifySession(c *gin.Context) { return } p, _ := call.GetUserXInfo(uid, "nick") - thisRet.PlayerName = common.GetProviderUserName(fmt.Sprintf("%v", uid)) + thisRet.PlayerName = fmt.Sprintf("%v", uid) thisRet.Currency = strings.ToUpper(common.CurrencyType(currency).GetCurrencyName()) thisRet.Nickname = p.Nick log.Debug("thisRet:%+v", thisRet) @@ -81,12 +72,7 @@ func cashGet(c *gin.Context) { a.RetData = resp thisRet := new(CashGetResp) errCode := "" - flag := false defer func() { - if flag { - a.ResponseB() - return - } if errCode != "" { resp.Error = &Error{ Code: errCode, @@ -104,21 +90,17 @@ func cashGet(c *gin.Context) { errCode = "1034" return } - if a.ShouldRoute(req, "OperatorPlayerSession", common.ProviderAPITypePostform) { - flag = true - return - } // 验证token uid, _ := db.Redis().GetInt(common.GetRedisKeyToken(req.OperatorPlayerSession)) if uid == 0 { errCode = "1034" return } - // reqUID, err := strconv.Atoi(req.PlayerName) - // if err != nil || reqUID != uid { - // errCode = "1034" - // return - // } + reqUID, err := strconv.Atoi(req.PlayerName) + if err != nil || reqUID != uid { + errCode = "1034" + return + } currency, err := db.Redis().GetInt(common.GetRedisKeyGameCurrency(uid)) if err != nil { log.Error("err:%v", err) @@ -137,12 +119,7 @@ func transInOut(c *gin.Context) { a.RetData = resp thisRet := new(TransInOutResp) errCode := "" - flag := false defer func() { - if flag { - a.ResponseB() - return - } if errCode != "" { resp.Error = &Error{ Code: errCode, @@ -166,10 +143,6 @@ func transInOut(c *gin.Context) { // errCode = "1034" // return // } - if a.ShouldRoute(req, "PlayerName", common.ProviderAPITypePostform) { - flag = true - return - } uid, err := strconv.Atoi(req.PlayerName) if err != nil { errCode = "1034" @@ -186,9 +159,9 @@ func transInOut(c *gin.Context) { return } ct := common.CurrencyType(currency) - st := common.SessionTypeBet + st := base.SessionTypeBet if !req.IsWager { - st = common.SessionTypeSettle + st = base.SessionTypeSettle } provider := call.GetConfigGameProvider(common.ProviderPGSoft) if provider == nil { @@ -204,9 +177,9 @@ func transInOut(c *gin.Context) { betResp := base.SessionBet(&base.BetReq{ UID: uid, CurrencyType: ct, - SettleAmount: common.CashFloat64ToInt64(req.WinAmount), - BetAmount: common.CashFloat64ToInt64(req.BetAmount), - TurnOver: common.CashFloat64ToInt64(req.BetAmount), + SettleAmount: int64(req.WinAmount * common.DecimalDigits), + BetAmount: int64(req.BetAmount * common.DecimalDigits), + TurnOver: int64(req.BetAmount * common.DecimalDigits), SessionType: st, GameID: req.GameID, Provider: provider, @@ -241,12 +214,7 @@ func adjsutment(c *gin.Context) { a.RetData = resp thisRet := new(AdjustmentResp) errCode := "" - flag := false defer func() { - if flag { - a.ResponseB() - return - } if errCode != "" { resp.Error = &Error{ Code: errCode, @@ -264,10 +232,6 @@ func adjsutment(c *gin.Context) { errCode = "1034" return } - if a.ShouldRoute(req, "PlayerName", common.ProviderAPITypePostform) { - flag = true - return - } uid, err := strconv.Atoi(req.PlayerName) if err != nil { log.Error("err:%v", err) @@ -295,12 +259,12 @@ func adjsutment(c *gin.Context) { adjustResp := base.Adjustment(&base.AdjustmentReq{ UID: uid, CurrencyType: ct, - Amount: common.CashFloat64ToInt64(req.TransferAmount), + Amount: int64(req.TransferAmount * common.DecimalDigits), Provider: provider, BetID: req.AdjustmentTransaction, Time: req.AdjustmentTime / 1000, Ess: req.TransactionType, - Type: common.SessionTypeAdjustment, + Type: base.SessionTypeAdjustment, }) if adjustResp.Code == base.CodeAccepted { thisRet.BalanceAfter = call.GetUserCurrencyFloat(uid, ct, 2) diff --git a/modules/web/providers/tada/base.go b/modules/web/providers/tada/base.go index 6ed6ea3..17c81fc 100644 --- a/modules/web/providers/tada/base.go +++ b/modules/web/providers/tada/base.go @@ -3,7 +3,6 @@ package tada import ( "fmt" "server/call" - "server/common" "server/config" "server/modules/web/providers/base" "server/util" @@ -39,7 +38,7 @@ func (s *Sub) EnterGame() string { lang := s.Base.EnterGameReq.Lang isDemo := s.Base.EnterGameReq.IsDemo gameid := s.Base.EnterGameReq.GameID - token := common.GetProviderUserToken(s.Base.EnterGameReq.Token) + token := s.Base.EnterGameReq.Token reqLang := "en-US" if lang == "pt" { diff --git a/modules/web/providers/tada/handler.go b/modules/web/providers/tada/handler.go index 1800176..2e3d862 100644 --- a/modules/web/providers/tada/handler.go +++ b/modules/web/providers/tada/handler.go @@ -35,11 +35,6 @@ func auth(c *gin.Context) { } log.Debug("tada auth req:%+v", req) a.RetData = resp - - if a.ShouldRoute(req, "Token", common.ProviderAPITypeJson) { - return - } - // 验证token uid, _ := db.Redis().GetInt(common.GetRedisKeyToken(req.Token)) if uid == 0 { @@ -52,10 +47,10 @@ func auth(c *gin.Context) { resp.ErrorCode = ErrorCodeOther return } - resp.UserName = common.GetProviderUserName(fmt.Sprintf("%v", uid)) + resp.UserName = fmt.Sprintf("%v", uid) resp.Currency = strings.ToUpper(common.CurrencyType(currency).GetCurrencyName()) resp.Balance = call.GetUserCurrencyFloat(uid, common.CurrencyType(currency), 4) - resp.Token = common.GetProviderUserToken(req.Token) + resp.Token = req.Token log.Debug("tada auth resp:%+v", resp) } @@ -73,11 +68,6 @@ func bet(c *gin.Context) { } log.Debug("tada bet req:%+v", req) a.RetData = resp - - if a.ShouldRoute(req, "Token", common.ProviderAPITypeJson) { - return - } - ct := common.GetCurrencyID(req.Currency) if !ct.IsValid() { resp.ErrorCode = ErrorCodeInvalidParameter @@ -109,11 +99,14 @@ func bet(c *gin.Context) { betResp := base.Bet(&base.BetReq{ UID: uid, CurrencyType: ct, - SettleAmount: common.CashFloat64ToInt64(req.WinLoseAmount), - BetAmount: common.CashFloat64ToInt64(req.BetAmount), - GameID: req.Game, - Provider: provider, - BetID: fmt.Sprintf("%d", req.Round), + SettleAmount: int64(req.WinLoseAmount * common.DecimalDigits), + BetAmount: int64(req.BetAmount * common.DecimalDigits), + // TurnOver: int64(req.TurnOver * common.DecimalDigits), + // Preserve: int64(req.Preserve * common.DecimalDigits), + // SessionType: req.Type, + GameID: req.Game, + Provider: provider, + BetID: fmt.Sprintf("%d", req.Round), // SessionID: fmt.Sprintf("%d", req.SessionID), Time: req.WagersTime, }) @@ -131,11 +124,11 @@ func bet(c *gin.Context) { return } - resp.UserName = common.GetProviderUserName(fmt.Sprintf("%v", uid)) + resp.UserName = fmt.Sprintf("%v", uid) resp.Currency = req.Currency resp.Balance = util.Decimal(float64(betResp.Balance)/common.DecimalDigits, 4) resp.TxID = betResp.MyUUID - resp.Token = common.GetProviderUserToken(req.Token) + resp.Token = req.Token } func sessionBet(c *gin.Context) { @@ -152,11 +145,6 @@ func sessionBet(c *gin.Context) { } log.Debug("tada sessionBet req:%+v", req) a.RetData = resp - - if a.ShouldRoute(req, "Token", common.ProviderAPITypeJson) { - return - } - ct := common.GetCurrencyID(req.Currency) if !ct.IsValid() { resp.ErrorCode = ErrorCodeInvalidParameter @@ -181,10 +169,10 @@ func sessionBet(c *gin.Context) { betResp := base.SessionBet(&base.BetReq{ UID: uid, CurrencyType: ct, - SettleAmount: common.CashFloat64ToInt64(req.WinLoseAmount), - BetAmount: common.CashFloat64ToInt64(req.BetAmount), - TurnOver: common.CashFloat64ToInt64(req.TurnOver), - Preserve: common.CashFloat64ToInt64(req.Preserve), + SettleAmount: int64(req.WinLoseAmount * common.DecimalDigits), + BetAmount: int64(req.BetAmount * common.DecimalDigits), + TurnOver: int64(req.TurnOver * common.DecimalDigits), + Preserve: int64(req.Preserve * common.DecimalDigits), SessionType: req.Type, GameID: req.Game, Provider: provider, @@ -214,11 +202,11 @@ func sessionBet(c *gin.Context) { // } // }() - resp.UserName = common.GetProviderUserName(fmt.Sprintf("%v", uid)) + resp.UserName = fmt.Sprintf("%v", uid) resp.Currency = req.Currency resp.Balance = util.Decimal(float64(betResp.Balance)/common.DecimalDigits, 4) resp.TxID = betResp.MyUUID - resp.Token = common.GetProviderUserToken(req.Token) + resp.Token = req.Token } func cancelSessionBet(c *gin.Context) { @@ -235,11 +223,6 @@ func cancelSessionBet(c *gin.Context) { } log.Debug("tada sessionBet req:%+v", req) a.RetData = resp - - if a.ShouldRoute(req, "Token", common.ProviderAPITypeJson) { - return - } - ct := common.GetCurrencyID(req.Currency) if !ct.IsValid() { resp.ErrorCode = ErrorCodeInvalidParameter @@ -264,8 +247,8 @@ func cancelSessionBet(c *gin.Context) { betResp := base.CancelSessionBet(&base.BetReq{ UID: uid, CurrencyType: ct, - BetAmount: common.CashFloat64ToInt64(req.BetAmount), - Preserve: common.CashFloat64ToInt64(req.Preserve), + BetAmount: int64(req.BetAmount * common.DecimalDigits), + Preserve: int64(req.Preserve * common.DecimalDigits), BetID: fmt.Sprintf("%d", req.Round), SessionID: fmt.Sprintf("%d", req.SessionID), GameID: req.Game, @@ -285,9 +268,9 @@ func cancelSessionBet(c *gin.Context) { return } - resp.UserName = common.GetProviderUserName(fmt.Sprintf("%v", uid)) + resp.UserName = fmt.Sprintf("%v", uid) resp.Currency = req.Currency resp.Balance = util.Decimal(float64(betResp.Balance)/common.DecimalDigits, 4) resp.TxID = betResp.MyUUID - resp.Token = common.GetProviderUserToken(req.Token) + resp.Token = req.Token } diff --git a/modules/web/routers/routers_game.go b/modules/web/routers/routers_game.go index c54dd61..f6cbe4e 100644 --- a/modules/web/routers/routers_game.go +++ b/modules/web/routers/routers_game.go @@ -11,4 +11,5 @@ func game(e *gin.RouterGroup) { e.POST("/game/enter", handler.EnterGame) e.POST("/game/history", handler.GameHistory) e.POST("/game/profile", handler.GameProfile) + e.POST("/game/search", handler.GameSearch) } diff --git a/modules/web/values/game.go b/modules/web/values/game.go index 62a148a..afd9784 100644 --- a/modules/web/values/game.go +++ b/modules/web/values/game.go @@ -96,3 +96,14 @@ type TopWins struct { SettleAmount int64 CurrencyType common.CurrencyType } + +type GameSearchReq struct { + Provider int // 游戏提供商 + Name string // 游戏名 + Page int + Num int +} + +type GameSearchResp struct { + List []*common.ConfigGameList +} diff --git a/pb/proto/pay.proto b/pb/proto/pay.proto index f696058..01841d1 100644 --- a/pb/proto/pay.proto +++ b/pb/proto/pay.proto @@ -31,17 +31,29 @@ message InnerWithdrawReq { int64 Amount = 2; // 订单金额 string Phone = 3; // 手机号 string Name = 4; // 玩家名字 - string Email = 5; // 邮件 - int64 PayType = 6; // 方式 - string Number = 7; // 卡号 - uint32 UID = 8; // uid - int64 Channel = 9; // 代付选择的渠道 - string Address = 10; - uint32 PaySource = 11; // 支付方式 - string IP = 12; // ip + int64 PayType = 5; // 方式 + string CardNo = 6; // 卡号 + string PayCode = 7; // 银行代码 + string Email = 8; // 邮件 + string Address = 9; // 地址 + uint32 UID = 10; // uid + int64 Channel = 11; // 代付选择的渠道 + string BankName = 12;// 银行名称 + string BankBranchName = 13; // 银行子名称 + string DeviceID = 14; // 设备号 + string IP = 15; // ip + uint32 PaySource = 16; // 支付方式 } + message InnerWithdrawResp { string APIOrderID = 1; // 第三方订单号 uint32 Channel = 2; // 支付渠道 } + +message InnerQueryWithdrawResp { + string APIOrderID = 1; // 第三方订单号 + string OrderID = 2; + int64 Status = 3; // 订单状态 1成功 2失败 3处理中 + string Msg = 4; // 返回的消息 +} diff --git a/pb/proto/platform.proto b/pb/proto/platform.proto index 9369484..96d2edb 100644 --- a/pb/proto/platform.proto +++ b/pb/proto/platform.proto @@ -46,9 +46,13 @@ message LoginResponse{ uint32 user_id = 2; // UID:这个地方必定和请求中的uid一致,但是为了方便客户端异步处理,把UID返回了 } +message RedInfo { + string module_name = 1;// 模块名称 + uint32 num =2 ; // 数量 +} // 红点 message RedPoint{ - uint32 Mail = 1; + repeated RedInfo list = 1; } enum ConfigChangeType{