package siterpc import ( "encoding/json" "errors" "strconv" "time" "git.tetele.net/tgo/crypter" "github.com/golang/protobuf/proto" ) type SiteConfigItemReqArg struct { SiteId string `json:"site_id"` Dbname string `json:"dbname"` Key string `json:"key"` } type SiteConfigItemRes struct { Type string Value string Exist bool } /** * 由配置key取对应value * 请求及回均加密验签 * 2021/01/20 * GZ */ func GetConfigItem(site_id, dbname, key string, url ...string) (*SiteConfigItemRes, error) { ret, err := getconfig(site_id, dbname, key, url...) if err != nil { return ret, err } if ret.Exist == false { return ret, errors.New("no data") } return ret, err } func GetConfig(site_id, dbname, key string, url ...string) (*SiteConfigItemRes, error) { return getconfig(site_id, dbname, key, url...) } func getconfig(site_id, dbname, key string, url ...string) (*SiteConfigItemRes, error) { conn, err := rpc_server_conn(url...) if err != nil { return nil, err } defer conn.Close() arg := SiteConfigItemReqArg{site_id, dbname, key} data_json, err := json.Marshal(arg) if err != nil { return nil, err } now_int64 := time.Now().Unix() encryData := crypter.DesEn(string(data_json), "confdata") now := strconv.FormatInt(now_int64, 10) sign := Sign(encryData, now) req := &Request{proto.String(encryData), proto.String(now), proto.String(sign), nil} res := &Response{} err = conn.GetConfig(req, res) if err != nil { return nil, err } res_data := res.GetData() if res_data != "" { time_int64, err := strconv.ParseInt(res.GetTime(), 10, 64) if err != nil { return nil, err } now_int64 = time.Now().Unix() if now_int64-time_int64 > 10 || time_int64-now_int64 > 10 { //时间误差前后10秒,返回 return nil, errors.New("返回时间错误") } check_sign := CheckSign(res.GetSign(), res_data, res.GetTime()) if !check_sign { return nil, errors.New("返回数据签名错误") } //解密 res_data_de := crypter.DesDe(res_data, "confdata") var res_arr SiteConfigItemRes err = json.Unmarshal([]byte(res_data_de), &res_arr) if err != nil { return nil, err } return &res_arr, nil } return nil, nil }