切换支付和游戏厂商

pull/1/head
mofangmin 1 year ago
parent 37d968698b
commit a5eac5f7cb
  1. 9
      call/config.go
  2. 6
      call/currency.go
  3. 6
      call/pay.go
  4. 2
      call/redpoint.go
  5. 4
      call/user.go
  6. 10
      common/config.go
  7. 6
      common/currency.go
  8. 1
      common/game.go
  9. 2
      common/player.go
  10. 4
      common/provider.go
  11. 49
      common/recharge.go
  12. 5
      modules/backend/handler/common/common.go
  13. 2
      modules/backend/handler/examine/examine.go
  14. 2
      modules/backend/handler/firstpage.go
  15. 4
      modules/backend/handler/gm/control.go
  16. 2
      modules/backend/handler/gm/gm.go
  17. 6
      modules/backend/handler/guser/getGameUserInfo.go
  18. 4
      modules/backend/handler/statistics/platformData.go
  19. 28
      modules/backend/handler/statistics/reviewData.go
  20. 4
      modules/common/timer.go
  21. 65
      modules/pay/allpay/all.go
  22. 133
      modules/pay/base/base.go
  23. 111
      modules/pay/base/callback.go
  24. 36
      modules/pay/base/http.go
  25. 148
      modules/pay/base/signaes.go
  26. 6
      modules/pay/base/signmd5.go
  27. 256
      modules/pay/base/util.go
  28. 181
      modules/pay/bfpay/base.go
  29. 250
      modules/pay/bfpay/values.go
  30. 137
      modules/pay/gopay/base.go
  31. 91
      modules/pay/gopay/values.go
  32. 168
      modules/pay/grepay/base.go
  33. 206
      modules/pay/grepay/values.go
  34. 6
      modules/pay/handler.go
  35. 147
      modules/pay/igeekpay/base.go
  36. 126
      modules/pay/igeekpay/values.go
  37. 147
      modules/pay/luckinpay/base.go
  38. 147
      modules/pay/luckinpay/values.go
  39. 166
      modules/pay/mlpay/base.go
  40. 137
      modules/pay/mlpay/values.go
  41. 233
      modules/pay/moonpay2/base.go
  42. 146
      modules/pay/moonpay2/values.go
  43. 139
      modules/pay/pluspay/base.go
  44. 73
      modules/pay/pluspay/values.go
  45. 6
      modules/pay/timer.go
  46. 68
      modules/pay/values/values.go
  47. 4
      modules/web/handler/account.go
  48. 26
      modules/web/handler/activity.go
  49. 3
      modules/web/handler/firstpage.go
  50. 40
      modules/web/handler/game.go
  51. 12
      modules/web/handler/recharge.go
  52. 6
      modules/web/handler/share.go
  53. 2
      modules/web/handler/task.go
  54. 4
      modules/web/handler/vip.go
  55. 13
      modules/web/handler/withdraw.go
  56. 11
      modules/web/providers/all/all.go
  57. 3
      modules/web/providers/awc/api.go
  58. 12
      modules/web/providers/awc/base.go
  59. 78
      modules/web/providers/awc/handler.go
  60. 6
      modules/web/providers/awc/values.go
  61. 163
      modules/web/providers/base/base.go
  62. 9
      modules/web/providers/gs/api.go
  63. 17
      modules/web/providers/gs/base.go
  64. 100
      modules/web/providers/gs/handler.go
  65. 38
      modules/web/providers/gs/values.go
  66. 3
      modules/web/providers/pgsoft/base.go
  67. 64
      modules/web/providers/pgsoft/handler.go
  68. 3
      modules/web/providers/tada/base.go
  69. 61
      modules/web/providers/tada/handler.go
  70. 1
      modules/web/routers/routers_game.go
  71. 11
      modules/web/values/game.go
  72. 28
      pb/proto/pay.proto
  73. 6
      pb/proto/platform.proto

@ -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{}

@ -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
}

@ -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,

@ -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")
}

@ -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),
},

@ -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 {

@ -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:

@ -76,6 +76,7 @@ const (
GameTypeSpecial
GameTypeESport
GameTypeSportBook
GameTypeFish
)
type PlayerFavorite struct {

@ -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"`
}

@ -31,6 +31,10 @@ const (
ProviderSlotXo
ProviderBTI
ProviderEzugi
ProviderJili
ProviderJDB
ProviderCMD368
ProviderSBO
ProviderAll
)

@ -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 (

@ -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

@ -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 { // 拒绝

@ -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...)

@ -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)
}
}

@ -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)

@ -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)

@ -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)
// 老户赠送人数

@ -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

@ -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,
// })
// }

@ -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) {

@ -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
}

@ -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
}

@ -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
}

@ -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)]
}

@ -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)

@ -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
}

@ -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
}

@ -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)
}

@ -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
}

@ -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"` // 数据字段
}

@ -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
}

@ -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)
}

@ -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 {

@ -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
}

@ -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"`
}

@ -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
}

@ -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"`
}

@ -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
}

@ -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))
}

@ -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
}

@ -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"`
}

@ -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
}

@ -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"` // 信息描述,不参与签名,信息描述。
}

@ -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
}

@ -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)))
})
}

@ -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),
},

@ -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),
},
})

@ -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()),

@ -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)
// }
}

@ -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

@ -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,

@ -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),
},

@ -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),

@ -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
}

@ -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) {

@ -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 {

@ -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
}

@ -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,
})

@ -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 = ""
)

@ -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
}

@ -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
}

@ -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)

@ -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,

@ -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",

@ -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

@ -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)

@ -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" {

@ -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
}

@ -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)
}

@ -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
}

@ -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; //
}

@ -46,9 +46,13 @@ message LoginResponse{
uint32 user_id = 2; // UIDuid一致便UID返回了
}
message RedInfo {
string module_name = 1;//
uint32 num =2 ; //
}
//
message RedPoint{
uint32 Mail = 1;
repeated RedInfo list = 1;
}
enum ConfigChangeType{

Loading…
Cancel
Save