package service import ( "context" "encoding/json" "fmt" "io" "net/http" "net/url" "strings" "tyc-server/app/main/api/internal/config" "tyc-server/pkg/lzkit/crypto" "github.com/tidwall/gjson" ) type VerificationService struct { c config.Config westDexService *WestDexService apiRequestService *ApiRequestService } func NewVerificationService(c config.Config, westDexService *WestDexService, apiRequestService *ApiRequestService) *VerificationService { return &VerificationService{ c: c, westDexService: westDexService, 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(ctx context.Context, request TwoFactorVerificationRequest) (*VerificationResult, error) { params := map[string]interface{}{ "name": request.Name, "id_card": request.IDCard, } marshal, err := json.Marshal(params) if err != nil { return nil, fmt.Errorf("二要素参数创建错误: %v", err) } resp, err := r.apiRequestService.ProcessLayoutIdcardRequest(ctx, marshal) if err != nil { return nil, fmt.Errorf("请求失败: %v", err) } respStr := string(resp.Data) if respStr != "0" { return &VerificationResult{ Passed: false, Err: &ValidationError{Message: "姓名与身份证不一致"}, }, nil } return &VerificationResult{Passed: true, Err: nil}, nil } func (r *VerificationService) ThreeFactorVerification(request ThreeFactorVerificationRequest) (*VerificationResult, error) { westName, err := crypto.WestDexEncrypt(request.Name, r.c.WestConfig.Key) if err != nil { return nil, err } westIDCard, err := crypto.WestDexEncrypt(request.IDCard, r.c.WestConfig.Key) if err != nil { return nil, err } westPhone, err := crypto.WestDexEncrypt(request.Mobile, r.c.WestConfig.Key) if err != nil { return nil, err } threeElementsReq := map[string]interface{}{ "data": map[string]interface{}{ "name": westName, "idNo": westIDCard, "phone": westPhone, }, } resp, err := r.westDexService.CallAPI("G15BJ02", threeElementsReq) if err != nil { return nil, err } dataResult := gjson.GetBytes(resp, "data.code") if !dataResult.Exists() { return nil, fmt.Errorf("code 字段不存在") } code := dataResult.Int() switch code { case 1000: case 1002: return &VerificationResult{ Passed: false, Err: &ValidationError{Message: "姓名、证件号、手机号信息不一致"}, }, nil case 1003: return &VerificationResult{ Passed: false, Err: &ValidationError{Message: "姓名、证件号、手机号信息不一致"}, }, nil case 1004: return &VerificationResult{ Passed: false, Err: &ValidationError{Message: "姓名不正确"}, }, nil case 1005: return &VerificationResult{ Passed: false, Err: &ValidationError{Message: "证件号码不正确"}, }, nil default: dataResultMsg := gjson.GetBytes(resp, "data.msg") if !dataResultMsg.Exists() { return nil, fmt.Errorf("msg字段不存在") } return nil, fmt.Errorf("三要素核验错误状态响应: %s", dataResultMsg.String()) } return &VerificationResult{Passed: true, Err: nil}, nil }