- update service

master
李光春 1 year ago
parent 7371dad756
commit 62a5a49783

@ -0,0 +1,56 @@
package alipayopen
import (
"context"
"encoding/json"
"github.com/dtapps/go-library/utils/gorequest"
)
type AlipaySystemOauthTokenResponse struct {
AlipaySystemOauthTokenResponse struct {
AlipayUserId string `json:"alipay_user_id,omitempty"`
UserId string `json:"user_id"` // 支付宝用户的唯一标识。以2088开头的16位数字。
AccessToken string `json:"access_token"` // 访问令牌。通过该令牌调用需要授权类接口
ExpiresIn string `json:"expires_in"` // 访问令牌的有效时间,单位是秒。
RefreshToken string `json:"refresh_token"` // 刷新令牌。通过该令牌可以刷新access_token
ReExpiresIn string `json:"re_expires_in"` // 刷新令牌的有效时间,单位是秒。
AuthStart string `json:"auth_start"` // 授权token开始时间作为有效期计算的起点
} `json:"alipay_system_oauth_token_response"`
}
type AlipaySystemOauthTokenResult struct {
Result AlipaySystemOauthTokenResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
ApiError ApiError // 接口错误
}
func newAlipaySystemOauthTokenResult(result AlipaySystemOauthTokenResponse, body []byte, http gorequest.Response, apiError ApiError) *AlipaySystemOauthTokenResult {
return &AlipaySystemOauthTokenResult{Result: result, Body: body, Http: http, ApiError: apiError}
}
// AlipaySystemOauthToken 换取授权访问令牌
// https://opendocs.alipay.com/open/02xtla
func (c *Client) AlipaySystemOauthToken(ctx context.Context, grantType, code, refreshToken string) (*AlipaySystemOauthTokenResult, error) {
// 参数
params := gorequest.NewParams()
params.Set("grant_type", grantType)
if code != "" {
params.Set("code", code)
}
if refreshToken != "" {
params.Set("refresh_token", refreshToken)
}
// 请求
request, err := c.request(ctx, c.newParamsWithType("alipay.system.oauth.token", params))
if err != nil {
return nil, err
}
// 定义
var response AlipaySystemOauthTokenResponse
err = json.Unmarshal(request.ResponseBody, &response)
// 错误
var apiError ApiError
err = json.Unmarshal(request.ResponseBody, &apiError)
return newAlipaySystemOauthTokenResult(response, request.ResponseBody, request, apiError), err
}

@ -0,0 +1,50 @@
package alipayopen
import (
"context"
"encoding/json"
"github.com/dtapps/go-library/utils/gorequest"
)
type AlipayUserInfoShareResponse struct {
AlipayUserInfoShareResponse struct {
AlipayUserId string `json:"alipay_user_id,omitempty"`
UserId string `json:"user_id"` // 支付宝用户的唯一标识。以2088开头的16位数字。
AccessToken string `json:"access_token"` // 访问令牌。通过该令牌调用需要授权类接口
ExpiresIn string `json:"expires_in"` // 访问令牌的有效时间,单位是秒。
RefreshToken string `json:"refresh_token"` // 刷新令牌。通过该令牌可以刷新access_token
ReExpiresIn string `json:"re_expires_in"` // 刷新令牌的有效时间,单位是秒。
AuthStart string `json:"auth_start"` // 授权token开始时间作为有效期计算的起点
} `json:"alipay_system_oauth_token_response"`
}
type AlipayUserInfoShareResult struct {
Result AlipayUserInfoShareResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
ApiError ApiError // 接口错误
}
func newAlipayUserInfoShareResult(result AlipayUserInfoShareResponse, body []byte, http gorequest.Response, apiError ApiError) *AlipayUserInfoShareResult {
return &AlipayUserInfoShareResult{Result: result, Body: body, Http: http, ApiError: apiError}
}
// AlipayUserInfoShare 换取授权访问令牌
// https://opendocs.alipay.com/open/02xtlb
func (c *Client) AlipayUserInfoShare(ctx context.Context, authToken string) (*AlipayUserInfoShareResult, error) {
// 参数
params := gorequest.NewParams()
params.Set("auth_token", authToken)
// 请求
request, err := c.request(ctx, c.newParamsWithType("alipay.user.info.share", params))
if err != nil {
return nil, err
}
// 定义
var response AlipayUserInfoShareResponse
err = json.Unmarshal(request.ResponseBody, &response)
// 错误
var apiError ApiError
err = json.Unmarshal(request.ResponseBody, &apiError)
return newAlipayUserInfoShareResult(response, request.ResponseBody, request, apiError), err
}

@ -0,0 +1,67 @@
package alipayopen
import (
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"errors"
"github.com/dtapps/go-library/utils/golog"
"github.com/dtapps/go-library/utils/gophp"
"github.com/dtapps/go-library/utils/gorequest"
)
// ClientConfig 实例配置
type ClientConfig struct {
AppId string // 支付宝分配给开发者的应用ID
AppKey string // 支付宝分配给开发者的应用私钥
AppRSA2 string // 应用公钥
AlipayRSA2 string // 支付宝公钥
Aes string // 接口内容加密方式
}
// Client 实例
type Client struct {
requestClient *gorequest.App // 请求服务
privateKey *rsa.PrivateKey // 私钥服务
config struct {
appId string // 支付宝分配给开发者的应用ID
appKey string // 支付宝分配给开发者的应用私钥
appRSA2 string // 应用公钥
alipayRSA2 string // 支付宝公钥
aes string // 接口内容加密方式
}
log struct {
status bool // 状态
client *golog.ApiClient // 日志服务
}
}
// NewClient 创建实例化
func NewClient(config *ClientConfig) (*Client, error) {
var err error
c := &Client{}
c.config.appId = config.AppId
c.config.appKey = config.AppKey
c.config.appRSA2 = config.AppRSA2
c.config.alipayRSA2 = config.AlipayRSA2
c.config.aes = config.Aes
// 私钥解码
block, _ := pem.Decode([]byte("-----BEGIN RSA PRIVATE KEY-----\n" + gophp.ChunkSplit(config.AppKey, 64, "\n") + "-----END RSA PRIVATE KEY-----\n"))
if block == nil {
return nil, errors.New("签名私钥解码错误")
}
privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
c.privateKey = privateKey.(*rsa.PrivateKey)
// 请求
c.requestClient = gorequest.NewHttp()
c.requestClient.Uri = apiUrl
return c, nil
}

@ -0,0 +1,12 @@
package alipayopen
import "github.com/dtapps/go-library/utils/golog"
// ConfigApiClientFun 日志配置
func (c *Client) ConfigApiClientFun(apiClientFun golog.ApiClientFun) {
apiClient := apiClientFun()
if apiClient != nil {
c.log.client = apiClient
c.log.status = true
}
}

@ -0,0 +1,22 @@
package alipayopen
const (
apiUrl = "https://openapi.alipay.com/gateway.do"
)
const (
LogTable = "alipayopen"
)
const AuthorizationCode = "authorization_code" // 表示换取使用用户授权码code换取授权令牌
const RefreshToken = "refresh_token" // 表示使用refresh_token刷新获取新授权令牌
type ApiError struct {
ErrorResponse struct {
Code string `json:"code"`
Msg string `json:"msg"`
SubCode string `json:"sub_code"`
SubMsg string `json:"sub_msg"`
} `json:"error_response"`
Sign string `json:"sign"`
}

@ -0,0 +1,27 @@
package alipayopen
import "github.com/dtapps/go-library/utils/golog"
func (c *Client) GetAppId() string {
return c.config.appId
}
func (c *Client) GetAppKey() string {
return c.config.appKey
}
func (c *Client) GetAppRSA2() string {
return c.config.appRSA2
}
func (c *Client) GetAlipayRSA2() string {
return c.config.alipayRSA2
}
func (c *Client) GetAes() string {
return c.config.aes
}
func (c *Client) GetLog() *golog.ApiClient {
return c.log.client
}

@ -0,0 +1,18 @@
package alipayopen
import (
"github.com/dtapps/go-library/utils/gorequest"
"github.com/dtapps/go-library/utils/gotime"
)
func (c *Client) newParamsWithType(_method string, param ...gorequest.Params) gorequest.Params {
params := gorequest.NewParamsWith(param...)
params.Set("app_id", c.GetAppId())
params.Set("method", _method)
params.Set("format", "JSON")
params.Set("charset", "utf-8")
params.Set("sign_type", "RSA2")
params.Set("timestamp", gotime.Current().SetFormat(gotime.DateTimeFormat))
params.Set("version", "1.0")
return params
}

@ -0,0 +1,39 @@
package alipayopen
import (
"context"
"github.com/dtapps/go-library"
"github.com/dtapps/go-library/utils/gorequest"
"github.com/dtapps/go-library/utils/gostring"
)
func (c *Client) request(ctx context.Context, param map[string]interface{}) (gorequest.Response, error) {
// 签名
params := c.sign(ctx, param)
// 创建请求
client := c.requestClient
// 设置参数
client.SetParams(params)
// 设置用户代理
client.SetUserAgent(gorequest.GetRandomUserAgentSystem())
// 传入SDk版本
client.AfferentSdkUserVersion(go_library.Version())
// 发起请求
request, err := client.Get(ctx)
if err != nil {
return gorequest.Response{}, err
}
// 记录日志
if c.log.status {
go c.log.client.MiddlewareCustom(ctx, gostring.ToString(params["method"]), request, go_library.Version())
}
return request, err
}

@ -0,0 +1,76 @@
package alipayopen
import (
"context"
"crypto"
"crypto/rand"
"encoding/base64"
"encoding/json"
"fmt"
"github.com/dtapps/go-library/utils/gorequest"
"log"
"sort"
"strconv"
"strings"
)
func (c *Client) rsaSign(signContent string, hash crypto.Hash) (string, error) {
shaNew := hash.New()
shaNew.Write([]byte(signContent))
hashed := shaNew.Sum(nil)
signByte, err := c.privateKey.Sign(rand.Reader, hashed, crypto.SHA256)
if err != nil {
return "", err
}
sign := base64.StdEncoding.EncodeToString(signByte)
return sign, nil
}
func (c *Client) sign(ctx context.Context, params gorequest.Params) gorequest.Params {
// 排序
var keys []string
for key := range params {
keys = append(keys, key)
}
sort.Strings(keys)
// 转换成字符串
var signStr = ""
for _, key := range keys {
if key != "" {
signStr += fmt.Sprintf("%s=%s&", key, c.getString(params[key]))
}
}
signStr = strings.TrimRight(signStr, "&")
// 签名
sign, err := c.rsaSign(signStr, crypto.SHA256)
if err != nil {
log.Printf("签名失败:%s\n", err)
return nil
}
params.Set("sign", sign)
return params
}
func (c *Client) getString(i interface{}) string {
switch v := i.(type) {
case string:
return v
case []byte:
return string(v)
case int:
return strconv.Itoa(v)
case bool:
return strconv.FormatBool(v)
default:
bytes, _ := json.Marshal(v)
return string(bytes)
}
}

@ -1,51 +1,35 @@
package dingdanxia
import (
"github.com/dtapps/go-library/utils/dorm"
"github.com/dtapps/go-library/utils/golog"
"github.com/dtapps/go-library/utils/gorequest"
"gorm.io/gorm"
)
type ConfigClient struct {
ApiKey string // 密钥
MongoDb *dorm.MongoClient // 日志数据库
PgsqlDb *gorm.DB // 日志数据库
DatabaseName string // 库名
// ClientConfig 实例配置
type ClientConfig struct {
ApiKey string // 密钥
}
// Client 实例
type Client struct {
client *gorequest.App // 请求客户端
log *golog.ApiClient // 日志服务
config *ConfigClient // 配置
requestClient *gorequest.App // 请求服务
config struct {
apiKey string // 密钥
}
log struct {
status bool // 状态
client *golog.ApiClient // 日志服务
}
}
func NewClient(config *ConfigClient) (*Client, error) {
// NewClient 创建实例化
func NewClient(config *ClientConfig) (*Client, error) {
var err error
c := &Client{config: config}
c := &Client{}
c.client = gorequest.NewHttp()
c.config.apiKey = config.ApiKey
if c.config.PgsqlDb != nil {
c.log, err = golog.NewApiClient(
golog.WithGormClient(c.config.PgsqlDb),
golog.WithTableName(logTable),
)
if err != nil {
return nil, err
}
}
if c.config.MongoDb != nil {
c.log, err = golog.NewApiClient(
golog.WithMongoClient(c.config.MongoDb),
golog.WithDatabaseName(c.config.DatabaseName),
golog.WithCollectionName(logTable),
)
if err != nil {
return nil, err
}
}
c.requestClient = gorequest.NewHttp()
return c, nil
}

@ -0,0 +1,12 @@
package dingdanxia
import "github.com/dtapps/go-library/utils/golog"
// ConfigApiClientFun 日志配置
func (c *Client) ConfigApiClientFun(apiClientFun golog.ApiClientFun) {
apiClient := apiClientFun()
if apiClient != nil {
c.log.client = apiClient
c.log.status = true
}
}

@ -5,5 +5,5 @@ const (
)
const (
logTable = "dingdanxia"
LogTable = "dingdanxia"
)

@ -0,0 +1,11 @@
package dingdanxia
import "github.com/dtapps/go-library/utils/golog"
func (c *Client) GetApiKey() string {
return c.config.apiKey
}
func (c *Client) GetLog() *golog.ApiClient {
return c.log.client
}

@ -10,10 +10,10 @@ import (
func (c *Client) request(ctx context.Context, url string, params map[string]interface{}, method string) (gorequest.Response, error) {
// 公共参数
params["apikey"] = c.config.ApiKey
params["apikey"] = c.GetApiKey()
// 创建请求
client := c.client
client := c.requestClient
// 设置请求地址
client.SetUri(url)
@ -27,18 +27,18 @@ func (c *Client) request(ctx context.Context, url string, params map[string]inte
// 设置参数
client.SetParams(params)
// 传入SDk版本
client.AfferentSdkUserVersion(go_library.Version())
// 发起请求
request, err := client.Request(ctx)
if err != nil {
return gorequest.Response{}, err
}
// 日志
if c.config.PgsqlDb != nil {
go c.log.GormMiddleware(ctx, request, go_library.Version())
}
if c.config.MongoDb != nil {
go c.log.MongoMiddleware(ctx, request, go_library.Version())
// 记录日志
if c.log.status {
go c.log.client.Middleware(ctx, request, go_library.Version())
}
return request, err

@ -0,0 +1,50 @@
package dingdanxia
import (
"context"
"encoding/json"
"github.com/dtapps/go-library/utils/gorequest"
"net/http"
)
type TbkActivityinfoResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
ClickUrl string `json:"click_url"`
WxQrcodeUrl string `json:"wx_qrcode_url"`
ShortClickUrl string `json:"short_click_url"`
TerminalType string `json:"terminal_type"`
MaterialOssUrl string `json:"material_oss_url"`
PageName string `json:"page_name"`
PageStartTime string `json:"page_start_time"`
PageEndTime string `json:"page_end_time"`
WxMiniprogramPath string `json:"wx_miniprogram_path"`
Tpwd string `json:"tpwd"`
LongTpwd string `json:"long_tpwd"`
} `json:"data"`
}
type TbkActivityinfoResult struct {
Result TbkActivityinfoResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func newTbkActivityinfoResult(result TbkActivityinfoResponse, body []byte, http gorequest.Response, err error) *TbkActivityinfoResult {
return &TbkActivityinfoResult{Result: result, Body: body, Http: http, Err: err}
}
// TbkActivityinfo 官方活动转链,饿了么/口碑活动转链
// https://www.dingdanxia.com/doc/122/173
func (c *Client) TbkActivityinfo(ctx context.Context, notMustParams ...gorequest.Params) *TbkActivityinfoResult {
// 参数
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := c.request(ctx, apiUrl+"/tbk/activityinfo", params, http.MethodPost)
// 定义
var response TbkActivityinfoResponse
err = json.Unmarshal(request.ResponseBody, &response)
return newTbkActivityinfoResult(response, request.ResponseBody, request, err)
}

@ -0,0 +1,39 @@
package dingdanxia
import (
"context"
"encoding/json"
"github.com/dtapps/go-library/utils/gorequest"
"net/http"
)
type WaiMaiMeituanGenerateLinkResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data struct{} `json:"data"`
MiniCode string `json:"miniCode"` // 小程序码地址
}
type WaiMaiMeituanGenerateLinkResult struct {
Result WaiMaiMeituanGenerateLinkResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func newWaiMaiMeituanGenerateLinkResult(result WaiMaiMeituanGenerateLinkResponse, body []byte, http gorequest.Response, err error) *WaiMaiMeituanGenerateLinkResult {
return &WaiMaiMeituanGenerateLinkResult{Result: result, Body: body, Http: http, Err: err}
}
// WaiMaiMeituanGenerateLink 美团外卖/闪购/酒店/优选CPS转链接口【推荐使用】
// https://www.dingdanxia.com/doc/221/173
func (c *Client) WaiMaiMeituanGenerateLink(ctx context.Context, notMustParams ...gorequest.Params) *WaiMaiMeituanGenerateLinkResult {
// 参数
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := c.request(ctx, apiUrl+"/waimai/meituan_generateLink", params, http.MethodPost)
// 定义
var response WaiMaiMeituanGenerateLinkResponse
err = json.Unmarshal(request.ResponseBody, &response)
return newWaiMaiMeituanGenerateLinkResult(response, request.ResponseBody, request, err)
}

@ -12,27 +12,35 @@ type WaiMaiMeituanOrderIdResponse struct {
Msg string `json:"msg"`
Data struct {
Order struct {
BusinessLine int `json:"businessLine"`
SubBusinessLine int `json:"subBusinessLine"`
ActId int `json:"actId"`
Quantity int `json:"quantity"`
OrderId string `json:"orderId"`
Paytime string `json:"paytime"`
ModTime string `json:"modTime"`
Payprice string `json:"payprice"`
Profit string `json:"profit"`
CpaProfit string `json:"cpaProfit"`
Sid string `json:"sid"`
Appkey string `json:"appkey"`
Smstitle string `json:"smstitle"`
Status int `json:"status"`
TradeTypeList []int `json:"tradeTypeList"`
RiskOrder interface{} `json:"riskOrder"`
Refundprofit interface{} `json:"refundprofit"`
CpaRefundProfit interface{} `json:"cpaRefundProfit"`
RefundInfoList interface{} `json:"refundInfoList"`
RefundProfitList interface{} `json:"refundProfitList"`
Extra interface{} `json:"extra"`
OrderId string `json:"orderId"` // 订单号
Sid string `json:"sid"` // 合作方唯一标识
Payprice string `json:"payprice"` // 订单用户实际支付金额
Profit string `json:"profit"` // 订单预估返佣金额
CpaProfit string `json:"cpaProfit"` // 订单预估cpa总收益优选、话费券
Smstitle string `json:"smstitle"` // 订单标题
Status int `json:"status"` // 订单状态,外卖、话费、闪购、优选、酒店订单会返回该字段 1 已付款 8 已完成 9 已退款或风控
TradeTypeList []int `json:"tradeTypeList"` // 订单的奖励类型 话费订单类型返回该字段 3 首购奖励 5 留存奖励 优选订单类型返回该字段 2 cps 3 首购奖励
RiskOrder interface{} `json:"riskOrder"` // 0表示非风控订单1表示风控订单
Refundprofit interface{} `json:"refundprofit"` // 订单需要扣除的返佣金额,外卖、话费、闪购、优选、酒店订单若发生退款会返回该字段
CpaRefundProfit interface{} `json:"cpaRefundProfit"` // 订单需要扣除的cpa返佣金额优选、话费券
RefundInfoList struct {
RefundPrice interface{} `json:"refundPrice"` // 订单实际退款金额,外卖、话费、闪购、优选、酒店订单若发生退款会返回该字段
RefundTime interface{} `json:"refundTime"` // 订单退款时间10位时间戳
RefundType interface{} `json:"refundType"` // ALL_REFUND(1, "全部退"), PART_REFUND(2, "部分退"), RISK_REFUND(3, "风控退");
} `json:"refundInfoList,omitempty"` // 退款列表
RefundProfitList struct { // 退款佣金明细
RefundProfit interface{} `json:"refundProfit"` // 退款佣金
RefundFinishTime interface{} `json:"refundFinishTime"` // 佣金产生时间,10位时间戳
Type interface{} `json:"type"` // 券订单: 1 流量订单: 2 首单: 3 复购: 4 留存: 5 二单: 6 唤起: 7
} `json:"refundProfitList,omitempty"`
BusinessLine int `json:"businessLine"`
SubBusinessLine int `json:"subBusinessLine"`
ActId int `json:"actId"`
Quantity int `json:"quantity"`
Paytime string `json:"paytime"`
ModTime string `json:"modTime"`
Appkey string `json:"appkey"`
Extra interface{} `json:"extra"`
} `json:"order"`
} `json:"data"`
}
@ -50,10 +58,14 @@ func newWaiMaiMeituanOrderIdResult(result WaiMaiMeituanOrderIdResponse, body []b
// WaiMaiMeituanOrderId 美团联盟外卖/闪购/优选/酒店订单查询API订单号版
// https://www.dingdanxia.com/doc/179/173
func (c *Client) WaiMaiMeituanOrderId(ctx context.Context, orderId string) *WaiMaiMeituanOrderIdResult {
func (c *Client) WaiMaiMeituanOrderId(ctx context.Context, orderId string, Type int) *WaiMaiMeituanOrderIdResult {
// 参数
param := gorequest.NewParams()
param.Set("order_id", orderId)
param.Set("orderid", orderId) // 订单号
if Type <= 0 {
Type = 4
}
param.Set("type", Type) // 2-酒店 4-外卖 6-闪购 8-优选 默认4
params := gorequest.NewParamsWith(param)
// 请求
request, err := c.request(ctx, apiUrl+"/waimai/meituan_orderid", params, http.MethodPost)

@ -11,17 +11,17 @@ type WaiMaiMeituanPrivilegeResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
H5 string `json:"h5"`
ShortH5 string `json:"short_h5"`
Deeplink string `json:"deeplink"`
H5Evoke string `json:"h5_evoke"`
Tkl string `json:"tkl"`
H5 string `json:"h5"` // H5 领券
ShortH5 string `json:"short_h5"` // H5 领券短链接
Deeplink string `json:"deeplink"` // Deeplink领券
H5Evoke string `json:"h5_evoke"` // H5 内唤起页
Qrcode string `json:"qrcode"` // 二维码海报图片路径
Tkl string `json:"tkl"` // 团口令
WeAppInfo struct {
AppId string `json:"app_id"`
PagePath string `json:"page_path"`
MiniCode string `json:"miniCode"`
} `json:"we_app_info"`
Qrcode string `json:"qrcode"`
AppId string `json:"app_id"` // 小程序ID
PagePath string `json:"page_path"` // 小程序路径
MiniCode string `json:"miniCode"` // 小程序码
} `json:"we_app_info"` // 小程序信息
} `json:"data"`
}
@ -38,12 +38,13 @@ func newWaiMaiMeituanPrivilegeResult(result WaiMaiMeituanPrivilegeResponse, body
// WaiMaiMeituanPrivilege 美团外卖CPS推广API接口
// https://www.dingdanxia.com/doc/174/173
func (c *Client) WaiMaiMeituanPrivilege(ctx context.Context, sid string, generateWeApp, qrcode bool) *WaiMaiMeituanPrivilegeResult {
func (c *Client) WaiMaiMeituanPrivilege(ctx context.Context, sid string, generateWeApp bool, channels int, qrcode bool) *WaiMaiMeituanPrivilegeResult {
// 参数
param := gorequest.NewParams()
param.Set("sid", sid)
param.Set("generate_we_app", generateWeApp)
param.Set("qrcode", qrcode)
param.Set("sid", sid) // 渠道方用户唯一标识,渠道可自定义,长度不超过50参数中不能包含dingdanxia用于向用户返佣,支持小写字母和数字的格式,其它字符可能造成无法正常跟单
param.Set("generate_we_app", generateWeApp) // 是否生成小程序推广信息
param.Set("channels", channels) // 推广渠道 1-小程序推广,2-公众号推广,3-app推广,4-社群推广 默认1 ,请务必选择对应渠道推广,选择错误会影响佣金比例
param.Set("qrcode", qrcode) // 二维码图片
params := gorequest.NewParamsWith(param)
// 请求
request, err := c.request(ctx, apiUrl+"/waimai/meituan_privilege", params, http.MethodPost)

@ -11,16 +11,16 @@ type WaiMaiMeituanSgPrivilegeResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
H5 string `json:"h5"`
Deeplink string `json:"deeplink"`
H5Evoke string `json:"h5_evoke"`
ShortH5 string `json:"short_h5"`
H5 string `json:"h5"` // H5 领券
Deeplink string `json:"deeplink"` // Deeplink领券
H5Evoke string `json:"h5_evoke"` // H5 内唤起页
ShortH5 string `json:"short_h5"` // h5短连接
WeAppInfo struct {
AppId string `json:"app_id"`
PagePath string `json:"page_path"`
MiniCode string `json:"miniCode"`
} `json:"we_app_info"`
Qrcode string `json:"qrcode"`
AppId string `json:"app_id"` // 小程序ID
PagePath string `json:"page_path"` // 小程序路径
MiniCode string `json:"miniCode"` // 小程序码
} `json:"we_app_info"` // 小程序信息
Qrcode string `json:"qrcode"` // 海报
} `json:"data"`
}
@ -40,9 +40,9 @@ func newWaiMaiMeituanSgPrivilegeResult(result WaiMaiMeituanSgPrivilegeResponse,
func (c *Client) WaiMaiMeituanSgPrivilege(ctx context.Context, sid string, generateWeApp, qrcode bool) *WaiMaiMeituanSgPrivilegeResult {
// 参数
param := gorequest.NewParams()
param.Set("sid", sid)
param.Set("generate_we_app", generateWeApp)
param.Set("qrcode", qrcode)
param.Set("sid", sid) // 渠道方用户唯一标识,渠道可自定义,长度不超过50参数中不能包含dingdanxia用于向用户返佣,支持小写字母和数字的格式,其它字符可能造成无法正常跟单
param.Set("generate_we_app", generateWeApp) // 是否生成小程序推广信息
param.Set("qrcode", qrcode) // 是否生成二维码海报
params := gorequest.NewParamsWith(param)
// 请求
request, err := c.request(ctx, apiUrl+"/waimai/meituan_sg_privilege", params, http.MethodPost)

@ -0,0 +1,52 @@
package dingdanxia
import (
"context"
"encoding/json"
"github.com/dtapps/go-library/utils/gorequest"
"net/http"
)
type WaiMaiMeituanYouxuanGoodsResponse struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
Total int64 `json:"total"` // 数据总量
skuList []struct {
ItemId string `json:"itemId"` // 商品信息-宝贝 id skuid
Title string `json:"title"` // 商品信息-商品标题
PictUrl string `json:"pictUrl"` // 商品信息-商品主图
SmallImages []string `json:"smallImages"` // 商品信息-商品小图列表
OriginPrice string `json:"originPrice"` // 原价(单位为元)
PromotionPrice string `json:"promotionPrice"` // 促销价(活动价格)秒杀价格 (单位为元)
ItemDeepLinkUrl string `json:"itemDeepLinkUrl"` // 宝贝的 deeplink 地址
ItemMiddlePageLinkUrl string `json:"itemMiddlePageLinkUrl"` // 宝贝的中间页地址
ItemWXLinkUrl string `json:"itemWXLinkUrl"` // 宝贝的微信小程序链接地址
HotFlag bool `json:"hotFlag"` // 是否是热门商品
}
} `json:"data"`
}
type WaiMaiMeituanYouxuanGoodsResult struct {
Result WaiMaiMeituanYouxuanGoodsResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func newWaiMaiMeituanYouxuanGoodsResult(result WaiMaiMeituanYouxuanGoodsResponse, body []byte, http gorequest.Response, err error) *WaiMaiMeituanYouxuanGoodsResult {
return &WaiMaiMeituanYouxuanGoodsResult{Result: result, Body: body, Http: http, Err: err}
}
// WaiMaiMeituanYouxuanGoods 优选商品查询API【2022年1月17日暂停数据访问】
// https://www.dingdanxia.com/doc/235/173
func (c *Client) WaiMaiMeituanYouxuanGoods(ctx context.Context, notMustParams ...gorequest.Params) *WaiMaiMeituanYouxuanGoodsResult {
// 参数
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := c.request(ctx, apiUrl+"/waimai/meituan_youxuan_goods", params, http.MethodPost)
// 定义
var response WaiMaiMeituanYouxuanGoodsResponse
err = json.Unmarshal(request.ResponseBody, &response)
return newWaiMaiMeituanYouxuanGoodsResult(response, request.ResponseBody, request, err)
}

@ -1,52 +1,38 @@
package dingtalk
import (
"github.com/dtapps/go-library/utils/dorm"
"github.com/dtapps/go-library/utils/golog"
"github.com/dtapps/go-library/utils/gorequest"
"gorm.io/gorm"
)
type ConfigClient struct {
Secret string
AccessToken string
MongoDb *dorm.MongoClient // 日志数据库
PgsqlDb *gorm.DB // 日志数据库
DatabaseName string // 库名
// ClientConfig 实例配置
type ClientConfig struct {
Secret string
AccessToken string
}
// Client 实例
type Client struct {
client *gorequest.App // 请求客户端
log *golog.ApiClient // 日志服务
config *ConfigClient // 配置
requestClient *gorequest.App // 请求服务
config struct {
secret string
accessToken string
}
log struct {
status bool // 状态
client *golog.ApiClient // 日志服务
}
}
func NewClient(config *ConfigClient) (*Client, error) {
// NewClient 创建实例化
func NewClient(config *ClientConfig) (*Client, error) {
var err error
c := &Client{config: config}
c := &Client{}
c.client = gorequest.NewHttp()
c.config.secret = config.Secret
c.config.accessToken = config.AccessToken
if c.config.PgsqlDb != nil {
c.log, err = golog.NewApiClient(
golog.WithGormClient(c.config.PgsqlDb),
golog.WithTableName(logTable),
)
if err != nil {
return nil, err
}
}
if c.config.MongoDb != nil {
c.log, err = golog.NewApiClient(
golog.WithMongoClient(c.config.MongoDb),
golog.WithDatabaseName(c.config.DatabaseName),
golog.WithCollectionName(logTable),
)
if err != nil {
return nil, err
}
}
c.requestClient = gorequest.NewHttp()
return c, nil
}

@ -0,0 +1,18 @@
package dingtalk
import "github.com/dtapps/go-library/utils/golog"
func (c *Client) Config(secret, accessToken string) *Client {
c.config.secret = secret
c.config.accessToken = accessToken
return c
}
// ConfigApiClientFun 日志配置
func (c *Client) ConfigApiClientFun(apiClientFun golog.ApiClientFun) {
apiClient := apiClientFun()
if apiClient != nil {
c.log.client = apiClient
c.log.status = true
}
}

@ -5,5 +5,5 @@ const (
)
const (
logTable = "dingtalk"
LogTable = "dingtalk"
)

@ -0,0 +1,15 @@
package dingtalk
import "github.com/dtapps/go-library/utils/golog"
func (c *Client) GetSecret() string {
return c.config.secret
}
func (c *Client) GetAccessToken() string {
return c.config.accessToken
}
func (c *Client) GetLog() *golog.ApiClient {
return c.log.client
}

@ -9,7 +9,7 @@ import (
func (c *Client) request(ctx context.Context, url string, params map[string]interface{}, method string) (gorequest.Response, error) {
// 创建请求
client := c.client
client := c.requestClient
// 设置请求地址
client.SetUri(url)
@ -23,18 +23,18 @@ func (c *Client) request(ctx context.Context, url string, params map[string]inte
// 设置参数
client.SetParams(params)
// 传入SDk版本
client.AfferentSdkUserVersion(go_library.Version())
// 发起请求
request, err := client.Request(ctx)
if err != nil {
return gorequest.Response{}, err
}
// 日志
if c.config.PgsqlDb != nil {
go c.log.GormMiddleware(ctx, request, go_library.Version())
}
if c.config.MongoDb != nil {
go c.log.MongoMiddleware(ctx, request, go_library.Version())
// 记录日志
if c.log.status {
go c.log.client.Middleware(ctx, request, go_library.Version())
}
return request, err

@ -33,7 +33,7 @@ func (c *Client) RobotSend(ctx context.Context, notMustParams ...gorequest.Param
// 时间
timestamp := time.Now().UnixNano() / 1e6
// 请求
request, err := c.request(ctx, apiUrl+fmt.Sprintf("/robot/send?access_token=%s&timestamp=%d&sign=%s", c.config.AccessToken, timestamp, c.sign(timestamp)), params, http.MethodPost)
request, err := c.request(ctx, apiUrl+fmt.Sprintf("/robot/send?access_token=%s&timestamp=%d&sign=%s", c.GetAccessToken(), timestamp, c.sign(timestamp)), params, http.MethodPost)
// 定义
var response RobotSendResponse
err = json.Unmarshal(request.ResponseBody, &response)

@ -8,8 +8,8 @@ import (
)
func (c *Client) sign(t int64) string {
secStr := fmt.Sprintf("%d\n%s", t, c.config.Secret)
hmac256 := hmac.New(sha256.New, []byte(c.config.Secret))
secStr := fmt.Sprintf("%d\n%s", t, c.GetSecret())
hmac256 := hmac.New(sha256.New, []byte(c.GetSecret()))
hmac256.Write([]byte(secStr))
result := hmac256.Sum(nil)
return base64.StdEncoding.EncodeToString(result)

@ -2,55 +2,36 @@ package douyin
import (
"errors"
"github.com/dtapps/go-library/utils/dorm"
"github.com/dtapps/go-library/utils/golog"
"github.com/dtapps/go-library/utils/gorequest"
"gorm.io/gorm"
"net/http"
"strings"
)
type ConfigClient struct {
MongoDb *dorm.MongoClient // 日志数据库
PgsqlDb *gorm.DB // 日志数据库
DatabaseName string // 库名
// ClientConfig 实例配置
type ClientConfig struct {
}
// Client 实例
type Client struct {
ua string // 用户代理
client *gorequest.App // 请求客户端
log *golog.ApiClient // 日志服务
config *ConfigClient // 配置
requestClient *gorequest.App // 请求服务
config struct {
ua string // 用户代理
}
log struct {
status bool // 状态
client *golog.ApiClient // 日志服务
}
}
func NewClient(config *ConfigClient) (*Client, error) {
// NewClient 创建实例化
func NewClient(config *ClientConfig) (*Client, error) {
var err error
c := &Client{config: config}
c := &Client{}
c.ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"
c.config.ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"
c.client = gorequest.NewHttp()
if c.config.PgsqlDb != nil {
c.log, err = golog.NewApiClient(
golog.WithGormClient(c.config.PgsqlDb),
golog.WithTableName(logTable),
)
if err != nil {
return nil, err
}
}
if c.config.MongoDb != nil {
c.log, err = golog.NewApiClient(
golog.WithMongoClient(c.config.MongoDb),
golog.WithDatabaseName(c.config.DatabaseName),
golog.WithCollectionName(logTable),
)
if err != nil {
return nil, err
}
}
c.requestClient = gorequest.NewHttp()
return c, nil
}

@ -0,0 +1,12 @@
package douyin
import "github.com/dtapps/go-library/utils/golog"
// ConfigApiClientFun 日志配置
func (c *Client) ConfigApiClientFun(apiClientFun golog.ApiClientFun) {
apiClient := apiClientFun()
if apiClient != nil {
c.log.client = apiClient
c.log.status = true
}
}

@ -1,5 +1,5 @@
package douyin
const (
logTable = "douyin"
LogTable = "douyin"
)

@ -0,0 +1,7 @@
package douyin
import "github.com/dtapps/go-library/utils/golog"
func (c *Client) GetLog() *golog.ApiClient {
return c.log.client
}

@ -9,7 +9,7 @@ import (
func (c *Client) request(ctx context.Context, url string, params map[string]interface{}, method string) (gorequest.Response, error) {
// 创建请求
client := c.client
client := c.requestClient
// 设置请求地址
client.SetUri(url)
@ -21,7 +21,7 @@ func (c *Client) request(ctx context.Context, url string, params map[string]inte
client.SetContentTypeJson()
// 设置用户代理
client.SetUserAgent(c.ua)
client.SetUserAgent(c.config.ua)
// 设置参数
client.SetParams(params)
@ -32,12 +32,9 @@ func (c *Client) request(ctx context.Context, url string, params map[string]inte
return gorequest.Response{}, err
}
// 日志
if c.config.PgsqlDb != nil {
go c.log.GormMiddleware(ctx, request, go_library.Version())
}
if c.config.MongoDb != nil {
go c.log.MongoMiddleware(ctx, request, go_library.Version())
// 记录日志
if c.log.status {
go c.log.client.Middleware(ctx, request, go_library.Version())
}
return request, err

@ -1,52 +1,38 @@
package eastiot
import (
"github.com/dtapps/go-library/utils/dorm"
"github.com/dtapps/go-library/utils/golog"
"github.com/dtapps/go-library/utils/gorequest"
"gorm.io/gorm"
)
type ConfigClient struct {
AppId string
ApiKey string
MongoDb *dorm.MongoClient // 日志数据库
PgsqlDb *gorm.DB // 日志数据库
DatabaseName string // 库名
// ClientConfig 实例配置
type ClientConfig struct {
AppId string
ApiKey string
}
// Client 实例
type Client struct {
client *gorequest.App // 请求客户端
log *golog.ApiClient // 日志服务
config *ConfigClient // 配置
requestClient *gorequest.App // 请求服务
config struct {
appId string
apiKey string
}
log struct {
status bool // 状态
client *golog.ApiClient // 日志服务
}
}
func NewClient(config *ConfigClient) (*Client, error) {
// NewClient 创建实例化
func NewClient(config *ClientConfig) (*Client, error) {
var err error
c := &Client{config: config}
c := &Client{}
c.client = gorequest.NewHttp()
c.config.appId = config.AppId
c.config.apiKey = config.ApiKey
if c.config.PgsqlDb != nil {
c.log, err = golog.NewApiClient(
golog.WithGormClient(c.config.PgsqlDb),
golog.WithTableName(logTable),
)
if err != nil {
return nil, err
}
}
if c.config.MongoDb != nil {
c.log, err = golog.NewApiClient(
golog.WithMongoClient(c.config.MongoDb),
golog.WithDatabaseName(c.config.DatabaseName),
golog.WithCollectionName(logTable),
)
if err != nil {
return nil, err
}
}
c.requestClient = gorequest.NewHttp()
return c, nil
}

@ -0,0 +1,12 @@
package eastiot
import "github.com/dtapps/go-library/utils/golog"
// ConfigApiClientFun 日志配置
func (c *Client) ConfigApiClientFun(apiClientFun golog.ApiClientFun) {
apiClient := apiClientFun()
if apiClient != nil {
c.log.client = apiClient
c.log.status = true
}
}

@ -5,5 +5,5 @@ const (
)
const (
logTable = "eastiot"
LogTable = "eastiot"
)

@ -0,0 +1,15 @@
package eastiot
import "github.com/dtapps/go-library/utils/golog"
func (c *Client) GetAppId() string {
return c.config.appId
}
func (c *Client) GetApiKey() string {
return c.config.apiKey
}
func (c *Client) GetLog() *golog.ApiClient {
return c.log.client
}

@ -10,14 +10,14 @@ import (
func (c *Client) request(ctx context.Context, url string, params map[string]interface{}, method string) (gorequest.Response, error) {
// 公共参数
params["appId"] = c.config.AppId
params["appId"] = c.GetAppId()
params["timeStamp"] = time.Now().Unix()
// 签名
params["sign"] = c.getSign(params)
// 创建请求
client := c.client
client := c.requestClient
// 设置请求地址
client.SetUri(url)
@ -37,12 +37,9 @@ func (c *Client) request(ctx context.Context, url string, params map[string]inte
return gorequest.Response{}, err
}
// 日志
if c.config.PgsqlDb != nil {
go c.log.GormMiddleware(ctx, request, go_library.Version())
}
if c.config.MongoDb != nil {
go c.log.MongoMiddleware(ctx, request, go_library.Version())
// 记录日志
if c.log.status {
go c.log.client.Middleware(ctx, request, go_library.Version())
}
return request, err

@ -18,7 +18,7 @@ func (c *Client) getSign(p map[string]interface{}) string {
for _, key := range keys {
signStr += fmt.Sprintf("%s=%s&", key, c.getString(p[key]))
}
signStr += fmt.Sprintf("apiKey=%s", c.config.ApiKey)
signStr += fmt.Sprintf("apiKey=%s", c.GetApiKey())
return gomd5.ToUpper(signStr)
}

@ -35,7 +35,7 @@ func (c *Client) CheckCost(ctx context.Context, orderId string) *CheckCostResult
param.Set("orderid", orderId)
params := gorequest.NewParamsWith(param)
// 签名
c.signStr = fmt.Sprintf("userid%vpwd%vorderid%v", c.getUserId(), c.getPwd(), orderId)
c.config.signStr = fmt.Sprintf("userid%vpwd%vorderid%v", c.GetUserId(), c.GetPwd(), orderId)
// 请求
request, err := c.request(ctx, apiUrl+"/checkCost.do", params, http.MethodGet)
// 定义

@ -46,7 +46,7 @@ func (c *Client) ChOngZhiJkOrders(ctx context.Context, orderID string, face int,
param.Set("amount", 1)
params := gorequest.NewParamsWith(param)
// 签名
c.signStr = fmt.Sprintf("userid%vpwd%vorderid%vface%vaccount%vamount1", c.getUserId(), c.getPwd(), orderID, face, account)
c.config.signStr = fmt.Sprintf("userid%vpwd%vorderid%vface%vaccount%vamount1", c.GetUserId(), c.GetPwd(), orderID, face, account)
// 请求
request, err := c.request(ctx, apiUrl+"/chongzhi_jkorders.do", params, http.MethodGet)
// 定义

@ -1,54 +1,42 @@
package ejiaofei
import (
"github.com/dtapps/go-library/utils/dorm"
"github.com/dtapps/go-library/utils/golog"
"github.com/dtapps/go-library/utils/gorequest"
"gorm.io/gorm"
)
type ConfigClient struct {
UserId string
Pwd string
Key string
MongoDb *dorm.MongoClient // 日志数据库
PgsqlDb *gorm.DB // 日志数据库
DatabaseName string // 库名
// ClientConfig 实例配置
type ClientConfig struct {
UserId string
Pwd string
Key string
}
// Client 实例
type Client struct {
client *gorequest.App // 请求客户端
log *golog.ApiClient // 日志服务
signStr string // 加密信息
config *ConfigClient // 配置
requestClient *gorequest.App // 请求服务
config struct {
userId string
pwd string
key string
signStr string // 需要签名的字符串
}
log struct {
status bool // 状态
client *golog.ApiClient // 日志服务
}
}
func NewClient(config *ConfigClient) (*Client, error) {
// NewClient 创建实例化
func NewClient(config *ClientConfig) (*Client, error) {
var err error
c := &Client{config: config}
c := &Client{}
c.client = gorequest.NewHttp()
c.config.userId = config.UserId
c.config.pwd = config.Pwd
c.config.key = config.Key
if c.config.PgsqlDb != nil {
c.log, err = golog.NewApiClient(
golog.WithGormClient(c.config.PgsqlDb),
golog.WithTableName(logTable),
)
if err != nil {
return nil, err
}
}
if c.config.MongoDb != nil {
c.log, err = golog.NewApiClient(
golog.WithMongoClient(c.config.MongoDb),
golog.WithDatabaseName(c.config.DatabaseName),
golog.WithCollectionName(logTable),
)
if err != nil {
return nil, err
}
}
c.requestClient = gorequest.NewHttp()
return c, err
return c, nil
}

@ -0,0 +1,12 @@
package ejiaofei
import "github.com/dtapps/go-library/utils/golog"
// ConfigApiClientFun 日志配置
func (c *Client) ConfigApiClientFun(apiClientFun golog.ApiClientFun) {
apiClient := apiClientFun()
if apiClient != nil {
c.log.client = apiClient
c.log.status = true
}
}

@ -5,5 +5,5 @@ const (
)
const (
logTable = "ejiaofei"
LogTable = "ejiaofei"
)

@ -1,13 +1,19 @@
package ejiaofei
func (c *Client) getUserId() string {
return c.config.UserId
import "github.com/dtapps/go-library/utils/golog"
func (c *Client) GetUserId() string {
return c.config.userId
}
func (c *Client) GetPwd() string {
return c.config.pwd
}
func (c *Client) getPwd() string {
return c.config.Pwd
func (c *Client) GetKey() string {
return c.config.key
}
func (c *Client) getKey() string {
return c.config.Key
func (c *Client) GetLog() *golog.ApiClient {
return c.log.client
}

@ -51,7 +51,7 @@ func (c *Client) GprsChOngZhiAdvance(ctx context.Context, notMustParams ...goreq
// 参数
params := gorequest.NewParamsWith(notMustParams...)
// 签名
c.signStr = fmt.Sprintf("userid%vpwd%vorderid%vaccount%vgprs%varea%veffecttime%vvalidity%vtimes%v", c.getUserId(), c.getPwd(), params["orderid"], params["account"], params["gprs"], params["area"], params["effecttime"], params["validity"], params["times"])
c.config.signStr = fmt.Sprintf("userid%vpwd%vorderid%vaccount%vgprs%varea%veffecttime%vvalidity%vtimes%v", c.GetUserId(), c.GetPwd(), params["orderid"], params["account"], params["gprs"], params["area"], params["effecttime"], params["validity"], params["times"])
// 请求
request, err := c.request(ctx, apiUrl+"/gprsChongzhiAdvance.do", params, http.MethodGet)
// 定义

@ -29,7 +29,7 @@ func newMoneyJkUserResult(result MoneyJkUserResponse, body []byte, http goreques
// MoneyJkUser 用户余额查询
func (c *Client) MoneyJkUser(ctx context.Context) *MoneyJkUserResult {
// 签名
c.signStr = fmt.Sprintf("userid%vpwd%v", c.getUserId(), c.getPwd())
c.config.signStr = fmt.Sprintf("userid%vpwd%v", c.GetUserId(), c.GetPwd())
// 请求
request, err := c.request(ctx, apiUrl+"/money_jkuser.do", map[string]interface{}{}, http.MethodGet)
// 定义

@ -41,7 +41,7 @@ func (c *Client) QueryJkOrders(ctx context.Context, orderId string) *QueryJkOrde
param.Set("orderid", orderId)
params := gorequest.NewParamsWith(param)
// 签名
c.signStr = fmt.Sprintf("userid%vpwd%vorderid%v", c.getUserId(), c.getPwd(), orderId)
c.config.signStr = fmt.Sprintf("userid%vpwd%vorderid%v", c.GetUserId(), c.GetPwd(), orderId)
// 请求
request, err := c.request(ctx, apiUrl+"/query_jkorders.do", params, http.MethodGet)
// 定义

@ -27,7 +27,7 @@ func newQueryTxProductResult(result QueryTxProductResponse, body []byte, http go
// QueryTxProduct 可充值腾讯产品查询
func (c *Client) QueryTxProduct(ctx context.Context) *QueryTxProductResult {
// 签名
c.signStr = fmt.Sprintf("userid%vpwd%v", c.getUserId(), c.getPwd())
c.config.signStr = fmt.Sprintf("userid%vpwd%v", c.GetUserId(), c.GetPwd())
// 请求
request, err := c.request(ctx, apiUrl+"/queryTXproduct.do", map[string]interface{}{}, http.MethodGet)
// 定义

@ -11,14 +11,14 @@ import (
func (c *Client) request(ctx context.Context, url string, params map[string]interface{}, method string) (gorequest.Response, error) {
// 公共参数
params["userid"] = c.getUserId()
params["pwd"] = c.getPwd()
params["userid"] = c.GetUserId()
params["pwd"] = c.GetPwd()
// 签名
params["userkey"] = gomd5.ToUpper(fmt.Sprintf("%s%s", c.signStr, c.getKey()))
params["userkey"] = gomd5.ToUpper(fmt.Sprintf("%s%s", c.config.signStr, c.GetKey()))
// 创建请求
client := c.client
client := c.requestClient
// 设置请求地址
client.SetUri(url)
@ -38,12 +38,9 @@ func (c *Client) request(ctx context.Context, url string, params map[string]inte
return gorequest.Response{}, err
}
// 日志
if c.config.PgsqlDb != nil {
go c.log.GormMiddlewareXml(ctx, request, go_library.Version())
}
if c.config.MongoDb != nil {
go c.log.MongoMiddlewareXml(ctx, request, go_library.Version())
// 记录日志
if c.log.status {
go c.log.client.MiddlewareXml(ctx, request, go_library.Version())
}
return request, err

@ -47,7 +47,7 @@ func (c *Client) TxChOngZhi(ctx context.Context, notMustParams ...gorequest.Para
// 参数
params := gorequest.NewParamsWith(notMustParams...)
// 签名
c.signStr = fmt.Sprintf("userid%vpwd%vorderid%vaccount%vproductid%vamount%vip%vtimes%v", c.getUserId(), c.getPwd(), params["orderid"], params["account"], params["productid"], params["amount"], params["ip"], params["times"])
c.config.signStr = fmt.Sprintf("userid%vpwd%vorderid%vaccount%vproductid%vamount%vip%vtimes%v", c.GetUserId(), c.GetPwd(), params["orderid"], params["account"], params["productid"], params["amount"], params["ip"], params["times"])
// 请求
request, err := c.request(ctx, apiUrl+"/txchongzhi.do", params, http.MethodGet)
// 定义

@ -1,51 +1,35 @@
package feishu
import (
"github.com/dtapps/go-library/utils/dorm"
"github.com/dtapps/go-library/utils/golog"
"github.com/dtapps/go-library/utils/gorequest"
"gorm.io/gorm"
)
type ConfigClient struct {
Key string
MongoDb *dorm.MongoClient // 日志数据库
PgsqlDb *gorm.DB // 日志数据库
DatabaseName string // 库名
// ClientConfig 实例配置
type ClientConfig struct {
Key string
}
// Client 实例
type Client struct {
client *gorequest.App // 请求客户端
log *golog.ApiClient // 日志服务
config *ConfigClient // 配置
requestClient *gorequest.App // 请求服务
config struct {
key string
}
log struct {
status bool // 状态
client *golog.ApiClient // 日志服务
}
}
func NewClient(config *ConfigClient) (*Client, error) {
// NewClient 创建实例化
func NewClient(config *ClientConfig) (*Client, error) {
var err error
c := &Client{config: config}
c := &Client{}
c.client = gorequest.NewHttp()
c.config.key = config.Key
if c.config.PgsqlDb != nil {
c.log, err = golog.NewApiClient(
golog.WithGormClient(c.config.PgsqlDb),
golog.WithTableName(logTable),
)
if err != nil {
return nil, err
}
}
if c.config.MongoDb != nil {
c.log, err = golog.NewApiClient(
golog.WithMongoClient(c.config.MongoDb),
golog.WithDatabaseName(c.config.DatabaseName),
golog.WithCollectionName(logTable),
)
if err != nil {
return nil, err
}
}
c.requestClient = gorequest.NewHttp()
return c, nil
}

@ -0,0 +1,17 @@
package feishu
import "github.com/dtapps/go-library/utils/golog"
func (c *Client) Config(key string) *Client {
c.config.key = key
return c
}
// ConfigApiClientFun 日志配置
func (c *Client) ConfigApiClientFun(apiClientFun golog.ApiClientFun) {
apiClient := apiClientFun()
if apiClient != nil {
c.log.client = apiClient
c.log.status = true
}
}

@ -5,5 +5,5 @@ const (
)
const (
logTable = "feishu"
LogTable = "feishu"
)

@ -0,0 +1,11 @@
package feishu
import "github.com/dtapps/go-library/utils/golog"
func (c *Client) GetKey() string {
return c.config.key
}
func (c *Client) GetLog() *golog.ApiClient {
return c.log.client
}

@ -9,7 +9,7 @@ import (
func (c *Client) request(ctx context.Context, url string, params map[string]interface{}) (gorequest.Response, error) {
// 创建请求
client := c.client
client := c.requestClient
// 设置请求地址
client.SetUri(url)
@ -20,18 +20,18 @@ func (c *Client) request(ctx context.Context, url string, params map[string]inte
// 设置参数
client.SetParams(params)
// 传入SDk版本
client.AfferentSdkUserVersion(go_library.Version())
// 发起请求
request, err := client.Post(ctx)
if err != nil {
return gorequest.Response{}, err
}
// 日志
if c.config.PgsqlDb != nil {
go c.log.GormMiddleware(ctx, request, go_library.Version())
}
if c.config.MongoDb != nil {
go c.log.MongoMiddleware(ctx, request, go_library.Version())
// 记录日志
if c.log.status {
go c.log.client.Middleware(ctx, request, go_library.Version())
}
return request, err

@ -31,7 +31,7 @@ func (c *Client) WebhookSend(ctx context.Context, notMustParams ...gorequest.Par
// 参数
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := c.request(ctx, apiUrl+fmt.Sprintf("/open-apis/bot/v2/hook/%s", c.config.Key), params)
request, err := c.request(ctx, apiUrl+fmt.Sprintf("/open-apis/bot/v2/hook/%s", c.GetKey()), params)
// 定义
var response WebhookSendResponse
err = json.Unmarshal(request.ResponseBody, &response)

@ -1,80 +1,45 @@
package jd
import (
"github.com/dtapps/go-library/utils/dorm"
"github.com/dtapps/go-library/utils/golog"
"github.com/dtapps/go-library/utils/gorequest"
"gorm.io/gorm"
)
type ConfigClient struct {
AppKey string // 应用Key
SecretKey string // 密钥
SiteId string // 网站ID/APP ID
PositionId string // 推广位id
MongoDb *dorm.MongoClient // 日志数据库
PgsqlDb *gorm.DB // 日志数据库
DatabaseName string // 库名
// ClientConfig 实例配置
type ClientConfig struct {
AppKey string // 应用Key
SecretKey string // 密钥
SiteId string // 网站ID/APP ID
PositionId string // 推广位id
}
// Client 实例
type Client struct {
client *gorequest.App // 请求客户端
log *golog.ApiClient // 日志服务
config *ConfigClient // 配置
}
func NewClient(config *ConfigClient) (*Client, error) {
var err error
c := &Client{config: config}
c.client = gorequest.NewHttp()
c.client.Uri = apiUrl
if c.config.PgsqlDb != nil {
c.log, err = golog.NewApiClient(
golog.WithGormClient(c.config.PgsqlDb),
golog.WithTableName(logTable),
)
if err != nil {
return nil, err
}
requestClient *gorequest.App // 请求服务
config struct {
appKey string // 应用Key
secretKey string // 密钥
siteId string // 网站ID/APP ID
positionId string // 推广位id
}
if c.config.MongoDb != nil {
c.log, err = golog.NewApiClient(
golog.WithMongoClient(c.config.MongoDb),
golog.WithDatabaseName(c.config.DatabaseName),
golog.WithCollectionName(logTable),
)
if err != nil {
return nil, err
}
log struct {
status bool // 状态
client *golog.ApiClient // 日志服务
}
return c, nil
}
// GoodsPriceToInt64 商品券后价
func (c *Client) GoodsPriceToInt64(LowestCouponPrice float64) int64 {
return int64(LowestCouponPrice * 100)
}
// NewClient 创建实例化
func NewClient(config *ClientConfig) (*Client, error) {
// GoodsOriginalPriceToInt64 商品原价
func (c *Client) GoodsOriginalPriceToInt64(Price float64) int64 {
return int64(Price * 100)
}
c := &Client{}
// CouponProportionToInt64 佣金比率
func (c *Client) CouponProportionToInt64(CommissionShare float64) int64 {
return int64(CommissionShare * 10)
}
c.config.appKey = config.AppKey
c.config.secretKey = config.SecretKey
c.config.siteId = config.SiteId
c.config.positionId = config.PositionId
// CouponAmountToInt64 优惠券金额
func (c *Client) CouponAmountToInt64(Commission float64) int64 {
return int64(Commission * 100)
}
c.requestClient = gorequest.NewHttp()
c.requestClient.Uri = apiUrl
// CommissionIntegralToInt64 佣金积分
func (c *Client) CommissionIntegralToInt64(GoodsPrice, CouponProportion int64) int64 {
return (GoodsPrice * CouponProportion) / 1000
return c, nil
}

@ -0,0 +1,12 @@
package jd
import "github.com/dtapps/go-library/utils/golog"
// ConfigApiClientFun 日志配置
func (c *Client) ConfigApiClientFun(apiClientFun golog.ApiClientFun) {
apiClient := apiClientFun()
if apiClient != nil {
c.log.client = apiClient
c.log.status = true
}
}

@ -5,5 +5,5 @@ const (
)
const (
logTable = "jd"
LogTable = "jd"
)

@ -1,21 +1,27 @@
package jd
import "github.com/dtapps/go-library/utils/golog"
// GetAppKey 应用Key
func (c *Client) GetAppKey() string {
return c.config.AppKey
return c.config.appKey
}
// GetSecretKey 密钥
func (c *Client) GetSecretKey() string {
return c.config.SecretKey
return c.config.secretKey
}
// GetSiteId 网站ID/APP ID
func (c *Client) GetSiteId() string {
return c.config.SiteId
return c.config.siteId
}
// GetPositionId 推广位id
func (c *Client) GetPositionId() string {
return c.config.PositionId
return c.config.positionId
}
func (c *Client) GetLog() *golog.ApiClient {
return c.log.client
}

@ -2,9 +2,9 @@ package jd
import (
"context"
"fmt"
"github.com/dtapps/go-library"
"github.com/dtapps/go-library/utils/gorequest"
"github.com/dtapps/go-library/utils/gostring"
)
// 请求接口
@ -14,7 +14,7 @@ func (c *Client) request(ctx context.Context, params map[string]interface{}) (go
c.Sign(params)
// 创建请求
client := c.client
client := c.requestClient
// 设置格式
client.SetContentTypeForm()
@ -28,12 +28,9 @@ func (c *Client) request(ctx context.Context, params map[string]interface{}) (go
return gorequest.Response{}, err
}
// 日志
if c.config.PgsqlDb != nil {
go c.log.GormMiddlewareCustom(ctx, gostring.ToString(params["method"]), request, go_library.Version())
}
if c.config.MongoDb != nil {
go c.log.MongoMiddlewareCustom(ctx, gostring.ToString(params["method"]), request, go_library.Version())
// 记录日志
if c.log.status {
go c.log.client.MiddlewareCustom(ctx, fmt.Sprintf("%s", params["method"]), request, go_library.Version())
}
return request, err

@ -10,7 +10,7 @@ type ApiBuyResponse struct {
Code string `json:"code"`
Message string `json:"message"`
Data struct {
OrderID int64 `json:"order_id"` // 订单号
OrderId string `json:"order_id"` // 订单号
ProductPrice string `json:"product_price"` // 商品价格
TotalPrice string `json:"total_price"` // 总支付价格
RechargeUrl string `json:"recharge_url"` // 卡密充值网址

@ -0,0 +1,26 @@
package kashangwl
import (
"context"
"github.com/gin-gonic/gin"
)
// ResponseApiBuyNotifyGin 购买商品 - 回调通知 - 请求参数
type ResponseApiBuyNotifyGin struct {
OrderId string `form:"order_id" json:"order_id" xml:"order_id" uri:"order_id" binding:"required"` // 订单编号
OuterOrderId string `form:"outer_order_id" json:"outer_order_id" xml:"outer_order_id" uri:"outer_order_id" binding:"omitempty"` // 商户订单号
ProductId int `form:"product_id" json:"product_id" xml:"product_id" uri:"product_id" binding:"omitempty"` // 商品编号
Quantity int `form:"quantity" json:"quantity" xml:"quantity" uri:"quantity" binding:"required"` // 购买数量
State int `form:"state" json:"state" xml:"state" uri:"state" binding:"required"` // 订单状态100等待发货101正在充值200交易成功500交易失败501未知状态
StateInfo string `form:"state_info" json:"state_info" xml:"state_info" uri:"state_info" binding:"omitempty"` // 状态信息
CreatedAt string `form:"created_at" json:"created_at" xml:"created_at" uri:"created_at" binding:"required"` // 购买数量
}
// ApiBuyNotifyGin 购买商品 - 回调通知
// http://doc.cqmeihu.cn/sales/order-status-notify.html
func (c *Client) ApiBuyNotifyGin(ctx context.Context, ginCtx *gin.Context) (validateJson ResponseApiBuyNotifyGin, err error) {
err = ginCtx.ShouldBind(&validateJson)
return validateJson, err
}

@ -10,17 +10,17 @@ type ApiOrderResponse struct {
Code string `json:"code"`
Message string `json:"message"`
Data struct {
ID int64 `json:"id"` // 订单号
ProductID int `json:"product_id"` // 商品编号
Id string `json:"id"` // 订单号
ProductId int `json:"product_id"` // 商品编号
ProductName string `json:"product_name"` // 商品名称
ProductType int `json:"product_type"` // 商品类型1充值2卡密3卡券4人工
ProductPrice string `json:"product_price"` // 售价
Quantity int `json:"quantity"` // 购买数量
TotalPrice string `json:"total_price"` // 总支付价格
RefundedAmount float64 `json:"refunded_amount"` // 已退款金额
BuyerCustomerID int `json:"buyer_customer_id"` // 买家编号
BuyerCustomerId int `json:"buyer_customer_id"` // 买家编号
BuyerCustomerName string `json:"buyer_customer_name"` // 买家名称
SellerCustomerID int `json:"seller_customer_id"` // 卖家编号
SellerCustomerId int `json:"seller_customer_id"` // 卖家编号
SellerCustomerName string `json:"seller_customer_name"` // 卖家名称
State int `json:"state"` // 订单状态100等待发货101正在充值200交易成功500交易失败501未知状态
CreatedAt string `json:"created_at"` // 下单时间
@ -34,8 +34,8 @@ type ApiOrderResponse struct {
No string `json:"no"`
Password string `json:"password"`
} `json:"cards"` //【卡密类订单】卡密
RechargeParams string `json:"recharge_params"` //【充值类订单】
OuterApiOrderID string `json:"outer_ApiOrder_id,omitempty"` // 外部订单号
RechargeParams string `json:"recharge_params"` //【充值类订单】
OuterOrderId string `json:"outer_order_id,omitempty"` // 外部订单号
} `json:"data"`
}

@ -10,17 +10,17 @@ type ApiOuterOrderResponse struct {
Code string `json:"code"`
Message string `json:"message"`
Data struct {
ID int64 `json:"id"` // 订单号
ProductID int `json:"product_id"` // 商品编号
Id string `json:"id"` // 订单号
ProductId int `json:"product_id"` // 商品编号
ProductName string `json:"product_name"` // 商品名称
ProductType int `json:"product_type"` // 商品类型1充值2卡密3卡券4人工
ProductPrice string `json:"product_price"` // 售价
Quantity int `json:"quantity"` // 购买数量
TotalPrice string `json:"total_price"` // 总支付价格
RefundedAmount float64 `json:"refunded_amount"` // 已退款金额
BuyerCustomerID int `json:"buyer_customer_id"` // 买家编号
BuyerCustomerId int `json:"buyer_customer_id"` // 买家编号
BuyerCustomerName string `json:"buyer_customer_name"` // 买家名称
SellerCustomerID int `json:"seller_customer_id"` // 卖家编号
SellerCustomerId int `json:"seller_customer_id"` // 卖家编号
SellerCustomerName string `json:"seller_customer_name"` // 卖家名称
State int `json:"state"` // 订单状态100等待发货101正在充值200交易成功500交易失败501未知状态
CreatedAt string `json:"created_at"` // 下单时间
@ -35,7 +35,7 @@ type ApiOuterOrderResponse struct {
Password string `json:"password"`
} `json:"cards"` //【卡密类订单】卡密
RechargeParams string `json:"recharge_params"` //【充值类订单】
OuterOrderID string `json:"outer_order_id,omitempty"` // 外部订单号
OuterOrderId string `json:"outer_order_id,omitempty"` // 外部订单号
} `json:"data"`
}

@ -12,12 +12,11 @@ type ApiProductCacheResponse struct {
Code int `json:"code"`
Message string `json:"message"`
Data struct {
GoodsId string `json:"goods_id"`
ApiGoodsId int `json:"api_goods_id"`
GoodsName string `json:"goods_name"`
ClassificationName string `json:"classification_name"`
GoodsPrice float64 `json:"goods_price"`
PurchaseTips string `json:"purchase_tips"`
GoodsId uint `json:"goods_id"`
ApiGoodsId int64 `json:"api_goods_id"`
GoodsName string `json:"goods_name"`
GoodsPrice float64 `json:"goods_price"`
PurchaseTips string `json:"purchase_tips"`
} `json:"data"`
Time int `json:"time"`
TraceId string `json:"trace_id"`
@ -38,8 +37,10 @@ func newApiProductCacheResult(result ApiProductCacheResponse, body []byte, http
func (c *Client) ApiProductCache(ctx context.Context, productId int64) *ApiProductCacheResult {
// 参数
params := gorequest.NewParams()
params.Set("customer_id", c.GetCustomerId())
params.Set("product_id", productId)
// 请求
request, err := c.requestCache(ctx, fmt.Sprintf("%s/%d/goods_info/%d", apiUrlCache, c.GetCustomerId(), productId), params, http.MethodGet)
request, err := c.requestCache(ctx, fmt.Sprintf("%s/goods_info", apiUrlCache), params, http.MethodGet)
// 定义
var response ApiProductCacheResponse
err = json.Unmarshal(request.ResponseBody, &response)

@ -10,17 +10,17 @@ type ApiProductResponse struct {
Code string `json:"code"`
Message string `json:"message"`
Data struct {
Id int `json:"id"` // 商品编号
ProductName string `json:"product_name"` // 商品名称
Name string `json:"name"` // 规格名称
Price float64 `json:"price"` // 售价
ValidPurchasingQuantity string `json:"valid_purchasing_quantity"` // 合法的购买数量
SuperiorCommissionsRate int `json:"superior_commissions_rate"` // 上级佣金比例
Type int `json:"type"` // 商品类型1充值2卡密3卡券4人工
SupplyState int `json:"supply_state"` // 库存状态1充足2断货
StockState int `json:"stock_state"` // 状态1上架2维护3下架
BanStartAt string `json:"ban_start_at"` // 禁售开始时间
BanEndAt string `json:"ban_end_at"` // 禁售结束时间
Id int `json:"id"` // 商品编号
ProductName string `json:"product_name,omitempty"` // 商品名称
Name string `json:"name"` // 规格名称
Price string `json:"price"` // 售价
ValidPurchasingQuantity string `json:"valid_purchasing_quantity"` // 合法的购买数量
SuperiorCommissionsRate int `json:"superior_commissions_rate"` // 上级佣金比例
Type int `json:"type"` // 商品类型1充值2卡密3卡券4人工
SupplyState int `json:"supply_state"` // 库存状态1充足2断货
StockState int `json:"stock_state"` // 状态1上架2维护3下架
BanStartAt string `json:"ban_start_at,omitempty"` // 禁售开始时间
BanEndAt string `json:"ban_end_at,omitempty"` // 禁售结束时间
} `json:"data"`
}

@ -1,53 +1,38 @@
package kashangwl
import (
"github.com/dtapps/go-library/utils/dorm"
"github.com/dtapps/go-library/utils/golog"
"github.com/dtapps/go-library/utils/gorequest"
"gorm.io/gorm"
)
type ConfigClient struct {
CustomerId int // 商家编号
CustomerKey string // 商家密钥
MongoDb *dorm.MongoClient // 日志数据库
PgsqlDb *gorm.DB // 日志数据库
DatabaseName string // 库名
// ClientConfig 实例配置
type ClientConfig struct {
CustomerId int64 // 商家编号
CustomerKey string // 商家密钥
}
// Client 卡商网服务
// Client 实例
type Client struct {
client *gorequest.App // 请求客户端
log *golog.ApiClient // 日志服务
config *ConfigClient // 配置
requestClient *gorequest.App // 请求服务
config struct {
customerId int64 // 商家编号
customerKey string // 商家密钥
}
log struct {
status bool // 状态
client *golog.ApiClient // 日志服务
}
}
func NewClient(config *ConfigClient) (*Client, error) {
// NewClient 创建实例化
func NewClient(config *ClientConfig) (*Client, error) {
var err error
c := &Client{config: config}
c := &Client{}
c.client = gorequest.NewHttp()
c.config.customerId = config.CustomerId
c.config.customerKey = config.CustomerKey
if c.config.PgsqlDb != nil {
c.log, err = golog.NewApiClient(
golog.WithGormClient(c.config.PgsqlDb),
golog.WithTableName(logTable),
)
if err != nil {
return nil, err
}
}
if c.config.MongoDb != nil {
c.log, err = golog.NewApiClient(
golog.WithMongoClient(c.config.MongoDb),
golog.WithDatabaseName(c.config.DatabaseName),
golog.WithCollectionName(logTable),
)
if err != nil {
return nil, err
}
}
c.requestClient = gorequest.NewHttp()
return c, nil
}

@ -0,0 +1,12 @@
package kashangwl
import "github.com/dtapps/go-library/utils/golog"
// ConfigApiClientFun 日志配置
func (c *Client) ConfigApiClientFun(apiClientFun golog.ApiClientFun) {
apiClient := apiClientFun()
if apiClient != nil {
c.log.client = apiClient
c.log.status = true
}
}

@ -14,5 +14,5 @@ const (
)
const (
logTable = "kashangwl"
LogTable = "kashangwl"
)

@ -1,9 +1,15 @@
package kashangwl
func (c *Client) GetCustomerId() int {
return c.config.CustomerId
import "github.com/dtapps/go-library/utils/golog"
func (c *Client) GetCustomerId() int64 {
return c.config.customerId
}
func (c *Client) GetCustomerKey() string {
return c.config.CustomerKey
return c.config.customerKey
}
func (c *Client) GetLog() *golog.ApiClient {
return c.log.client
}

@ -17,7 +17,7 @@ func (c *Client) request(ctx context.Context, url string, params map[string]inte
params["sign"] = c.getSign(c.GetCustomerKey(), params)
// 创建请求
client := c.client
client := c.requestClient
// 设置请求地址
client.SetUri(url)
@ -25,6 +25,9 @@ func (c *Client) request(ctx context.Context, url string, params map[string]inte
// 设置格式
client.SetContentTypeJson()
// 设置用户代理
client.SetUserAgent(gorequest.GetRandomUserAgentSystem())
// 设置参数
client.SetParams(params)
@ -35,11 +38,8 @@ func (c *Client) request(ctx context.Context, url string, params map[string]inte
}
// 日志
if c.config.PgsqlDb != nil {
go c.log.GormMiddleware(ctx, request, go_library.Version())
}
if c.config.MongoDb != nil {
go c.log.MongoMiddleware(ctx, request, go_library.Version())
if c.log.status {
go c.log.client.Middleware(ctx, request, go_library.Version())
}
return request, err
@ -48,7 +48,7 @@ func (c *Client) request(ctx context.Context, url string, params map[string]inte
func (c *Client) requestCache(ctx context.Context, url string, params map[string]interface{}, method string) (gorequest.Response, error) {
// 创建请求
client := c.client
client := c.requestClient
// 设置请求地址
client.SetUri(url)
@ -59,6 +59,9 @@ func (c *Client) requestCache(ctx context.Context, url string, params map[string
// 设置FORM格式
client.SetContentTypeJson()
// 设置用户代理
client.SetUserAgent(gorequest.GetRandomUserAgentSystem())
// 设置参数
client.SetParams(params)
@ -69,11 +72,8 @@ func (c *Client) requestCache(ctx context.Context, url string, params map[string
}
// 日志
if c.config.PgsqlDb != nil {
go c.log.GormMiddleware(ctx, request, go_library.Version())
}
if c.config.MongoDb != nil {
go c.log.MongoMiddleware(ctx, request, go_library.Version())
if c.log.status {
go c.log.client.Middleware(ctx, request, go_library.Version())
}
return request, err

@ -0,0 +1,13 @@
package kashangwl
type SetConfigConfig struct {
CustomerId int64 // 商家编号
CustomerKey string // 商家密钥
}
// SetConfig 配置
func (c *Client) SetConfig(config *SetConfigConfig) *Client {
c.config.customerId = config.CustomerId
c.config.customerKey = config.CustomerKey
return c
}

@ -1,60 +1,34 @@
package kuaishou
import (
"github.com/dtapps/go-library/utils/dorm"
"github.com/dtapps/go-library/utils/golog"
"github.com/dtapps/go-library/utils/gorequest"
"gorm.io/gorm"
)
type ConfigClient struct {
MongoDb *dorm.MongoClient // 日志数据库
PgsqlDb *gorm.DB // 日志数据库
DatabaseName string // 库名
// ClientConfig 实例配置
type ClientConfig struct {
}
// Client 实例
type Client struct {
ua string
client *gorequest.App // 请求客户端
log *golog.ApiClient // 日志服务
config *ConfigClient // 配置
requestClient *gorequest.App // 请求服务
config struct {
ua string // 用户代理
}
log struct {
status bool // 状态
client *golog.ApiClient // 日志服务
}
}
func NewClient(config *ConfigClient) (*Client, error) {
var err error
c := &Client{config: config}
// NewClient 创建实例化
func NewClient(config *ClientConfig) (*Client, error) {
c.ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36"
c := &Client{}
c.client = gorequest.NewHttp()
if c.config.PgsqlDb != nil {
c.log, err = golog.NewApiClient(
golog.WithGormClient(c.config.PgsqlDb),
golog.WithTableName(logTable),
)
if err != nil {
return nil, err
}
}
if c.config.MongoDb != nil {
c.log, err = golog.NewApiClient(
golog.WithMongoClient(c.config.MongoDb),
golog.WithDatabaseName(c.config.DatabaseName),
golog.WithCollectionName(logTable),
)
if err != nil {
return nil, err
}
}
c.config.ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36"
//if c.config.PgsqlDb != nil {
// go c.log.GormMiddleware(request)
//}
//if c.config.MongoDb != nil {
// go c.log.MongoMiddleware(request)
//}
c.requestClient = gorequest.NewHttp()
return c, nil
}

@ -0,0 +1,12 @@
package kuaishou
import "github.com/dtapps/go-library/utils/golog"
// ConfigApiClientFun 日志配置
func (c *Client) ConfigApiClientFun(apiClientFun golog.ApiClientFun) {
apiClient := apiClientFun()
if apiClient != nil {
c.log.client = apiClient
c.log.status = true
}
}

@ -1,5 +1,5 @@
package kuaishou
const (
logTable = "kuaishou"
LogTable = "kuaishou"
)

@ -0,0 +1,7 @@
package kuaishou
import "github.com/dtapps/go-library/utils/golog"
func (c *Client) GetLog() *golog.ApiClient {
return c.log.client
}

@ -29,14 +29,14 @@ func newApiGenerateLinkResult(result ApiGenerateLinkResponse, body []byte, http
func (c *Client) ApiGenerateLink(ctx context.Context, actId int64, sid string, linkType, shortLink int) *ApiGenerateLinkResult {
// 参数
param := gorequest.NewParams()
param.Set("actId", actId) // 活动id可以在联盟活动列表中查看获取
param.Set("appkey", c.config.AppKey) // 媒体名称,可在推广者备案-媒体管理中查询
param.Set("sid", sid) // 推广位sid支持通过接口自定义创建不受平台200个上限限制长度不能超过64个字符支持小写字母和数字历史已创建的推广位不受这个约束
param.Set("linkType", linkType) // 投放链接的类型
param.Set("shortLink", shortLink) // 获取长链还是短链
param.Set("actId", actId) // 活动id可以在联盟活动列表中查看获取
param.Set("appkey", c.GetAppKey()) // 媒体名称,可在推广者备案-媒体管理中查询
param.Set("sid", sid) // 推广位sid支持通过接口自定义创建不受平台200个上限限制长度不能超过64个字符支持小写字母和数字历史已创建的推广位不受这个约束
param.Set("linkType", linkType) // 投放链接的类型
param.Set("shortLink", shortLink) // 获取长链还是短链
// 转换
params := gorequest.NewParamsWith(param)
params["sign"] = c.getSign(c.config.Secret, params)
params["sign"] = c.getSign(c.GetSecret(), params)
// 请求
request, err := c.request(ctx, apiUrl+"/api/generateLink", params, http.MethodGet)
// 定义

@ -40,8 +40,8 @@ func (c *Client) ApiGetQuaLitYsCoreBySid(ctx context.Context, notMustParams ...g
params := gorequest.NewParamsWith(notMustParams...)
// 请求时刻10位时间戳(秒级)有效期60s
params["ts"] = gotime.Current().Timestamp()
params["appkey"] = c.config.AppKey
params["sign"] = c.getSign(c.config.Secret, params)
params["appkey"] = c.GetAppKey()
params["sign"] = c.getSign(c.GetSecret(), params)
// 请求
request, err := c.request(ctx, apiUrl+"/api/getqualityscorebysid", params, http.MethodGet)
// 定义

@ -29,12 +29,12 @@ func newApiMiniCodeResult(result ApiMiniCodeResponse, body []byte, http goreques
func (c *Client) ApiMiniCode(ctx context.Context, actId int64, sid string) *ApiMiniCodeResult {
// 参数
param := gorequest.NewParams()
param.Set("appkey", c.config.AppKey)
param.Set("appkey", c.GetAppKey())
param.Set("sid", sid)
param.Set("actId", actId)
// 转换
params := gorequest.NewParamsWith(param)
params["sign"] = c.getSign(c.config.Secret, params)
params["sign"] = c.getSign(c.GetSecret(), params)
// 请求
request, err := c.request(ctx, apiUrl+"/api/miniCode", params, http.MethodGet)
// 定义

@ -52,8 +52,8 @@ func (c *Client) ApiOrder(ctx context.Context, notMustParams ...gorequest.Params
// 参数
params := gorequest.NewParamsWith(notMustParams...)
// 请求时刻10位时间戳(秒级)有效期60s
params["appkey"] = c.config.AppKey
params["sign"] = c.getSign(c.config.Secret, params)
params["appkey"] = c.GetAppKey()
params["sign"] = c.getSign(c.GetSecret(), params)
// 请求
request, err := c.request(ctx, apiUrl+"/api/order", params, http.MethodGet)
// 定义

@ -52,8 +52,8 @@ func (c *Client) ApiOrderList(ctx context.Context, notMustParams ...gorequest.Pa
params := gorequest.NewParamsWith(notMustParams...)
// 请求时刻10位时间戳(秒级)有效期60s
params["ts"] = gotime.Current().Timestamp()
params["appkey"] = c.config.AppKey
params["sign"] = c.getSign(c.config.Secret, params)
params["appkey"] = c.GetAppKey()
params["sign"] = c.getSign(c.GetSecret(), params)
// 请求
request, err := c.request(ctx, apiUrl+"/api/orderList", params, http.MethodGet)
// 定义

@ -1,53 +1,38 @@
package meituan
import (
"github.com/dtapps/go-library/utils/dorm"
"github.com/dtapps/go-library/utils/golog"
"github.com/dtapps/go-library/utils/gorequest"
"gorm.io/gorm"
)
type ConfigClient struct {
Secret string // 秘钥
AppKey string // 渠道标记
MongoDb *dorm.MongoClient // 日志数据库
PgsqlDb *gorm.DB // 日志数据库
DatabaseName string // 库名
// ClientConfig 实例配置
type ClientConfig struct {
Secret string // 秘钥
AppKey string // 渠道标记
}
// Client 美团联盟
// Client 实例
type Client struct {
client *gorequest.App // 请求客户端
log *golog.ApiClient // 日志服务
config *ConfigClient // 配置
requestClient *gorequest.App // 请求服务
config struct {
secret string // 秘钥
appKey string // 渠道标记
}
log struct {
status bool // 状态
client *golog.ApiClient // 日志服务
}
}
func NewClient(config *ConfigClient) (*Client, error) {
// NewClient 创建实例化
func NewClient(config *ClientConfig) (*Client, error) {
var err error
c := &Client{config: config}
c := &Client{}
c.client = gorequest.NewHttp()
c.config.secret = config.Secret
c.config.appKey = config.AppKey
if c.config.PgsqlDb != nil {
c.log, err = golog.NewApiClient(
golog.WithGormClient(c.config.PgsqlDb),
golog.WithTableName(logTable),
)
if err != nil {
return nil, err
}
}
if c.config.MongoDb != nil {
c.log, err = golog.NewApiClient(
golog.WithMongoClient(c.config.MongoDb),
golog.WithDatabaseName(c.config.DatabaseName),
golog.WithCollectionName(logTable),
)
if err != nil {
return nil, err
}
}
c.requestClient = gorequest.NewHttp()
return c, nil
}

@ -0,0 +1,12 @@
package meituan
import "github.com/dtapps/go-library/utils/golog"
// ConfigApiClientFun 日志配置
func (c *Client) ConfigApiClientFun(apiClientFun golog.ApiClientFun) {
apiClient := apiClientFun()
if apiClient != nil {
c.log.client = apiClient
c.log.status = true
}
}

@ -5,5 +5,5 @@ const (
)
const (
logTable = "meituan"
LogTable = "meituan"
)

@ -1,5 +1,15 @@
package meituan
import "github.com/dtapps/go-library/utils/golog"
func (c *Client) GetAppKey() string {
return c.config.AppKey
return c.config.appKey
}
func (c *Client) GetSecret() string {
return c.config.secret
}
func (c *Client) GetLog() *golog.ApiClient {
return c.log.client
}

@ -9,7 +9,7 @@ import (
func (c *Client) request(ctx context.Context, url string, params map[string]interface{}, method string) (gorequest.Response, error) {
// 创建请求
client := c.client
client := c.requestClient
// 设置请求地址
client.SetUri(url)
@ -30,11 +30,8 @@ func (c *Client) request(ctx context.Context, url string, params map[string]inte
}
// 日志
if c.config.PgsqlDb != nil {
go c.log.GormMiddleware(ctx, request, go_library.Version())
}
if c.config.MongoDb != nil {
go c.log.MongoMiddleware(ctx, request, go_library.Version())
if c.log.status {
go c.log.client.Middleware(ctx, request, go_library.Version())
}
return request, err

@ -1,70 +1,51 @@
package pinduoduo
import (
"fmt"
"github.com/dtapps/go-library/utils/dorm"
"github.com/dtapps/go-library/utils/godecimal"
"github.com/dtapps/go-library/utils/golog"
"github.com/dtapps/go-library/utils/gorequest"
"github.com/dtapps/go-library/utils/gostring"
"gorm.io/gorm"
"regexp"
"strconv"
"strings"
)
type ConfigClient struct {
ClientId string // POP分配给应用的client_id
ClientSecret string // POP分配给应用的client_secret
MediaId string // 媒体ID
Pid string // 推广位
MongoDb *dorm.MongoClient // 日志数据库
PgsqlDb *gorm.DB // 日志数据库
DatabaseName string // 库名
// ClientConfig 实例配置
type ClientConfig struct {
ClientId string // POP分配给应用的client_id
ClientSecret string // POP分配给应用的client_secret
MediaId string // 媒体ID
Pid string // 推广位
}
// Client 实例
type Client struct {
client *gorequest.App // 请求客户端
log *golog.ApiClient // 日志服务
config *ConfigClient // 配置
requestClient *gorequest.App // 请求服务
config struct {
clientId string // POP分配给应用的client_id
clientSecret string // POP分配给应用的client_secret
mediaId string // 媒体ID
pid string // 推广位
}
log struct {
status bool // 状态
client *golog.ApiClient // 日志服务
}
}
func NewClient(config *ConfigClient) (*Client, error) {
// NewClient 创建实例化
func NewClient(config *ClientConfig) (*Client, error) {
var err error
c := &Client{config: config}
c := &Client{}
c.client = gorequest.NewHttp()
c.client.Uri = apiUrl
c.config.clientId = config.ClientId
c.config.clientSecret = config.ClientSecret
c.config.mediaId = config.MediaId
c.config.pid = config.Pid
if c.config.PgsqlDb != nil {
c.log, err = golog.NewApiClient(
golog.WithGormClient(c.config.PgsqlDb),
golog.WithTableName(logTable),
)
if err != nil {
return nil, err
}
}
if c.config.MongoDb != nil {
c.log, err = golog.NewApiClient(
golog.WithMongoClient(c.config.MongoDb),
golog.WithDatabaseName(c.config.DatabaseName),
golog.WithCollectionName(logTable),
)
if err != nil {
return nil, err
}
}
c.requestClient = gorequest.NewHttp()
c.requestClient.Uri = apiUrl
return c, nil
}
func (c *Client) ConfigPid(pid string) *Client {
n := c
n.config.Pid = pid
return n
}
type ErrResp struct {
ErrorResponse struct {
ErrorMsg string `json:"error_msg"`
@ -81,28 +62,11 @@ type CustomParametersResult struct {
}
func (c *Client) SalesTipParseInt64(salesTip string) int64 {
parseInt, err := strconv.ParseInt(salesTip, 10, 64)
if err != nil {
salesTipStr := salesTip
if strings.Contains(salesTip, "万+") {
salesTipStr = strings.Replace(salesTip, "万+", "0000", -1)
} else if strings.Contains(salesTip, "万") {
salesTipStr = strings.Replace(salesTip, "万", "000", -1)
}
re := regexp.MustCompile("[0-9]+")
SalesTipMap := re.FindAllString(salesTipStr, -1)
if len(SalesTipMap) == 2 {
return gostring.ToInt64(fmt.Sprintf("%s%s", SalesTipMap[0], SalesTipMap[1]))
} else if len(SalesTipMap) == 1 {
return gostring.ToInt64(SalesTipMap[0])
} else {
return 0
}
if strings.Contains(salesTip, "万+") {
return godecimal.NewString(strings.Replace(salesTip, "万+", "0000", -1)).Int64()
} else if strings.Contains(salesTip, "万") {
return godecimal.NewString(strings.Replace(salesTip, "万", "000", -1)).Int64()
} else {
return parseInt
return godecimal.NewString(salesTip).Int64()
}
}
func (c *Client) CommissionIntegralToInt64(GoodsPrice, CouponProportion int64) int64 {
return (GoodsPrice * CouponProportion) / 1000
}

@ -0,0 +1,17 @@
package pinduoduo
import "github.com/dtapps/go-library/utils/golog"
func (c *Client) ConfigPid(pid string) *Client {
c.config.pid = pid
return c
}
// ConfigApiClientFun 日志配置
func (c *Client) ConfigApiClientFun(apiClientFun golog.ApiClientFun) {
apiClient := apiClientFun()
if apiClient != nil {
c.log.client = apiClient
c.log.status = true
}
}

@ -5,5 +5,15 @@ const (
)
const (
logTable = "pinduoduo"
LogTable = "pinduoduo"
)
type ApiErrorT struct {
ErrorResponse struct {
ErrorMsg string `json:"error_msg"`
SubMsg string `json:"sub_msg"`
SubCode string `json:"sub_code"`
ErrorCode int `json:"error_code"`
RequestId string `json:"request_id"`
} `json:"error_response"`
}

@ -0,0 +1,23 @@
package pinduoduo
import "github.com/dtapps/go-library/utils/golog"
func (c *Client) GetClientId() string {
return c.config.clientId
}
func (c *Client) GetClientSecret() string {
return c.config.clientSecret
}
func (c *Client) GetMediaId() string {
return c.config.mediaId
}
func (c *Client) GetPid() string {
return c.config.pid
}
func (c *Client) GetLog() *golog.ApiClient {
return c.log.client
}

@ -27,18 +27,18 @@ func NewParamsWithType(_type string, params ...Params) Params {
}
func (c *Client) Sign(p Params) {
p["client_id"] = c.config.ClientId
p["client_id"] = c.GetClientId()
// 排序所有的 key
var keys []string
for key := range p {
keys = append(keys, key)
}
sort.Strings(keys)
signStr := c.config.ClientSecret
signStr := c.GetClientSecret()
for _, key := range keys {
signStr += key + getString(p[key])
}
signStr += c.config.ClientSecret
signStr += c.GetClientSecret()
p["sign"] = createSign(signStr)
}

@ -66,7 +66,7 @@ func newCmsPromUrlGenerateResult(result CmsPromUrlGenerateResponse, body []byte,
func (c *Client) CmsPromUrlGenerate(ctx context.Context, notMustParams ...Params) *CmsPromUrlGenerateResult {
// 参数
params := NewParamsWithType("pdd.ddk.cms.prom.url.generate", notMustParams...)
params.Set("p_id_list", []string{c.config.Pid})
params.Set("p_id_list", []string{c.GetPid()})
// 请求
request, err := c.request(ctx, params)
// 定义

@ -101,7 +101,7 @@ func newGoodsDetailResult(result GoodsDetailResponse, body []byte, http goreques
func (c *Client) GoodsDetail(ctx context.Context, notMustParams ...Params) *GoodsDetailResult {
// 参数
params := NewParamsWithType("pdd.ddk.goods.detail", notMustParams...)
params.Set("pid", c.config.Pid)
params.Set("pid", c.GetPid())
// 请求
request, err := c.request(ctx, params)
// 定义

@ -34,6 +34,11 @@ type GoodsPromotionUrlGenerateResponse struct {
UserName string `json:"user_name,omitempty"` // 用户名
WeAppIconUrl string `json:"we_app_icon_url,omitempty"` // 小程序图片
} `json:"we_app_info"`
WeixinCode string `json:"weixin_code"`
WeAppWebViewUrl string `json:"we_app_web_view_url"`
WeAppWebViewShortUrl string `json:"we_app_web_view_short_url"`
TzSchemaUrl string `json:"tz_schema_url"`
WeixinShortLink string `json:"weixin_short_link"`
} `json:"goods_promotion_url_list"`
} `json:"goods_promotion_url_generate_response"`
}
@ -54,7 +59,7 @@ func newGoodsPromotionUrlGenerateResult(result GoodsPromotionUrlGenerateResponse
func (c *Client) GoodsPromotionUrlGenerate(ctx context.Context, notMustParams ...Params) *GoodsPromotionUrlGenerateResult {
// 参数
params := NewParamsWithType("pdd.ddk.goods.promotion.url.generate", notMustParams...)
params.Set("p_id", c.config.Pid)
params.Set("p_id", c.GetPid())
// 请求
request, err := c.request(ctx, params)
// 定义

@ -83,7 +83,7 @@ func newGoodsRecommendGetResult(result GoodsRecommendGetResponse, body []byte, h
func (c *Client) GoodsRecommendGet(ctx context.Context, notMustParams ...Params) *GoodsRecommendGetResult {
// 参数
params := NewParamsWithType("pdd.ddk.goods.recommend.get", notMustParams...)
params.Set("pid", c.config.Pid)
params.Set("pid", c.GetPid())
// 请求
request, err := c.request(ctx, params)
// 定义

@ -97,7 +97,7 @@ func newGoodsSearchResult(result GoodsSearchResponse, body []byte, http goreques
func (c *Client) GoodsSearch(ctx context.Context, notMustParams ...Params) *GoodsSearchResult {
// 参数
params := NewParamsWithType("pdd.ddk.goods.search", notMustParams...)
params.Set("pid", c.config.Pid)
params.Set("pid", c.GetPid())
// 请求
request, err := c.request(ctx, params)
// 定义

@ -29,7 +29,7 @@ func newMemberAuthorityQueryResult(result MemberAuthorityQueryResponse, body []b
func (c *Client) MemberAuthorityQuery(ctx context.Context, notMustParams ...Params) *MemberAuthorityQueryResult {
// 参数
params := NewParamsWithType("pdd.ddk.member.authority.query", notMustParams...)
params.Set("pid", c.config.Pid)
params.Set("pid", c.GetPid())
// 请求
request, err := c.request(ctx, params)
// 定义

@ -55,7 +55,7 @@ func newResourceUrlGenResult(result ResourceUrlGenResponse, body []byte, http go
func (c *Client) ResourceUrlGen(ctx context.Context, notMustParams ...Params) *ResourceUrlGenResult {
// 参数
params := NewParamsWithType("pdd.ddk.resource.url.gen", notMustParams...)
params.Set("pid", c.config.Pid)
params.Set("pid", c.GetPid())
// 请求
request, err := c.request(ctx, params)
// 定义

@ -70,7 +70,7 @@ func newRpPromUrlGenerateResult(result RpPromUrlGenerateResponse, body []byte, h
func (c *Client) RpPromUrlGenerate(ctx context.Context, notMustParams ...Params) *RpPromUrlGenerateResult {
// 参数
params := NewParamsWithType("pdd.ddk.rp.prom.url.generate", notMustParams...)
params.Set("p_id_list", []string{c.config.Pid})
params.Set("p_id_list", []string{c.GetPid()})
// 请求
request, err := c.request(ctx, params)
// 定义

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save