Files
junhong_cmp_fiber/internal/infrastructure/carriercallback/cmcc_realname.go
break 5c4d17e9fc
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
收口七月卡状态回调与系列授权兼容契约
完成运营商实名回调、业务事件观测序列与受控配置装配,同时恢复 UR43 已交付的 packages[].remove 字段及旧响应兼容,统一更新 OpenSpec、OpenAPI 和交付文档。

Constraint: 七月测试环境里程碑不新增或运行自动化测试

Rejected: 以必填 operation_type 替换 packages[].remove | 会破坏已交付前端契约

Confidence: high

Scope-risk: broad

Directive: 后续修改系列套餐管理接口必须保持 packages[].remove 和 ShopSeriesGrantResponse 兼容

Tested: go run ./cmd/gendocs;go build -buildvcs=false ./...;openspec validate complete-july-iteration-test-release --strict;git diff --check

Not-tested: 按本 Change 约定未运行 go test,真实运营商与 Gateway 联调延期
2026-07-24 19:59:24 +08:00

68 lines
2.2 KiB
Go

package carriercallback
import (
"bytes"
"strings"
"github.com/bytedance/sonic"
"gorm.io/gorm"
"github.com/break/junhong_cmp_fiber/pkg/errors"
pkgvalidator "github.com/break/junhong_cmp_fiber/pkg/validator"
)
// CMCCRealnameTranslation 是移动实名 JSON 回调的受控语义。
type CMCCRealnameTranslation struct {
ICCID string
BusiSeq string
}
// CMCCRealnameTranslator 解析移动实名成功回调的固定 JSON 结构。
type CMCCRealnameTranslator struct{}
// CMCCCardResolver 复用系统级 ICCID 精确查询约束。
type CMCCCardResolver = CTCCCardResolver
// NewCMCCCardResolver 创建移动回调卡定位器。
func NewCMCCCardResolver(db *gorm.DB) *CMCCCardResolver {
return NewCTCCCardResolver(db)
}
// NewCMCCRealnameTranslator 创建移动实名回调 Translator。
func NewCMCCRealnameTranslator() *CMCCRealnameTranslator {
return &CMCCRealnameTranslator{}
}
type cmccRealnamePayload struct {
Status string `json:"status"`
Message string `json:"message"`
Result []struct {
RegStatus string `json:"regStatus"`
BusiSeq string `json:"busiSeq"`
ICCID string `json:"iccid"`
} `json:"result"`
}
// Translate 只接受 status=0、message=正确、首条结果实名成功且 ICCID 合法。
func (t *CMCCRealnameTranslator) Translate(body []byte) (CMCCRealnameTranslation, error) {
var result CMCCRealnameTranslation
if len(bytes.TrimSpace(body)) == 0 {
return result, errors.New(errors.CodeInvalidParam, "移动实名回调报文为空")
}
var payload cmccRealnamePayload
if err := sonic.Unmarshal(body, &payload); err != nil {
return result, errors.Wrap(errors.CodeInvalidParam, err, "移动实名回调 JSON 解析失败")
}
if len(payload.Result) > 0 {
result.BusiSeq = strings.TrimSpace(payload.Result[0].BusiSeq)
result.ICCID = strings.TrimSpace(payload.Result[0].ICCID)
}
if payload.Status != "0" || payload.Message != "正确" || len(payload.Result) == 0 || payload.Result[0].RegStatus != "00000" {
return result, errors.New(errors.CodeInvalidParam, "移动实名回调业务结果无效")
}
if validation := pkgvalidator.ValidateICCIDWithoutCarrier(result.ICCID); !validation.Valid {
return result, errors.New(errors.CodeInvalidParam, "移动实名回调 ICCID 无效")
}
return result, nil
}