package fliggy import ( "context" "errors" "fmt" "net/url" "repository.lenntc.com/lenntc/third-platform-sdk/sdk/fliggysdk/defaultability/domain" "repository.lenntc.com/lenntc/third-platform-sdk/sdk/fliggysdk/defaultability/request" "strings" "github.com/zeromicro/go-zero/core/logx" ) // FliggyApi 飞猪平台 // Api defines the interface of fliggy api type FliggyApi interface { // GenerateH5Url 生成H5链接 GenerateH5Url(ctx context.Context, req GenerateH5UrlRequest) (string, error) // GenerateWechatUrl 生成微信小程序链接 GenerateWechatUrl(ctx context.Context, req GenerateWechatUrlRequest) (string, error) // FliggyPromoteOrdersList 飞猪分销订单列表 FliggyPromoteOrdersList(req *request.AlibabaFliggyPromoteOrdersListRequest) ([]*domain.AlibabaFliggyPromoteOrdersListOrder, error) } type fliggyApiImpl struct { log logx.Logger client *Client } func newFliggyApiImpl(log logx.Logger, client *Client) FliggyApi { return &fliggyApiImpl{ log: log, client: client, } } // GenerateH5Url 生成H5推广链接 // 飞猪官方不支持H5取链,生成的H5url为小程序中间页URL func (a *fliggyApiImpl) GenerateH5Url(ctx context.Context, req GenerateH5UrlRequest) (string, error) { var activityUrl string if len(req.ActivityUrl) == 0 { return "", errors.New("url参数不能为空") } urls := strings.Split(req.ActivityUrl, "?") if len(urls) == 1 { activityUrl = fmt.Sprintf("%s?linkCode=%s&actId=%s", req.ActivityUrl, req.LinkCode, req.ActId) return activityUrl, nil } else if len(urls) == 2 { activityUrl = fmt.Sprintf("%s&linkCode=%s&actId=%s", req.ActivityUrl, req.LinkCode, req.ActId) return activityUrl, nil } else { return "", errors.New("url参数有误") } } // GenerateWechatUrl 生成微信小程序推广链接 func (a *fliggyApiImpl) GenerateWechatUrl(ctx context.Context, req GenerateWechatUrlRequest) (string, error) { // 分两种类型的URL // 1. 小程序路径为 pages/home/index 只处理fpsid的值即可 // 2. 小程序路径为 pages/main/webview 需要将小程序后面的参数url urldecode后 将fpsid填充 再次urlencode后拼接回 小程序路径后面?url= urls := strings.Split(req.ActivityUrl, "?") if len(urls) < 2 { return "", errors.New("活动链接错误") } newUrl := "" switch urls[0] { case "pages/home/index": newUrl = strings.ReplaceAll(req.ActivityUrl, "fpsid=", fmt.Sprintf("fpsid=%s", req.FpSid)) case "pages/main/webview": parsedURL, err := url.Parse(req.ActivityUrl) if err != nil { return "", fmt.Errorf("error parsing url:%s", err.Error()) } urlValue := parsedURL.Query().Get("url") newUrlValue := strings.ReplaceAll(urlValue, "fpsid=", fmt.Sprintf("fpsid=%s", req.FpSid)) newUrl = fmt.Sprintf("pages/main/webview?url=%s", url.QueryEscape(newUrlValue)) } return newUrl, nil } // FliggyPromoteOrdersList 飞猪分销订单列表 func (a *fliggyApiImpl) FliggyPromoteOrdersList(req *request.AlibabaFliggyPromoteOrdersListRequest) ([]*domain.AlibabaFliggyPromoteOrdersListOrder, error) { resp, err := a.client.abilityClient.AlibabaFliggyPromoteOrdersList(req) if err != nil { a.log.WithFields(logx.LogField{Key: "data", Value: map[string]any{"req": req, "resp": resp}}).Errorf("[fliggyApiImpl][FliggyPromoteOrdersList] get promote orders failed, error: %v", err) return nil, err } if resp == nil { return nil, fmt.Errorf("[fliggyApiImpl][FliggyPromoteOrdersList] get promote order list is empty") } var result []*domain.AlibabaFliggyPromoteOrdersListOrder if resp.Model.List != nil { for _, item := range *resp.Model.List { entity := item result = append(result, &entity) } } return result, nil }