聚推客api对接

This commit is contained in:
wukesheng 2024-06-23 14:35:54 +08:00
parent 52694b22e5
commit a470a5ebb8
10 changed files with 303 additions and 20 deletions

View File

@ -5,6 +5,7 @@ import (
didiunion "gitee.com/chengdu-lenntc/third-platform-sdk/platform/didi-union" didiunion "gitee.com/chengdu-lenntc/third-platform-sdk/platform/didi-union"
elemeunion "gitee.com/chengdu-lenntc/third-platform-sdk/platform/eleme-union" elemeunion "gitee.com/chengdu-lenntc/third-platform-sdk/platform/eleme-union"
"gitee.com/chengdu-lenntc/third-platform-sdk/platform/jutuike"
meituancsr "gitee.com/chengdu-lenntc/third-platform-sdk/platform/meituan-csr" meituancsr "gitee.com/chengdu-lenntc/third-platform-sdk/platform/meituan-csr"
"gitee.com/chengdu-lenntc/third-platform-sdk/platform/meituan-media" "gitee.com/chengdu-lenntc/third-platform-sdk/platform/meituan-media"
meituanunion "gitee.com/chengdu-lenntc/third-platform-sdk/platform/meituan-union" meituanunion "gitee.com/chengdu-lenntc/third-platform-sdk/platform/meituan-union"
@ -25,6 +26,8 @@ const (
PlatformT3Union = "t3_union" PlatformT3Union = "t3_union"
// PlatformMeituanMedia 美团-美天赚 // PlatformMeituanMedia 美团-美天赚
PlatformMeituanMedia = "meituan_media" PlatformMeituanMedia = "meituan_media"
// PlatformJutuike 聚推客
PlatformJutuike = "jutuike"
) )
// PlatformNameMap 平台名称 // PlatformNameMap 平台名称
@ -35,6 +38,7 @@ var PlatformNameMap = map[string]string{
PlatformDidiUnion: "滴滴联盟", PlatformDidiUnion: "滴滴联盟",
PlatformT3Union: "t3联盟", PlatformT3Union: "t3联盟",
PlatformMeituanMedia: "美团-美天赚", PlatformMeituanMedia: "美团-美天赚",
PlatformJutuike: "聚推客",
} }
// GetPlatformName 获取平台名称 // GetPlatformName 获取平台名称
@ -62,10 +66,17 @@ func NewDidiUnionApi(log logx.Logger, conf didiunion.AuthConfig) didiunion.DidiU
return didiunion.NewApiClient(log, conf) return didiunion.NewApiClient(log, conf)
} }
// NewT3UnionApi t3联盟
func NewT3UnionApi(log logx.Logger, conf t3_union.AuthConfig) t3_union.T3UnionApi { func NewT3UnionApi(log logx.Logger, conf t3_union.AuthConfig) t3_union.T3UnionApi {
return t3_union.NewApiClient(log, conf) return t3_union.NewApiClient(log, conf)
} }
// NewMeituanMediaApi 美团-美天赚
func NewMeituanMediaApi(log logx.Logger, conf meituan_media.AuthConfig) meituan_media.MeituanMediaApi { func NewMeituanMediaApi(log logx.Logger, conf meituan_media.AuthConfig) meituan_media.MeituanMediaApi {
return meituan_media.NewApiClient(log, conf) return meituan_media.NewApiClient(log, conf)
} }
// NewJutuikeApi 聚推客
func NewJutuikeApi(log logx.Logger, conf jutuike.AuthConfig) jutuike.JutuikeApi {
return jutuike.NewApiClient(log, conf)
}

70
platform/jutuike/api.go Normal file
View File

@ -0,0 +1,70 @@
package jutuike
import (
"context"
"errors"
"github.com/zeromicro/go-zero/core/logx"
"gitee.com/chengdu-lenntc/third-platform-sdk/client"
"gitee.com/chengdu-lenntc/third-platform-sdk/util"
)
// JutuikeApi 美团-美天赚
// Api defines the interface of jutuike api
type JutuikeApi interface {
// GenerateLink 生成推广链接
GenerateLink(ctx context.Context, req GenerateLinkRequest) (*GenerateLinkData, error)
// QueryOrderList 查询订单列表
QueryOrderList(ctx context.Context, req QueryOrderListRequest) (*QueryOrderListData, error)
}
type jutuikeApiImpl struct {
log logx.Logger
client *Client
}
func newJutuikeApiImpl(log logx.Logger, client *Client) JutuikeApi {
return &jutuikeApiImpl{
log: log,
client: client,
}
}
// GenerateLink 生成推广链接
func (a *jutuikeApiImpl) GenerateLink(ctx context.Context, req GenerateLinkRequest) (*GenerateLinkData, error) {
if len(req.ApiKey) == 0 {
req.ApiKey = a.client.authConfig.ApiKey
}
args := util.StructToMap(req)
request := &client.HttpRequest{Headers: a.client.headers, QueryArgs: args}
response := new(GenerateLinkResponse)
if err := a.client.HttpGet(GetLinkUrl, request, &client.HttpResponse{Result: response}); err != nil {
return nil, err
}
if response.Code != 1 {
a.log.WithFields(logx.LogField{Key: "data", Value: map[string]any{"req": req, "resp": response}}).
Errorf("[jutuikeApiImpl][GenerateLink] response result error: %s", response.Msg)
return nil, errors.New(response.Msg)
}
return response.Data, nil
}
// QueryOrderList 查询订单列表
func (a *jutuikeApiImpl) QueryOrderList(ctx context.Context, req QueryOrderListRequest) (*QueryOrderListData, error) {
if len(req.ApiKey) == 0 {
req.ApiKey = a.client.authConfig.ApiKey
}
args := util.StructToMap(req)
request := &client.HttpRequest{Headers: a.client.headers, BodyArgs: args}
response := new(QueryOrderListResponse)
if err := a.client.HttpPost(GetOrderListUrl, request, &client.HttpResponse{Result: response}); err != nil {
return nil, err
}
if response.Code != 1 {
a.log.WithFields(logx.LogField{Key: "data", Value: map[string]any{"req": req, "resp": response}}).
Errorf("[jutuikeApiImpl][QueryOrderList] response result error: %s", response.Msg)
return nil, errors.New(response.Msg)
}
return response.Data, nil
}

View File

@ -0,0 +1,61 @@
package jutuike
import (
"context"
"encoding/json"
"testing"
"github.com/stretchr/testify/suite"
"github.com/zeromicro/go-zero/core/logx"
)
// api-单元测试
type apiClientSuite struct {
suite.Suite
api JutuikeApi
}
func TestApiClient(t *testing.T) {
suite.Run(t, new(apiClientSuite))
}
func (a *apiClientSuite) SetupSuite() {
log := logx.WithContext(context.Background())
apiClient := NewApiClient(log, AuthConfig{
ApiKey: "IyftVpzDVqDIRDqPZByW5xVpj9MgZSB7",
})
a.api = apiClient
}
func (a *apiClientSuite) Test_GenerateLink() {
req := GenerateLinkRequest{
ActId: 3,
Sid: "f3a8c1",
}
result, err := a.api.GenerateLink(context.Background(), req)
if !a.NoError(err) {
a.T().Errorf("========[Test_GenerateLink] response error:%s", err)
return
}
resultByte, err := json.Marshal(result)
if err != nil {
a.T().Errorf("========[Test_GenerateLink] json_marshal error:%s", err)
return
}
a.T().Logf("=====[Test_GenerateLink] result: %s", string(resultByte))
}
func (a *apiClientSuite) Test_QueryOrderList() {
req := QueryOrderListRequest{}
result, err := a.api.QueryOrderList(context.Background(), req)
if !a.NoError(err) {
a.T().Errorf("========[Test_QueryOrderList] response error:%s", err)
return
}
resultByte, err := json.Marshal(result)
if err != nil {
a.T().Errorf("========[Test_QueryOrderList] json_marshal error:%s", err)
return
}
a.T().Logf("=====[Test_QueryOrderList] result: %s", string(resultByte))
}

View File

@ -0,0 +1,36 @@
package jutuike
import (
"github.com/zeromicro/go-zero/core/logx"
"gitee.com/chengdu-lenntc/third-platform-sdk/client"
)
// AuthConfig api鉴权参数
type AuthConfig struct {
ApiKey string // api key
}
// 连接第三方平台的client
type Client struct {
log logx.Logger
authConfig AuthConfig
client.HttpClient
headers map[string]string
}
func NewApiClient(log logx.Logger, conf AuthConfig) JutuikeApi {
clt := newClient(log, conf)
return newJutuikeApiImpl(log, clt)
}
func newClient(log logx.Logger, conf AuthConfig) *Client {
return &Client{
log: log,
authConfig: conf,
HttpClient: client.NewHttpClient(log),
headers: map[string]string{
"Content-Type": "application/json",
},
}
}

View File

@ -0,0 +1,18 @@
package jutuike
// 相关地址
const (
SiteDomain = "https://pub.jutuike.com" // Domain 后台域名
SiteUrl = "https://pub.jutuike.com/login" // SiteUrl 后台地址
DocUrl = "https://www.jutuike.com/document" // DocUrl 文档地址
ApiDocUrl = "https://www.jutuike.com/doc/48" // ApiDocUrl api文档地址
)
// 接口地址
const (
ApiDomain = "http://api.jutuike.com" // Domain api域名
GetLinkUri = "/union/act"
GetOrderListUri = "/union/orders"
GetLinkUrl = ApiDomain + GetLinkUri
GetOrderListUrl = ApiDomain + GetOrderListUri
)

80
platform/jutuike/types.go Normal file
View File

@ -0,0 +1,80 @@
package jutuike
import "time"
type GenerateLinkRequest struct {
ApiKey string `json:"apikey"` // api key
ActId int64 `json:"act_id"` // 活动id
Sid string `json:"sid"` // 自定义参数
}
// GenerateLinkResponse 生成推广链接响应
type GenerateLinkResponse struct {
Code int32 `json:"code"` // 错误码
Msg string `json:"msg"` // 错误消息
Data *GenerateLinkData `json:"data"` // 数据结构
}
type GenerateLinkData struct {
H5 string `json:"h5"` // 推广短链接(部分活动没有,请注意判断)
WeAppInfo WeAppInfo `json:"we_app_info"` // 小程序信息(部分活动没有,请注意判断)
ActName string `json:"act_name"` // 活动名称
LongH5 string `json:"long_h5"` // 推广长链接(部分活动没有,请注意判断)
}
type WeAppInfo struct {
AppId string `json:"app_id"` // 小程序ID
PagePath string `json:"page_path"` // 小程序路径
MiniCode string `json:"miniCode"` // 小程序码(部分活动没有,请注意判断)
}
// 查询订单列表请求
type QueryOrderListRequest struct {
ApiKey string `json:"api_key"` // api key
StartTime time.Time `json:"start_time"` // 是 2021-06-05 00:00:00 开始时间与结束时间不能超过1小时
EndTime time.Time `json:"end_time"` // 是 2021-06-05 00:00:00 结束时间与开始时间不能超过1小时
QueryType int32 `json:"query_type"` // 否 1 1 按支付时间 2按更新时间 3创建时间 默认3
Sid string `json:"sid"` // 否 自定义参数跟单
BrandId int32 `json:"brand_id"` // 否 1 品牌id 1 美团 2 饿了么 3 拼多多 4 京东 5 肯德基 6 电影 7 麦当劳 8 话费充值 9 百果园 10 奈雪的茶 11 瑞幸咖啡 12 星巴克 13 喜茶 14 唯品会 15 滴滴/花小猪 16 汉堡王 17 高德打车 18 电费充值 19 会员充值 20 特价快递 21 联联周边游 22 抖音联盟 23 必胜客 24 旅划算 25 大牌餐券 26 千千惠生活 27 流量卡 28 同程出行 29 华莱士 30 T3出行 31 景点门票 32 淘宝
Status int32 `json:"status"` // 否 1 订单统一状态0未付款 1已付款 2待结算 3已结算 4无效订单
OrderSn string `json:"order_sn"` // 否 1234567 订单号
RelationFlagName string `json:"relation_flag_name"` // 否 第三方渠道标识
Page int32 `json:"page"` // 否 1 页码 默认 1
PageSize int32 `json:"pageSize"` // 否 20 每页显示多少 默认 20 最大 100
}
// 查询订单列表响应
type QueryOrderListResponse struct {
Code int32 `json:"code"` // 错误码
Msg string `json:"msg"` // 错误消息
Data *QueryOrderListData `json:"data"` // 数据结构
}
type QueryOrderListData struct {
Total int32 `json:"total"` // 总数
PerPage int32 `json:"per_page"` // 上一页
CurrentPage int32 `json:"current_page"` // 当前页码
LastPage int32 `json:"last_page"` // 下一页
Data []*OrderItem `json:"data"` // 数据
}
type OrderItem struct {
ActName string `json:"act_name"` // 美团外卖 活动名称
ActId int32 `json:"act_id"` // 活动idjd19 、考拉35、 pdd14 、 淘宝40 、vip39 、47-高德打车 对应该接口 https://www.jutuike.com/doc/34
Sid string `json:"sid"` // 123456 渠道标识
PubId int32 `json:"pub_id"` // 推广者id平台用户唯一id
JtkShareRate string `json:"jtk_share_rate"` // 佣金比例0.1 则代表10% (实际佣金比率 = 比例x100
JtkShareFee string `json:"jtk_share_fee"` // 佣金, 如1.2
OrderSn string `json:"order_sn"` // 订单号如12345678
OrderTitle string `json:"order_title"` // 北京烤鸭 商品名称
CreateTime time.Time `json:"create_time"` // 2021-06-05 21:41:52 下单时间
PayTime *time.Time `json:"pay_time"` // 2021-06-05 21:41:52 付款时间
ModifiedTime *time.Time `json:"modified_time"` // 2021-06-05 21:41:52 最后一次更新时间
OrderPrice string `json:"order_price"` // 商品单价
PayPrice string `json:"pay_price"` // 实际付款金额
Status int32 `json:"status"` // 订单统一状态0未付款 1已付款 2待结算 3已结算 4无效订单
StatusDesc string `json:"status_desc"` // 状态描述,如已付款
Extension string `json:"extension"` // 扩展参数,可根据需要解析
BrandId int32 `json:"brand_id"` // 品牌id 1 美团 2 饿了么 3 拼多多 4 京东 5 肯德基 6 电影 7 麦当劳 8 话费充值 9 百果园 10 奈雪的茶 11 瑞幸咖啡 12 星巴克 13 喜茶 14 唯品会 15 滴滴/花小猪 16 汉堡王 17 高德打车 18 电费充值 19 会员充值 20 特价快递 21 联联周边游 22 抖音联盟 23 必胜客 24 旅划算 25 大牌餐券 26 千千惠生活 27 流量卡 28 同程出行 29 华莱士 30 T3出行 31 景点门票 32 淘宝
InvalidReason string `json:"invalid_reason"` // 失效原因
}

View File

@ -12,7 +12,7 @@ import (
) )
// MeituanMediaApi 美团-美天赚 // MeituanMediaApi 美团-美天赚
// Api defines the interface of t3_union api // Api defines the interface of meituan_media api
type MeituanMediaApi interface { type MeituanMediaApi interface {
// Sign 签名 // Sign 签名
Sign(methodType string, url string, data map[string]interface{}) string Sign(methodType string, url string, data map[string]interface{}) string

View File

@ -39,7 +39,9 @@ func (a *apiClientSuite) Test_Sign() {
func (a *apiClientSuite) Test_GenerateLink() { func (a *apiClientSuite) Test_GenerateLink() {
req := GenerateLinkRequest{ req := GenerateLinkRequest{
//LinkType: 1, LinkType: 1,
ActId: "7",
Sid: "f3a8c1",
} }
result, err := a.api.GenerateLink(context.Background(), req) result, err := a.api.GenerateLink(context.Background(), req)
if !a.NoError(err) { if !a.NoError(err) {

View File

@ -2,9 +2,9 @@ package meituan_media
import ( import (
"crypto/hmac" "crypto/hmac"
"crypto/md5"
"crypto/sha256" "crypto/sha256"
"encoding/base64" "encoding/base64"
"encoding/hex"
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/http" "net/http"
@ -31,8 +31,9 @@ func (s *Sign) BuildHeader(methodType string, uri string, data map[string]any) m
headers := map[string]string{ headers := map[string]string{
SCaApp: s.AppKey, // 应用app_key SCaApp: s.AppKey, // 应用app_key
SCaTimestamp: fmt.Sprintf("%d", time.Now().UnixMilli()), // 请求发起时间戳(毫秒)有效时1分钟 SCaTimestamp: fmt.Sprintf("%d", time.Now().UnixMilli()), // 请求发起时间戳(毫秒)有效时1分钟
SCaSignatureHeaders: "S-Ca-App,S-Ca-Timestamp", // 将需要签名的header SCaSignatureHeaders: "S-Ca-Timestamp,S-Ca-App", // 将需要签名的header
ContentMd5: s.contentMD5(methodType, data), // body数据Md5加密 ContentMd5: s.contentMD5(methodType, data), // body数据Md5加密
//"Content-Type": "application/json",
} }
headers[SCaSignature] = s.GetSign(methodType, uri, data, headers) headers[SCaSignature] = s.GetSign(methodType, uri, data, headers)
return headers return headers
@ -44,9 +45,11 @@ func (s *Sign) GetSign(methodType string, uri string, data map[string]any, signH
headers := s.headers(signHeaders) headers := s.headers(signHeaders)
url := s.url(methodType, uri, data) url := s.url(methodType, uri, data)
strSign := httpMethod + `\n` + contentMD5 + `\n` + headers + url strSign := httpMethod + `\n` + contentMD5 + `\n` + headers + url
fmt.Printf("======= strSign:%s \n", strSign)
hm := hmac.New(sha256.New, []byte(s.AppSecret)) hm := hmac.New(sha256.New, []byte(s.AppSecret))
hm.Write([]byte(strSign)) hm.Write([]byte(strSign))
signStr := base64.StdEncoding.EncodeToString([]byte(hex.EncodeToString(hm.Sum([]byte(""))))) //hash := hex.EncodeToString(hm.Sum(nil))
signStr := base64.StdEncoding.EncodeToString(hm.Sum(nil))
return signStr return signStr
} }
@ -60,7 +63,9 @@ func (s *Sign) contentMD5(methodType string, data map[string]any) string {
methodType = s.httpMethod(methodType) methodType = s.httpMethod(methodType)
if (methodType == http.MethodPost || methodType == http.MethodPut) && data != nil { if (methodType == http.MethodPost || methodType == http.MethodPut) && data != nil {
dataByte, _ := json.Marshal(data) dataByte, _ := json.Marshal(data)
return base64.StdEncoding.EncodeToString([]byte(util.Md5String(string(dataByte)))) h := md5.New()
h.Write(dataByte)
return base64.StdEncoding.EncodeToString(h.Sum(nil))
} else { } else {
return "" return ""
} }

View File

@ -21,20 +21,20 @@ type GenerateLinkResponse struct {
// QueryOrderListRequest 查询订单列表请求 // QueryOrderListRequest 查询订单列表请求
type QueryOrderListRequest struct { type QueryOrderListRequest struct {
Platform int32 `json:"platform"` // 非必填 商品所属业务一级分类类型1 到家及其他业务类型2 到店业务类型包含到店美食、休闲生活、酒店、门票不填则默认1 Platform int32 `json:"platform,omitempty"` // 非必填 商品所属业务一级分类类型1 到家及其他业务类型2 到店业务类型包含到店美食、休闲生活、酒店、门票不填则默认1
BusinessLine []int32 `json:"businessLine"` // 非必填 业务线标识1当platform为1选择到家及其他业务类型时业务线枚举为1外卖订单 WAIMAI 2闪购红包 3酒旅 4美团电商订单团好货 5医药 6拼好饭 7商品超值券包 COUPON 8买菜 MAICAI 11闪购商品不传则默认传空表示非售卖券包订单类型的全部查询。若输入参数含7 商品超值券包则只返回商品超值券包订单2当platform为2选择到店业务类型 时业务线枚举1到餐 2到综 3酒店 4门票不填则默认传1 BusinessLine []int32 `json:"businessLine,omitempty"` // 非必填 业务线标识1当platform为1选择到家及其他业务类型时业务线枚举为1外卖订单 WAIMAI 2闪购红包 3酒旅 4美团电商订单团好货 5医药 6拼好饭 7商品超值券包 COUPON 8买菜 MAICAI 11闪购商品不传则默认传空表示非售卖券包订单类型的全部查询。若输入参数含7 商品超值券包则只返回商品超值券包订单2当platform为2选择到店业务类型 时业务线枚举1到餐 2到综 3酒店 4门票不填则默认传1
ActId int64 `json:"actId"` // 非必填 活动物料id我要推广-活动推广中第一列的id信息不传则返回所有actId的数据建议查询订单时传入actId ActId int64 `json:"actId,omitempty"` // 非必填 活动物料id我要推广-活动推广中第一列的id信息不传则返回所有actId的数据建议查询订单时传入actId
Sid string `json:"sid"` // 非必填 二级推广位id最长64位不传则返回所有sid的数据 Sid string `json:"sid,omitempty"` // 非必填 二级推广位id最长64位不传则返回所有sid的数据
OrderId string `json:"orderId"` // 非必填 订单id入参后可与业务线标识businessLine配合使用输入的orderId需要与businessLine能对应上。举例如查询商品超值券包订单时orderId传券包订单号businessLine传7除此以外其他查询筛选条件不生效不传业务线标识businessLine则默认仅查非券包订单 OrderId string `json:"orderId,omitempty"` // 非必填 订单id入参后可与业务线标识businessLine配合使用输入的orderId需要与businessLine能对应上。举例如查询商品超值券包订单时orderId传券包订单号businessLine传7除此以外其他查询筛选条件不生效不传业务线标识businessLine则默认仅查非券包订单
StartTime int32 `json:"startTime"` // 非必填 查询时间类型对应的查询开始时间10位时间戳表示单位秒 StartTime int32 `json:"startTime,omitempty"` // 非必填 查询时间类型对应的查询开始时间10位时间戳表示单位秒
EndTime int32 `json:"endTime"` // 非必填 查询时间类型对应的查询结束时间10位时间戳表示单位秒 EndTime int32 `json:"endTime,omitempty"` // 非必填 查询时间类型对应的查询结束时间10位时间戳表示单位秒
Page int32 `json:"page"` // 非必填 页码默认1从1开始,若searchType选择2本字段必须传1若不传参数默认1 Page int32 `json:"page,omitempty"` // 非必填 页码默认1从1开始,若searchType选择2本字段必须传1若不传参数默认1
Limit int32 `json:"limit"` // 非必填 每页限制条数默认100最大支持100 Limit int32 `json:"limit,omitempty"` // 非必填 每页限制条数默认100最大支持100
QueryTimeType int32 `json:"queryTimeType"` // 非必填 查询时间类型,枚举值, 1 按订单支付时间查询, 2 按照更新时间查询, 默认为1 QueryTimeType int32 `json:"queryTimeType,omitempty"` // 非必填 查询时间类型,枚举值, 1 按订单支付时间查询, 2 按照更新时间查询, 默认为1
TradeType int32 `json:"tradeType"` // 非必填 交易类型1表示CPS2表示CPA TradeType int32 `json:"tradeType,omitempty"` // 非必填 交易类型1表示CPS2表示CPA
ScrollId string `json:"scrollId"` // 非必填 分页id当searchType选择2逐页查询时本字段为必填。若不填写默认查询首页。取值为上一页查询时出参的scrollId字段 ScrollId string `json:"scrollId,omitempty"` // 非必填 分页id当searchType选择2逐页查询时本字段为必填。若不填写默认查询首页。取值为上一页查询时出参的scrollId字段
SearchType int32 `json:"searchType"` // 非必填 订单分页查询方案选择不填则默认为1。1 分页查询最多能查询到1万条订单当选择本查询方案page参数不能为空。此查询方式后续不再维护建议使用2逐页查询。2 逐页查询不限制查询订单数只能逐页查询不能指定页数当选择本查询方案需配合scrollId参数使用 SearchType int32 `json:"searchType,omitempty"` // 非必填 订单分页查询方案选择不填则默认为1。1 分页查询最多能查询到1万条订单当选择本查询方案page参数不能为空。此查询方式后续不再维护建议使用2逐页查询。2 逐页查询不限制查询订单数只能逐页查询不能指定页数当选择本查询方案需配合scrollId参数使用
CityNames []string `json:"cityNames"` // 非必填 可输入城市名称圈定特定城市的订单单次最多查询10个城市英文逗号分隔。不传则默认全部城市订单。 注:如需确认城市具体名称,可参考后台订单明细页的城市筛选项,或参考具体活动的城市命名。目前只支持到家业务类型-商品超值券包业务线。 CityNames []string `json:"cityNames,omitempty"` // 非必填 可输入城市名称圈定特定城市的订单单次最多查询10个城市英文逗号分隔。不传则默认全部城市订单。 注:如需确认城市具体名称,可参考后台订单明细页的城市筛选项,或参考具体活动的城市命名。目前只支持到家业务类型-商品超值券包业务线。
} }
// QueryOrderListResponse 查询订单列表响应 // QueryOrderListResponse 查询订单列表响应