From b6405c8f28027e3ad6f3c249966eddf5bb28519c Mon Sep 17 00:00:00 2001 From: shanshanzhong Date: Thu, 12 Mar 2026 04:56:17 -0700 Subject: [PATCH] =?UTF-8?q?fix:=20IAP=20attach=20=E5=90=8E=E7=AB=8B?= =?UTF-8?q?=E5=8D=B3=E6=B8=85=E9=99=A4=E8=AE=A2=E9=98=85=E7=BC=93=E5=AD=98?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8D=20App=20=E6=9F=A5=E5=88=B0=E6=97=A7?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=EF=BC=9B=E8=BF=94=E5=9B=9E=E5=80=BC=E6=94=B9?= =?UTF-8?q?=E7=94=A8=E7=B4=AF=E8=AE=A1=E5=88=B0=E6=9C=9F=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: claude-flow --- .../iap/apple/attachTransactionLogic.go | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/internal/logic/public/iap/apple/attachTransactionLogic.go b/internal/logic/public/iap/apple/attachTransactionLogic.go index 5ab445f..bfecea6 100644 --- a/internal/logic/public/iap/apple/attachTransactionLogic.go +++ b/internal/logic/public/iap/apple/attachTransactionLogic.go @@ -427,9 +427,37 @@ func (l *AttachTransactionLogic) Attach(req *types.AttachAppleTransactionRequest return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseInsertError), "insert error: %v", err.Error()) } l.sendIAPAttachTraceToTelegram("SUCCESS_COMMIT", orderInfo, u.Id, subscribeId, tier, duration, txPayload.PurchaseDate, txPayload.TransactionId, txPayload.OriginalTransactionId, "") - l.Infow("绑定完成", logger.Field("userId", u.Id), logger.Field("tier", tier), logger.Field("expiresAt", exp.Unix())) + + // 事务提交后立即清除订阅缓存,避免 App 查到旧数据(激活队列异步执行,存在竞态) + if orderLinkedSub != nil { + _ = l.svcCtx.UserModel.ClearSubscribeCache(l.ctx, orderLinkedSub) + } else if singleModeAnchorSub != nil { + _ = l.svcCtx.UserModel.ClearSubscribeCache(l.ctx, singleModeAnchorSub) + } + + // merged 路径下,exp 仅从购买日算起,需要用已有订阅到期时间 + duration 作为预估值返回前端 + responseExpire := exp + var mergeSub *user.Subscribe + if orderLinkedSub != nil { + mergeSub = orderLinkedSub + } else if singleModeAnchorSub != nil { + mergeSub = singleModeAnchorSub + } + if mergeSub != nil { + base := mergeSub.ExpireTime + now := time.Now() + if base.Before(now) { + base = now + } + estimated := base.AddDate(0, 0, int(duration)) + if estimated.After(responseExpire) { + responseExpire = estimated + } + } + + l.Infow("绑定完成", logger.Field("userId", u.Id), logger.Field("tier", tier), logger.Field("expiresAt", responseExpire.Unix())) return &types.AttachAppleTransactionResponse{ - ExpiresAt: exp.Unix(), + ExpiresAt: responseExpire.Unix(), Tier: tier, }, nil }