发货优化

This commit is contained in:
hahwu 2026-04-02 12:25:25 +08:00
parent 0e6d5ec4fa
commit dbaa303418
3 changed files with 80 additions and 18 deletions

View File

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

View File

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

View File

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