third-platform-sdk/platform/elong-hotel/api.go
2024-07-17 22:10:35 +08:00

124 lines
3.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package elong_hotel
import (
"context"
"crypto/md5"
"errors"
"fmt"
"net/url"
"time"
"github.com/zeromicro/go-zero/core/logx"
"gitee.com/chengdu-lenntc/third-platform-sdk/client"
"gitee.com/chengdu-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)
// GenerateUrl 生成链接
GenerateUrl(ctx context.Context, req GenerateUrlRequest) (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,
}
}
// GenerateLink 生成短链
func (t *elongHotelApiImpl) GetExternalChannelConfig(ctx context.Context, req GetExternalChannelConfigRequest, env string) (*ExternalChannelConfigResponse, error) {
var url 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 {
url = HDApiDomain + GetLinkUri
} else {
url = ApiDomain + GetLinkUri
}
if err := t.client.HttpGet(url, 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
}
// GenerateUrl 生成链接
func (t *elongHotelApiImpl) GenerateUrl(ctx context.Context, req GenerateUrlRequest) (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)
urlParams.Add("isRefresh", "refresh")
u.RawQuery = urlParams.Encode()
return u.String(), nil
}
// QueryOrderList 查询订单列表
func (t *elongHotelApiImpl) QueryOrderList(ctx context.Context, req QueryOrderListRequest, env string) (*ExternalOrderData, error) {
var url string
args := util.StructToMap(req)
request := &client.HttpRequest{Headers: t.client.headers, QueryArgs: args}
response := new(GetExternalOrderResp)
if env == EnvHuidu {
url = HDApiDomain + GetOrderListUri
} else {
url = ApiDomain + GetOrderListUri
}
if err := t.client.HttpGet(url, 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
}