package elong_hotel import ( "context" "crypto/md5" "errors" "fmt" "net/url" "time" "github.com/zeromicro/go-zero/core/logx" "github.com/zywaited/xcopy" "repository.lenntc.com/lenntc/third-platform-sdk/client" "repository.lenntc.com/lenntc/third-platform-sdk/util" ) // ElongHotelApi 同程酒店的api // Api defines the interface of elong_hotel api type ElongHotelApi interface { // GetExternalChannelConfig 获取渠道配置信息 GetExternalChannelConfig(ctx context.Context, req GetExternalChannelConfigRequest, env string) (*ExternalChannelConfigResponse, error) // GenerateWechatUrl 生成微信小程序链接 GenerateWechatUrl(ctx context.Context, req GenerateWechatUrlRequest) (string, error) // GenerateH5Url 生成H5链接 GenerateH5Url(ctx context.Context, req GenerateH5UrlRequest) (string, error) // QueryOrderList 查询订单列表 QueryOrderList(ctx context.Context, req QueryOrderListRequest, env string) (*ExternalOrderData, error) } type elongHotelApiImpl struct { log logx.Logger client *Client } func newElongHotelApiImpl(log logx.Logger, client *Client) ElongHotelApi { return &elongHotelApiImpl{ log: log, client: client, } } // GetExternalChannelConfig 生成短链 func (t *elongHotelApiImpl) GetExternalChannelConfig(ctx context.Context, req GetExternalChannelConfigRequest, env string) (*ExternalChannelConfigResponse, error) { var apiUrl string token := t.client.authConfig.Token tn := time.Now() actionTime := tn.Unix() h := md5.New() h.Write([]byte(fmt.Sprintf("%s%d", token, actionTime))) queryArgs := &GetExternalChannelConfigReq{ ActionTime: tn.Unix(), Token: token, Code: string(h.Sum(nil)), Trackid: req.Trackid, } args := util.StructToMap(queryArgs) request := &client.HttpRequest{Headers: t.client.headers, QueryArgs: args} response := new(GetExternalChannelConfigResponse) if env == EnvHuidu { apiUrl = HDApiDomain + GetLinkUri } else { apiUrl = ApiDomain + GetLinkUri } if err := t.client.HttpGet(apiUrl, request, &client.HttpResponse{Result: response}); err != nil { return nil, err } if response.Code != 200 { t.log.WithFields(logx.LogField{Key: "data", Value: map[string]any{"req": req, "resp": response}}). Errorf("[elongHotelApiImpl][GetExternalChannelConfig] response result error: %s", response.Msg) return nil, errors.New(response.Msg) } return response.Data, nil } // GenerateWechatUrl 生成微信小程序链接 func (t *elongHotelApiImpl) GenerateWechatUrl(ctx context.Context, req GenerateWechatUrlRequest) (string, error) { if len(req.ActivityUrl) == 0 { return "", errors.New("url参数不能为空") } u, err := url.Parse(req.ActivityUrl) if err != nil { return "", errors.New("activityUrl不是一个url") } urlParams := u.Query() src := urlParams.Get("src") src, err = url.QueryUnescape(src) if err != nil { return "", errors.New("src参数解析失败") } srcUrl, err := url.Parse(src) if err != nil { return "", errors.New("activityUrl格式不符合要求,src参数不是一个url") } srcParams := srcUrl.Query() srcParams.Add("outUserid", req.Uid) srcParams.Add("outToken", t.client.authConfig.Token) srcUrl.RawQuery = srcParams.Encode() newSrc := url.QueryEscape(srcUrl.String()) urlParams.Set("src", newSrc) urlSrc := fmt.Sprintf("src=%s", newSrc) urlParams.Del("src") u.RawQuery = fmt.Sprintf("%s&%s", urlSrc, urlParams.Encode()) return u.String(), nil } // GenerateH5Url 生成H5链接 func (t *elongHotelApiImpl) GenerateH5Url(ctx context.Context, req GenerateH5UrlRequest) (string, error) { if len(req.ActivityUrl) == 0 { return "", errors.New("url参数不能为空") } u, err := url.Parse(req.ActivityUrl) if err != nil { return "", errors.New("activityUrl不是一个url") } urlParams := u.Query() urlParams.Set("linkCode", req.LinkCode) urlParams.Set("actId", req.ActId) u.RawQuery = urlParams.Encode() return u.String(), nil } // QueryOrderList 查询订单列表 func (t *elongHotelApiImpl) QueryOrderList(ctx context.Context, req QueryOrderListRequest, env string) (*ExternalOrderData, error) { var apiUrl string var apiReq *QueryOrderListReq if err := xcopy.Copy(&apiReq, req); err != nil { return nil, err } apiReq.AppId = t.client.authConfig.AppId args := util.StructToMap(apiReq) request := &client.HttpRequest{Headers: t.client.headers, QueryArgs: args} response := new(GetExternalOrderResp) if env == EnvHuidu { apiUrl = HDApiDomain + GetOrderListUri } else { apiUrl = ApiDomain + GetOrderListUri } if err := t.client.HttpGet(apiUrl, request, &client.HttpResponse{Result: response}); err != nil { return nil, err } if response.Code != 200 { t.log.WithFields(logx.LogField{Key: "data", Value: map[string]any{"req": req, "resp": response}}). Errorf("[elongHotelApiImpl][QueryOrderList] response result error: %s", response.Msg) return nil, errors.New(response.Msg) } return response.Data, nil }