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 }