third-platform-sdk/platform/elong-hotel/api.go

163 lines
5.3 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"
"strings"
"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) {
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参数有误")
}
//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
}