fix: IAP 支付流程优化与关键 bug 修复
Build docker and publish / build (20.15.1) (push) Successful in 7m42s

- getStatusLogic 类型断言修复(*user.User)
- restoreLogic 事务拆分为单条处理 + appAccountToken 解析
- attachTransactionLogic 提取 ParseProductIdDuration 共享函数
- 新增 config_helper.go 统一 Apple API 配置加载
- reconcileLogic 补充 BundleID 配置读取
- activateOrderLogic 邀请赠送天数逻辑完善

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
2026-03-09 00:27:16 -07:00
parent dcfcd036de
commit 130fb702ab
9 changed files with 358 additions and 249 deletions
+43
View File
@@ -2,6 +2,8 @@ package apple
import (
"encoding/json"
"strconv"
"strings"
"time"
)
@@ -37,3 +39,44 @@ func CalcExpire(start time.Time, days int64) time.Time {
}
return start.Add(time.Duration(days) * 24 * time.Hour)
}
// ParsedProduct holds the result of parsing an Apple product ID.
type ParsedProduct struct {
Unit string // "Day", "Month", "Year"
Quantity int64
}
// ParseProductIdDuration extracts time unit and quantity from Apple product IDs.
// e.g. "com.app.vip.day30" -> {Unit: "Day", Quantity: 30}
func ParseProductIdDuration(productId string) *ParsedProduct {
pid := strings.ToLower(productId)
parts := strings.Split(pid, ".")
for i := len(parts) - 1; i >= 0; i-- {
p := parts[i]
var unit string
switch {
case strings.HasPrefix(p, "day"):
unit = "Day"
p = p[len("day"):]
case strings.HasPrefix(p, "month"):
unit = "Month"
p = p[len("month"):]
case strings.HasPrefix(p, "year"):
unit = "Year"
p = p[len("year"):]
default:
continue
}
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 {
return &ParsedProduct{Unit: unit, Quantity: q}
}
}
return nil
}