diff --git a/internal/logic/public/iap/apple/attachTransactionLogic.go b/internal/logic/public/iap/apple/attachTransactionLogic.go index 59eae55..5ab445f 100644 --- a/internal/logic/public/iap/apple/attachTransactionLogic.go +++ b/internal/logic/public/iap/apple/attachTransactionLogic.go @@ -59,6 +59,13 @@ func (l *AttachTransactionLogic) Attach(req *types.AttachAppleTransactionRequest l.Errorw("无效访问,用户信息缺失") return nil, errors.Wrapf(xerr.NewErrCode(xerr.InvalidAccess), "invalid access") } + // 解析家庭权益:member 的订阅归属于 owner + entitlement, entErr := commonLogic.ResolveEntitlementUser(l.ctx, l.svcCtx.DB, u.Id) + if entErr != nil { + l.Errorw("解析家庭权益失败", logger.Field("userId", u.Id), logger.Field("error", entErr.Error())) + return nil, entErr + } + if strings.TrimSpace(req.OrderNo) == "" { l.Errorw("参数错误,orderNo 不能为空") return nil, errors.Wrapf(xerr.NewErrCode(xerr.InvalidParams), "order_no is required") @@ -219,8 +226,8 @@ func (l *AttachTransactionLogic) Attach(req *types.AttachAppleTransactionRequest orderSub, subErr := l.svcCtx.UserModel.FindOneSubscribeByToken(l.ctx, orderInfo.SubscribeToken) switch { case subErr == nil && orderSub != nil && orderSub.Id > 0: - if orderSub.UserId != u.Id { - l.Errorw("订单订阅与当前用户不匹配", logger.Field("orderNo", orderInfo.OrderNo), logger.Field("orderSubUserId", orderSub.UserId), logger.Field("userId", u.Id)) + if orderSub.UserId != u.Id && orderSub.UserId != entitlement.EffectiveUserID { + l.Errorw("订单订阅与当前用户不匹配", logger.Field("orderNo", orderInfo.OrderNo), logger.Field("orderSubUserId", orderSub.UserId), logger.Field("userId", u.Id), logger.Field("effectiveUserId", entitlement.EffectiveUserID)) return nil, errors.Wrapf(xerr.NewErrCode(xerr.InvalidAccess), "order subscribe owner mismatch") } orderLinkedSub = orderSub @@ -233,7 +240,7 @@ func (l *AttachTransactionLogic) Attach(req *types.AttachAppleTransactionRequest } var singleModeAnchorSub *user.Subscribe if !isNewPurchaseOrder && l.svcCtx.Config.Subscribe.SingleModel && orderLinkedSub == nil { - anchorSub, anchorErr := findSingleModeMergeTarget(l.ctx, l.svcCtx, u.Id, subscribeId) + anchorSub, anchorErr := findSingleModeMergeTarget(l.ctx, l.svcCtx, entitlement.EffectiveUserID, subscribeId) switch { case errors.Is(anchorErr, commonLogic.ErrSingleModePlanMismatch): l.Errorw("单订阅模式下 IAP 套餐不匹配", logger.Field("userId", u.Id), logger.Field("orderNo", req.OrderNo), logger.Field("iapSubscribeId", subscribeId)) @@ -385,7 +392,7 @@ func (l *AttachTransactionLogic) Attach(req *types.AttachAppleTransactionRequest } if !merged { userSub := user.Subscribe{ - UserId: u.Id, + UserId: entitlement.EffectiveUserID, SubscribeId: subscribeId, StartTime: time.Now(), ExpireTime: exp,