fix: Apple IAP attach 支持家庭成员购买场景
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m15s
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m15s
member 发起购买后订阅归属于 owner,但 attach 交易时校验 orderSub.UserId != u.Id 报"订单订阅与当前用户不匹配"。 现在通过 ResolveEntitlementUser 获取 EffectiveUserID, 允许 member 绑定属于其家庭 owner 的订阅。 Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
parent
2f33e1e680
commit
add27aa4d9
@ -59,6 +59,13 @@ func (l *AttachTransactionLogic) Attach(req *types.AttachAppleTransactionRequest
|
|||||||
l.Errorw("无效访问,用户信息缺失")
|
l.Errorw("无效访问,用户信息缺失")
|
||||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.InvalidAccess), "invalid access")
|
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) == "" {
|
if strings.TrimSpace(req.OrderNo) == "" {
|
||||||
l.Errorw("参数错误,orderNo 不能为空")
|
l.Errorw("参数错误,orderNo 不能为空")
|
||||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.InvalidParams), "order_no is required")
|
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)
|
orderSub, subErr := l.svcCtx.UserModel.FindOneSubscribeByToken(l.ctx, orderInfo.SubscribeToken)
|
||||||
switch {
|
switch {
|
||||||
case subErr == nil && orderSub != nil && orderSub.Id > 0:
|
case subErr == nil && orderSub != nil && orderSub.Id > 0:
|
||||||
if orderSub.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))
|
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")
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.InvalidAccess), "order subscribe owner mismatch")
|
||||||
}
|
}
|
||||||
orderLinkedSub = orderSub
|
orderLinkedSub = orderSub
|
||||||
@ -233,7 +240,7 @@ func (l *AttachTransactionLogic) Attach(req *types.AttachAppleTransactionRequest
|
|||||||
}
|
}
|
||||||
var singleModeAnchorSub *user.Subscribe
|
var singleModeAnchorSub *user.Subscribe
|
||||||
if !isNewPurchaseOrder && l.svcCtx.Config.Subscribe.SingleModel && orderLinkedSub == nil {
|
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 {
|
switch {
|
||||||
case errors.Is(anchorErr, commonLogic.ErrSingleModePlanMismatch):
|
case errors.Is(anchorErr, commonLogic.ErrSingleModePlanMismatch):
|
||||||
l.Errorw("单订阅模式下 IAP 套餐不匹配", logger.Field("userId", u.Id), logger.Field("orderNo", req.OrderNo), logger.Field("iapSubscribeId", subscribeId))
|
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 {
|
if !merged {
|
||||||
userSub := user.Subscribe{
|
userSub := user.Subscribe{
|
||||||
UserId: u.Id,
|
UserId: entitlement.EffectiveUserID,
|
||||||
SubscribeId: subscribeId,
|
SubscribeId: subscribeId,
|
||||||
StartTime: time.Now(),
|
StartTime: time.Now(),
|
||||||
ExpireTime: exp,
|
ExpireTime: exp,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user