diff --git a/app/user/cmd/api/desc/query.api b/app/user/cmd/api/desc/query.api index bcc76ba..19edfd2 100644 --- a/app/user/cmd/api/desc/query.api +++ b/app/user/cmd/api/desc/query.api @@ -70,3 +70,12 @@ service main { @handler queryRetry post /query/retry/:id (QueryRetryReq) returns (QueryRetryResp) } + +@server ( + prefix: api/v1 + group: query +) +service main { + @handler querySingleTest + post /query/single/test (QuerySingleTestReq) returns (QuerySingleTestResp) +} \ No newline at end of file diff --git a/app/user/cmd/api/desc/query/query.api b/app/user/cmd/api/desc/query/query.api index b69c131..b6702bb 100644 --- a/app/user/cmd/api/desc/query/query.api +++ b/app/user/cmd/api/desc/query/query.api @@ -114,3 +114,13 @@ type ( QueryRetryResp {} ) +type QuerySingleTestReq { + params map[string]interface{} `json:"params"` + Api string `json:"api"` +} + +type QuerySingleTestResp { + Data interface{} `json:"data"` + Api string `json:"api"` +} + diff --git a/app/user/cmd/api/etc/main.dev.yaml b/app/user/cmd/api/etc/main.dev.yaml index fd84fba..2df0e39 100644 --- a/app/user/cmd/api/etc/main.dev.yaml +++ b/app/user/cmd/api/etc/main.dev.yaml @@ -60,4 +60,4 @@ Applepay: Ali: Code: "d55b58829efb41c8aa8e86769cba4844" SystemConfig: - ThreeVerify: true \ No newline at end of file + ThreeVerify: false \ No newline at end of file diff --git a/app/user/cmd/api/internal/handler/query/querysingletesthandler.go b/app/user/cmd/api/internal/handler/query/querysingletesthandler.go new file mode 100644 index 0000000..5c52db0 --- /dev/null +++ b/app/user/cmd/api/internal/handler/query/querysingletesthandler.go @@ -0,0 +1,29 @@ +package query + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/user/cmd/api/internal/logic/query" + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func QuerySingleTestHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.QuerySingleTestReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := query.NewQuerySingleTestLogic(r.Context(), svcCtx) + resp, err := l.QuerySingleTest(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/routes.go b/app/user/cmd/api/internal/handler/routes.go index 8c45930..8c6bad0 100644 --- a/app/user/cmd/api/internal/handler/routes.go +++ b/app/user/cmd/api/internal/handler/routes.go @@ -256,6 +256,17 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { rest.WithPrefix("/api/v1"), ) + server.AddRoutes( + []rest.Route{ + { + Method: http.MethodPost, + Path: "/query/single/test", + Handler: query.QuerySingleTestHandler(serverCtx), + }, + }, + rest.WithPrefix("/api/v1"), + ) + server.AddRoutes( []rest.Route{ { diff --git a/app/user/cmd/api/internal/logic/query/queryservicelogic.go b/app/user/cmd/api/internal/logic/query/queryservicelogic.go index 884756d..172289e 100644 --- a/app/user/cmd/api/internal/logic/query/queryservicelogic.go +++ b/app/user/cmd/api/internal/logic/query/queryservicelogic.go @@ -65,30 +65,33 @@ func (l *QueryServiceLogic) QueryService(req *types.QueryServiceReq) (resp *type //} var productProcessors = map[string]func(*QueryServiceLogic, *types.QueryServiceReq) (*types.QueryServiceResp, error){ - "marriage": (*QueryServiceLogic).ProcessMarriageLogic, - "homeservice": (*QueryServiceLogic).ProcessHomeServiceLogic, - "riskassessment": (*QueryServiceLogic).ProcessRiskAssessmentLogic, - "companyinfo": (*QueryServiceLogic).ProcessCompanyInfoLogic, - "rentalinfo": (*QueryServiceLogic).ProcessRentalInfoLogic, - "preloanbackgroundcheck": (*QueryServiceLogic).ProcessPreLoanBackgroundCheckLogic, - "backgroundcheck": (*QueryServiceLogic).ProcessBackgroundCheckLogic, - "toc_Marriage": (*QueryServiceLogic).ProcessTocMarriageLogic, - "toc_PersonalBadRecord": (*QueryServiceLogic).ProcessTocPersonalBadRecordLogic, - "toc_ShareholderBusinessRelation": (*QueryServiceLogic).ProcessTocShareholderBusinessRelationLogic, - "toc_PersonalLawsuit": (*QueryServiceLogic).ProcessTocPersonalLawsuitLogic, - "toc_EnterpriseLawsuit": (*QueryServiceLogic).ProcessTocEnterpriseLawsuitLogic, - "toc_PhoneThreeElements": (*QueryServiceLogic).ProcessTocPhoneThreeElementsLogic, - "toc_PhoneTwoElements": (*QueryServiceLogic).ProcessTocPhoneTwoElementsLogic, - "toc_IDCardTwoElements": (*QueryServiceLogic).ProcessTocIDCardTwoElementsLogic, - "toc_NaturalLifeStatus": (*QueryServiceLogic).ProcessTocNaturalLifeStatusLogic, - "toc_PersonVehicleVerification": (*QueryServiceLogic).ProcessTocPersonVehicleVerificationLogic, - "toc_BankCardBlacklist": (*QueryServiceLogic).ProcessTocBankCardBlacklistLogic, - "toc_VehiclesUnderName": (*QueryServiceLogic).ProcessTocVehiclesUnderNameLogic, - "toc_DualMarriage": (*QueryServiceLogic).ProcessTocDualMarriageLogic, - "toc_PhoneNumberRisk": (*QueryServiceLogic).ProcessTocPhoneNumberRiskLogic, - "toc_NetworkDuration": (*QueryServiceLogic).ProcessTocNetworkDurationLogic, - "toc_PhoneSecondaryCard": (*QueryServiceLogic).ProcessTocPhoneSecondaryCardLogic, - "toc_BankCardFourElements": (*QueryServiceLogic).ProcessTocBankCardFourElementsLogic, + "marriage": (*QueryServiceLogic).ProcessMarriageLogic, + "homeservice": (*QueryServiceLogic).ProcessHomeServiceLogic, + "riskassessment": (*QueryServiceLogic).ProcessRiskAssessmentLogic, + "companyinfo": (*QueryServiceLogic).ProcessCompanyInfoLogic, + "rentalinfo": (*QueryServiceLogic).ProcessRentalInfoLogic, + "preloanbackgroundcheck": (*QueryServiceLogic).ProcessPreLoanBackgroundCheckLogic, + "backgroundcheck": (*QueryServiceLogic).ProcessBackgroundCheckLogic, + "toc_Marriage": (*QueryServiceLogic).ProcessTocMarriageLogic, + "toc_PersonalBadRecord": (*QueryServiceLogic).ProcessTocPersonalBadRecordLogic, + "toc_ShareholderBusinessRelation": (*QueryServiceLogic).ProcessTocShareholderBusinessRelationLogic, + "toc_PersonalLawsuit": (*QueryServiceLogic).ProcessTocPersonalLawsuitLogic, + "toc_EnterpriseLawsuit": (*QueryServiceLogic).ProcessTocEnterpriseLawsuitLogic, + "toc_PhoneThreeElements": (*QueryServiceLogic).ProcessTocPhoneThreeElementsLogic, + "toc_PhoneTwoElements": (*QueryServiceLogic).ProcessTocPhoneTwoElementsLogic, + "toc_IDCardTwoElements": (*QueryServiceLogic).ProcessTocIDCardTwoElementsLogic, + "toc_NaturalLifeStatus": (*QueryServiceLogic).ProcessTocNaturalLifeStatusLogic, + "toc_PersonVehicleVerification": (*QueryServiceLogic).ProcessTocPersonVehicleVerificationLogic, + "toc_BankCardBlacklist": (*QueryServiceLogic).ProcessTocBankCardBlacklistLogic, + "toc_VehiclesUnderName": (*QueryServiceLogic).ProcessTocVehiclesUnderNameLogic, + "toc_DualMarriage": (*QueryServiceLogic).ProcessTocDualMarriageLogic, + "toc_PhoneNumberRisk": (*QueryServiceLogic).ProcessTocPhoneNumberRiskLogic, + "toc_NetworkDuration": (*QueryServiceLogic).ProcessTocNetworkDurationLogic, + "toc_PhoneSecondaryCard": (*QueryServiceLogic).ProcessTocPhoneSecondaryCardLogic, + "toc_BankCardFourElements": (*QueryServiceLogic).ProcessTocBankCardFourElementsLogic, + "toc_EnterpriseCase": (*QueryServiceLogic).ProcessTocEnterpriseCaseLogic, + "toc_PersonJudicialDishonest": (*QueryServiceLogic).ProcessTocPersonJudicialDishonestLogic, + "toc_PersonConsumptionRestriction": (*QueryServiceLogic).ProcessTocPersonConsumptionRestrictionLogic, } func (l *QueryServiceLogic) PreprocessLogic(req *types.QueryServiceReq, product string) (*types.QueryServiceResp, error) { @@ -1171,6 +1174,131 @@ func (l *QueryServiceLogic) ProcessTocBankCardFourElementsLogic(req *types.Query return &types.QueryServiceResp{Id: cacheNo}, nil } + +func (l *QueryServiceLogic) ProcessTocEnterpriseCaseLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { + userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) + } + + // AES解密 + decryptData, DecryptDataErr := l.DecryptData(req.Data) + if DecryptDataErr != nil { + return nil, DecryptDataErr + } + + // 校验参数 + var data types.EntLawsuitReq + if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) + } + + if validatorErr := validator.Validate(data); validatorErr != nil { + return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) + } + + // 校验验证码 + verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) + if verifyCodeErr != nil { + return nil, verifyCodeErr + } + + // 缓存 + params := map[string]interface{}{ + "ent_name": data.EntName, + "ent_code": data.EntCode, + } + cacheNo, cacheDataErr := l.CacheData(params, "toc_EnterpriseCase", userID) + if cacheDataErr != nil { + return nil, cacheDataErr + } + + return &types.QueryServiceResp{Id: cacheNo}, nil +} + +// ProcessTocPersonJudicialDishonestLogic 个人失信 +func (l *QueryServiceLogic) ProcessTocPersonJudicialDishonestLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { + userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) + } + + // AES解密 + decryptData, DecryptDataErr := l.DecryptData(req.Data) + if DecryptDataErr != nil { + return nil, DecryptDataErr + } + + // 校验参数 + var data types.MarriageReq + if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) + } + + if validatorErr := validator.Validate(data); validatorErr != nil { + return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) + } + + // 校验验证码 + verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) + if verifyCodeErr != nil { + return nil, verifyCodeErr + } + + // 缓存 + params := map[string]interface{}{ + "name": data.Name, + "id_card": data.IDCard, + } + cacheNo, cacheDataErr := l.CacheData(params, "toc_PersonJudicialDishonest", userID) + if cacheDataErr != nil { + return nil, cacheDataErr + } + + return &types.QueryServiceResp{Id: cacheNo}, nil +} + +// ProcessTocPersonConsumptionRestrictionLogic 个人限高 +func (l *QueryServiceLogic) ProcessTocPersonConsumptionRestrictionLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { + userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) + } + + // AES解密 + decryptData, DecryptDataErr := l.DecryptData(req.Data) + if DecryptDataErr != nil { + return nil, DecryptDataErr + } + + // 校验参数 + var data types.MarriageReq + if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) + } + + if validatorErr := validator.Validate(data); validatorErr != nil { + return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) + } + + // 校验验证码 + verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) + if verifyCodeErr != nil { + return nil, verifyCodeErr + } + + // 缓存 + params := map[string]interface{}{ + "name": data.Name, + "id_card": data.IDCard, + } + cacheNo, cacheDataErr := l.CacheData(params, "toc_PersonConsumptionRestriction", userID) + if cacheDataErr != nil { + return nil, cacheDataErr + } + + return &types.QueryServiceResp{Id: cacheNo}, nil +} func (l *QueryServiceLogic) DecryptData(data string) ([]byte, error) { secretKey := l.svcCtx.Config.Encrypt.SecretKey key, decodeErr := hex.DecodeString(secretKey) diff --git a/app/user/cmd/api/internal/logic/query/querysingletestlogic.go b/app/user/cmd/api/internal/logic/query/querysingletestlogic.go new file mode 100644 index 0000000..d3640e7 --- /dev/null +++ b/app/user/cmd/api/internal/logic/query/querysingletestlogic.go @@ -0,0 +1,51 @@ +package query + +import ( + "context" + "encoding/json" + "github.com/pkg/errors" + "tydata-server/common/xerr" + + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type QuerySingleTestLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewQuerySingleTestLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QuerySingleTestLogic { + return &QuerySingleTestLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *QuerySingleTestLogic) QuerySingleTest(req *types.QuerySingleTestReq) (resp *types.QuerySingleTestResp, err error) { + featrueModel, err := l.svcCtx.FeatureModel.FindOneByApiId(l.ctx, req.Api) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "单查测试, 获取接口失败 : %d", err) + } + marshalParams, err := json.Marshal(req.Params) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "单查测试, 序列化参数失败 : %d", err) + } + apiResp, err := l.svcCtx.ApiRequestService.PreprocessRequestApi(marshalParams, req.Api) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "单查测试, 获取接口失败 : %d", err) + } + var respData interface{} + err = json.Unmarshal(apiResp, &respData) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "单查测试, 反序列化接口失败 : %d", err) + } + return &types.QuerySingleTestResp{ + Data: respData, + Api: featrueModel.Name, + }, nil +} diff --git a/app/user/cmd/api/internal/service/agentService.go b/app/user/cmd/api/internal/service/agentService.go index 02e8434..7427208 100644 --- a/app/user/cmd/api/internal/service/agentService.go +++ b/app/user/cmd/api/internal/service/agentService.go @@ -63,9 +63,12 @@ func NewAgentService(c config.Config, agentModel model.AgentModel, agentAuditMod func (l *AgentService) AgentProcess(ctx context.Context, order *model.Order) error { // 获取是否该订单是代理推广订单 agentOrderModel, err := l.AgentOrderModel.FindOneByOrderId(ctx, order.Id) - if err != nil { + if err != nil && !errors.Is(err, model.ErrNotFound) { return err } + if errors.Is(err, model.ErrNotFound) || agentOrderModel == nil { + return nil + } // 事务 transErr := l.AgentWalletModel.Trans(ctx, func(transCtx context.Context, session sqlx.Session) error { agentID := agentOrderModel.AgentId diff --git a/app/user/cmd/api/internal/service/apirequestService.go b/app/user/cmd/api/internal/service/apirequestService.go index 83ac52c..53d091f 100644 --- a/app/user/cmd/api/internal/service/apirequestService.go +++ b/app/user/cmd/api/internal/service/apirequestService.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "github.com/Masterminds/squirrel" + "github.com/bytedance/sonic" "github.com/tidwall/gjson" "github.com/zeromicro/go-zero/core/logx" "io" @@ -18,6 +19,7 @@ import ( "tydata-server/app/user/cmd/api/internal/config" "tydata-server/app/user/model" "tydata-server/pkg/lzkit/crypto" + "tydata-server/pkg/lzkit/lzUtils" ) type ApiRequestService struct { @@ -186,6 +188,12 @@ var requestProcessors = map[string]func(*ApiRequestService, []byte) ([]byte, err "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, } // PreprocessRequestApi 调用指定的请求处理函数 @@ -956,3 +964,190 @@ func (a *ApiRequestService) ProcessG20GZ01Request(params []byte) ([]byte, error) 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("递归反序列化") + } + marshal, err := sonic.Marshal(parseResult) + if err != nil { + return nil, fmt.Errorf("序列化失败: %v", err) + } + return marshal, 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 + +} diff --git a/app/user/cmd/api/internal/service/westdexService.go b/app/user/cmd/api/internal/service/westdexService.go index cf42d7e..4ffa578 100644 --- a/app/user/cmd/api/internal/service/westdexService.go +++ b/app/user/cmd/api/internal/service/westdexService.go @@ -6,7 +6,6 @@ import ( "fmt" "github.com/pkg/errors" "io" - "log" "net/http" "strconv" "time" @@ -99,18 +98,14 @@ func (w *WestDexService) CallAPI(code string, reqData map[string]interface{}) (r return nil, DecryptErr } return decryptedData, errors.New(westDexResp.Message) - log.Println(string(decryptedData)) } if westDexResp.Data == "" { return nil, errors.New(westDexResp.Message) } - // 解密响应数据 decryptedData, DecryptErr := crypto.WestDexDecrypt(westDexResp.Data, w.config.Key) if DecryptErr != nil { return nil, DecryptErr } - // 输出解密后的数据 - log.Println(string(decryptedData)) return decryptedData, nil } diff --git a/app/user/cmd/api/internal/types/types.go b/app/user/cmd/api/internal/types/types.go index 769619b..810eade 100644 --- a/app/user/cmd/api/internal/types/types.go +++ b/app/user/cmd/api/internal/types/types.go @@ -350,6 +350,16 @@ type QueryServiceResp struct { RefreshAfter int64 `json:"refreshAfter"` } +type QuerySingleTestReq struct { + Params map[string]interface{} `json:"params"` + Api string `json:"api"` +} + +type QuerySingleTestResp struct { + Data interface{} `json:"data"` + Api string `json:"api"` +} + type RegisterReq struct { Mobile string `json:"mobile" validate:"required,mobile"` Password string `json:"password" validate:"required,min=11,max=11,password"` diff --git a/go.mod b/go.mod index adb411f..792dd47 100644 --- a/go.mod +++ b/go.mod @@ -30,9 +30,12 @@ require ( github.com/alibabacloud-go/tea-xml v1.1.3 // indirect github.com/aliyun/credentials-go v1.3.10 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bytedance/sonic v1.13.0 // indirect + github.com/bytedance/sonic/loader v0.2.2 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/clbanning/mxj/v2 v2.5.5 // indirect + github.com/cloudwego/base64x v0.1.5 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/fatih/color v1.17.0 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect @@ -46,6 +49,7 @@ require ( github.com/hibiken/asynq v0.25.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.9 // indirect + github.com/klauspost/cpuid/v2 v2.0.9 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/leodido/go-urn v1.4.0 // indirect @@ -72,6 +76,7 @@ require ( github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tjfoc/gmsm v1.4.1 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 // indirect @@ -84,6 +89,7 @@ require ( go.opentelemetry.io/otel/trace v1.24.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/automaxprocs v1.6.0 // indirect + golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect golang.org/x/crypto v0.28.0 // indirect golang.org/x/net v0.30.0 // indirect golang.org/x/sync v0.9.0 // indirect diff --git a/go.sum b/go.sum index 48cd053..57609ee 100644 --- a/go.sum +++ b/go.sum @@ -72,6 +72,11 @@ github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/bytedance/sonic v1.13.0 h1:R+aSALdYjFT39PoytNFIxV8W7rb/ZxRpdQd+1TFZ2F0= +github.com/bytedance/sonic v1.13.0/go.mod h1:uVvFidNmlt9+wa31S1urfwwthTWteBgG0hWuoKAXTx8= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.2 h1:jxAJuN9fOot/cyz5Q6dUuMJF5OqQ6+5GfA8FjjQ0R4o= +github.com/bytedance/sonic/loader v0.2.2/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -80,6 +85,9 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/clbanning/mxj/v2 v2.5.5 h1:oT81vUeEiQQ/DcHbzSytRngP6Ky9O+L+0Bw0zSJag9E= github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4= +github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -146,6 +154,9 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -230,6 +241,7 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= @@ -247,6 +259,8 @@ github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhso github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho= github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/wechatpay-apiv3/wechatpay-go v0.2.20 h1:gS8oFn1bHGnyapR2Zb4aqTV6l4kJWgbtqjCq6k1L9DQ= github.com/wechatpay-apiv3/wechatpay-go v0.2.20/go.mod h1:A254AUBVB6R+EqQFo3yTgeh7HtyqRRtN2w9hQSOrd4Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -282,6 +296,8 @@ go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -428,3 +444,4 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= diff --git a/pkg/lzkit/lzUtils/json.go b/pkg/lzkit/lzUtils/json.go new file mode 100644 index 0000000..e44c371 --- /dev/null +++ b/pkg/lzkit/lzUtils/json.go @@ -0,0 +1,35 @@ +package lzUtils + +import "github.com/bytedance/sonic" + +func RecursiveParse(data interface{}) (interface{}, error) { + switch v := data.(type) { + case string: + // 尝试解析字符串是否为嵌套 JSON + var parsed interface{} + if err := sonic.Unmarshal([]byte(v), &parsed); err == nil { + return RecursiveParse(parsed) + } + return v, nil // 普通字符串直接返回 + case map[string]interface{}: + for key, val := range v { + parsed, err := RecursiveParse(val) + if err != nil { + return nil, err + } + v[key] = parsed + } + return v, nil + case []interface{}: + for i, item := range v { + parsed, err := RecursiveParse(item) + if err != nil { + return nil, err + } + v[i] = parsed + } + return v, nil + default: + return v, nil + } +}