112 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			112 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package FLXG | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"context" | ||
|  | 	"encoding/hex" | ||
|  | 	"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 FLXG0V3BLogic struct { | ||
|  | 	logx.Logger | ||
|  | 	ctx    context.Context | ||
|  | 	svcCtx *svc.ServiceContext | ||
|  | } | ||
|  | 
 | ||
|  | func NewFLXG0V3BLogic(ctx context.Context, svcCtx *svc.ServiceContext) *FLXG0V3BLogic { | ||
|  | 	return &FLXG0V3BLogic{ | ||
|  | 		Logger: logx.WithContext(ctx), | ||
|  | 		ctx:    ctx, | ||
|  | 		svcCtx: svcCtx, | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func (l *FLXG0V3BLogic) FLXG0V3B(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.FLXG0V3BRequest | ||
|  | 	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.FLXG0V3BFieldMapping, "data") | ||
|  | 
 | ||
|  | 	westResp, callAPIErr := l.svcCtx.WestDexService.CallAPI("G34BJ03", apiRequest, l.svcCtx.Config.WestConfig.SecretId) | ||
|  | 	if callAPIErr != nil { | ||
|  | 		if callAPIErr.Code == errs.ErrDataSource.Code { | ||
|  | 			encryptData, aesEncrypt := crypto.AesEncrypt(westResp, key) | ||
|  | 			if aesEncrypt != nil { | ||
|  | 				return "", errs.ErrSystem | ||
|  | 			} | ||
|  | 			return encryptData, callAPIErr | ||
|  | 		} | ||
|  | 		return "", callAPIErr | ||
|  | 	} | ||
|  | 
 | ||
|  | 	encryptData, aesEncrypt := crypto.AesEncrypt(westResp, key) | ||
|  | 	if aesEncrypt != nil { | ||
|  | 		return "", errs.ErrSystem | ||
|  | 	} | ||
|  | 	return encryptData, nil | ||
|  | } |