package daichong import ( "context" "encoding/hex" "fmt" "net/url" "reflect" "strconv" "time" "91porn-server/app/appg" "91porn-server/common" "91porn-server/common/crypt" "91porn-server/common/httputil" "91porn-server/common/log" "91porn-server/models/commod" ) // 发起聊天 func TakeChat(req ChatReq, domian string) (chatResp ChatResp, err error) { var code int param, _ := common.ToJsonM(req) c, cancle := context.WithTimeout(context.Background(), time.Duration(appg.Conf.HttpOptions.DcCtxTimeOut)*time.Second) defer cancle() code, err = httputil.DefaultClientPostJsonWithResp(&chatResp, common.BindUrl(domian, takeChat), nil, param) common.Go(func() { <-c.Done() fmt.Print("current http method takeChat", c.Err()) }) log.Info("http method TakeChat response code ==>", log.Any("statusCode", code), log.Any("respCode", chatResp.Code)) if err != nil { log.Error("TakeChat failed", log.E(err)) } return } // 获取订单信息 func GetOrder(req CommonReq, domian string) (orderResp OrderResp, err error) { param, _ := common.ToJsonM(req) code, err := httputil.DefaultClientPostJsonWithResp(&orderResp, common.BindUrl(domian, getOrder), nil, param) log.Info("http method GetOrder response code ==>", log.Any("statusCode", code), log.Any("respCode", orderResp.Code)) if err != nil { log.Error("GetOrder failed", log.E(err)) } return } // 上分通知 func OrderCallBack(ctx context.Context, req CommonReq, domian string) (resp commod.Resp, err error) { param, _ := common.ToJsonM(req) code, err := httputil.DefaultClientPostJsonWithResp(&resp, common.BindUrl(domian, orderCallBack), nil, param) log.InfoX(ctx, "http method OrderCallBack response code ==>", log.Any("statusCode", code), log.Any("respCode", resp.Code)) if err != nil { log.ErrorX(ctx, "OrderCallBack failed", log.E(err)) } return } // 上传图片 func UploadFile(req UploadFileReq, domian string) (resp commod.Resp, err error) { header := map[string]string{ "Authorization": req.UserID + "&" + req.SessionId, } data := map[string]interface{}{ "file": req.File, } code, err := httputil.DefaultClientPostJsonWithResp(&resp, common.BindUrl(domian, uploadFile, req.FileName), header, data) log.Info("http method UploadFile response code ==>", log.Any("statusCode", code), log.Any("respCode", resp.Code)) if err != nil { log.Error("UploadFile failed", log.E(err)) } return } // 根据订单ID获取聊天记录 func GetChatRecordsByOrderId(req CommonReq, domian string) (resp RecordResp, err error) { code, err := httputil.DefaultClientPostJsonWithResp(&resp, common.BindUrl(domian, getChatRecordsByOrderId), nil, req) log.Info("http method GetChatRecordsByOrderId response code ==>", log.Any("statusCode", code), log.Any("respCode", resp.Code)) if err != nil { log.Error("GetChatRecordsByOrderId failed", log.E(err)) } return } // 获取商人支付信息 func GetTraderPayInfo(req CommonReq, domian string) (resp PayInfoResp, err error) { code, err := httputil.DefaultClientPostJsonWithResp(&resp, common.BindUrl(domian, getTraderPayInfo), nil, req) log.Info("http method GetTraderPayInfo response code ==>", log.Any("statusCode", code), log.Any("respCode", resp.Code)) if err != nil { log.Error("GetTraderPayInfo failed", log.E(err)) } return } // 结构体转换为加密的16进制字符串 func Convert2Sign(obj interface{}, appSecret string) (string, error) { urlParam, err := crypt.Strcut2UrlValue(obj) if err != nil { log.Warn("chat sign struct convert to url values wrong", log.Any("urlParam", urlParam), log.Any("warn", err)) return "", err } log.Info("covert obj to urlParam ==>", log.Any("obj", obj), log.Any("urlParam", urlParam)) sign, err := crypt.AesEncrypt(urlParam, appSecret) if err != nil { log.Warn("create sign data wrong", log.Any("warn", err)) return "", err } cryptdata := hex.EncodeToString(sign) return cryptdata, nil } // 加密的16进制字符串转为结构体 func Sign2Struct(obj interface{}, sign, appSecret string) error { cryptdata, err := hex.DecodeString(sign) if err != nil { log.Warn("hex decode string occour error", log.Any("warn", err)) return err } origin, err := crypt.CoreAesDecrypt(cryptdata, appSecret) if err != nil { log.Warn("core aes decrypt sign data wrong", log.Any("warn", err)) return err } t := reflect.TypeOf(obj) m := make(map[string]interface{}) u, err := url.ParseQuery(origin) if err == nil { for k, v := range u { s, _ := t.Elem().FieldByName(common.Ucfirst(k)) typ := s.Type.Kind() switch typ { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: rv, _ := strconv.ParseInt(v[0], 10, 64) m[k] = rv case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: rv, _ := strconv.ParseUint(v[0], 10, 64) m[k] = rv default: m[k] = v[0] } } } if len(m) > 0 { return common.Map2JSONStruct(obj, m) } return nil }