diff --git a/modules/backend/handler/gm/gm.go b/modules/backend/handler/gm/gm.go index 092027f..cf500a5 100644 --- a/modules/backend/handler/gm/gm.go +++ b/modules/backend/handler/gm/gm.go @@ -4,6 +4,7 @@ import ( "fmt" "server/call" "server/common" + "server/config" "server/db" "server/modules/backend/app" "server/modules/backend/values" @@ -61,7 +62,7 @@ func GMRecharge(c *gin.Context) { return } order := new(common.RechargeOrder) - id := util.NewOrderID(req.UID) + id := util.NewOrderID(req.UID, config.GetBase().ServerFlag) order.OrderID = id order.APIPayID = id order.UID = req.UID diff --git a/modules/pay/agropay/base.go b/modules/pay/agropay/base.go index c030d72..16350c2 100644 --- a/modules/pay/agropay/base.go +++ b/modules/pay/agropay/base.go @@ -1,14 +1,16 @@ package agropay import ( + "encoding/json" "errors" "fmt" "net/http" - "server/common" + "server/call" "server/modules/pay/base" "server/modules/pay/values" "server/pb" "server/util" + "time" "github.com/gogo/protobuf/proto" "github.com/liangdas/mqant/log" @@ -57,6 +59,10 @@ func (s *Sub) PackReq() interface{} { 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 } @@ -73,51 +79,98 @@ func (s *Sub) GetResp() (proto.Message, error) { if s.Base.Status == 0 && resp.Code != 2000 { return nil, errors.New("withdraw fail") } - return &pb.InnerWithdrawResp{APIOrderID: fmt.Sprintf("%v", resp.Data.TransferId), Channel: uint32(values.AgroPay)}, nil + return &pb.InnerWithdrawResp{APIOrderID: fmt.Sprintf("%v", resp.Data.TransferId), Channel: uint32(values.AgroPay), Status: uint32(s.Base.Status)}, nil + } else if s.Base.Opt == base.OPTQueryWithdraw { + resp := s.Base.Resp.(*QueryWithdrawResp) + log.Debug("QueryWithdrawResp:%+v", resp) + ret := &pb.InnerQueryWithdrawResp{APIOrderID: resp.Data.TransferId, OrderID: resp.Data.MchOrderNo} + s.Base.QueryWithdrawResp.OrderID = resp.Data.MchOrderNo + s.Base.QueryWithdrawResp.APIOrderID = resp.Data.TransferId + if s.Base.Status == 0 { + if resp.Code == 2000 { + if resp.Data.State == 2 { + s.Base.QueryWithdrawResp.Status = base.QueryStatusOrderSuccess + } else if resp.Data.State == 1 { + s.Base.QueryWithdrawResp.Status = base.QueryStatusSuccess + } + } else { + if resp.Data.State == 3 { + s.Base.QueryWithdrawResp.Status = base.QueryStatusFail + } + } + } + if s.Base.QueryWithdrawResp.Status == 0 { + s.Base.QueryWithdrawResp.Status = base.QueryStatusUnknown + } + return ret, nil + } else if s.Base.Opt == base.OPTQueryPay { + resp := s.Base.Resp.(*QueryPayResp) + log.Debug("QueryPayResp:%+v", resp) + ret := &pb.InnerQueryWithdrawResp{APIOrderID: resp.Data.PayOrderId, OrderID: resp.Data.MchOrderNo} + s.Base.QueryPayResp.OrderID = resp.Data.MchOrderNo + s.Base.QueryPayResp.APIOrderID = resp.Data.PayOrderId + if s.Base.Status == 0 { + if resp.Code == 2000 && resp.Data.State == 2 { + s.Base.QueryPayResp.Status = base.QueryStatusOrderSuccess + } + } + if s.Base.QueryPayResp.Status == 0 { + s.Base.QueryPayResp.Status = base.QueryStatusUnknown + } + return ret, nil } return nil, fmt.Errorf("unknow opt") } func (s *Sub) PackPayReq() interface{} { r := s.Base.PayReq - r.Amount /= 100 - if len(r.Phone) == 12 { - r.Phone = r.Phone[2:] - } send := &PayReq{ MchNo: mid, - AppId: appID, + AppID: appID, MchOrderNo: r.OrderID, // Amount: fmt.Sprintf("%d", r.Amount), - Amount: float64(r.Amount), - Currency: "INR", - UserName: r.Name, - Phone: r.Phone, - Email: r.Email, - Subject: "shop", - Body: "shop buy", - NotifyUrl: values.GetPayCallback(values.AgroPay), - ReturnUrl: values.GetFrontCallback(), - RiskControlExtParam: fmt.Sprintf(`{"userId":%d}`, r.UID), - EncryptPhone: util.CalculateMD5(r.Phone), - EncryptEmail: util.CalculateMD5(r.Email), + Amount: r.Amount, + Currency: "INR", + UserName: r.Name, + Phone: r.Phone, + Email: r.Email, + Subject: "shop", + Body: "shop buy", + // NotifyUrl: s.Base.GetPayCallbackURL(), + ReturnURL: values.GetFrontCallback(), + // RiskControlExtParam: fmt.Sprintf(`{"userId":%d}`, r.UID), + EncryptPhone: util.CalculateMD5(r.Phone), + EncryptEmail: util.CalculateMD5(r.Email), + DeviceID: r.DeviceID, } - send.Sign = s.Base.SignMD5(send) + risk := &RiskControlData{ + UID: fmt.Sprintf("%d", r.UID), + } + p, _ := call.GetUserXInfo(int(r.UID), "birth") + risk.RegistrationTime = time.Unix(p.Birth, 0).Format("2006-01-02 15:04:05") + //re := call.GetRechargeInfo(int(r.UID)) + send.PayinTimes = 0 + // re := call.GetRechargeInfo(int(r.UID)) + // risk.TotalRechargeAmount = re.TotalCharge + // risk.TotalNumberOfRecharges = int64(re.TotalChargeCount) + // risk.TotalWithdrawalAmount = re.TotoalWithdraw + // risk.TotalNumberOfWithdrawals = re.TotoalWithdrawCount + + byt, _ := json.Marshal(risk) + send.RiskControlExtParam = string(byt) + + send.Sign = s.Base.SignMD5Empty(send) return send } func (s *Sub) PackWithdrawReq() interface{} { r := s.Base.WithdrawReq - r.Amount /= 100 - if len(r.Phone) == 12 { - r.Phone = r.Phone[2:] - } send := &WithdrawReq{ MchNo: mid, AppId: appID, MchOrderNo: r.OrderID, - Amount: fmt.Sprintf("%d", r.Amount), + Amount: r.Amount, Currency: "INR", // EntryType: , // AccountNo: , @@ -129,25 +182,41 @@ func (s *Sub) PackWithdrawReq() interface{} { // BankName: , ClientIp: r.IP, TransferDesc: "shop withdraw", - NotifyUrl: values.GetWithdrawCallback(values.AgroPay), + // NotifyUrl: s.Base.GetWithdrawCallbackURL(), // ChannelExtra // ExtParam: , EncryptPhone: util.CalculateMD5(r.Phone), EncryptEmail: util.CalculateMD5(r.Email), DeviceId: r.DeviceID, } - if r.PayType == int64(common.PayTypeBank) { - send.EntryType = "banks" - send.AccountNo = r.CardNo - send.IfscCode = r.PayCode - send.BankName = r.BankName - } else if r.PayType == int64(common.PayTypeUPI) { - send.EntryType = "upi" - send.AccountNo = r.PayCode - } else { - return nil + + send.EntryType = "banks" + send.AccountNo = r.CardNo + send.IfscCode = r.PayCode + send.BankName = r.BankName + + send.Sign = s.Base.SignMD5(send) + return send +} + +func (s *Sub) PackQueryWithdrawReq() interface{} { + r := s.Base.QueryWithdrawReq + send := &QueryWithdrawReq{ + MchNo: mid, + AppId: appID, + MchOrderNo: r.OrderID, } + send.Sign = s.Base.SignMD5(send) + return send +} +func (s *Sub) PackQueryPayReq() interface{} { + r := s.Base.QueryPayReq + send := &QueryPayReq{ + MchNo: mid, + AppId: appID, + MchOrderNo: r.OrderID, + } send.Sign = s.Base.SignMD5(send) return send } diff --git a/modules/pay/agropay/values.go b/modules/pay/agropay/values.go index 08ac5e3..9cd4cdf 100644 --- a/modules/pay/agropay/values.go +++ b/modules/pay/agropay/values.go @@ -12,24 +12,33 @@ const ( ) type PayReq struct { - MchNo string `json:"mchNo"` - AppId string `json:"appId"` - MchOrderNo string `json:"mchOrderNo"` - Amount float64 `json:"amount"` - Currency string `json:"currency"` - UserName string `json:"userName"` - Phone string `json:"phone"` - Email string `json:"email"` - Subject string `json:"subject"` - Body string `json:"body"` - NotifyUrl string `json:"notifyUrl"` - ReturnUrl string `json:"returnUrl"` - ExtParam string `json:"extParam"` - RiskControlExtParam string `json:"riskControlExtParam"` - EncryptPhone string `json:"encryptPhone"` - EncryptEmail string `json:"encryptEmail"` - DeviceId string `json:"deviceId"` - Sign string `json:"sign"` + MchNo string `json:"mchNo"` // 平台分配的商户号 + AppID string `json:"appId"` // 商户应用ID + MchOrderNo string `json:"mchOrderNo"` // 商户生成的唯一订单号 + Amount int64 `json:"amount"` // 代收订单金额(单位:卢比,最多保留两位小数) + Currency string `json:"currency"` // 货币代码:INR + UserName string `json:"userName"` // 付款人姓名(仅字母和空格) + Phone string `json:"phone"` // 付款人电话(10位数字) + Email string `json:"email"` // 付款人邮箱 + Subject string `json:"subject"` // 商品标题 + Body string `json:"body"` // 商品描述 + ReturnURL string `json:"returnUrl"` // 跳转地址(非必填) + // ExtParam string `json:"extParam"` // 商户扩展参数(非必填) + RiskControlExtParam string `json:"riskControlExtParam"` // 风控扩展参数(JSON格式字符串,非必填) + EncryptPhone string `json:"encryptPhone"` // MD5加密后的真实手机号 + EncryptEmail string `json:"encryptEmail"` // MD5加密后的真实邮件地址 + DeviceID string `json:"deviceId"` // 用户设备ID + PayinTimes int `json:"payinTimes"` // 充值成功次数 + Sign string `json:"sign"` // 签名 +} + +type RiskControlData struct { + UID string `json:"userId"` + RegistrationTime string `json:"registrationTime"` + // TotalRechargeAmount int64 `json:"totalRechargeAmount"` + // TotalNumberOfRecharges int64 `json:"totalNumberOfRecharges"` + // TotalWithdrawalAmount int64 `json:"totalWithdrawalAmount"` + // TotalNumberOfWithdrawals int64 `json:"totalNumberOfWithdrawals"` } type PayResp struct { @@ -47,6 +56,35 @@ type PayResp struct { Sign string `json:"sign"` } +type QueryPayReq struct { + MchNo string `json:"mchNo"` // 商户号 String 是 平台分配的商户号 + AppId string `json:"appId"` // 商户应用ID String 是 商户应用ID + MchOrderNo string `json:"mchOrderNo"` // 商户生成的唯一订单号 String 否 商户订单号与平台订单号必须传一个 + PayOrderId string `json:"payOrderId"` // 平台订单号 String 否 商户订单号与平台订单号必须传一个 + Sign string `json:"sign"` // 签名 String 是 详见签名算法 +} + +type QueryPayResp struct { + Code int // 返回码 2000:成功(仅代表请求成功,不代表业务成功);2010:系统异常;2011:参数有误;2012:数据库服务异常;9999:自定义业务异常 + Msg string // 业务响应信息 成功:success + Data struct { + PayOrderId string // 支付平台订单号 + MchOrderNo string // 商户订单号 + MchNo string // 商户号 + AppId string // 商户应用ID + Amount string // 支付金额 保留两位小数 + RealAmount string // 实际支付金额 state=2 时,必须以这个金额为准,其它状态时,值为 0 + State int // 订单状态 1 - 支付中 2 - 支付成功 3 - 支付失败 5 - 已退款 + ErrCode string // 错误码 + ErrMsg string // 错误描述 + ExtParam string // 商户扩展参数 + SuccessTime int64 // 订单支付成功时间 + CreatedAt int64 // 订单创建时间 + Sign string // 参数签名 + } // 数据对象 成功时返回 + Sign string // 签名 详见签名算法(data 中的数据参与签名) +} + type PayCallbackReq struct { PayOrderId string `json:"payOrderId"` // 支付平台订单号 MchOrderNo string `json:"mchOrderNo"` // 商户订单号 @@ -67,7 +105,7 @@ type WithdrawReq struct { MchNo string `json:"mchNo"` // 商户号 String 是 平台分配的商户号 AppId string `json:"appId"` // 商户应用ID String 是 商户应用ID MchOrderNo string `json:"mchOrderNo"` // 商户生成的唯一订单号 String 是 商户保证唯一性 - Amount string `json:"amount"` // 代付订单金额 BigDecimal 是 单位:卢比,最多保留两位小数 + Amount int64 `json:"amount"` // 代付订单金额 BigDecimal 是 单位:卢比,最多保留两位小数 Currency string `json:"currency"` // 货币代码 String 是 货币代码:INR EntryType string `json:"entryType"` // 入账方式 String 否 banks,upi,paytm,不传默认 banks(paytm 暂不支持) AccountNo string `json:"accountNo"` // 收款账号 String 是 收款账号, banks: 银行卡号,upi: UPI 账号,paytm:paytm 账号 @@ -79,9 +117,8 @@ type WithdrawReq struct { BankName string `json:"bankName"` // 开户行名称 String 否 开户行名称 ClientIp string `json:"clientIp"` // 客户端 IP String 否 客户端 IP TransferDesc string `json:"transferDesc"` // 转账备注 String 是 转账备注 - NotifyUrl string `json:"notifyUrl"` // 异步通知地址 String 是 异步通知地址,只支持 https - ChannelExtra string `json:"channelExtra"` // 特定渠道发起额外参数 String 否 - ExtParam string `json:"extParam"` // 商户扩展参数 String 否 + // ChannelExtra string `json:"channelExtra"` // 特定渠道发起额外参数 String 否 + // ExtParam string `json:"extParam"` // 商户扩展参数 String 否 EncryptPhone string `json:"encryptPhone"` // MD5 加密后的真实手机号 String 是 加密方法请参考签名文档中的 MD5 加密方法,用于黑名单校验 EncryptEmail string `json:"encryptEmail"` // MD5 加密后的真实邮件地址 String 是 加密方法请参考签名文档中的 MD5 加密方法,用于黑名单校验 DeviceId string `json:"deviceId"` // 用户设备 ID String 是 设备 ID:用来标识用户当前使用的设备,要求最好是唯一、并且与用户账号无关的。 @@ -145,32 +182,3 @@ type QueryWithdrawResp struct { } `json:"data"` Sign string `json:"sign"` } - -type QueryPayReq struct { - MchNo string `json:"mchNo"` // 商户号 String 是 平台分配的商户号 - AppId string `json:"appId"` // 商户应用ID String 是 商户应用ID - MchOrderNo string `json:"mchOrderNo"` // 商户生成的唯一订单号 String 否 商户订单号与平台订单号必须传一个 - PayOrderId string `json:"payOrderId"` // 平台订单号 String 否 商户订单号与平台订单号必须传一个 - Sign string `json:"sign"` // 签名 String 是 详见签名算法 -} - -type QueryPayResp struct { - Code int // 返回码 2000:成功(仅代表请求成功,不代表业务成功);2010:系统异常;2011:参数有误;2012:数据库服务异常;9999:自定义业务异常 - Msg string // 业务响应信息 成功:success - Data struct { - PayOrderId string // 支付平台订单号 - MchOrderNo string // 商户订单号 - MchNo string // 商户号 - AppId string // 商户应用ID - Amount string // 支付金额 保留两位小数 - RealAmount string // 实际支付金额 state=2 时,必须以这个金额为准,其它状态时,值为 0 - State int // 订单状态 1 - 支付中 2 - 支付成功 3 - 支付失败 5 - 已退款 - ErrCode string // 错误码 - ErrMsg string // 错误描述 - ExtParam string // 商户扩展参数 - SuccessTime int64 // 订单支付成功时间 - CreatedAt int64 // 订单创建时间 - Sign string // 参数签名 - } // 数据对象 成功时返回 - Sign string // 签名 详见签名算法(data 中的数据参与签名) -} diff --git a/modules/pay/allpay/all.go b/modules/pay/allpay/all.go index 9a05bff..91c1858 100644 --- a/modules/pay/allpay/all.go +++ b/modules/pay/allpay/all.go @@ -2,6 +2,7 @@ package allpay import ( "reflect" + "server/modules/pay/agropay" "server/modules/pay/antpay" "server/modules/pay/base" "server/modules/pay/ddaypay" @@ -126,7 +127,7 @@ func init() { All.RichPay = richpay.NewSub All.Moonpay2 = moonpay2.NewSub All.MoneydealerPay = moneydealer.NewSub - //All.AgroPay = agropay.NewSub + All.Agropay = agropay.NewSub All.JJPay = jjpay.NewSub All.AntPay = antpay.NewSub All.VirgoPay = virgopay.NewSub diff --git a/modules/pay/base/signmd5.go b/modules/pay/base/signmd5.go index e267360..50365e3 100644 --- a/modules/pay/base/signmd5.go +++ b/modules/pay/base/signmd5.go @@ -55,3 +55,20 @@ func (b *Base) SignMD5WithStrEmpty(str string) string { } return ret } + +func (b *Base) SignMD5Empty(send interface{}) string { + signStr := GetSignStrEmpty(send, b.SignPassStr...) + if b.PassKeyName { + signStr += b.SignKey + } else if b.KeyName == "" { + signStr += "&key=" + b.SignKey + } else { + signStr += "&" + b.KeyName + "=" + b.SignKey + } + log.Debug("final signStr:%s", signStr) + ret := util.CalculateMD5(signStr) + if b.ShouldSignUpper { + ret = strings.ToUpper(ret) + } + return ret +} diff --git a/modules/pay/base/util.go b/modules/pay/base/util.go index 5021276..1a74c5d 100644 --- a/modules/pay/base/util.go +++ b/modules/pay/base/util.go @@ -62,6 +62,12 @@ func GetSignStrEmpty(send interface{}, pass ...string) string { if shouldPass { continue } + switch m[i].(type) { + case string: + if m[i].(string) == "" { + continue + } + } str = append(str, i) } sort.Strings(str) diff --git a/modules/web/handler/luckyWheel.go b/modules/web/handler/luckyWheel.go index c42c333..fce37f3 100644 --- a/modules/web/handler/luckyWheel.go +++ b/modules/web/handler/luckyWheel.go @@ -48,10 +48,10 @@ func LuckyWheelCfg(c *gin.Context) { update bool ) for _, wheelCfg := range luckyWheel.WheelCfgStr { - if wheelCfg.LuckyType == 4 && - rechargeInfo.TotalRecharge < int64(wheelCfg.RechargeAmount[0]*common.DecimalDigits) { // 特殊转盘达到了才能看见 - continue - } + //if wheelCfg.LuckyType == 4 && + // rechargeInfo.TotalRecharge < int64(wheelCfg.RechargeAmount[0]*common.DecimalDigits) { // 特殊转盘达到了才能看见 + // continue + //} lessKey := fmt.Sprintf("l%d", wheelCfg.LuckyType) for _, rechargeAmount := range wheelCfg.RechargeAmount { if rechargeAmount == 0 { diff --git a/modules/web/handler/recharge.go b/modules/web/handler/recharge.go index 15d3fe7..8fb2221 100644 --- a/modules/web/handler/recharge.go +++ b/modules/web/handler/recharge.go @@ -405,7 +405,7 @@ type RechargeImp struct { func (r *RechargeImp) CreateRecharge() error { if r.Order.OrderID == "" { - r.Order.OrderID = util.NewOrderID(r.UID) + r.Order.OrderID = util.NewOrderID(r.UID, config.GetBase().ServerFlag) } // r.Order.UID = r.UID // r.Order.Status = common.StatusROrderCreate @@ -426,7 +426,7 @@ type PayImp struct { } func (p *PayImp) Recharge() int { - orderID := util.NewOrderID(p.base.UID) + orderID := util.NewOrderID(p.base.UID, config.GetBase().ServerFlag) // product := p.base.product var resp *pb.InnerRechargeResp var err error diff --git a/modules/web/handler/share.go b/modules/web/handler/share.go index 60fcb7c..0c307ab 100644 --- a/modules/web/handler/share.go +++ b/modules/web/handler/share.go @@ -403,7 +403,7 @@ func ShareNewWithdraw(c *gin.Context) { } db.Mysql().Create(&common.RechargeOrder{ UID: uid, - OrderID: util.NewOrderID(uid), + OrderID: util.NewOrderID(uid, config.GetBase().ServerFlag), APIPayID: "", // ProductID: common.ActivityIDPddShare, Amount: one.Amount, @@ -470,7 +470,7 @@ func ShareNewWithdraw(c *gin.Context) { return } - orderID := util.NewOrderID(uid) + orderID := util.NewOrderID(uid, config.GetBase().ServerFlag) order := &common.RechargeOrder{ UID: uid, diff --git a/modules/web/handler/withdraw.go b/modules/web/handler/withdraw.go index bf891a9..e1f9762 100644 --- a/modules/web/handler/withdraw.go +++ b/modules/web/handler/withdraw.go @@ -360,7 +360,7 @@ func PlayerWithdrawBlock(c *gin.Context) { } } - orderID := "USDT" + util.NewOrderID(uid) + orderID := "USDT" + util.NewOrderID(uid, config.GetBase().ServerFlag) // 第一步,先扣钱 err := call.MineCurrencyProReal(&common.UpdateCurrency{ CurrencyBalance: &common.CurrencyBalance{ @@ -507,7 +507,7 @@ func PlayerWithdraw(c *gin.Context) { } } - orderID := util.NewOrderID(uid) + orderID := util.NewOrderID(uid, config.GetBase().ServerFlag) // 第一步,先扣钱 pro := call.MineCurrencyProReal(&common.UpdateCurrency{ CurrencyBalance: &common.CurrencyBalance{ diff --git a/util/util.go b/util/util.go index c39e03f..268ddca 100644 --- a/util/util.go +++ b/util/util.go @@ -350,13 +350,16 @@ func RandomToken(uid int) string { } // NewOrderID 新生成一个订单id -func NewOrderID(uid int) string { +func NewOrderID(uid int, flag string) string { orderID := "" str := strconv.Itoa(uid) for _, v := range str { orderID += tokenMap[string(v)] } - return orderID + strconv.FormatInt(time.Now().Unix(), 10) + if flag == "a" { + flag = "" + } + return orderID + strconv.FormatInt(time.Now().Unix(), 10) + flag } // SliceInt2Int32 数组转换