package FLXG import ( "context" "encoding/hex" "encoding/json" "tianyuan-api/apps/api/internal/common" "tianyuan-api/apps/api/internal/validator" "tianyuan-api/apps/api/internal/westmodel" "tianyuan-api/pkg/crypto" "tianyuan-api/pkg/errs" "tianyuan-api/apps/api/internal/svc" "tianyuan-api/apps/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) type FLXG54F5Logic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewFLXG54F5Logic(ctx context.Context, svcCtx *svc.ServiceContext) *FLXG54F5Logic { return &FLXG54F5Logic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *FLXG54F5Logic) FLXG54F5(req *types.Request) (resp *types.Response, err *errs.AppError) { secretKey, ok := l.ctx.Value("secretKey").(string) if !ok { return &types.Response{}, errs.ErrSystem } transactionID, ok := l.ctx.Value("transactionID").(string) if !ok { return &types.Response{}, errs.ErrSystem } // 1、解密 key, decodeErr := hex.DecodeString(secretKey) if decodeErr != nil { return nil, errs.ErrSystem } decryptData, aesDecryptErr := crypto.AesDecrypt(req.Data, key) if aesDecryptErr != nil || len(decryptData) == 0 { return nil, errs.ErrParamDecryption } // 2、校验 var data validator.FLXG54F5Request if validatorErr := validator.ValidateAndParse(decryptData, &data); validatorErr != nil { return nil, errs.ErrParamValidation } // 3、西部加密 westConfig := l.svcCtx.Config.WestConfig encryptedFields, encryptStructFieldsErr := common.EncryptStructFields(data, westConfig.Key) if encryptStructFieldsErr != nil { logx.Errorf("西部加密错误:%v", encryptStructFieldsErr) return nil, errs.ErrSystem } // 4、发送请求到西部 logx.Infof("交易号:%s", transactionID) apiRequest := common.MapStructToAPIRequest(encryptedFields, westmodel.FLXG54F5FieldMapping, "data") westResp, callAPIErr := l.svcCtx.WestDexService.CallAPI("G03HZ01", apiRequest) if callAPIErr != nil { return nil, errs.ErrSystem } // 5、响应解析 var respData westmodel.G03HZ01Response unmarshalErr := json.Unmarshal(westResp, &respData) if unmarshalErr != nil { return nil, errs.ErrSystem } if respData.Code != "0000" { return nil, errs.ErrSystem } encryptData, aesEncrypt := crypto.AesEncrypt(westResp, key) if aesEncrypt != nil { return nil, errs.ErrSystem } return &types.Response{ Data: encryptData, }, nil }