From 75887289f0dc670c982cec1c0f2d99387df13b97 Mon Sep 17 00:00:00 2001 From: chenlin Date: Thu, 26 Jun 2025 16:14:11 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=96=B0=E5=A2=9E=E9=80=9A=E7=94=A8=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=90=8C=E6=AD=A5=E6=8E=A5=E5=8F=A3=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/apis/migumanage/migu_music.go | 148 ++++++++++++++++++++++++ app/admin/models/music.go | 7 +- app/admin/router/migu.go | 2 + 3 files changed, 156 insertions(+), 1 deletion(-) diff --git a/app/admin/apis/migumanage/migu_music.go b/app/admin/apis/migumanage/migu_music.go index 32e8fc9..98cd36a 100644 --- a/app/admin/apis/migumanage/migu_music.go +++ b/app/admin/apis/migumanage/migu_music.go @@ -613,3 +613,151 @@ func (e MiGuDeployService) MusicQueryOrder(c *gin.Context) { app.MiGuOK(c, resp) } + +// CommonFeedback 通用订单同步接口(支持不同产品不同渠道) +// @Summary 通用订单同步接口 +// @Tags 2025-咪咕音乐-回调 +// @Produce json +// @Accept json +// @Param request body models.CallbackRequest true "通用订单同步接口" +// @Success 200 {object} models.CommonFeedbackResp +// @Router /api/v1/migu/music/common/feedback [post] +func (e MiGuDeployService) CommonFeedback(c *gin.Context) { + fmt.Println("CommonFeedback-start") + logger.Info("CommonFeedback-start") + + var resp models.CommonFeedbackResp + resp.ReturnCode = 0 + // 读取 Body 参数 (JSON/Raw) + bodyBytes, err := io.ReadAll(c.Request.Body) + if err != nil { + fmt.Println("Failed to read body:", err) + logger.Error(err) + resp.ReturnDesc = "参数错误,读取Body失败" + app.MiGuOK(c, resp) + return + } + + fmt.Println("Body Params:", string(bodyBytes)) + logger.Info("Body Params:", string(bodyBytes)) + + // 反序列化 JSON 为 Map + var jsonData map[string]interface{} + if err = json.Unmarshal(bodyBytes, &jsonData); err == nil { + fmt.Println("JSON Params:", jsonData) + } else { + fmt.Println("Failed to unmarshal JSON:", err) + } + + req := &models.CallbackRequest{} + if err = json.Unmarshal(bodyBytes, req); err != nil { + logger.Errorf("CommonFeedback para err: %v", err) + resp.ReturnDesc = "参数错误" + app.MiGuOK(c, resp) + return + } + + logger.Info("CommonFeedback req:", req) + // 初始化数据库 + err = e.MakeContext(c).MakeOrm().Errors + if err != nil { + fmt.Println("CommonFeedback err:", err) + e.Logger.Error(err) + resp.ReturnDesc = "初始化失败" + app.MiGuOK(c, resp) + return + } + + // 判断渠道编号 + if !models.IsValidChannelEx(req.ChannelCode, e.Orm) { + resp.ReturnDesc = "无效的渠道号" + app.MiGuOK(c, resp) + return + } + + channelInfo, err := models.GetChannelInfoByChannelCode(req.ChannelCode, e.Orm) + if err != nil { + fmt.Println("CommonFeedback GetChannelInfoByChannelCode err:", err) + fmt.Println("CommonFeedback sub_channel_code is:", req.ChannelCode) + logger.Errorf("CommonFeedback GetChannelInfoByChannelCode err, sub_channel_code is:", req.ChannelCode) + } + + // 记录数据库 + var sendLog models.MgTransactionLog + sendLog.ProductID = int64(channelInfo.ProductID) + sendLog.ChannelCode = req.ChannelCode + sendLog.OutTradeNo = models.GetOrderSerial(e.Orm) + sendLog.PhoneNumber = req.PhoneNumber + sendLog.LinkId = req.ExternalOrderNo + sendLog.ChannelTradeNo = req.ExternalOrderNo + if req.ResCode != 1 { + sendLog.Result = "999004" + sendLog.VerificationCode = "999999" + } else { + sendLog.Result = "00000" // 跟咪咕钻石会员保持一致 + sendLog.VerificationCode = "666666" + } + if req.Province != "" && req.ResDesc != "" { + sendLog.Reason = fmt.Sprintf("[%s]:%s", req.Province, req.ResDesc) + } else if req.Province != "" { + sendLog.Reason = fmt.Sprintf("[%s]", req.Province) + } else if req.ResDesc != "" { + sendLog.Reason = req.ResDesc + } else { + sendLog.Reason = "" + } + + err = e.Orm.Create(&sendLog).Error + if err != nil { + logger.Info("Create MgTransactionLog err:", err) + + resp.ReturnDesc = err.Error() + app.MiGuOK(c, resp) + return + } + + if req.ResCode == 1 { // 成功消息 + var lastOrder models.MgOrder + result := e.Orm.Model(&models.MgOrder{}).Where("phone_number = ? and product_id = ?", req.PhoneNumber, channelInfo.ProductID). + Order("subscribe_time DESC").First(&lastOrder) + + if errors.Is(result.Error, gorm.ErrRecordNotFound) { + nowTime := time.Now() + flag := true + if lastOrder.ID != 0 { + timeDiff := nowTime.Sub(lastOrder.CreatedAt) + if timeDiff < 2*time.Minute { + flag = false + } + } + + if flag { + // 插入新记录 + var orderInfo models.MgOrder + orderInfo.ProductID = int64(channelInfo.ProductID) + orderInfo.ChannelCode = req.ChannelCode + orderInfo.OrderSerial = models.GetOrderSerial(e.Orm) + orderInfo.SubscribeTime = &nowTime + orderInfo.PhoneNumber = req.PhoneNumber + orderInfo.SM4PhoneNumber, _ = tools.SM4Encrypt(models.SM4KEy, req.PhoneNumber) + + if req.ExternalOrderNo == "" { + req.ExternalOrderNo = orderInfo.OrderSerial + } + orderInfo.ChannelTradeNo = req.ExternalOrderNo + orderInfo.ExternalOrderID = req.ExternalOrderNo + orderInfo.State = models.SubscribeOK + + if err = e.Orm.Create(&orderInfo).Error; err != nil { + logger.Error(err) + } + } + } + } + + fmt.Println("CommonFeedback-end") + logger.Info("CommonFeedback-end") + + resp.ReturnCode = 1 + app.MiGuOK(c, resp) +} diff --git a/app/admin/models/music.go b/app/admin/models/music.go index 2c67a4e..584df35 100644 --- a/app/admin/models/music.go +++ b/app/admin/models/music.go @@ -28,7 +28,7 @@ const ( ) type CallbackRequest struct { - ChannelCode string `json:"channel_code" binding:"required"` // 渠道编码,例如:00211NV + ChannelCode string `json:"channel_code" binding:"required"` // 渠道编码,例如:00211AI ExternalOrderNo string `json:"external_order_no"` // 外部平台流水号,例如:1909274381102424065 PhoneNumber string `json:"phone_number" binding:"required"` // 手机号,例如:13590011234 Province string `json:"province"` // 省份,例如:广东 @@ -59,6 +59,11 @@ type MusicFeedbackResp struct { ReturnDesc string `json:"return_desc"` // 返回描述 } +type CommonFeedbackResp struct { + ReturnCode int `json:"return_code"` // 返回代码 + ReturnDesc string `json:"return_desc"` // 返回描述 +} + func ParseMsg(msg string) (*MsgDetails, error) { parts := strings.Split(msg, "@") if len(parts) < 6 { diff --git a/app/admin/router/migu.go b/app/admin/router/migu.go index 8512102..015cea0 100644 --- a/app/admin/router/migu.go +++ b/app/admin/router/migu.go @@ -42,6 +42,8 @@ func registerMiGuControlManageUnAuthRouter(v1 *gin.RouterGroup) { apiMusic.POST("login", apiMiGu.MusicLogin) // 咪咕音乐登陆 apiMusic.POST("query_order", apiMiGu.MusicQueryOrder) // 咪咕音乐查询订单 + + apiMusic.POST("common/feedback", apiMiGu.CommonFeedback) // 通用订单同步接口(支持不同产品不同渠道) } //api := v1.Group("/notice")