Compare commits

..

No commits in common. "2fdc9c812749bbb23010adeadf989677300f30e2" and "5d7ca4b9bdc2e51f60a2e4fc8e30a8c141c6ae38" have entirely different histories.

View File

@ -58,41 +58,21 @@ func (l *AttachTransactionLogic) Attach(req *types.AttachAppleTransactionRequest
existTx, _ = iapmodel.NewModel(l.svcCtx.DB, l.svcCtx.Redis).FindByOriginalId(l.ctx, txPayload.OriginalTransactionId)
l.Infow("幂等等检查", logger.Field("originalTransactionId", txPayload.OriginalTransactionId), logger.Field("exists", existTx != nil && existTx.Id > 0))
// 解析 Apple 商品ID中的单位与数量支持 dayN / monthN / yearN
var parsedUnit string
// 从 Apple 商品ID中解析购买数量天数形如 com.hifastvpn.plan.day7 -> 7
var parsedQuantity int64
{
pid := strings.ToLower(txPayload.ProductId)
parts := strings.Split(pid, ".")
for i := len(parts) - 1; i >= 0; i-- {
p := parts[i]
if strings.HasPrefix(p, "day") || strings.HasPrefix(p, "month") || strings.HasPrefix(p, "year") {
switch {
case strings.HasPrefix(p, "day"):
parsedUnit = "Day"
p = p[len("day"):]
case strings.HasPrefix(p, "month"):
parsedUnit = "Month"
p = p[len("month"):]
case strings.HasPrefix(p, "year"):
parsedUnit = "Year"
p = p[len("year"):]
}
digits := p
for j := 0; j < len(digits); j++ {
if digits[j] < '0' || digits[j] > '9' {
digits = digits[:j]
break
}
}
if q, e := strconv.ParseInt(digits, 10, 64); e == nil && q > 0 {
parsedQuantity = q
break
}
if idx := strings.Index(strings.ToLower(txPayload.ProductId), "day"); idx >= 0 {
sub := txPayload.ProductId[idx+3:]
for i := 0; i < len(sub); i++ {
if sub[i] < '0' || sub[i] > '9' {
sub = sub[:i]
break
}
}
if q, e := strconv.ParseInt(sub, 10, 64); e == nil && q > 0 {
parsedQuantity = q
}
}
l.Infow("商品映射解析", logger.Field("productId", txPayload.ProductId), logger.Field("解析单位", parsedUnit), logger.Field("解析数量", parsedQuantity))
l.Infow("商品映射解析", logger.Field("productId", txPayload.ProductId), logger.Field("解析数量", parsedQuantity))
// 基于订阅列表的折扣配置做匹配UnitTime=Day 且 Discount.quantity == parsedQuantity
var duration int64
@ -108,7 +88,7 @@ func (l *AttachTransactionLogic) Attach(req *types.AttachAppleTransactionRequest
})
if e == nil && len(subs) > 0 {
for _, item := range subs {
if parsedUnit != "" && !strings.EqualFold(item.UnitTime, parsedUnit) {
if !strings.EqualFold(item.UnitTime, "Day") {
continue
}
var discounts []types.SubscribeDiscount
@ -117,16 +97,7 @@ func (l *AttachTransactionLogic) Attach(req *types.AttachAppleTransactionRequest
}
for _, d := range discounts {
if int64(d.Quantity) == parsedQuantity {
switch parsedUnit {
case "Day":
duration = parsedQuantity
case "Month":
duration = parsedQuantity * 30
case "Year":
duration = parsedQuantity * 365
default:
duration = parsedQuantity
}
duration = parsedQuantity
subscribeId = item.Id
tier = item.Name
l.Infow("订阅映射命中", logger.Field("subscribeId", subscribeId), logger.Field("name", tier), logger.Field("durationDays", duration))