fix: 修复收入统计 404,并隔离支付测试/生产配置

Dashboard 收入接口路径对齐;登录页去掉「授权管理平台」;Waffo 测试/生产密钥与 Product 映射分环境保存。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Logan.LiandCursor committed 2026-08-12 22:37:22 +08:00
1 parent 76bba729f1
commit 9b79eabd34
9 files changed
+391 -80

No files matched your search

@@ -0,0 +1,132 @@
package payment
import (
"encoding/json"
"strings"
)
// WaffoEnvProfile 单环境下的 Product 映射(测试/生产隔离) // Logan.Li
type WaffoEnvProfile struct {
ProductID string `json:"product_id,omitempty"`
ProductIDYearly string `json:"product_id_yearly,omitempty"`
ProductIDPerpetual string `json:"product_id_perpetual,omitempty"`
ProductIDs map[string]string `json:"product_ids,omitempty"`
ProductMappings []WaffoProductMapping `json:"product_mappings,omitempty"`
}
// WaffoSecretBag 测试/生产私钥分存(写入 SecretKey 字段的 JSON) // Logan.Li
type WaffoSecretBag struct {
Test string `json:"test,omitempty"`
Live string `json:"live,omitempty"`
}
// NormalizeWaffoEnvironment 归一化环境名 // Logan.Li
func NormalizeWaffoEnvironment(env string) string {
switch strings.ToLower(strings.TrimSpace(env)) {
case "live", "prod", "production":
return "live"
default:
return "test"
}
}
// ParseWaffoSecretBag 解析 SecretKey:JSON 双钥或旧版单 PEM // Logan.Li
func ParseWaffoSecretBag(raw, fallbackEnv string) WaffoSecretBag {
raw = strings.TrimSpace(raw)
if raw == "" {
return WaffoSecretBag{}
}
if strings.HasPrefix(raw, "{") {
var bag WaffoSecretBag
if err := json.Unmarshal([]byte(raw), &bag); err == nil {
return bag
}
}
env := NormalizeWaffoEnvironment(fallbackEnv)
if env == "live" {
return WaffoSecretBag{Live: raw}
}
return WaffoSecretBag{Test: raw}
}
// EncodeWaffoSecretBag 序列化双环境私钥 // Logan.Li
func EncodeWaffoSecretBag(bag WaffoSecretBag) (string, error) {
bag.Test = strings.TrimSpace(bag.Test)
bag.Live = strings.TrimSpace(bag.Live)
b, err := json.Marshal(bag)
if err != nil {
return "", err
}
return string(b), nil
}
// SecretForEnv 取指定环境私钥 // Logan.Li
func (b WaffoSecretBag) SecretForEnv(env string) string {
if NormalizeWaffoEnvironment(env) == "live" {
return strings.TrimSpace(b.Live)
}
return strings.TrimSpace(b.Test)
}
// SetSecretForEnv 写入指定环境私钥 // Logan.Li
func (b *WaffoSecretBag) SetSecretForEnv(env, secret string) {
secret = strings.TrimSpace(secret)
if NormalizeWaffoEnvironment(env) == "live" {
b.Live = secret
return
}
b.Test = secret
}
// ClearSecretForEnv 清除指定环境私钥 // Logan.Li
func (b *WaffoSecretBag) ClearSecretForEnv(env string) {
b.SetSecretForEnv(env, "")
}
// ApplyEnvProfile 将当前环境的 Profile 叠到顶层字段供运行时使用 // Logan.Li
func (m *WaffoPublicMeta) ApplyEnvProfile(env string) {
if m == nil {
return
}
env = NormalizeWaffoEnvironment(env)
if m.EnvProfiles == nil {
return
}
p, ok := m.EnvProfiles[env]
if !ok {
return
}
if len(p.ProductMappings) > 0 {
m.ProductMappings = p.ProductMappings
}
if len(p.ProductIDs) > 0 {
m.ProductIDs = p.ProductIDs
}
if p.ProductID != "" {
m.ProductID = p.ProductID
}
if p.ProductIDYearly != "" {
m.ProductIDYearly = p.ProductIDYearly
}
if p.ProductIDPerpetual != "" {
m.ProductIDPerpetual = p.ProductIDPerpetual
}
}
// CaptureEnvProfile 把顶层映射写入指定环境 Profile // Logan.Li
func (m *WaffoPublicMeta) CaptureEnvProfile(env string) {
if m == nil {
return
}
env = NormalizeWaffoEnvironment(env)
if m.EnvProfiles == nil {
m.EnvProfiles = map[string]WaffoEnvProfile{}
}
m.EnvProfiles[env] = WaffoEnvProfile{
ProductID: m.ProductID,
ProductIDYearly: m.ProductIDYearly,
ProductIDPerpetual: m.ProductIDPerpetual,
ProductIDs: m.ProductIDs,
ProductMappings: m.ProductMappings,
}
}