package IVYZ import ( "context" "encoding/hex" "encoding/json" "fmt" "strings" "tianyuan-api/apps/api/internal/common" "tianyuan-api/apps/api/internal/svc" "tianyuan-api/apps/api/internal/types" "tianyuan-api/apps/api/internal/validator" "tianyuan-api/apps/api/internal/westmodel" "tianyuan-api/pkg/crypto" "tianyuan-api/pkg/errs" "github.com/tidwall/gjson" "github.com/zeromicro/go-zero/core/logx" ) type IVYZ5733Logic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewIVYZ5733Logic(ctx context.Context, svcCtx *svc.ServiceContext) *IVYZ5733Logic { return &IVYZ5733Logic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *IVYZ5733Logic) IVYZ5733(req *types.Request) (resp string, err *errs.AppError) { var status string var charges bool var remark = "" secretKey, ok := l.ctx.Value("secretKey").(string) if !ok { return "", errs.ErrSystem } transactionID, ok := l.ctx.Value("transactionID").(string) if !ok { return "", errs.ErrSystem } userId, userIdOk := l.ctx.Value("userId").(int64) if !userIdOk { return "", errs.ErrSystem } productCode, productCodeOk := l.ctx.Value("productCode").(string) if !productCodeOk || productCode == "" { return "", errs.ErrSystem } defer func() { if err != nil { status = "failed" charges = false } else { status = "success" charges = true } sendApiRequestMessageErr := l.svcCtx.ApiRequestMqsService.SendApiRequestMessage(l.ctx, transactionID, userId, productCode, status, charges, remark) if sendApiRequestMessageErr != nil { logx.Errorf("发送 API 请求消息失败: %v", err) } }() // 1、解密 key, decodeErr := hex.DecodeString(secretKey) if decodeErr != nil { return "", errs.ErrSystem } decryptData, aesDecryptErr := crypto.AesDecrypt(req.Data, key) if aesDecryptErr != nil || len(decryptData) == 0 { return "", errs.ErrParamDecryption } // 2、校验 var data validator.IVYZ5733Request if validatorErr := validator.ValidateAndParse(decryptData, &data); validatorErr != nil { return "", errs.ErrParamValidation } // 3、西部加密 westConfig := l.svcCtx.Config.WestConfig encryptedFields, encryptStructFieldsErr := common.EncryptStructFields(data, westConfig.Key) if encryptStructFieldsErr != nil { logx.Errorf("西部加密错误:%v", encryptStructFieldsErr) return "", errs.ErrSystem } // 4、发送请求到西部 logx.Infof("交易号:%s", transactionID) apiRequest := common.MapStructToAPIRequest(encryptedFields, westmodel.IVYZ5733FieldMapping, "data") westResp, callAPIErr := l.svcCtx.WestDexService.CallAPI("G09XM02", apiRequest, l.svcCtx.Config.WestConfig.SecretId) if callAPIErr != nil { if callAPIErr.Code == errs.ErrDataSource.Code { return "", callAPIErr } return "", callAPIErr } encryptData, aesEncrypt := crypto.AesEncrypt(westResp, key) if aesEncrypt != nil { return "", errs.ErrSystem } return encryptData, nil } func handleResponse(resp []byte) ([]byte, error) { 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 }