third-platform-sdk/platform/tong-cheng/api.go
2024-07-15 23:11:04 +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 tong_cheng
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"
)
// TongChengApi 同程酒店的api
// Api defines the interface of tong-cheng api
type TongChengApi 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 tongChengApiImpl struct {
log logx.Logger
client *Client
}
func newTongChengApiImpl(log logx.Logger, client *Client) TongChengApi {
return &tongChengApiImpl{
log: log,
client: client,
}
}
// GenerateLink 生成短链
func (t *tongChengApiImpl) 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("[tongChengApiImpl][GetExternalChannelConfig] response result error: %s", response.Msg)
return nil, errors.New(response.Msg)
}
return response.Data, nil
}
// GenerateUrl 生成链接
func (t *tongChengApiImpl) 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 *tongChengApiImpl) 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("[tongChengApiImpl][QueryOrderList] response result error: %s", response.Msg)
return nil, errors.New(response.Msg)
}
return response.Data, nil
}