From 2095b3100432bf57b257db4c4c1d11f74ffa4619 Mon Sep 17 00:00:00 2001 From: yangduo Date: Tue, 31 Dec 2024 11:48:25 +0800 Subject: [PATCH] other order --- server/payserver/api/v1/ingame/ingame.go | 88 +++++++++++++++++++++++- server/payserver/model/inapp_order.go | 1 + server/payserver/router/ingame/ingame.go | 2 + 3 files changed, 89 insertions(+), 2 deletions(-) diff --git a/server/payserver/api/v1/ingame/ingame.go b/server/payserver/api/v1/ingame/ingame.go index 0e460a3..30b8bcb 100644 --- a/server/payserver/api/v1/ingame/ingame.go +++ b/server/payserver/api/v1/ingame/ingame.go @@ -233,11 +233,13 @@ func (this *InGameApi) OrderInfo(c *gin.Context) { OrderId string `json:"order_id"` GoodsId int32 `json:"goods_id"` Count int32 `json:"count"` + Others int32 `json:"others"` Status int32 `json:"status"` }{ OrderId: orderModel.OrderId, GoodsId: orderModel.ItemId, Count: orderModel.SpAmount, + Others: orderModel.SpOthers, Status: orderModel.Status, } @@ -260,11 +262,12 @@ func (this *InGameApi) OrderInfo(c *gin.Context) { } if balance >= count { - errcode = service.Wxpay.QueryPay(openid, gameid, userip, sessionkey, int32(count), orderModel.OrderId) + errcode = service.Wxpay.QueryPay(openid, gameid, userip, sessionkey, int32(balance), orderModel.OrderId) if errcode == constant.WX_ERRCODE_OK { orderModel.Status = 1 orderModel.SpAmount = int32(count) - orderModel.UpdateFields([]string{"status", "sp_amount"}) + orderModel.SpOthers = int32(balance - count) + orderModel.UpdateFields([]string{"status", "sp_amount", "sp_others"}) } } } @@ -278,6 +281,87 @@ func (this *InGameApi) OrderInfo(c *gin.Context) { } } +func (this *InGameApi) OtherOrder(c *gin.Context) { + reqJson := struct { + AccountId string `json:"account_id" binding:"required"` + SessionId string `json:"session_id" binding:"required"` + }{} + if err := c.ShouldBindJSON(&reqJson); err != nil { + f5.RspErr(c, 401, "params error") + return + } + + strs := strings.Split(reqJson.AccountId, "_") + if len(strs) < 3 { + f5.RspErr(c, 401, "params error1") + return + } + + rediskey := "ls:accountid:" + reqJson.AccountId + str, err := service.Redis.Get(constant.LOGIN_REDIS, rediskey) + if err != nil { + f5.RspErr(c, 402, "invalid session") + return + } + + data := map[string]interface{}{} + if json.Unmarshal([]byte(str), &data) != nil { + f5.RspErr(c, 402, "invalid session 1") + return + } + + sessionkeytime := q5.SafeToInt64(data["update_time"]) + if service.Wxpay.CheckExpireCache(reqJson.AccountId, sessionkeytime) { + f5.RspErr(c, 402, "session expired") + return + } + + rspObj := struct { + ErrorCode int32 `json:"errcode"` + ErrMsg string `json:"errmsg"` + Count int64 `json:"count"` + }{} + + gameid := q5.SafeToInt64(strs[1]) + openid := q5.SafeToString(data["openid"]) + sessionkey := q5.SafeToString(data["session_key"]) + userip := this.getIP(c) + balance, errcode, err := service.Wxpay.QueryBalance(openid, gameid, userip, sessionkey) + if err != nil { + f5.RspErr(c, 500, "wx server busy") + return + } + + if errcode == constant.WX_ERRCODE_OK && balance > 0 { + nowTime := int32(f5.GetApp().GetRealSeconds()) + order := new(model.InAppOrder) + order.AccountId = reqJson.AccountId + order.OrderId = "o" + q5.ToString(f5.GetApp().NewLockNodeUuid()) + + errcode = service.Wxpay.QueryPay(openid, gameid, userip, sessionkey, int32(balance), order.OrderId) + if errcode == constant.WX_ERRCODE_OK { + order.GameId = int32(gameid) + order.Channel = q5.SafeToInt32(strs[0]) + order.IP = this.getIP(c) + order.Status = 2 + order.SpOthers = int32(balance) + order.CreateTime = nowTime + order.ModifyTime = nowTime + + if err := order.Create(); err != nil { + f5.GetSysLog().Error("record other order error:%s, %s, %d", reqJson.AccountId, order.OrderId, balance) + } + rspObj.Count = balance + } + } else if errcode == constant.WX_ERRCODE_SESSIONERR || errcode == constant.WX_ERRCODE_SIGERR { + service.Wxpay.AddExpireInfo(reqJson.AccountId, sessionkeytime) + rspObj.ErrorCode = 402 + rspObj.ErrMsg = "invalid session 2" + } + + c.JSON(200, rspObj) +} + func (iga *InGameApi) getIP(c *gin.Context) (ip string) { ip = c.Request.Header.Get("X-Real-Ip") if ip == "" { diff --git a/server/payserver/model/inapp_order.go b/server/payserver/model/inapp_order.go index 4fbd608..f92fa55 100644 --- a/server/payserver/model/inapp_order.go +++ b/server/payserver/model/inapp_order.go @@ -30,6 +30,7 @@ type InAppOrder struct { SpOrderId string `gorm:"column:sp_orderid;comment:平台的订单id"` SpAmount int32 `gorm:"column:sp_amount;comment:sp_amount"` + SpOthers int32 `gorm:"column:sp_others;comment:补单金额"` SpConfirm int32 `gorm:"column:sp_confirmtime;comment:平台确认时间"` SpResult int32 `gorm:"column:sp_pay_result;comment:0: 未确认 1: 支付成功 -1:支付失败"` } diff --git a/server/payserver/router/ingame/ingame.go b/server/payserver/router/ingame/ingame.go index 81ae20a..0e61e97 100644 --- a/server/payserver/router/ingame/ingame.go +++ b/server/payserver/router/ingame/ingame.go @@ -13,6 +13,8 @@ func (this *IngameRouter) InitRouter() { api.InGameApi.PreOrder) f5.GetApp().GetGinEngine().POST("/api/ingame/orderinfo", api.InGameApi.OrderInfo) + f5.GetApp().GetGinEngine().POST("/api/ingame/otherorder", + api.InGameApi.OtherOrder) f5.GetApp().GetGinEngine().GET("/api/ingame/spreorder", api.InGameApi.ServerPreOrder) f5.GetApp().GetGinEngine().GET("/api/ingame/paid",