package service import ( "encoding/json" "fmt" "io" "net/http" "net/url" "strings" "znc-server/app/main/api/internal/config" tianyuanapi "znc-server/app/main/api/internal/service/tianyuanapi_sdk" "github.com/tidwall/gjson" ) type VerificationService struct { c config.Config tianyuanapi *tianyuanapi.Client apiRequestService *ApiRequestService } func NewVerificationService(c config.Config, tianyuanapi *tianyuanapi.Client, apiRequestService *ApiRequestService) *VerificationService { return &VerificationService{ c: c, tianyuanapi: tianyuanapi, apiRequestService: apiRequestService, } } // 二要素 type TwoFactorVerificationRequest struct { Name string IDCard string } type TwoFactorVerificationResp struct { Msg string `json:"msg"` Success bool `json:"success"` Code int `json:"code"` Data *TwoFactorVerificationData `json:"data"` // } type TwoFactorVerificationData struct { Birthday string `json:"birthday"` Result int `json:"result"` Address string `json:"address"` OrderNo string `json:"orderNo"` Sex string `json:"sex"` Desc string `json:"desc"` } // 三要素 type ThreeFactorVerificationRequest struct { Name string IDCard string Mobile string } // VerificationResult 定义校验结果结构体 type VerificationResult struct { Passed bool Err error } // ValidationError 定义校验错误类型 type ValidationError struct { Message string } func (e *ValidationError) Error() string { return e.Message } func (r *VerificationService) TwoFactorVerification(request TwoFactorVerificationRequest) (*VerificationResult, error) { appCode := r.c.Ali.Code requestUrl := "https://kzidcardv1.market.alicloudapi.com/api-mall/api/id_card/check" // 构造查询参数 data := url.Values{} data.Add("name", request.Name) data.Add("idcard", request.IDCard) req, err := http.NewRequest(http.MethodPost, requestUrl, strings.NewReader(data.Encode())) if err != nil { return nil, fmt.Errorf("创建请求失败: %v", err) } req.Header.Set("Authorization", "APPCODE "+appCode) req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") client := &http.Client{} resp, err := client.Do(req) if err != nil { return nil, fmt.Errorf("请求失败: %v", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("请求失败, 状态码: %d", resp.StatusCode) } respBody, err := io.ReadAll(resp.Body) if err != nil { return nil, fmt.Errorf("响应体读取失败:%v", err) } var twoFactorVerificationResp TwoFactorVerificationResp err = json.Unmarshal(respBody, &twoFactorVerificationResp) if err != nil { return nil, fmt.Errorf("二要素解析错误: %v", err) } if !twoFactorVerificationResp.Success { return &VerificationResult{ Passed: false, Err: &ValidationError{Message: "请输入有效的身份证号码"}, }, nil } if twoFactorVerificationResp.Code != 200 { return &VerificationResult{ Passed: false, Err: &ValidationError{Message: twoFactorVerificationResp.Msg}, }, nil } if twoFactorVerificationResp.Data.Result == 1 { return &VerificationResult{ Passed: false, Err: &ValidationError{Message: "姓名与身份证不一致"}, }, nil } return &VerificationResult{Passed: true, Err: nil}, nil } func (r *VerificationService) TwoFactorVerificationWest(request TwoFactorVerificationRequest) (*VerificationResult, error) { resp, err := r.tianyuanapi.CallInterface("YYSYBE08", map[string]interface{}{ "name": request.Name, "id_card": request.IDCard, }) if err != nil { return nil, fmt.Errorf("请求失败: %v", err) } respBytes, err := json.Marshal(resp.Data) if err != nil { return nil, fmt.Errorf("转换响应失败: %v", err) } // 使用gjson获取resultCode resultCode := gjson.GetBytes(respBytes, "ctidRequest.ctidAuth.resultCode") if !resultCode.Exists() { return &VerificationResult{ Passed: false, Err: &ValidationError{Message: "获取resultCode失败"}, }, nil } // 获取resultCode的第一个字符 resultCodeStr := resultCode.String() if len(resultCodeStr) == 0 { return &VerificationResult{ Passed: false, Err: &ValidationError{Message: "resultCode为空"}, }, nil } firstChar := string(resultCodeStr[0]) if firstChar != "0" && firstChar != "5" { return &VerificationResult{ Passed: false, Err: &ValidationError{Message: "姓名与身份证不一致"}, }, nil } return &VerificationResult{Passed: true, Err: nil}, nil } func (r *VerificationService) ThreeFactorVerification(request ThreeFactorVerificationRequest) (*VerificationResult, error) { resp, err := r.tianyuanapi.CallInterface("YYSY09CD", map[string]interface{}{ "name": request.Name, "id_card": request.IDCard, "mobile_no": request.Mobile, }) if err != nil { return nil, fmt.Errorf("请求失败: %v", err) } respBytes, err := json.Marshal(resp.Data) if err != nil { return nil, fmt.Errorf("转换响应失败: %v", err) } // 使用gjson获取resultCode resultCode := gjson.GetBytes(respBytes, "ctidRequest.ctidAuth.resultCode") if !resultCode.Exists() { return &VerificationResult{ Passed: false, Err: &ValidationError{Message: "身份信息异常"}, }, nil } // 获取resultCode的第一个字符 resultCodeStr := resultCode.String() if len(resultCodeStr) == 0 { return &VerificationResult{ Passed: false, Err: &ValidationError{Message: "身份信息异常"}, }, nil } firstChar := string(resultCodeStr[0]) if firstChar != "0" && firstChar != "5" { return &VerificationResult{ Passed: false, Err: &ValidationError{Message: "姓名、证件号、手机号信息不一致"}, }, nil } return &VerificationResult{Passed: true, Err: nil}, nil }