Browse Source

创建商品订单

kobe6258 7 months ago
parent
commit
a87f49e3c3

+ 54 - 18
api/ht_account_api.go

@@ -3,26 +3,30 @@ package api
 import (
 	"encoding/base64"
 	"encoding/json"
+	"eta/eta_mini_ht_api/common/component/cache"
 	"eta/eta_mini_ht_api/common/component/config"
 	logger "eta/eta_mini_ht_api/common/component/log"
 	"eta/eta_mini_ht_api/common/contants"
 	"eta/eta_mini_ht_api/common/exception"
 	"eta/eta_mini_ht_api/common/utils/auth"
 	"eta/eta_mini_ht_api/common/utils/client"
+	"eta/eta_mini_ht_api/common/utils/redis"
 	"fmt"
 	"io"
 	"sync"
+	"time"
 )
 
 const (
-	clientSuitInfoUrl = "/open/api/getClientSuitInfo"
+	clientSuitInfoUrl = "/wt/front/api/open/api/getClientSuitInfo"
 	accessTokenUrl    = "/api/openapi/authless/token"
 )
 
 var (
 	htFacadeOnce sync.Once
 
-	htFacade *HTAccountApi
+	htFacade   *HTAccountApi
+	redisUtils = cache.GetInstance()
 )
 
 type HTAccountApi struct {
@@ -84,18 +88,44 @@ type EncodeReq struct {
 	Param string `json:"param"`
 }
 
+func (f *HTAccountApi) getToken() (token string, err error) {
+	accessToken := redis.GenerateCAPAccessTokenKey()
+	token = redisUtils.GetString(accessToken)
+	var tokenInfo TokenInfo
+	if token == "" {
+		tokenInfo, err = f.GetAccessToken()
+		if err != nil {
+			logger.Error("获取token失败%v", err)
+			return
+		}
+		var parseErr error
+		expireTime, parseErr := time.Parse(time.DateTime, tokenInfo.ExpiresAt)
+		if parseErr != nil {
+			logger.Error("解析过期时间失败:%v", parseErr)
+			err = parseErr
+			return
+		}
+		duration := expireTime.Sub(time.Now()).Seconds()
+		token = tokenInfo.AccessToken
+		_ = redisUtils.SetString(accessToken, tokenInfo.AccessToken, int(duration)-5)
+	}
+	return
+}
 func (f *HTAccountApi) GetCustomerRiskLevelInfo(req ClientSuitInfoReq) (info CustomerAccountInfo, err error) {
 	url := f.htConfig.GetAccountApiUrl() + clientSuitInfoUrl
+	token, err := f.getToken()
+	if err != nil {
+		return
+	}
 	publicKey, err := auth.ParsePublicKey(f.htConfig.GetWebhookPublicKey())
 	if err != nil {
 		logger.Error("解析公钥失败:%v", err)
 	}
 	reqStr, err := json.Marshal(req)
 	encodeData, _ := auth.EncryptWithRSA(publicKey, reqStr)
-	resp, err := f.client.Post(url, EncodeReq{
+	resp, err := f.client.PostWithAuth(url, EncodeReq{
 		Param: base64.StdEncoding.EncodeToString(encodeData),
-	})
-	err = nil
+	}, token)
 	if err != nil {
 		logger.Error("调用CAP customerRiskInfo接口失败:[%v]", err)
 		return
@@ -107,12 +137,8 @@ func (f *HTAccountApi) GetCustomerRiskLevelInfo(req ClientSuitInfoReq) (info Cus
 		}
 	}(resp.Body)
 
-	//body, _ := io.ReadAll(resp.Body)
-	ss := WebhookRequest{
-		Data: "Zta5UfBQpvZSQPMo41CGda6/MnMKvz4cTiBptQ/KPiBTiyDDnqE7remZfKzPqYkuzcMDTN7lrr5W2by2gsTd2JjTlg3NzfotoorqHbdjP6FyVCRBCbkSM1OOnkuldtbWaP1b0APh1QhT40zdOvDqwnYcSa7z3zEG0EKh6kYGCcd+ugSmXxrZzZR8uguYZniFQFc+Or2dDFAuQfOhmN9kScQ90iHhlJ6g9pqlSB4sJxA8S2q3MR1qkW1MOA/9Z/Mgj2fy2m2AjP18hlzKMP71A/EezBbusXVNo5occ9xV2L7tfbDqnpk77NJL+YnoIoPhj7WjFC3pDXfD3phHuov8CQ==",
-	}
-	jsonstr, _ := json.Marshal(ss)
-	return decodeResponse(jsonstr)
+	body, _ := io.ReadAll(resp.Body)
+	return decodeResponse(body)
 }
 
 type AccessTokenReq struct {
@@ -180,8 +206,9 @@ type TokenInfo struct {
 	ExpiresAt   string
 }
 
-type WebhookRequest struct {
-	Data string `json:"data"`
+type CustomerRiskInfoResp struct {
+	Error Error  `json:"error"`
+	Data  string `json:"data"`
 }
 
 type SyncCustomerRiskLevelReq struct {
@@ -211,10 +238,20 @@ type CustomerAccountInfo struct {
 }
 
 func decodeResponse(resp []byte) (info CustomerAccountInfo, err error) {
-	webhookRequest := new(WebhookRequest)
-	err = json.Unmarshal(resp, &webhookRequest)
+	customerRiskInfoResp := new(CustomerRiskInfoResp)
+	err = json.Unmarshal(resp, &customerRiskInfoResp)
+	if err != nil {
+		logger.Error("customerRiskInfoResp解析失败: %v", err)
+		return
+	}
 	if err != nil {
-		logger.Error("WebhookRequest解析失败: %v", err)
+		logger.Warn("[cap 接口调用]解析客户风险信息接口应答失败:%v", err)
+		err = exception.New(exception.GetCapTokenFailed)
+		return
+	}
+	if customerRiskInfoResp.Error.ErrorNo != "0" {
+		logger.Warn("[cap 接口调用] 获取客户风险信息失败:[code:%v, msg:%v, path:%v]", customerRiskInfoResp.Error.ErrorNo, customerRiskInfoResp.Error.ErrorInfo, customerRiskInfoResp.Error.ErrorPathInfo)
+		err = exception.NewWithException(exception.GetCustomerRiskInfoFailed, customerRiskInfoResp.Error.ErrorInfo)
 		return
 	}
 	privateKey, err := auth.ParsePrivateKey(htFacade.htConfig.GetWebhookPrivateKey())
@@ -222,8 +259,7 @@ func decodeResponse(resp []byte) (info CustomerAccountInfo, err error) {
 		logger.Error("解析私钥失败: %v", err)
 		return
 	}
-	logger.Info("解码请求: %v", webhookRequest.Data)
-	decodeData, err := auth.DecryptWithRSA(privateKey, webhookRequest.Data)
+	decodeData, err := auth.DecryptWithRSA(privateKey, customerRiskInfoResp.Data)
 	if err != nil {
 		logger.Error("解密请求体失败: %v", err)
 		return

+ 28 - 0
common/contants/sys_config_enum.go

@@ -1 +1,29 @@
 package contants
+
+type Config struct {
+	ConfigId   int
+	ConfigType string
+}
+
+const (
+	ConfigTypeInt  = "int"
+	ConfigTypeStr  = "string"
+	ConfigTypeByte = "byte"
+)
+const (
+	// configCode
+	HTCPELoginUrl = "HtCpeLoginUrl"
+	authToken     = "int"
+	byte          = "byte"
+)
+
+// SysConfigMap 用于存储错误码和错误信息的映射
+var SysConfigMap = map[string]*Config{
+	HTCPELoginUrl: {ConfigId: 1, ConfigType: ConfigTypeStr},
+	authToken:     {ConfigId: 2, ConfigType: ConfigTypeInt},
+	byte:          {ConfigId: 3, ConfigType: ConfigTypeByte},
+}
+
+func GetConfig(code string) *Config {
+	return SysConfigMap[code]
+}

+ 6 - 1
common/exception/exc_enums.go

@@ -19,6 +19,8 @@ const (
 	Unauthorized
 	SysError
 	QueryRiskMappingError
+	IllegalConfigType
+	GetConfigValueFailed
 )
 
 // BIZErrCode  业务错误
@@ -123,6 +125,7 @@ const (
 	WebhookErrCode int = iota + 80000
 	SyncRiskError
 	GetCapTokenFailed
+	GetCustomerRiskInfoFailed
 	GenerateRiskTestTokenFailed
 )
 const (
@@ -149,6 +152,8 @@ var ErrorMap = map[int]string{
 	IllegalAreaCode:       "无效的区号",
 	MediaTypeError:        "媒体类型非法",
 	GetAnalystListFailed:  "获取研究员列表失败",
+	IllegalConfigType:     "不合法的配置项值类型",
+	GetConfigValueFailed:  "配置获取失败",
 	//用户
 	TemplateUserNotFound:               "临时用户记录不存在",
 	LogoutFailed:                       "退出登录失败",
@@ -216,7 +221,7 @@ var ErrorMap = map[int]string{
 	SyncRiskError:               "同步风险等级失败",
 	GetCapTokenFailed:           "获取cap token失败",
 	GenerateRiskTestTokenFailed: "生成风险测评token失败",
-
+	GetCustomerRiskInfoFailed:   "查询客户风险信息失败",
 	//order
 	IllegalOrderStatus:   "非法的订单状态",
 	OrderPayTimeoutError: "订单支付超时",

+ 30 - 1
common/utils/client/http_client.go

@@ -99,7 +99,36 @@ func (hc *HttpClient) Post(url string, data interface{}) (resp *http.Response, e
 	}
 	return
 }
-
+func (hc *HttpClient) PostWithAuth(url string, data interface{}, token string) (resp *http.Response, err error) {
+	dataStr, err := json.Marshal(data)
+	if err != nil {
+		logger.Error("请求data json序列化失败,err:" + err.Error())
+	}
+	body := io.NopCloser(strings.NewReader(string(dataStr)))
+	req, err := http.NewRequest(http.MethodPost, url, body)
+	req.Header.Set("Content-Type", "application/json")
+	req.Header.Set("Authorization", token)
+	if err != nil {
+		logger.Error("创建POST请求失败: %v", err)
+	}
+	resp, err = hc.DoWithRetry(req.Context(), req)
+	code := resp.StatusCode
+	if code != 200 {
+		logger.Error("请求错误应答,状态码:%d", code)
+		errMsg := fmt.Sprintf("请求状态码异常,StatusCode:[%d]", code)
+		respBody, respErr := io.ReadAll(resp.Body)
+		if respErr != nil {
+			logger.Error("读取body失败,err:%v", err)
+			err = errors.New(errMsg)
+			return
+		}
+		logger.Error("请求错误应答,body:%s", string(respBody))
+		errMsg = fmt.Sprintf("%s,body:%s", errMsg, string(respBody))
+		err = errors.New(errMsg)
+		return
+	}
+	return
+}
 func (hc *HttpClient) Get(url string) (resp *http.Response, err error) {
 	req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, url, nil)
 	if err != nil {

+ 50 - 0
controllers/sys/sys_controller.go

@@ -1 +1,51 @@
 package sys
+
+import (
+	"eta/eta_mini_ht_api/common/contants"
+	"eta/eta_mini_ht_api/controllers"
+	configService "eta/eta_mini_ht_api/service/sys"
+)
+
+type SysController struct {
+	controllers.BaseController
+}
+type SysconfigResp struct {
+	Value interface{}
+}
+
+// GetRiskInfoToken  获取风险测评问卷请求Token
+// @Summary 获取风险测评问卷请求Token
+// @Description 获取风险测评问卷请求Token
+// @Success 200 {object} controllers.BaseResponse
+// @router /config [get]
+func (s *SysController) GetConfig(config string) {
+	controllers.Wrap(&s.BaseController, func() (result *controllers.WrapData, err error) {
+		result = s.InitWrapData("获取配置项失败")
+		sysConfig := contants.GetConfig(config)
+		if sysConfig == nil {
+			s.FailedResult("配置项不存在", result)
+			return
+		}
+		var value interface{}
+		switch sysConfig.ConfigType {
+		case "string":
+			value, err = configService.GetStrConfig(sysConfig.ConfigId)
+		case "int":
+			value, err = configService.GetIntConfig(sysConfig.ConfigId)
+		case "byte":
+			value, err = configService.GetByteConfig(sysConfig.ConfigId)
+		default:
+			s.FailedResult("配置项类型错误", result)
+			return
+		}
+		if err != nil {
+			s.FailedResult("配置项获取失败", result)
+			return
+		}
+		result = s.InitWrapData("风险测评问卷请求token生成成功")
+		s.SuccessResult("success", SysconfigResp{
+			Value: value,
+		}, result)
+		return
+	})
+}

+ 0 - 1
controllers/user/account_controller.go

@@ -54,7 +54,6 @@ func (a *AccountController) GetRiskInfoToken() {
 		token, err := facade.GetRiskTestToken(userInfo.Mobile)
 		if err != nil {
 			logger.InfoWithTraceId(a.Ctx, err.Error())
-
 			a.FailedResult("风险测评问卷请求token生成失败", result)
 			return
 		}

+ 31 - 0
domian/config/sys_config.go

@@ -1 +1,32 @@
 package config
+
+import (
+	logger "eta/eta_mini_ht_api/common/component/log"
+	"eta/eta_mini_ht_api/common/exception"
+	"eta/eta_mini_ht_api/models/sys"
+)
+
+func GetConfigValue(configId int, configType string) (value interface{}, err error) {
+	config, err := sys.GetConfig(configId)
+	if err != nil {
+		logger.Error("获取配置失败:%v,配置项[%d]", err, configId)
+		err = exception.NewWithException(exception.GetConfigValueFailed, err.Error())
+		return
+	}
+	if config.ConfigType != configType {
+		logger.Error("配置项类型不符 配置类型:%v,获取类型:%v", err, configId)
+		err = exception.NewWithException(exception.IllegalConfigType, "配置项类型不符")
+	}
+	switch configType {
+	case "int":
+		value = config.IntValue
+	case "string":
+		value = config.StrValue
+	case "byte":
+		value = config.ByteValue
+	default:
+		logger.Error("不支持的配置类型:%v", configType)
+		err = exception.New(exception.IllegalConfigType)
+	}
+	return
+}

+ 2 - 4
main.go

@@ -1,7 +1,6 @@
 package main
 
 import (
-	"encoding/base64"
 	"eta/eta_mini_ht_api/api"
 	_ "eta/eta_mini_ht_api/common/component"
 	"eta/eta_mini_ht_api/common/component/cache"
@@ -15,7 +14,6 @@ import (
 	"eta/eta_mini_ht_api/models/ht"
 	_ "eta/eta_mini_ht_api/routers"
 	_ "eta/eta_mini_ht_api/task"
-	"fmt"
 	"github.com/beego/beego/v2/server/web"
 	"sync"
 	"time"
@@ -62,8 +60,8 @@ func initThirdPartyAccessToken() {
 			return
 		}
 		duration := expireTime.Sub(time.Now()).Seconds()
-		_ = redisUtils.SetString(accessToken, token.AccessToken, int(duration))
-		fmt.Printf(base64.StdEncoding.EncodeToString([]byte(token.AccessToken)))
+		_ = redisUtils.SetString(accessToken, token.AccessToken, int(duration)-5)
+		//fmt.Printf(base64.StdEncoding.EncodeToString([]byte(token.AccessToken)))
 	}
 }
 func initReport() {

+ 35 - 0
models/sys/sys_config.go

@@ -1 +1,36 @@
 package sys
+
+import (
+	"eta/eta_mini_ht_api/models"
+	"gorm.io/gorm"
+	"time"
+)
+
+// SysConfig 表示 sys_config 表的结构体
+type SysConfig struct {
+	ID          int       `gorm:"primaryKey;autoIncrement" json:"id"`
+	ConfigID    int       `gorm:"column:config_id" json:"config_id"`
+	ConfigName  string    `gorm:"column:config_name" json:"config_name"`
+	ConfigType  string    `gorm:"column:config_type;type:enum('string','int','byte')" json:"config_type"`
+	Deleted     int       `gorm:"column:deleted" json:"deleted"`
+	StrValue    string    `gorm:"column:strValue" json:"str_value"`
+	IntValue    int       `gorm:"column:int_value" json:"int_value"`
+	ByteValue   string    `gorm:"column:byte_value" json:"byte_value"`
+	CreatedTime time.Time `gorm:"column:created_time" json:"created_time"`
+	UpdatedTime time.Time `gorm:"column:updated_time;default:CURRENT_TIMESTAMP;autoUpdateTime" json:"updated_time"`
+}
+
+func (SysConfig) TableName() string {
+	return "sys_config"
+
+}
+
+func (sys *SysConfig) BeforeCreate(db *gorm.DB) {
+	sys.CreatedTime = time.Now()
+}
+
+func GetConfig(configId int) (config SysConfig, err error) {
+	db := models.Main()
+	err = db.Where("config_id = ? and deleted=0", configId).First(&config).Error
+	return
+}

+ 11 - 0
routers/commentsRouter.go

@@ -148,6 +148,17 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/sys:SysController"] = append(beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/sys:SysController"],
+        beego.ControllerComments{
+            Method: "GetConfig",
+            Router: `/config`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(
+				param.New("config"),
+			),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:AccountController"] = append(beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:AccountController"],
         beego.ControllerComments{
             Method: "GetRiskInfoToken",

+ 6 - 0
routers/router.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_mini_ht_api/controllers/order"
 	"eta/eta_mini_ht_api/controllers/product"
 	"eta/eta_mini_ht_api/controllers/report"
+	"eta/eta_mini_ht_api/controllers/sys"
 	"eta/eta_mini_ht_api/controllers/user"
 	"eta/eta_mini_ht_api/controllers/web_hook"
 	"eta/eta_mini_ht_api/middleware"
@@ -80,6 +81,11 @@ func init() {
 				&controllers.WebSocketController{},
 			),
 		),
+		web.NSNamespace("/system",
+			web.NSInclude(
+				&sys.SysController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 44 - 0
service/sys/sys_config.go

@@ -1 +1,45 @@
 package sys
+
+import (
+	logger "eta/eta_mini_ht_api/common/component/log"
+	"eta/eta_mini_ht_api/domian/config"
+)
+
+const (
+	ConfigTypeInt  = "int"
+	ConfigTypeStr  = "string"
+	ConfigTypeByte = "byte"
+)
+
+func GetStrConfig(configId int) (value string, err error) {
+	var configVal interface{}
+	configVal, err = config.GetConfigValue(configId, ConfigTypeStr)
+	if err != nil {
+		logger.Error("获取配置失败:%v,配置项[%d]", err, configId)
+		return
+	}
+	value = configVal.(string)
+	return
+}
+
+func GetIntConfig(configId int) (value int, err error) {
+	var configVal interface{}
+	configVal, err = config.GetConfigValue(configId, ConfigTypeInt)
+	if err != nil {
+		logger.Error("获取配置失败:%v,配置项[%d]", err, configId)
+		return
+	}
+	value = configVal.(int)
+	return
+}
+
+func GetByteConfig(configId int) (value string, err error) {
+	var configVal interface{}
+	configVal, err = config.GetConfigValue(configId, ConfigTypeByte)
+	if err != nil {
+		logger.Error("获取配置失败:%v,配置项[%d]", err, configId)
+		return
+	}
+	value = configVal.(string)
+	return
+}