1.新增通用订单同步接口;

This commit is contained in:
chenlin 2025-06-26 16:14:11 +08:00
parent 88a0cb8fc3
commit 75887289f0
3 changed files with 156 additions and 1 deletions

View File

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

View File

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

View File

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