diff --git a/app/user/cmd/api/internal/logic/query/queryservicelogic.go b/app/user/cmd/api/internal/logic/query/queryservicelogic.go index bc34867..a3f9454 100644 --- a/app/user/cmd/api/internal/logic/query/queryservicelogic.go +++ b/app/user/cmd/api/internal/logic/query/queryservicelogic.go @@ -89,7 +89,7 @@ func (l *QueryServiceLogic) VerifyTwoFactors(Name string, IDCard string) error { Name: Name, IDCard: IDCard, } - verification, err := l.svcCtx.VerificationService.TwoFactorVerification(twoVerification) + verification, err := l.svcCtx.VerificationService.TwoFactorVerificationWest(l.ctx, twoVerification) if err != nil { return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "二要素验证失败: %+v", err) } diff --git a/app/user/cmd/api/internal/service/apirequestService.go b/app/user/cmd/api/internal/service/apirequestService.go index 19186c3..f72bc1a 100644 --- a/app/user/cmd/api/internal/service/apirequestService.go +++ b/app/user/cmd/api/internal/service/apirequestService.go @@ -188,51 +188,52 @@ func (a *ApiRequestService) ProcessRequests(ctx context.Context, params []byte, // ------------------------------------请求处理器-------------------------- var requestProcessors = map[string]func(*ApiRequestService, context.Context, []byte) (*APIInternalResult, error){ - "G09SC02": (*ApiRequestService).ProcessG09SC02Request, - "G27BJ05": (*ApiRequestService).ProcessG27BJ05Request, - "G26BJ05": (*ApiRequestService).ProcessG26BJ05Request, - "G34BJ03": (*ApiRequestService).ProcessG34BJ03Request, - "G35SC01": (*ApiRequestService).ProcessG35SC01Request, - "G28BJ05": (*ApiRequestService).ProcessG28BJ05Request, - "G05HZ01": (*ApiRequestService).ProcessG05HZ01Request, - "Q23SC01": (*ApiRequestService).ProcessQ23SC01Request, - "G15BJ02": (*ApiRequestService).ProcessG15BJ02Request, - "G17BJ02": (*ApiRequestService).ProcessG17BJ02Request, - "G08SC02": (*ApiRequestService).ProcessG08SC02Request, - "KZEYS": (*ApiRequestService).ProcessKZEYSRequest, - "P_C_B332": (*ApiRequestService).ProcessP_C_B332Request, - "FIN019": (*ApiRequestService).ProcessFIN019Request, - "G10SC02": (*ApiRequestService).ProcessG10SC02Request, - "G03HZ01": (*ApiRequestService).ProcessG03HZ01Request, - "G02BJ02": (*ApiRequestService).ProcessG02BJ02Request, - "G19BJ02": (*ApiRequestService).ProcessG19BJ02Request, - "G20GZ01": (*ApiRequestService).ProcessG20GZ01Request, - "CAR061": (*ApiRequestService).ProcessCAR061Request, // 名下车辆 - "CAR074": (*ApiRequestService).ProcessCAR074Request, // 车辆出险信息 - "CAR058": (*ApiRequestService).ProcessCAR058Request, // 车辆维保记录 - "CAR059": (*ApiRequestService).ProcessCAR059Request, // 车辆维保记录结果查询 - "CAR079": (*ApiRequestService).ProcessCAR079Request, // 车架号查车 - "CAR066": (*ApiRequestService).ProcessCAR066Request, // 车辆过户次数 - "CAR100": (*ApiRequestService).ProcessCAR100Request, // 车辆估值 - "G37SC01": (*ApiRequestService).ProcessG37SC01Request, - "G36SC01": (*ApiRequestService).ProcessG36SC01Request, - "G22SC01": (*ApiRequestService).ProcessG22SC01Request, - "Q03SC01": (*ApiRequestService).ProcessQ03SC01Request, - "COM187": (*ApiRequestService).ProcessCOM187Request, - "MOB035": (*ApiRequestService).ProcessMOB035Request, - "PCB915": (*ApiRequestService).ProcessPCB915Request, - "RIS031": (*ApiRequestService).ProcessRIS031Request, - "PCB601": (*ApiRequestService).ProcessPCB601Request, - "PCB148": (*ApiRequestService).ProcessPCB148Request, - "FIN011": (*ApiRequestService).ProcessFIN011Request, - "FIN020": (*ApiRequestService).ProcessFIN020Request, - "FIN018": (*ApiRequestService).ProcessFIN018Request, - "MOB032": (*ApiRequestService).ProcessMOB032Request, - "FIN032": (*ApiRequestService).ProcessFIN032Request, - "HRD004": (*ApiRequestService).ProcessHRD004Request, - "mobilelocal": (*ApiRequestService).ProcessMobilelocalRequest, // 手机归属地 - "sfz": (*ApiRequestService).ProcessSfzRequest, // 身份证归属地 - "IDV044": (*ApiRequestService).ProcessIDV044Request, + "G09SC02": (*ApiRequestService).ProcessG09SC02Request, + "G27BJ05": (*ApiRequestService).ProcessG27BJ05Request, + "G26BJ05": (*ApiRequestService).ProcessG26BJ05Request, + "G34BJ03": (*ApiRequestService).ProcessG34BJ03Request, + "G35SC01": (*ApiRequestService).ProcessG35SC01Request, + "G28BJ05": (*ApiRequestService).ProcessG28BJ05Request, + "G05HZ01": (*ApiRequestService).ProcessG05HZ01Request, + "Q23SC01": (*ApiRequestService).ProcessQ23SC01Request, + "G15BJ02": (*ApiRequestService).ProcessG15BJ02Request, + "G17BJ02": (*ApiRequestService).ProcessG17BJ02Request, + "G08SC02": (*ApiRequestService).ProcessG08SC02Request, + "KZEYS": (*ApiRequestService).ProcessKZEYSRequest, + "P_C_B332": (*ApiRequestService).ProcessP_C_B332Request, + "FIN019": (*ApiRequestService).ProcessFIN019Request, + "G10SC02": (*ApiRequestService).ProcessG10SC02Request, + "G03HZ01": (*ApiRequestService).ProcessG03HZ01Request, + "G02BJ02": (*ApiRequestService).ProcessG02BJ02Request, + "G19BJ02": (*ApiRequestService).ProcessG19BJ02Request, + "G20GZ01": (*ApiRequestService).ProcessG20GZ01Request, + "CAR061": (*ApiRequestService).ProcessCAR061Request, // 名下车辆 + "CAR074": (*ApiRequestService).ProcessCAR074Request, // 车辆出险信息 + "CAR058": (*ApiRequestService).ProcessCAR058Request, // 车辆维保记录 + "CAR059": (*ApiRequestService).ProcessCAR059Request, // 车辆维保记录结果查询 + "CAR079": (*ApiRequestService).ProcessCAR079Request, // 车架号查车 + "CAR066": (*ApiRequestService).ProcessCAR066Request, // 车辆过户次数 + "CAR100": (*ApiRequestService).ProcessCAR100Request, // 车辆估值 + "G37SC01": (*ApiRequestService).ProcessG37SC01Request, + "G36SC01": (*ApiRequestService).ProcessG36SC01Request, + "G22SC01": (*ApiRequestService).ProcessG22SC01Request, + "Q03SC01": (*ApiRequestService).ProcessQ03SC01Request, + "COM187": (*ApiRequestService).ProcessCOM187Request, + "MOB035": (*ApiRequestService).ProcessMOB035Request, + "PCB915": (*ApiRequestService).ProcessPCB915Request, + "RIS031": (*ApiRequestService).ProcessRIS031Request, + "PCB601": (*ApiRequestService).ProcessPCB601Request, + "PCB148": (*ApiRequestService).ProcessPCB148Request, + "FIN011": (*ApiRequestService).ProcessFIN011Request, + "FIN020": (*ApiRequestService).ProcessFIN020Request, + "FIN018": (*ApiRequestService).ProcessFIN018Request, + "MOB032": (*ApiRequestService).ProcessMOB032Request, + "FIN032": (*ApiRequestService).ProcessFIN032Request, + "HRD004": (*ApiRequestService).ProcessHRD004Request, + "mobilelocal": (*ApiRequestService).ProcessMobilelocalRequest, // 手机归属地 + "sfz": (*ApiRequestService).ProcessSfzRequest, // 身份证归属地 + "IDV044": (*ApiRequestService).ProcessIDV044Request, + "layoutIdcard": (*ApiRequestService).ProcessLayoutIdcardRequest, // New Feature "PersonEnterprisePro": (*ApiRequestService).ProcessPersonEnterpriseProRequest, @@ -1779,6 +1780,48 @@ func (a *ApiRequestService) ProcessIDV044Request(ctx context.Context, params []b }, nil } +// layoutIdcard 西部二要素 +func (a *ApiRequestService) ProcessLayoutIdcardRequest(ctx context.Context, params []byte) (*APIInternalResult, error) { + name := gjson.GetBytes(params, "name") + idCard := gjson.GetBytes(params, "id_card") + + if !name.Exists() || !idCard.Exists() { + return nil, errors.New("api请求, layoutIdcard, 获取相关参数失败") + } + + request := map[string]interface{}{ + "data": map[string]interface{}{ + "xM": a.westDexService.Encrypt(name.String()), + "gMSFZHM": a.westDexService.Encrypt(idCard.String()), + "customerNumber": a.config.WestConfig.SecretId, + "timeStamp": fmt.Sprintf("%d", time.Now().UnixNano()/int64(time.Millisecond)), + }, + } + resp, callApiErr := a.westDexService.CallAPI("layoutIdcard", request) + if callApiErr != nil { + return nil, callApiErr + } + // 使用gjson获取resultCode + resultCode := gjson.GetBytes(resp, "ctidRequest.ctidAuth.resultCode") + if !resultCode.Exists() { + return nil, errors.New("获取resultCode失败") + } + + // 获取resultCode的第一个字符 + resultCodeStr := resultCode.String() + if len(resultCodeStr) == 0 { + return nil, errors.New("resultCode为空") + } + + firstChar := string(resultCodeStr[0]) + if firstChar != "0" && firstChar != "5" { + return nil, errors.New("resultCode的第一个字符既不是0也不是5") + } + return &APIInternalResult{ + Data: []byte(firstChar), + }, nil +} + // PersonEnterprisePro 人企业关系加强版 func (a *ApiRequestService) ProcessPersonEnterpriseProRequest(ctx context.Context, params []byte) (*APIInternalResult, error) { idCard := gjson.GetBytes(params, "id_card") diff --git a/app/user/cmd/api/internal/service/verificationService.go b/app/user/cmd/api/internal/service/verificationService.go index 005da81..a439a70 100644 --- a/app/user/cmd/api/internal/service/verificationService.go +++ b/app/user/cmd/api/internal/service/verificationService.go @@ -1,6 +1,7 @@ package service import ( + "context" "encoding/json" "fmt" "io" @@ -14,14 +15,16 @@ import ( ) type VerificationService struct { - c config.Config - westDexService *WestDexService + c config.Config + westDexService *WestDexService + apiRequestService *ApiRequestService } -func NewVerificationService(c config.Config, westDexService *WestDexService) *VerificationService { +func NewVerificationService(c config.Config, westDexService *WestDexService, apiRequestService *ApiRequestService) *VerificationService { return &VerificationService{ - c: c, - westDexService: westDexService, + c: c, + westDexService: westDexService, + apiRequestService: apiRequestService, } } @@ -127,6 +130,31 @@ func (r *VerificationService) TwoFactorVerification(request TwoFactorVerificatio 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 { diff --git a/app/user/cmd/api/internal/service/westdexService.go b/app/user/cmd/api/internal/service/westdexService.go index 6349048..ae5298d 100644 --- a/app/user/cmd/api/internal/service/westdexService.go +++ b/app/user/cmd/api/internal/service/westdexService.go @@ -91,7 +91,7 @@ func (w *WestDexService) CallAPI(code string, reqData map[string]interface{}) (r if UnmarshalErr != nil { return nil, UnmarshalErr } - if westDexResp.Code != "00000" { + if westDexResp.Code != "00000" && westDexResp.Code != "0" { if westDexResp.Data == "" { return nil, errors.New(westDexResp.Message) } diff --git a/app/user/cmd/api/internal/svc/servicecontext.go b/app/user/cmd/api/internal/svc/servicecontext.go index 23fb258..42d659c 100644 --- a/app/user/cmd/api/internal/svc/servicecontext.go +++ b/app/user/cmd/api/internal/svc/servicecontext.go @@ -63,6 +63,8 @@ func NewServiceContext(c config.Config) *ServiceContext { productFeatureModel := model.NewProductFeatureModel(db, c.CacheRedis) featureModel := model.NewFeatureModel(db, c.CacheRedis) userAuthModel := model.NewUserAuthModel(db, c.CacheRedis) + apiRequestService := service.NewApiRequestService(c, westDexService, yushanService, tianjuService, featureModel, productFeatureModel) + return &ServiceContext{ Config: c, Redis: redis.MustNewRedis(redisConf), @@ -73,9 +75,9 @@ func NewServiceContext(c config.Config) *ServiceContext { WestDexService: westDexService, YushanService: yushanService, TianjuService: tianjuService, - VerificationService: service.NewVerificationService(c, westDexService), + VerificationService: service.NewVerificationService(c, westDexService, apiRequestService), AsynqServer: asynqServer, - ApiRequestService: service.NewApiRequestService(c, westDexService, yushanService, tianjuService, featureModel, productFeatureModel), + ApiRequestService: apiRequestService, AsynqService: service.NewAsynqService(c), UserModel: model.NewUserModel(db, c.CacheRedis), UserAuthModel: userAuthModel,