From 978cc5fd911b2595764d87efb39c2567884d1a2f Mon Sep 17 00:00:00 2001 From: yangduo Date: Fri, 10 Jan 2025 20:15:34 +0800 Subject: [PATCH] sprepurchase --- server/payserver/api/v1/ingame/ingame.go | 109 +++++++++++++++++++++++ server/payserver/router/ingame/ingame.go | 2 + server/payserver/service/wxpaybase.go | 12 +++ 3 files changed, 123 insertions(+) diff --git a/server/payserver/api/v1/ingame/ingame.go b/server/payserver/api/v1/ingame/ingame.go index b3bb0db..f2d3ed9 100644 --- a/server/payserver/api/v1/ingame/ingame.go +++ b/server/payserver/api/v1/ingame/ingame.go @@ -188,6 +188,115 @@ func (this *InGameApi) PayDone(c *gin.Context) { c.JSON(200, rspObj) } +func (this *InGameApi) ServerPrePurchase(c *gin.Context) { + req := struct { + AccountId string `binding:"required" json:"account_id"` + SessionId string `binding:"required" json:"session_id"` + UserIp string `binding:"required" json:"user_ip"` + Sign string `binding:"required" json:"sign"` + SigData string `binding:"required" json:"sig_data"` + }{} + + if err := c.ShouldBindJSON(&req); err != nil { + f5.RspErr(c, 401, "post content error") + return + } + + strs := strings.Split(req.AccountId, "_") + if len(strs) < 3 { + f5.RspErr(c, 401, "params error1") + return + } + + if !strings.EqualFold(q5.Md5Str(req.AccountId+constant.GLOBAL_SALT+req.SessionId), req.Sign) { + f5.RspErr(c, 401, "sign err") + return + } + + sigdata := map[string]interface{}{} + if json.Unmarshal([]byte(req.SigData), &sigdata) != nil { + f5.RspErr(c, 401, "sigdata err") + return + } + + goodsid := q5.SafeToInt32(sigdata["productId"]) + if goodsid == 0 { + f5.RspErr(c, 401, "sigdata productid err") + return + } + + rediskey := "ls:accountid:" + req.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 + } + + sessionkey := q5.SafeToString(data["session_key"]) + if len(sessionkey) == 0 { + f5.GetSysLog().Debug("empty sessionkey:%s", req.AccountId) + f5.RspErr(c, 402, "invalid session 2") + return + } + + sessionkeytime := q5.SafeToInt64(data["update_time"]) + if service.Wxpay.CheckExpireCache(req.AccountId, sessionkeytime) { + f5.RspErr(c, 402, "session expired") + return + } + + gameid := q5.SafeToInt64(strs[1]) + + nowTime := int32(f5.GetApp().GetRealSeconds()) + order := new(model.InAppOrder) + order.AccountId = req.AccountId + order.OrderId = q5.ToString(f5.GetApp().NewLockNodeUuid()) + order.ItemId = goodsid + order.IP = req.UserIp + + order.CreateTime = nowTime + order.ModifyTime = nowTime + + sigdata["outTradeNo"] = order.OrderId + sigdatabyte, _ := json.Marshal(sigdata) + fullsigdata := string(sigdatabyte) + + paysig, signature := service.Wxpay.GetPurchaseSig(gameid, fullsigdata, sessionkey) + if len(paysig) == 0 || len(signature) == 0 { + f5.RspErr(c, 403, "account error") + return + } + + if err := order.Create(); err != nil { + f5.RspErr(c, 500, "server internal error") + return + } + + rspObj := struct { + ErrorCode int32 `json:"errcode"` + ErrMsg string `json:"errmsg"` + OrderId string `json:"order_id"` + PaySig string `json:"pay_sig"` + Signature string `json:"signature"` + SigData string `json:"sig_data"` + }{ + 0, + "", + order.OrderId, + paysig, + signature, + fullsigdata, + } + + c.JSON(200, rspObj) +} + func (this *InGameApi) OrderInfo(c *gin.Context) { reqJson := struct { AccountId string `json:"account_id" binding:"required"` diff --git a/server/payserver/router/ingame/ingame.go b/server/payserver/router/ingame/ingame.go index 0e61e97..52865e4 100644 --- a/server/payserver/router/ingame/ingame.go +++ b/server/payserver/router/ingame/ingame.go @@ -19,4 +19,6 @@ func (this *IngameRouter) InitRouter() { api.InGameApi.ServerPreOrder) f5.GetApp().GetGinEngine().GET("/api/ingame/paid", api.InGameApi.PayDone) + f5.GetApp().GetGinEngine().POST("/api/ingame/sprepurchase", + api.InGameApi.ServerPrePurchase) } diff --git a/server/payserver/service/wxpaybase.go b/server/payserver/service/wxpaybase.go index 2d6a060..aafc65e 100644 --- a/server/payserver/service/wxpaybase.go +++ b/server/payserver/service/wxpaybase.go @@ -22,6 +22,18 @@ func (wp *wxpay) GenSHA256Signature(str string, key string) string { return strings.ToLower(hex.EncodeToString(mac.Sum(nil))) } +func (wp *wxpay) GetPurchaseSig(gameid int64, data string, sessionkey string) (pay_sig string, signature string) { + cfg := mt.Table.Wxconfig.GetById(gameid) + if cfg == nil { + return + } + pay_sig = wp.GenSHA256Signature("requestMidasPaymentGameItem&"+data, cfg.GetAppkey()) + signature = wp.GenSHA256Signature(data, sessionkey) + + return pay_sig, signature + +} + func (wp *wxpay) DecryptMsg(sMsgSignature string, sTimeStamp string, sNonce string, sEncryptMsg string) (sMsg []byte, msgappid []byte) { // 2.validate signature