From dbaa303418c6acf71673e1aa87861a859ebd06e8 Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Thu, 2 Apr 2026 12:25:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E8=B4=A7=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sdk/ship/model/base/base.go | 4 ++ sdk/ship/model/test/test.go | 71 +++++++++++++++++++++++++++-------- sdk/ship/model/tuyou/tuyou.go | 23 ++++++++++-- 3 files changed, 80 insertions(+), 18 deletions(-) diff --git a/sdk/ship/model/base/base.go b/sdk/ship/model/base/base.go index 169ea18..c815f92 100644 --- a/sdk/ship/model/base/base.go +++ b/sdk/ship/model/base/base.go @@ -3,6 +3,7 @@ package base import ( "backend/util" "fmt" + "log" "time" "github.com/gin-gonic/gin" @@ -25,6 +26,7 @@ func (p *Param) ChangeOrderStatus(Platform string, prodprice string) error { // 校验成功 修改订单状态为已支付 AppConf, err := util.GetAppConfig(p.AppId) if err != nil { + log.Print("get app config error:", err) return err } Db := util.MPool.GetMysqlDB(AppConf, 1) @@ -34,8 +36,10 @@ func (p *Param) ChangeOrderStatus(Platform string, prodprice string) error { var paystatus int err = Db.QueryRow("SELECT `ProductId`, `Price`, `PayStatus` FROM `t_player_charge` WHERE `OrderId`=?", p.OrderId).Scan(&chargeId, &price, &paystatus) if err != nil { + log.Print("query order error:", err, p.OrderId) return err } + log.Printf("订单金额:数据库金额:%.2f,回调金额:%s; 订单id:%s, chargeid:%d", price, prodprice, p.OrderId, chargeId) // if fmt.Sprintf("%.2f", price) != prodprice { // return fmt.Errorf("订单金额不匹配,数据库金额:%.2f,回调金额:%s; 订单id:%s, chargeid:%d", price, prodprice, p.OrderId, chargeId) // } diff --git a/sdk/ship/model/test/test.go b/sdk/ship/model/test/test.go index 6125deb..4d780d4 100644 --- a/sdk/ship/model/test/test.go +++ b/sdk/ship/model/test/test.go @@ -1,6 +1,10 @@ package test import ( + "backend/Type" + "backend/client" + "backend/common" + "backend/feishu" "backend/msg" "backend/sdk/ship/model/base" "backend/util" @@ -20,14 +24,27 @@ type TestModel struct { } type ChargeRequest struct { - AppID string `json:"appId" form:"appId" binding:"required" description:"途游应用id"` - ClientID string `json:"clientId" form:"clientId" binding:"required" description:"途游客户端包id"` - UserID string `json:"userId" form:"userId" binding:"required" description:"途游用户id"` - ProductID string `json:"productId" form:"productId" binding:"required" description:"途游商品id"` - AppInfo string `json:"appInfo" form:"appInfo" description:"项目组透传参数"` - Code string `json:"code" form:"code" binding:"required" description:"接口签名"` + ApiVer string `json:"apiver" form:"apiver" binding:"required" description:"SDK服务端支付API版本"` + AppID string `json:"appId" form:"appId" binding:"required" description:"cp应用ID"` + AppInfo string `json:"appInfo" form:"appInfo" description:"项目透传信息"` + ChargedDiamonds string `json:"chargedDiamonds" form:"chargedDiamonds" description:"充值钻石数量,一般为充值金额的10倍"` + ChargedRmbs string `json:"chargedRmbs" form:"chargedRmbs" description:"充值金额(元)"` + ClientID string `json:"clientId" form:"clientId" binding:"required" description:"途游客户端包id"` + ConsumeCoin string `json:"consumeCoin" form:"consumeCoin" description:"消耗金币数量,一般为充值金额的10倍"` + ConsumeID string `json:"consumeId" form:"consumeId" description:"本次消耗事务id"` + OrderID string `json:"orderId" form:"orderId" description:"CP订单号"` + PlatformOrder string `json:"platformOrder" form:"platformOrder" description:"SDK订单号"` + ProdCount string `json:"prodCount" form:"prodCount" description:"商品数量,默认为1"` + UserID string `json:"userId" form:"userId" binding:"required" description:"SDK用户ID"` + ProdID string `json:"prodId" form:"prodId" description:"商品ID"` + ProdPrice string `json:"prodPrice" form:"prodPrice" description:"商品价格"` + Code string `json:"code" form:"code" binding:"required" description:"回调签名"` } +const ( + APP_KEY = "8001bd25832553c39d4b443f56480841" +) + // 增加 Sign 方法:按 json tag 名称收集参数,排除 code,按 ASCII 升序拼接 key=value 用 & 连接,最后 MD5 并返回小写十六进制字符串。 func (r *ChargeRequest) Sign() string { if r == nil { @@ -78,7 +95,7 @@ func (r *ChargeRequest) Sign() string { b.WriteString(params[k]) } checkstr := b.String() - + checkstr = APP_KEY + checkstr + APP_KEY // 计算 MD5 并返回小写十六进制字符串 sum := md5.Sum([]byte(checkstr)) return fmt.Sprintf("%x", sum) @@ -93,39 +110,57 @@ func Charge(c *gin.Context) { } expectedSign := req.Sign() if req.Code != expectedSign { + // FeishuNotify(fmt.Sprintf("invalid signature: got %s, expected %s", req.Code, expectedSign)) // log.Printf("invalid signature: got %s, expected %s", req.Code, expectedSign) // c.JSON(401, gin.H{"error": "invalid signature"}) // return } - // {"appId":1,"uid":100100476,"serverId":1,"orderId":"order_100100002_20250820142941DBLbNB"} var AppInfo base.Param if err := json.Unmarshal([]byte(req.AppInfo), &AppInfo); err != nil { + FeishuNotify(fmt.Sprintf("unmarshal AppInfo error:%v", err)) log.Print("unmarshal AppInfo error:", err) c.JSON(400, gin.H{"error": "invalid AppInfo"}) return } - AppInfo.ChannelOrderId = req.ProductID - err := AppInfo.ChangeOrderStatus("test", req.ProductID) + AppInfo.ChannelOrderId = req.PlatformOrder + err := AppInfo.ChangeOrderStatus("test", req.ProdPrice) if err != nil { + //alibaba.SendStandardMsg("途游充值发货错误-测试", err.Error(), "red") log.Print("change order status error:", err) c.JSON(500, gin.H{"error": "failed to change order status"}) return } go Shipping(AppInfo) - c.JSON(200, gin.H{"code": 0, "message": "success"}) + c.String(200, "success") } +// http://localhost:5240/api/tuyou/charge?apiver=2&appId=20659&appInfo=%7B%22appId%22%3A0%2C%22serverId%22%3A1%2C%22orderId%22%3A%22order_105372_20260125225337HhpqbU%22%2C%22uid%22%3A105372%7D&chargedDiamonds=20&chargedRmbs=1.99&clientId=Android_5.00_tyGuest%2Cfacebook.googleplay.0-hall20659.googleplay.Meowment&consumeCoin=20&consumeId=d50b32601260117387&orderId=-&platformOrder=e50b3260126045d972&prodCount=1&prodId=TY206590059&prodPrice=1.99&userId=3790944&code=fd7532d651bed4c3041aa3e628bef80b func Shipping(AppInfo base.Param) { + if common.GetRpcSwitch() { + err := client.OrderShipping(AppInfo.AppId, AppInfo.ServerId, &msg.ReqOrderShipping{ + OrderSn: AppInfo.OrderId, + Status: 1, + ChannelOrderSn: AppInfo.ChannelOrderId, + }) + + if err == nil { + log.Printf("rpc order shipping success;AppId:%d;ServerId:%d;OrderId:%s", AppInfo.AppId, AppInfo.ServerId, AppInfo.OrderId) + return + } + } + Adminreq := &msg.ReqAdminShipping{ OrderSn: AppInfo.OrderId, Status: 1, ChannelOrderSn: AppInfo.ChannelOrderId, } num := 0 + log.Print("charge shipping start;AppId:", AppInfo.AppId, ";ServerId:", AppInfo.ServerId, ";OrderId:", AppInfo.OrderId) for { num++ if num > 100 { - log.Print("charge shipping break infinite loop") + log.Print("charge shipping break infinite loop;AppId:", AppInfo.AppId, ";ServerId:", AppInfo.ServerId, ";OrderId:", AppInfo.OrderId) + break } ws, err := util.GetWebsocket(AppInfo.AppId, AppInfo.ServerId) @@ -144,12 +179,18 @@ func Shipping(AppInfo base.Param) { continue } if r != nil { - log.Printf("charge shipping:orderSn:%s;res:%v", AppInfo.OrderId, r) + log.Printf("ws charge shipping success:orderSn:%s;res:%v", AppInfo.OrderId, r) break } } } -func (t *TestModel) VerifyToken(Uid string, Token string) error { - return nil +func FeishuNotify(EvnetName string) { + feishu.SendNotifyMsg(&Type.NotifyData{ + NotifyMsg: "支付发货失败", + Host: "途游", + EventName: EvnetName, + Severity: "High", + AlarmTime: time.Unix(time.Now().Unix(), 0).Format("2006-01-02 15:04:05"), + }) } diff --git a/sdk/ship/model/tuyou/tuyou.go b/sdk/ship/model/tuyou/tuyou.go index acbc8b9..1a1895d 100644 --- a/sdk/ship/model/tuyou/tuyou.go +++ b/sdk/ship/model/tuyou/tuyou.go @@ -3,6 +3,8 @@ package tuyou import ( "backend/Type" "backend/alibaba" + "backend/client" + "backend/common" "backend/feishu" "backend/msg" "backend/sdk/ship/model/base" @@ -132,17 +134,32 @@ func Charge(c *gin.Context) { // http://localhost:5240/api/tuyou/charge?apiver=2&appId=20659&appInfo=%7B%22appId%22%3A0%2C%22serverId%22%3A1%2C%22orderId%22%3A%22order_105372_20260125225337HhpqbU%22%2C%22uid%22%3A105372%7D&chargedDiamonds=20&chargedRmbs=1.99&clientId=Android_5.00_tyGuest%2Cfacebook.googleplay.0-hall20659.googleplay.Meowment&consumeCoin=20&consumeId=d50b32601260117387&orderId=-&platformOrder=e50b3260126045d972&prodCount=1&prodId=TY206590059&prodPrice=1.99&userId=3790944&code=fd7532d651bed4c3041aa3e628bef80b func Shipping(AppInfo base.Param) { + if common.GetRpcSwitch() { + err := client.OrderShipping(AppInfo.AppId, AppInfo.ServerId, &msg.ReqOrderShipping{ + OrderSn: AppInfo.OrderId, + Status: 1, + ChannelOrderSn: AppInfo.ChannelOrderId, + }) + + if err == nil { + log.Printf("rpc order shipping success;AppId:%d;ServerId:%d;OrderId:%s", AppInfo.AppId, AppInfo.ServerId, AppInfo.OrderId) + return + } else { + log.Printf("rpc order shipping error: %v;AppId:%d;ServerId:%d;OrderId:%s", err, AppInfo.AppId, AppInfo.ServerId, AppInfo.OrderId) + } + } + Adminreq := &msg.ReqAdminShipping{ OrderSn: AppInfo.OrderId, Status: 1, ChannelOrderSn: AppInfo.ChannelOrderId, } num := 0 - log.Print("charge shipping start;AppId:", AppInfo.AppId, ";ServerId:", AppInfo.ServerId, ";OrderId:", AppInfo.OrderId) + log.Print("ws charge shipping start;AppId:", AppInfo.AppId, ";ServerId:", AppInfo.ServerId, ";OrderId:", AppInfo.OrderId) for { num++ if num > 100 { - log.Print("charge shipping break infinite loop;AppId:", AppInfo.AppId, ";ServerId:", AppInfo.ServerId, ";OrderId:", AppInfo.OrderId) + log.Print("ws charge shipping break infinite loop;AppId:", AppInfo.AppId, ";ServerId:", AppInfo.ServerId, ";OrderId:", AppInfo.OrderId) break } @@ -162,7 +179,7 @@ func Shipping(AppInfo base.Param) { continue } if r != nil { - log.Printf("charge shipping success:orderSn:%s;res:%v", AppInfo.OrderId, r) + log.Printf("ws charge shipping success:orderSn:%s;res:%v", AppInfo.OrderId, r) break } }