package service import ( "context" "encoding/json" "errors" "fmt" "io" "net/http" "net/url" "qnc-server/app/main/api/internal/config" "qnc-server/app/main/model" "qnc-server/pkg/lzkit/crypto" "qnc-server/pkg/lzkit/lzUtils" "sort" "strings" "sync" "sync/atomic" "time" "github.com/Masterminds/squirrel" "github.com/bytedance/sonic" "github.com/tidwall/gjson" "github.com/zeromicro/go-zero/core/logx" ) type ApiRequestService struct { config config.Config westDexService *WestDexService yushanService *YushanService featureModel model.FeatureModel productFeatureModel model.ProductFeatureModel } // NewApiRequestService 是一个构造函数,用于初始化 ApiRequestService func NewApiRequestService(c config.Config, westDexService *WestDexService, yushanService *YushanService, featureModel model.FeatureModel, productFeatureModel model.ProductFeatureModel) *ApiRequestService { return &ApiRequestService{ config: c, featureModel: featureModel, productFeatureModel: productFeatureModel, westDexService: westDexService, yushanService: yushanService, } } type APIResponseData struct { ApiID string `json:"apiID"` Data json.RawMessage `json:"data"` // 这里用 RawMessage 来存储原始的 data Success bool `json:"success"` Timestamp string `json:"timestamp"` Error string `json:"error,omitempty"` } // ProcessRequests 处理请求 func (a *ApiRequestService) ProcessRequests(params []byte, productID int64) ([]byte, error) { var ctx, cancel = context.WithCancel(context.Background()) defer cancel() build := a.productFeatureModel.SelectBuilder().Where(squirrel.Eq{ "product_id": productID, }) productFeatureList, findProductFeatureErr := a.productFeatureModel.FindAll(ctx, build, "") if findProductFeatureErr != nil { return nil, findProductFeatureErr } var featureIDs []int64 isImportantMap := make(map[int64]int64, len(productFeatureList)) for _, pf := range productFeatureList { featureIDs = append(featureIDs, pf.FeatureId) isImportantMap[pf.FeatureId] = pf.IsImportant } if len(featureIDs) == 0 { return nil, errors.New("featureIDs 是空的") } builder := a.featureModel.SelectBuilder().Where(squirrel.Eq{"id": featureIDs}) featureList, findFeatureErr := a.featureModel.FindAll(ctx, builder, "") if findFeatureErr != nil { return nil, findFeatureErr } if len(featureList) == 0 { return nil, errors.New("处理请求错误,产品无对应接口功能") } var ( wg sync.WaitGroup resultsCh = make(chan APIResponseData, len(featureList)) errorsCh = make(chan error, len(featureList)) errorCount int32 errorLimit = len(featureList) retryNum = 5 ) for i, feature := range featureList { wg.Add(1) go func(i int, feature *model.Feature) { defer wg.Done() select { case <-ctx.Done(): return default: } result := APIResponseData{ ApiID: feature.ApiId, Success: false, } timestamp := time.Now().Format("2006-01-02 15:04:05") var ( resp json.RawMessage preprocessErr error ) // 若 isImportantMap[feature.ID] == 1,则表示需要在出错时重试 isImportant := isImportantMap[feature.Id] == 1 tryCount := 0 for { tryCount++ resp, preprocessErr = a.PreprocessRequestApi(params, feature.ApiId) if preprocessErr == nil { break } if isImportant && tryCount < retryNum { continue } else { break } } if preprocessErr != nil { result.Timestamp = timestamp result.Error = preprocessErr.Error() result.Data = resp resultsCh <- result errorsCh <- fmt.Errorf("请求失败: %v", preprocessErr) atomic.AddInt32(&errorCount, 1) if atomic.LoadInt32(&errorCount) >= int32(errorLimit) { cancel() } return } result.Data = resp result.Success = true result.Timestamp = timestamp resultsCh <- result }(i, feature) } go func() { wg.Wait() close(resultsCh) close(errorsCh) }() // 收集所有结果并合并z var responseData []APIResponseData for result := range resultsCh { responseData = append(responseData, result) } if atomic.LoadInt32(&errorCount) >= int32(errorLimit) { var allErrors []error for err := range errorsCh { allErrors = append(allErrors, err) } return nil, fmt.Errorf("请求失败次数超过 %d 次: %v", errorLimit, allErrors) } combinedResponse, err := json.Marshal(responseData) if err != nil { return nil, fmt.Errorf("响应数据转 JSON 失败: %v", err) } return combinedResponse, nil } // ------------------------------------请求处理器-------------------------- var requestProcessors = map[string]func(*ApiRequestService, []byte) ([]byte, 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, "CAR061": (*ApiRequestService).ProcessCAR061Request, "IDV044": (*ApiRequestService).ProcessIDV044Request, "G10SC02": (*ApiRequestService).ProcessG10SC02Request, "G03HZ01": (*ApiRequestService).ProcessG03HZ01Request, "G02BJ02": (*ApiRequestService).ProcessG02BJ02Request, "G19BJ02": (*ApiRequestService).ProcessG19BJ02Request, "G20GZ01": (*ApiRequestService).ProcessG20GZ01Request, "G37SC01": (*ApiRequestService).ProcessG37SC01Request, "G36SC01": (*ApiRequestService).ProcessG36SC01Request, "G22SC01": (*ApiRequestService).ProcessG22SC01Request, "Q03SC01": (*ApiRequestService).ProcessQ03SC01Request, "G39SC02": (*ApiRequestService).ProcessG39SC02Request, "G38SC02": (*ApiRequestService).ProcessG38SC02Request, "layoutIdcard": (*ApiRequestService).ProcessLayoutIdcardRequest, // New Feature "PersonEnterprisePro": (*ApiRequestService).ProcessPersonEnterpriseProRequest, "BehaviorRiskScan": (*ApiRequestService).ProcessBehaviorRiskScanRequest, "G30BJ05": (*ApiRequestService).ProcessG30BJ05Request, "G31BJ05": (*ApiRequestService).ProcessG31BJ05Request, "G32BJ05": (*ApiRequestService).ProcessG32BJ05Request, "RIS031": (*ApiRequestService).ProcessRIS031Request, "G09XM02": (*ApiRequestService).ProcessG09XM02Request, "G10XM02": (*ApiRequestService).ProcessG10XM02Request, "G11BJ06": (*ApiRequestService).ProcessG11BJ06Request, "G29BJ05": (*ApiRequestService).ProcessG29BJ05Request, "Marriage": (*ApiRequestService).ProcessMarriageRequest, } // PreprocessRequestApi 调用指定的请求处理函数 func (a *ApiRequestService) PreprocessRequestApi(params []byte, apiID string) ([]byte, error) { if processor, exists := requestProcessors[apiID]; exists { return processor(a, params) // 调用 ApiRequestService 方法 } return nil, errors.New("api请求, 未找到相应的处理程序") } func (a *ApiRequestService) ProcessG09SC02Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") if !name.Exists() || !idCard.Exists() { return nil, errors.New("api请求, G09SC02, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "certNumMan": a.westDexService.Encrypt(idCard.String()), "nameMan": a.westDexService.Encrypt(name.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G09SC02", request) if callApiErr != nil { return nil, callApiErr } result := gjson.GetBytes(resp, "data.0.maritalStatus") if result.Exists() { responseMap := map[string]string{"status": result.String()} jsonResponse, err := json.Marshal(responseMap) if err != nil { return nil, err } return jsonResponse, nil } else { return nil, errors.New("查询为空") } } func (a *ApiRequestService) ProcessG27BJ05Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") mobile := gjson.GetBytes(params, "mobile") if !name.Exists() || !idCard.Exists() || !mobile.Exists() { return nil, errors.New("api请求, G27BJ05, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "id": a.westDexService.Encrypt(idCard.String()), "name": a.westDexService.Encrypt(name.String()), "cell": a.westDexService.Encrypt(mobile.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G27BJ05", request) if callApiErr != nil { return nil, callApiErr } // 获取 code 字段 codeResult := gjson.GetBytes(resp, "code") if !codeResult.Exists() { return nil, fmt.Errorf("code 字段不存在") } if codeResult.String() != "00" { return nil, fmt.Errorf("未匹配到相关结果") } // 获取 data 字段 dataResult := gjson.GetBytes(resp, "data") if !dataResult.Exists() { return nil, fmt.Errorf("data 字段不存在") } // 将 data 字段解析为 map var dataMap map[string]interface{} if err := json.Unmarshal([]byte(dataResult.Raw), &dataMap); err != nil { return nil, fmt.Errorf("解析 data 字段失败: %v", err) } // 删除指定字段 delete(dataMap, "swift_number") delete(dataMap, "DataStrategy") // 重新编码为 JSON modifiedData, err := json.Marshal(dataMap) if err != nil { return nil, fmt.Errorf("编码修改后的 data 失败: %v", err) } return modifiedData, nil } func (a *ApiRequestService) ProcessG26BJ05Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") mobile := gjson.GetBytes(params, "mobile") if !name.Exists() || !idCard.Exists() || !mobile.Exists() { return nil, errors.New("api请求, G26BJ05, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "id": a.westDexService.Encrypt(idCard.String()), "name": a.westDexService.Encrypt(name.String()), "cell": a.westDexService.Encrypt(mobile.String()), "time_range": 5, }, } resp, callApiErr := a.westDexService.CallAPI("G26BJ05", request) if callApiErr != nil { return nil, callApiErr } codeResult := gjson.GetBytes(resp, "code") if !codeResult.Exists() { return nil, fmt.Errorf("code 字段不存在") } if codeResult.String() != "00" { return nil, fmt.Errorf("未匹配到相关结果") } // 获取 data 字段 dataResult := gjson.GetBytes(resp, "data") if !dataResult.Exists() { return nil, fmt.Errorf("data 字段不存在") } // 将 data 字段解析为 map var dataMap map[string]interface{} if err := json.Unmarshal([]byte(dataResult.Raw), &dataMap); err != nil { return nil, fmt.Errorf("解析 data 字段失败: %v", err) } // 删除指定字段 delete(dataMap, "swift_number") delete(dataMap, "DataStrategy") // 重新编码为 JSON modifiedData, err := json.Marshal(dataMap) if err != nil { return nil, fmt.Errorf("编码修改后的 data 失败: %v", err) } return modifiedData, nil } func (a *ApiRequestService) ProcessG34BJ03Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") if !name.Exists() || !idCard.Exists() { return nil, errors.New("api请求, G34BJ03, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "id_card": a.westDexService.Encrypt(idCard.String()), "name": a.westDexService.Encrypt(name.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G34BJ03", request) if callApiErr != nil { return nil, callApiErr } dataResult := gjson.GetBytes(resp, "negative_info.data.risk_level") if dataResult.Exists() { // 如果字段存在,构造包含 "status" 的 JSON 响应 responseMap := map[string]string{"risk_level": dataResult.String()} jsonResponse, err := json.Marshal(responseMap) if err != nil { return nil, err } return jsonResponse, nil } else { return nil, errors.New("查询为空") } } func (a *ApiRequestService) ProcessG35SC01Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") if !name.Exists() || !idCard.Exists() { return nil, errors.New("api请求, G35SC01, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "idcard": a.westDexService.Encrypt(idCard.String()), "name": a.westDexService.Encrypt(name.String()), "inquired_auth": a.westDexService.GetDateRange(), }, } resp, callApiErr := a.westDexService.CallAPI("G35SC01", request) if callApiErr != nil { return nil, callApiErr } // 第一步:提取外层的 data 字段 dataResult := gjson.GetBytes(resp, "data") if !dataResult.Exists() { return nil, fmt.Errorf("外层 data 字段不存在") } // 第二步:解析外层 data 的 JSON 字符串 var outerDataMap map[string]interface{} if err := json.Unmarshal([]byte(dataResult.String()), &outerDataMap); err != nil { return nil, fmt.Errorf("解析外层 data 字段失败: %v", err) } // 第三步:提取内层的 data 字段 innerData, ok := outerDataMap["data"].(string) if !ok { return nil, fmt.Errorf("内层 data 字段不存在或类型错误") } if innerData == "" || innerData == "{}" || innerData == "[]" { innerData = "{}" } // 第四步:解析内层 data 的 JSON 字符串 var finalDataMap map[string]interface{} if err := json.Unmarshal([]byte(innerData), &finalDataMap); err != nil { return nil, fmt.Errorf("解析内层 data 字段失败: %v", err) } finalDataBytes, err := json.Marshal(finalDataMap) if err != nil { return nil, fmt.Errorf("编码最终的 JSON 对象失败: %v", err) } return finalDataBytes, nil } func (a *ApiRequestService) ProcessG28BJ05Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") mobile := gjson.GetBytes(params, "mobile") if !name.Exists() || !idCard.Exists() || !mobile.Exists() { return nil, errors.New("api请求, G28BJ05, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "id": a.westDexService.Encrypt(idCard.String()), "name": a.westDexService.Encrypt(name.String()), "cell": a.westDexService.Encrypt(mobile.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G28BJ05", request) if callApiErr != nil { return nil, callApiErr } // 获取 code 字段 codeResult := gjson.GetBytes(resp, "code") if !codeResult.Exists() { return nil, fmt.Errorf("code 字段不存在") } if codeResult.String() != "00" { return nil, fmt.Errorf("未匹配到相关结果") } // 获取 data 字段 dataResult := gjson.GetBytes(resp, "data") if !dataResult.Exists() { return nil, fmt.Errorf("data 字段不存在") } // 将 data 字段解析为 map var dataMap map[string]interface{} if err := json.Unmarshal([]byte(dataResult.Raw), &dataMap); err != nil { return nil, fmt.Errorf("解析 data 字段失败: %v", err) } // 删除指定字段 delete(dataMap, "swift_number") delete(dataMap, "DataStrategy") // 重新编码为 JSON modifiedData, err := json.Marshal(dataMap) if err != nil { return nil, fmt.Errorf("编码修改后的 data 失败: %v", err) } return modifiedData, nil } func (a *ApiRequestService) ProcessG05HZ01Request(params []byte) ([]byte, error) { idCard := gjson.GetBytes(params, "id_card") if !idCard.Exists() { return nil, errors.New("api请求, G05HZ01, 获取相关参数失败") } request := map[string]interface{}{ "pid": crypto.Md5Encrypt(idCard.String()), } resp, callApiErr := a.westDexService.G05HZ01CallAPI("G05HZ01", request) if callApiErr != nil { return nil, callApiErr } // 处理股东人企关系的响应数据 code := gjson.GetBytes(resp, "code") if !code.Exists() { return nil, fmt.Errorf("响应中缺少 code 字段") } // 判断 code 是否等于 "0000" if code.String() == "0000" { // 获取 data 字段的值 data := gjson.GetBytes(resp, "data") if !data.Exists() { return nil, fmt.Errorf("响应中缺少 data 字段") } // 返回 data 字段的内容 return []byte(data.Raw), nil } // code 不等于 "0000",返回错误 return nil, fmt.Errorf("响应code错误%s", code.String()) } func (a *ApiRequestService) ProcessQ23SC01Request(params []byte) ([]byte, error) { entName := gjson.GetBytes(params, "ent_name") entCode := gjson.GetBytes(params, "ent_code") if !entName.Exists() || !entCode.Exists() { return nil, errors.New("api请求, Q23SC01, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "uscc": a.westDexService.Encrypt(entCode.String()), "org_name": a.westDexService.Encrypt(entName.String()), "inquired_auth": a.westDexService.GetDateRange(), }, } resp, callApiErr := a.westDexService.CallAPI("Q23SC01", request) logx.Infof("企业涉诉返回%+v", string(resp)) if callApiErr != nil { return nil, callApiErr } // 第一步:提取外层的 data 字段 dataResult := gjson.GetBytes(resp, "data") if !dataResult.Exists() { return nil, fmt.Errorf("外层 data 字段不存在") } // 第二步:解析外层 data 的 JSON 字符串 var outerDataMap map[string]interface{} if err := json.Unmarshal([]byte(dataResult.String()), &outerDataMap); err != nil { return nil, fmt.Errorf("解析外层 data 字段失败: %v", err) } // 第三步:提取内层的 data 字段 innerData, ok := outerDataMap["data"].(string) if !ok { return nil, fmt.Errorf("内层 data 字段不存在或类型错误") } // 第四步:解析内层 data 的 JSON 字符串 var finalDataMap map[string]interface{} if err := json.Unmarshal([]byte(innerData), &finalDataMap); err != nil { return nil, fmt.Errorf("解析内层 data 字段失败: %v", err) } // 将最终的 JSON 对象编码为字节数组返回 finalDataBytes, err := json.Marshal(finalDataMap) if err != nil { return nil, fmt.Errorf("编码最终的 JSON 对象失败: %v", err) } statusResult := gjson.GetBytes(finalDataBytes, "status.status") if statusResult.Exists() || statusResult.Int() == -1 { return nil, fmt.Errorf("企业涉诉为空: %+v", finalDataBytes) } return finalDataBytes, nil } func (a *ApiRequestService) ProcessG15BJ02Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") mobile := gjson.GetBytes(params, "mobile") if !name.Exists() || !idCard.Exists() || !mobile.Exists() { return nil, errors.New("api请求, G15BJ02, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "name": a.westDexService.Encrypt(name.String()), "idNo": a.westDexService.Encrypt(idCard.String()), "phone": a.westDexService.Encrypt(mobile.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G15BJ02", request) if callApiErr != nil { return nil, callApiErr } dataResult := gjson.GetBytes(resp, "data.code") if !dataResult.Exists() { return nil, fmt.Errorf("code 字段不存在") } code := dataResult.Int() // 处理允许的 code 值 if code == 1000 || code == 1003 || code == 1004 || code == 1005 { return resp, nil } return nil, fmt.Errorf("三要素核验失败: %+v", resp) } func (a *ApiRequestService) ProcessG17BJ02Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") mobile := gjson.GetBytes(params, "mobile") if !name.Exists() || !mobile.Exists() { return nil, errors.New("api请求, G17BJ02, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "name": a.westDexService.Encrypt(name.String()), "phone": a.westDexService.Encrypt(mobile.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G17BJ02", request) if callApiErr != nil { return nil, callApiErr } dataResult := gjson.GetBytes(resp, "data.code") if !dataResult.Exists() { return nil, fmt.Errorf("code 字段不存在") } code := dataResult.Int() // 处理允许的 code 值 if code == 1000 || code == 1001 { return resp, nil } return nil, fmt.Errorf("手机二要素核验失败: %+v", resp) } func (a *ApiRequestService) ProcessG08SC02Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") if !name.Exists() || !idCard.Exists() { return nil, errors.New("api请求, G08SC02, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "xm": a.westDexService.Encrypt(name.String()), "gmsfzhm": a.westDexService.Encrypt(idCard.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G08SC02", request) if callApiErr != nil { return nil, callApiErr } return resp, nil } func (a *ApiRequestService) ProcessKZEYSRequest(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") if !name.Exists() || !idCard.Exists() { return nil, errors.New("api请求, KZEYS, 获取相关参数失败") } appCode := a.config.Ali.Code requestUrl := "https://kzidcardv1.market.alicloudapi.com/api-mall/api/id_card/check" // 构造查询参数 data := url.Values{} data.Add("name", name.String()) data.Add("idcard", idCard.String()) req, err := http.NewRequest(http.MethodPost, requestUrl, strings.NewReader(data.Encode())) if err != nil { return nil, fmt.Errorf("KZEYS 创建请求失败: %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("KZEYS 请求失败: %v", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("KZEYS 请求失败, 状态码: %d", resp.StatusCode) } respBody, err := io.ReadAll(resp.Body) if err != nil { return nil, fmt.Errorf("KZEYS 响应体读取失败:%v", err) } // 使用 gjson 解析 JSON 数据 code := gjson.GetBytes(respBody, "code").Int() if code != 200 { msg := gjson.GetBytes(respBody, "msg").String() if msg == "" { msg = "未知错误" } return nil, fmt.Errorf("KZEYS 响应失败: %s", msg) } respData := gjson.GetBytes(respBody, "data") if !respData.Exists() { return nil, fmt.Errorf("KZEYS 响应, data 字段不存在") } dataRaw := respData.Raw // 成功返回 return []byte(dataRaw), nil } // 人车核验 func (a *ApiRequestService) ProcessP_C_B332Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") carType := gjson.GetBytes(params, "car_type") carLicense := gjson.GetBytes(params, "car_license") if !name.Exists() || !carType.Exists() || !carLicense.Exists() { return nil, errors.New("api请求, P_C_B332, 获取相关参数失败: car_number") } request := map[string]interface{}{ "name": name.String(), "carType": carType.String(), "carNumber": carLicense.String(), } resp, err := a.yushanService.request("P_C_B332", request) if err != nil { return nil, fmt.Errorf("人车核验查询失败: %v", err) } return resp, nil } // 银行卡黑名单 func (a *ApiRequestService) ProcessFIN019Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") mobile := gjson.GetBytes(params, "mobile") bankCard := gjson.GetBytes(params, "bank_card") if !name.Exists() || !idCard.Exists() || !mobile.Exists() || !bankCard.Exists() { return nil, errors.New("api请求, FIN019, 获取相关参数失败: car_number") } request := map[string]interface{}{ "name": name.String(), "cardNo": idCard.String(), "mobile": mobile.String(), "cardld": bankCard.String(), } resp, err := a.yushanService.request("FIN019", request) if err != nil { return nil, fmt.Errorf("银行卡黑名单查询失败: %v", err) } return resp, nil } // 名下车辆 func (a *ApiRequestService) ProcessCAR061Request(params []byte) ([]byte, error) { idCard := gjson.GetBytes(params, "id_card") if !idCard.Exists() { return nil, errors.New("api请求, CAR061, 获取相关参数失败") } request := map[string]interface{}{ "cardNo": idCard.String(), } resp, err := a.yushanService.request("CAR061", request) if err != nil { return nil, fmt.Errorf("名下车辆查询失败: %v", err) } return resp, nil } func (a *ApiRequestService) ProcessIDV044Request(params []byte) ([]byte, error) { idCard := gjson.GetBytes(params, "id_card") name := gjson.GetBytes(params, "name") if !idCard.Exists() || !name.Exists() { return nil, errors.New("api请求, IDV044, 获取相关参数失败") } request := map[string]interface{}{ "cardNo": idCard.String(), "name": name.String(), } resp, err := a.yushanService.request("IDV044", request) if err != nil { return nil, fmt.Errorf("婚姻状态查询失败: %v", err) } return resp, nil } func (a *ApiRequestService) ProcessG10SC02Request(params []byte) ([]byte, error) { // 提取男方和女方信息 nameMan := gjson.GetBytes(params, "nameMan") idCardMan := gjson.GetBytes(params, "idCardMan") nameWoman := gjson.GetBytes(params, "nameWoman") idCardWoman := gjson.GetBytes(params, "idCardWoman") // 校验是否存在必要参数 if !nameMan.Exists() || !idCardMan.Exists() || !nameWoman.Exists() || !idCardWoman.Exists() { return nil, errors.New("请求参数缺失:需要提供男方和女方的姓名及身份证号") } // 构造请求数据 request := map[string]interface{}{ "data": map[string]interface{}{ "certNumMan": a.westDexService.Encrypt(idCardMan.String()), "nameMan": a.westDexService.Encrypt(nameMan.String()), "certNumWoman": a.westDexService.Encrypt(idCardWoman.String()), "nameWoman": a.westDexService.Encrypt(nameWoman.String()), }, } // 调用 API resp, callApiErr := a.westDexService.CallAPI("G10SC02", request) if callApiErr != nil { return nil, callApiErr } // 解析响应数据 code := gjson.GetBytes(resp, "code").String() // 状态码校验 if code != "200" { return nil, fmt.Errorf("婚姻查询失败:%s", string(resp)) } result := gjson.GetBytes(resp, "data.0.maritalStatus") if result.Exists() { responseMap := map[string]string{"status": result.String()} jsonResponse, err := json.Marshal(responseMap) if err != nil { return nil, err } return jsonResponse, nil } else { return nil, errors.New("查询为空") } } // 手机号码风险 func (a *ApiRequestService) ProcessG03HZ01Request(params []byte) ([]byte, error) { mobile := gjson.GetBytes(params, "mobile") if !mobile.Exists() { return nil, errors.New("api请求, G03HZ01, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "mobile": a.westDexService.Encrypt(mobile.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G03HZ01", request) if callApiErr != nil { return nil, callApiErr } // 获取 code 字段 codeResult := gjson.GetBytes(resp, "code") if !codeResult.Exists() || codeResult.String() != "0000" { return nil, fmt.Errorf("查询手机号码风险失败, %s", string(resp)) } data := gjson.GetBytes(resp, "data.data") if !data.Exists() { return nil, fmt.Errorf("查询手机号码风险失败, %s", string(resp)) } return []byte(data.Raw), nil } // 手机在网时长 func (a *ApiRequestService) ProcessG02BJ02Request(params []byte) ([]byte, error) { mobile := gjson.GetBytes(params, "mobile") if !mobile.Exists() { return nil, errors.New("api请求, G02BJ02, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "phone": a.westDexService.Encrypt(mobile.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G02BJ02", request) if callApiErr != nil { return nil, callApiErr } // 获取 code 字段 codeResult := gjson.GetBytes(resp, "code") validCodes := map[string]bool{"1006": true, "1007": true, "1008": true, "1009": true, "1010": true} if !validCodes[codeResult.String()] { return nil, fmt.Errorf("查询手机在网时长失败, %s", string(resp)) } data := gjson.GetBytes(resp, "data") if !data.Exists() { return nil, fmt.Errorf("查询手机在网时长失败, %s", string(resp)) } return []byte(data.Raw), nil } // 手机二次卡 func (a *ApiRequestService) ProcessG19BJ02Request(params []byte) ([]byte, error) { mobile := gjson.GetBytes(params, "mobile") startDate := gjson.GetBytes(params, "startDate") if !mobile.Exists() { return nil, errors.New("api请求, G19BJ02, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "phone": a.westDexService.Encrypt(mobile.String()), "startDate": startDate.String(), }, } resp, callApiErr := a.westDexService.CallAPI("G19BJ02", request) if callApiErr != nil { return nil, callApiErr } // 获取 code 字段 codeResult := gjson.GetBytes(resp, "code") if !codeResult.Exists() || (codeResult.String() != "1025" && codeResult.String() != "1026") { return nil, fmt.Errorf("手机二次卡失败, %s", string(resp)) } data := gjson.GetBytes(resp, "data") if !data.Exists() { return nil, fmt.Errorf("手机二次卡失败, %s", string(resp)) } return []byte(data.Raw), nil } // 银行卡四要素 func (a *ApiRequestService) ProcessG20GZ01Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") mobile := gjson.GetBytes(params, "mobile") bankCard := gjson.GetBytes(params, "bank_card") if !mobile.Exists() { return nil, errors.New("api请求, G20GZ01, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "name": a.westDexService.Encrypt(name.String()), "idcard": a.westDexService.Encrypt(idCard.String()), "acc_no": a.westDexService.Encrypt(bankCard.String()), "mobile": a.westDexService.Encrypt(mobile.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G20GZ01", request) if callApiErr != nil { return nil, callApiErr } // 获取 code 字段 codeResult := gjson.GetBytes(resp, "code") if !codeResult.Exists() || codeResult.String() != "10000" { return nil, fmt.Errorf("银行卡四要素失败, %s", string(resp)) } data := gjson.GetBytes(resp, "data") if !data.Exists() { return nil, fmt.Errorf("银行卡四要素失败, %s", string(resp)) } // 解析 data.Raw 字符串为接口类型 var parsedData interface{} err := json.Unmarshal([]byte(data.String()), &parsedData) if err != nil { return nil, fmt.Errorf("解析 data 失败: %v", err) } // 将解析后的数据重新编码为 []byte resultBytes, err := json.Marshal(parsedData) if err != nil { return nil, fmt.Errorf("重新编码 data 失败: %v", err) } return resultBytes, nil } // G37SC01 自然人失信信息 func (a *ApiRequestService) ProcessG37SC01Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") if !name.Exists() || !idCard.Exists() { return nil, errors.New("api请求, G37SC01, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "name": a.westDexService.Encrypt(name.String()), "idcard": a.westDexService.Encrypt(idCard.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G37SC01", request) if callApiErr != nil { return nil, callApiErr } // 第一步:提取外层的 data 字段 dataResult := gjson.GetBytes(resp, "data") if !dataResult.Exists() { return nil, fmt.Errorf("外层 data 字段不存在") } // 解析 data 字符串为 JSON 对象 parsedData := gjson.Parse(dataResult.String()) sxbzxr := parsedData.Get("sxbzxr") if !sxbzxr.Exists() { return nil, fmt.Errorf("内层 sxbzxr 字段不存在") } return []byte(sxbzxr.Raw), nil } // G36SC01 自然人限高信息 func (a *ApiRequestService) ProcessG36SC01Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") if !name.Exists() || !idCard.Exists() { return nil, errors.New("api请求, G36SC01, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "name": a.westDexService.Encrypt(name.String()), "idcard": a.westDexService.Encrypt(idCard.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G36SC01", request) if callApiErr != nil { return nil, callApiErr } // 第一步:提取外层的 data 字段 dataResult := gjson.GetBytes(resp, "data") if !dataResult.Exists() { return nil, fmt.Errorf("外层 data 字段不存在") } // 解析 data 字符串为 JSON 对象 parsedData := gjson.Parse(dataResult.String()) xgbzxr := parsedData.Get("xgbzxr") if !xgbzxr.Exists() { return nil, fmt.Errorf("内层 xgbzxr 字段不存在") } return []byte(xgbzxr.Raw), nil } // G22SC01 自然人司法模型 func (a *ApiRequestService) ProcessG22SC01Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") if !name.Exists() || !idCard.Exists() { return nil, errors.New("api请求, G22SC01, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "name": a.westDexService.Encrypt(name.String()), "idcard": a.westDexService.Encrypt(idCard.String()), "inquired_auth": a.westDexService.GetDateRange(), }, } resp, callApiErr := a.westDexService.CallAPI("G22SC01", request) if callApiErr != nil { return nil, callApiErr } // 第一步:提取外层的 data 字段 dataResult := gjson.GetBytes(resp, "data") if !dataResult.Exists() { return nil, fmt.Errorf("外层 data 字段不存在") } parseResult, err := lzUtils.RecursiveParse(dataResult.Raw) if err != nil { return nil, fmt.Errorf("递归反序列化") } marshal, err := sonic.Marshal(parseResult) if err != nil { return nil, fmt.Errorf("序列化失败: %v", err) } return marshal, nil } // Q03SC01 企业涉诉信息 func (a *ApiRequestService) ProcessQ03SC01Request(params []byte) ([]byte, error) { entName := gjson.GetBytes(params, "ent_name") entCode := gjson.GetBytes(params, "ent_code") if !entName.Exists() || !entCode.Exists() { return nil, errors.New("api请求, Q03SC01, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "uscc": a.westDexService.Encrypt(entCode.String()), "org_name": a.westDexService.Encrypt(entName.String()), "inquired_auth": a.westDexService.GetDateRange(), }, } resp, callApiErr := a.westDexService.CallAPI("Q03SC01", request) if callApiErr != nil { return nil, callApiErr } // 第一步:提取外层的 data 字段 dataResult := gjson.GetBytes(resp, "data") if !dataResult.Exists() { return nil, fmt.Errorf("外层 data 字段不存在") } // 保留原有的递归解析和序列化逻辑 parseResult, err := lzUtils.RecursiveParse(dataResult.Raw) if err != nil { return nil, fmt.Errorf("递归反序列化") } logx.Infof("parseResult: %v", parseResult) marshal, err := sonic.Marshal(parseResult) if err != nil { return nil, fmt.Errorf("序列化失败: %v", err) } // 第二步:使用gjson预处理数据 dataMap := make(map[string]interface{}) // 处理entout数据 entoutArray := gjson.GetBytes(marshal, "entout").Array() if len(entoutArray) > 0 { // 检查是否存在count字段来判断是否有数据 countField := entoutArray[0].Get("data.count") if countField.Exists() { // 有count字段,表示有数据 entoutData := entoutArray[0].Get("data") if entoutData.Exists() { dataMap["data"] = json.RawMessage(entoutData.Raw) } } else { // 没有count字段,使用空对象 dataMap["data"] = json.RawMessage("{}") } } else { dataMap["data"] = json.RawMessage("{}") } // 处理sxbzxr数据(失信被执行人) sxbzxrArray := dataResult.Get("sxbzxr").Array() if len(sxbzxrArray) > 0 { sxbzxrList := sxbzxrArray[0].Get("sxbzxr") if sxbzxrList.Exists() && len(sxbzxrList.Array()) > 0 { dataMap["sxbzxr"] = json.RawMessage(sxbzxrList.Raw) } else { dataMap["sxbzxr"] = json.RawMessage("[]") } } else { dataMap["sxbzxr"] = json.RawMessage("[]") } // 处理xgbzxr数据(限高被执行人) xgbzxrArray := dataResult.Get("xgbzxr").Array() if len(xgbzxrArray) > 0 { xgbzxrList := xgbzxrArray[0].Get("xgbzxr") if xgbzxrList.Exists() && len(xgbzxrList.Array()) > 0 { dataMap["xgbzxr"] = json.RawMessage(xgbzxrList.Raw) } else { dataMap["xgbzxr"] = json.RawMessage("[]") } } else { dataMap["xgbzxr"] = json.RawMessage("[]") } result, err := sonic.Marshal(dataMap) if err != nil { return nil, fmt.Errorf("序列化预处理数据失败: %v", err) } return result, nil } // G39SC02 职业资格证书核验 func (a *ApiRequestService) ProcessG39SC02Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") if !name.Exists() || !idCard.Exists() { return nil, errors.New("api请求, G39SC02, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "name": a.westDexService.Encrypt(name.String()), "IdNum": a.westDexService.Encrypt(idCard.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G39SC02", request) if callApiErr != nil { return nil, callApiErr } return resp, nil } // G38SC02 全国个人离婚次数 func (a *ApiRequestService) ProcessG38SC02Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") if !name.Exists() || !idCard.Exists() { return nil, errors.New("api请求, G38SC02, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "xm": a.westDexService.Encrypt(name.String()), "sfzh": a.westDexService.Encrypt(idCard.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G38SC02", request) if callApiErr != nil { return nil, callApiErr } return resp, nil } // layoutIdcard 西部二要素 func (a *ApiRequestService) ProcessLayoutIdcardRequest(params []byte) ([]byte, 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 []byte(firstChar), nil } // PersonEnterprisePro 人企业关系加强版 func (a *ApiRequestService) ProcessPersonEnterpriseProRequest(params []byte) ([]byte, error) { idCard := gjson.GetBytes(params, "id_card") // 设置最大调用次数上限 maxApiCalls := 20 // 允许最多查询20个企业 if !idCard.Exists() { return nil, errors.New("api请求, PersonEnterprisePro, 获取相关参数失败") } request := map[string]interface{}{ "pid": crypto.Md5Encrypt(idCard.String()), } resp, callApiErr := a.westDexService.G05HZ01CallAPI("G05HZ01", request) if callApiErr != nil { return nil, callApiErr } // 处理股东人企关系的响应数据 code := gjson.GetBytes(resp, "code") if !code.Exists() { return nil, fmt.Errorf("响应中缺少 code 字段") } // 判断 code 是否等于 "0000" if code.String() == "0000" { // 获取 data 字段的值 data := gjson.GetBytes(resp, "data") if !data.Exists() { return nil, fmt.Errorf("响应中缺少 data 字段") } // 使用gjson获取企业列表 datalistResult := gjson.Get(data.Raw, "datalist") if !datalistResult.Exists() { return nil, fmt.Errorf("datalist字段不存在") } // 获取所有企业并进行排序 companies := datalistResult.Array() // 创建企业对象切片,用于排序 type CompanyWithPriority struct { Index int Data gjson.Result RelationshipVal int // 关系权重值 RelationCount int // 关系数量 AdminPenalty int // 行政处罚数量 Executed int // 被执行人数量 Dishonest int // 失信被执行人数量 } companiesWithPriority := make([]CompanyWithPriority, 0, len(companies)) // 遍历企业,计算优先级 for i, companyJson := range companies { // 统计行政处罚、被执行人、失信被执行人 adminPenalty := 0 executed := 0 dishonest := 0 // 检查行政处罚字段是否存在并获取数组长度 adminPenaltyResult := companyJson.Get("adminPenalty") if adminPenaltyResult.Exists() && adminPenaltyResult.IsArray() { adminPenalty = len(adminPenaltyResult.Array()) } // 检查被执行人字段是否存在并获取数组长度 executedPersonResult := companyJson.Get("executedPerson") if executedPersonResult.Exists() && executedPersonResult.IsArray() { executed = len(executedPersonResult.Array()) } // 检查失信被执行人字段是否存在并获取数组长度 dishonestExecutedPersonResult := companyJson.Get("dishonestExecutedPerson") if dishonestExecutedPersonResult.Exists() && dishonestExecutedPersonResult.IsArray() { dishonest = len(dishonestExecutedPersonResult.Array()) } // 计算relationship权重 relationshipVal := 0 relationCount := 0 // 获取relationship数组 relationshipResult := companyJson.Get("relationship") if relationshipResult.Exists() && relationshipResult.IsArray() { relationships := relationshipResult.Array() // 统计各类关系的数量和权重 for _, rel := range relationships { relationCount++ relStr := rel.String() // 根据关系类型设置权重,权重顺序: // 股东(6) > 历史股东(5) > 法人(4) > 历史法人(3) > 高管(2) > 历史高管(1) switch relStr { case "sh": // 股东 if relationshipVal < 6 { relationshipVal = 6 } case "his_sh": // 历史股东 if relationshipVal < 5 { relationshipVal = 5 } case "lp": // 法人 if relationshipVal < 4 { relationshipVal = 4 } case "his_lp": // 历史法人 if relationshipVal < 3 { relationshipVal = 3 } case "tm": // 高管 if relationshipVal < 2 { relationshipVal = 2 } case "his_tm": // 历史高管 if relationshipVal < 1 { relationshipVal = 1 } } } } companiesWithPriority = append(companiesWithPriority, CompanyWithPriority{ Index: i, Data: companyJson, RelationshipVal: relationshipVal, RelationCount: relationCount, AdminPenalty: adminPenalty, Executed: executed, Dishonest: dishonest, }) } // 按优先级排序 sort.Slice(companiesWithPriority, func(i, j int) bool { // 首先根据是否有失信被执行人排序 if companiesWithPriority[i].Dishonest != companiesWithPriority[j].Dishonest { return companiesWithPriority[i].Dishonest > companiesWithPriority[j].Dishonest } // 然后根据是否有被执行人排序 if companiesWithPriority[i].Executed != companiesWithPriority[j].Executed { return companiesWithPriority[i].Executed > companiesWithPriority[j].Executed } // 然后根据是否有行政处罚排序 if companiesWithPriority[i].AdminPenalty != companiesWithPriority[j].AdminPenalty { return companiesWithPriority[i].AdminPenalty > companiesWithPriority[j].AdminPenalty } // 然后按relationship类型排序 if companiesWithPriority[i].RelationshipVal != companiesWithPriority[j].RelationshipVal { return companiesWithPriority[i].RelationshipVal > companiesWithPriority[j].RelationshipVal } // 最后按relationship数量排序 return companiesWithPriority[i].RelationCount > companiesWithPriority[j].RelationCount }) // 限制处理的企业数量 processCount := len(companiesWithPriority) if processCount > maxApiCalls { processCount = maxApiCalls } // 只处理前N个优先级高的企业 prioritizedCompanies := companiesWithPriority[:processCount] // 使用WaitGroup和chan处理并发 var wg sync.WaitGroup results := make(chan struct { index int data []byte err error }, processCount) // 对按优先级排序的前N个企业进行涉诉信息查询 for _, company := range prioritizedCompanies { wg.Add(1) go func(origIndex int, companyInfo gjson.Result) { defer wg.Done() logx.Infof("开始处理企业[%d],企业名称: %s,统一社会信用代码: %s", origIndex, companyInfo.Get("basicInfo.name").String(), companyInfo.Get("basicInfo.creditCode").String()) // 提取企业名称和统一社会信用代码 orgName := companyInfo.Get("basicInfo.name") creditCode := companyInfo.Get("basicInfo.creditCode") if !orgName.Exists() || !creditCode.Exists() { results <- struct { index int data []byte err error }{origIndex, nil, fmt.Errorf("企业名称或统一社会信用代码不存在")} return } // 解析原始公司信息为map var companyMap map[string]interface{} if err := json.Unmarshal([]byte(companyInfo.Raw), &companyMap); err != nil { results <- struct { index int data []byte err error }{origIndex, nil, fmt.Errorf("解析企业信息失败: %v", err)} return } // 构造调用Q03SC01的参数 q03Params, err := json.Marshal(map[string]string{ "ent_name": orgName.String(), "ent_code": creditCode.String(), }) if err != nil { // 参数构造失败,但不影响整体处理 logx.Errorf("构造企业[%s]涉诉查询参数失败: %v", orgName.String(), err) companyMap["lawsuitInfo"] = map[string]interface{}{} } else { // 调用Q03SC01接口获取企业涉诉信息 lawsuitData, err := a.ProcessQ03SC01Request(q03Params) // 无论是否有错误,都继续处理 if err != nil { // 可能是正常没有涉诉数据,设置为空对象 logx.Infof("企业[%s]涉诉信息查询结果: %v", orgName.String(), err) companyMap["lawsuitInfo"] = map[string]interface{}{} } else if len(lawsuitData) == 0 || string(lawsuitData) == "{}" || string(lawsuitData) == "null" { // 无涉诉数据 companyMap["lawsuitInfo"] = map[string]interface{}{} } else { // 解析涉诉信息 var lawsuitInfo interface{} if err := json.Unmarshal(lawsuitData, &lawsuitInfo); err != nil { logx.Errorf("解析企业[%s]涉诉信息失败: %v", orgName.String(), err) companyMap["lawsuitInfo"] = map[string]interface{}{} } else { // 添加涉诉信息到企业信息中 companyMap["lawsuitInfo"] = lawsuitInfo } } } // 序列化更新后的企业信息 companyData, err := json.Marshal(companyMap) if err != nil { results <- struct { index int data []byte err error }{origIndex, nil, fmt.Errorf("序列化企业信息失败: %v", err)} return } results <- struct { index int data []byte err error }{origIndex, companyData, nil} }(company.Index, company.Data) } // 关闭结果通道 go func() { wg.Wait() close(results) }() // 解析原始数据为map var dataMap map[string]interface{} if err := json.Unmarshal([]byte(data.Raw), &dataMap); err != nil { return nil, fmt.Errorf("解析data字段失败: %v", err) } // 获取原始企业列表 originalDatalist, ok := dataMap["datalist"].([]interface{}) if !ok { return nil, fmt.Errorf("无法获取原始企业列表") } // 创建结果映射,用于保存已处理的企业 processedCompanies := make(map[int]interface{}) // 收集处理过的企业数据 for result := range results { if result.err != nil { logx.Errorf("处理企业失败: %v", result.err) continue } if result.data != nil { var companyMap interface{} if err := json.Unmarshal(result.data, &companyMap); err == nil { processedCompanies[result.index] = companyMap } } } // 更新企业列表 // 处理过的用新数据,未处理的保留原样 updatedDatalist := make([]interface{}, len(originalDatalist)) for i, company := range originalDatalist { if processed, exists := processedCompanies[i]; exists { // 已处理的企业,使用新数据 updatedDatalist[i] = processed } else { // 未处理的企业,保留原始数据并添加空的涉诉信息 companyMap, ok := company.(map[string]interface{}) if ok { // 为未处理的企业添加空的涉诉信息 companyMap["lawsuitInfo"] = map[string]interface{}{} updatedDatalist[i] = companyMap } else { updatedDatalist[i] = company } } } // 更新原始数据中的企业列表 dataMap["datalist"] = updatedDatalist // 序列化最终结果 result, err := json.Marshal(dataMap) if err != nil { return nil, fmt.Errorf("序列化最终结果失败: %v", err) } return result, nil } // code不等于"0000",返回错误 return nil, fmt.Errorf("响应code错误: %s", code.String()) } func (a *ApiRequestService) ProcessBehaviorRiskScanRequest(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") mobile := gjson.GetBytes(params, "mobile") if !name.Exists() || !idCard.Exists() || !mobile.Exists() { return nil, errors.New("api请求, BehaviorRiskScan, 获取相关参数失败") } var wg sync.WaitGroup type apiResult struct { name string data []byte err error } results := make(chan apiResult, 5) // 5个风险检测项 // 并行调用五个不同的风险检测API wg.Add(5) // 黑灰产检测 go func() { defer wg.Done() data, err := a.ProcessG30BJ05Request(params) results <- apiResult{name: "black_gray_level", data: data, err: err} }() // 电诈风险预警 go func() { defer wg.Done() data, err := a.ProcessG31BJ05Request(params) results <- apiResult{name: "telefraud_level", data: data, err: err} }() // 团伙欺诈排查 go func() { defer wg.Done() data, err := a.ProcessG32BJ05Request(params) results <- apiResult{name: "fraud_group", data: data, err: err} }() // // 反诈反赌核验 go func() { defer wg.Done() data, err := a.ProcessRIS031Request(params) results <- apiResult{name: "anti_fraud_gaming", data: data, err: err} }() // 风险等级 go func() { defer wg.Done() data, err := a.ProcessG34BJ03Request(params) results <- apiResult{name: "risk_level", data: data, err: err} }() // 关闭结果通道 go func() { wg.Wait() close(results) }() // 收集所有结果 resultMap := make(map[string]interface{}) var errors []string for result := range results { if result.err != nil { // 记录错误但继续处理其他结果 errors = append(errors, fmt.Sprintf("%s: %v", result.name, result.err)) continue } // 解析JSON结果并添加到结果映射 var parsedData interface{} if err := json.Unmarshal(result.data, &parsedData); err != nil { errors = append(errors, fmt.Sprintf("解析%s数据失败: %v", result.name, err)) } else { resultMap[result.name] = parsedData } } // 添加错误信息到结果中(如果存在) if len(errors) > 0 { resultMap["errors"] = errors } // 序列化最终结果 finalResult, err := json.Marshal(resultMap) if err != nil { return nil, fmt.Errorf("序列化行为风险扫描结果失败: %v", err) } return finalResult, nil } // G30BJ05 黑灰产 func (a *ApiRequestService) ProcessG30BJ05Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") Mobile := gjson.GetBytes(params, "mobile") if !name.Exists() || !idCard.Exists() || !Mobile.Exists() { return nil, errors.New("api请求, G30BJ05, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "name": a.westDexService.Encrypt(name.String()), "id": a.westDexService.Encrypt(idCard.String()), "cell": a.westDexService.Encrypt(Mobile.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G30BJ05", request) if callApiErr != nil { return nil, callApiErr } fmt.Println(resp) flagBlackgraylevel := gjson.GetBytes(resp, "flag_blackgraylevel") if !flagBlackgraylevel.Exists() || flagBlackgraylevel.String() != "1" { return nil, fmt.Errorf("自然人黑灰产信息查询失败") } bglLevel := gjson.GetBytes(resp, "bgl_level") if !bglLevel.Exists() { return nil, fmt.Errorf("bgl_level 字段不存在") } return []byte(bglLevel.Raw), nil } // G31BJ05 电诈风险预警 func (a *ApiRequestService) ProcessG31BJ05Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") Mobile := gjson.GetBytes(params, "mobile") if !name.Exists() || !idCard.Exists() || !Mobile.Exists() { return nil, errors.New("api请求, G31BJ05, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "name": a.westDexService.Encrypt(name.String()), "id": a.westDexService.Encrypt(idCard.String()), "cell": a.westDexService.Encrypt(Mobile.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G31BJ05", request) if callApiErr != nil { return nil, callApiErr } fmt.Println(resp) flagTelefraudpredictstd := gjson.GetBytes(resp, "flag_telefraudpredictstd") if !flagTelefraudpredictstd.Exists() || flagTelefraudpredictstd.String() != "1" { return nil, fmt.Errorf("自然人电诈风险预警查询失败") } tfpsLevel := gjson.GetBytes(resp, "tfps_level") if !tfpsLevel.Exists() { return nil, fmt.Errorf("tfps_level 字段不存在") } return []byte(tfpsLevel.Raw), nil } // G32BJ05 团伙欺诈排查 func (a *ApiRequestService) ProcessG32BJ05Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") Mobile := gjson.GetBytes(params, "mobile") if !name.Exists() || !idCard.Exists() || !Mobile.Exists() { return nil, errors.New("api请求, G32BJ05, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "name": a.westDexService.Encrypt(name.String()), "id": a.westDexService.Encrypt(idCard.String()), "cell": a.westDexService.Encrypt(Mobile.String()), }, } resp, callApiErr := a.westDexService.CallAPI("G32BJ05", request) if callApiErr != nil { return nil, callApiErr } flagFraudrelation := gjson.GetBytes(resp, "flag_fraudrelation") if !flagFraudrelation.Exists() || flagFraudrelation.String() != "1" { return nil, fmt.Errorf("自然人团伙欺诈排查查询失败") } frgListLevel := gjson.GetBytes(resp, "frg_list_level") if !frgListLevel.Exists() { return nil, fmt.Errorf("frg_list_level 字段不存在") } frgGroupNum := gjson.GetBytes(resp, "frg_group_num") if !frgGroupNum.Exists() { return nil, fmt.Errorf("frg_group_num 字段不存在") } // 构建包含两个字段的JSON响应 result := map[string]interface{}{ "frg_list_level": frgListLevel.Value(), "frg_group_num": frgGroupNum.Value(), } resultJSON, err := json.Marshal(result) if err != nil { return nil, fmt.Errorf("序列化结果失败: %v", err) } return resultJSON, nil } // RIS031 反诈反赌核验 func (a *ApiRequestService) ProcessRIS031Request(params []byte) ([]byte, error) { name := gjson.GetBytes(params, "name") idCard := gjson.GetBytes(params, "id_card") Mobile := gjson.GetBytes(params, "mobile") if !name.Exists() || !idCard.Exists() || !Mobile.Exists() { return nil, errors.New("api请求, RIS031, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "name": a.westDexService.Encrypt(name.String()), "id": a.westDexService.Encrypt(idCard.String()), "cell": a.westDexService.Encrypt(Mobile.String()), }, } resp, callApiErr := a.yushanService.request("RIS031", request) if callApiErr != nil { return nil, callApiErr } Value := gjson.GetBytes(resp, "value") if !Value.Exists() { return nil, fmt.Errorf("自然人反诈反赌核验查询失败") } return []byte(Value.Raw), nil } // ProcessMarriageRequest 婚姻状态查询,优先使用西部数据G09XM02接口,失败时回退到羽山IDV044接口 func (a *ApiRequestService) ProcessMarriageRequest(params []byte) ([]byte, error) { // 首先尝试使用西部数据接口查询 resp, err := a.ProcessG09XM02Request(params) if err != nil { // 西部数据接口查询失败,尝试使用羽山接口 logx.Infof("西部数据婚姻查询失败,尝试使用羽山接口: %v", err) resp, err = a.ProcessIDV044Request(params) if err != nil { return nil, err } } return resp, nil } func (a *ApiRequestService) ProcessG09XM02Request(params []byte) ([]byte, error) { idCard := gjson.GetBytes(params, "id_card") name := gjson.GetBytes(params, "name") if !idCard.Exists() || !name.Exists() { return nil, errors.New("api请求, G09XM02, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "idCard": a.westDexService.Encrypt(idCard.String()), "name": a.westDexService.Encrypt(name.String()), }, } resp, err := a.westDexService.CallAPI("G09XM02", request) if err != nil && resp == nil { return nil, fmt.Errorf("婚姻状态查询失败: %v", err) } result := gjson.GetBytes(resp, "data.data") if !result.Exists() { return nil, fmt.Errorf("婚姻状态查询失败") } // 获取原始结果 rawResult := result.String() // 根据结果转换状态码 var statusCode string switch { case strings.HasPrefix(rawResult, "INR"): statusCode = "0" // 匹配不成功 case strings.HasPrefix(rawResult, "IA"): statusCode = "1" // 结婚 case strings.HasPrefix(rawResult, "IB"): statusCode = "2" // 离婚 default: return nil, fmt.Errorf("婚姻状态查询失败,未知状态码: %s", statusCode) } // 构建新的返回结果 response := map[string]string{ "status": statusCode, } // 序列化为JSON jsonResponse, err := json.Marshal(response) if err != nil { return nil, fmt.Errorf("序列化结果失败: %v", err) } return jsonResponse, nil } func (a *ApiRequestService) ProcessG10XM02Request(params []byte) ([]byte, error) { // 提取男方和女方信息 nameMan := gjson.GetBytes(params, "nameMan") idCardMan := gjson.GetBytes(params, "idCardMan") nameWoman := gjson.GetBytes(params, "nameWoman") idCardWoman := gjson.GetBytes(params, "idCardWoman") // 校验是否存在必要参数 if !nameMan.Exists() || !idCardMan.Exists() || !nameWoman.Exists() || !idCardWoman.Exists() { return nil, errors.New("请求参数缺失:需要提供男方和女方的姓名及身份证号") } // 构造请求数据 request := map[string]interface{}{ "data": map[string]interface{}{ "idCardMan": a.westDexService.Encrypt(idCardMan.String()), "nameMan": a.westDexService.Encrypt(nameMan.String()), "idCardWoman": a.westDexService.Encrypt(idCardWoman.String()), "nameWoman": a.westDexService.Encrypt(nameWoman.String()), }, } // 调用 API resp, callApiErr := a.westDexService.CallAPI("G10XM02", request) if callApiErr != nil && resp == nil { return nil, callApiErr } result := gjson.GetBytes(resp, "data.data") if !result.Exists() { return nil, fmt.Errorf("婚姻状态查询失败") } // 获取原始结果 rawResult := result.String() // 根据结果转换状态码 var statusCode string switch { case strings.HasPrefix(rawResult, "INR"): statusCode = "0" // 匹配不成功 case strings.HasPrefix(rawResult, "IA"): statusCode = "1" // 结婚 case strings.HasPrefix(rawResult, "IB"): statusCode = "2" // 离婚 default: return nil, fmt.Errorf("婚姻状态查询失败,未知状态码: %s", statusCode) } // 构建新的返回结果 response := map[string]string{ "status": statusCode, } // 序列化为JSON jsonResponse, err := json.Marshal(response) if err != nil { return nil, fmt.Errorf("序列化结果失败: %v", err) } return jsonResponse, nil } func (a *ApiRequestService) ProcessG11BJ06Request(params []byte) ([]byte, error) { idCard := gjson.GetBytes(params, "id_card") name := gjson.GetBytes(params, "name") if !idCard.Exists() || !name.Exists() { return nil, errors.New("api请求, G11BJ06, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "id_card_value": a.westDexService.Encrypt(idCard.String()), "name_value": a.westDexService.Encrypt(name.String()), }, } resp, err := a.westDexService.CallAPI("G11BJ06", request) if err != nil && resp == nil { return nil, fmt.Errorf("教育经历核验查询失败: %v", err) } // 解析响应 codeResult := gjson.GetBytes(resp, "data.education_background.code") if !codeResult.Exists() { return nil, fmt.Errorf("教育经历核验查询失败: 返回数据缺少code字段") } code := codeResult.String() var result map[string]interface{} switch code { case "9100": // 查询成功有结果 eduResultArray := gjson.GetBytes(resp, "data.education_background.data").Array() var processedEduData []interface{} // 提取每个元素中Raw字段的实际内容 for _, item := range eduResultArray { var eduInfo interface{} if err := json.Unmarshal([]byte(item.Raw), &eduInfo); err != nil { return nil, fmt.Errorf("解析教育信息失败: %v", err) } processedEduData = append(processedEduData, eduInfo) } result = map[string]interface{}{ "data": processedEduData, "status": 1, } case "9000": // 查询成功无结果 result = map[string]interface{}{ "data": []interface{}{}, "status": 0, } default: // 其他情况视为错误 errMsg := gjson.GetBytes(resp, "data.education_background.msg").String() return nil, fmt.Errorf("教育经历核验查询失败: %s (code: %s)", errMsg, code) } // 将结果转为JSON字节 jsonResult, err := json.Marshal(result) if err != nil { return nil, fmt.Errorf("处理教育经历查询结果失败: %v", err) } return jsonResult, nil } func (a *ApiRequestService) ProcessG29BJ05Request(params []byte) ([]byte, error) { idCard := gjson.GetBytes(params, "id_card") name := gjson.GetBytes(params, "name") mobile := gjson.GetBytes(params, "mobile") if !idCard.Exists() || !name.Exists() || !mobile.Exists() { return nil, errors.New("api请求, G29BJ05, 获取相关参数失败") } request := map[string]interface{}{ "data": map[string]interface{}{ "id": a.westDexService.Encrypt(idCard.String()), "name": a.westDexService.Encrypt(name.String()), "cell": a.westDexService.Encrypt(mobile.String()), }, } resp, err := a.westDexService.CallAPI("G29BJ05", request) if err != nil && resp == nil { return nil, fmt.Errorf("偿贷压力查询失败: %v", err) } // 获取响应码和偿贷压力标志 code := gjson.GetBytes(resp, "code").String() flagDebtRepayStress := gjson.GetBytes(resp, "flag_debtrepaystress").String() // 判断是否成功 if code != "00" || flagDebtRepayStress != "1" { return nil, fmt.Errorf("偿贷压力查询失败: %+v", resp) } // 获取偿贷压力分数 drsNoDebtScore := gjson.GetBytes(resp, "drs_nodebtscore").String() // 构建结果 result := map[string]interface{}{ "score": drsNoDebtScore, } // 将结果转为JSON jsonResult, err := json.Marshal(result) if err != nil { return nil, fmt.Errorf("处理偿贷压力查询结果失败: %v", err) } return jsonResult, nil }