master
李光春 2 years ago
parent 5750f7eb2c
commit b77d14b664

@ -1,25 +1,18 @@
package dingdanxia
import (
"dtapps/dta/library/utils/gohttp"
"dtapps/dta/library/utils/gomongo"
"errors"
"fmt"
"github.com/dtapps/go-library/utils/gohttp"
"github.com/go-redis/redis/v8"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
"gorm.io/gorm"
"net/http"
)
type App struct {
ApiKey string
ZapLog *zap.Logger // 日志服务
Db *gorm.DB // 关系数据库服务
RDb *redis.Client // 缓存数据库服务
MDb *mongo.Client // 非关系数据库服务
Mongo gomongo.App // 日志数据库
}
func (app *App) request(url string, params map[string]interface{}, method string) ([]byte, error) {
func (app *App) request(url string, params map[string]interface{}, method string) (resp gohttp.Response, err error) {
// 公共参数
params["apikey"] = app.ApiKey
switch method {
@ -27,19 +20,15 @@ func (app *App) request(url string, params map[string]interface{}, method string
// 请求
get, err := gohttp.Get(url, params)
// 日志
if app.ZapLog != nil {
app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, get.Header, get.Body))
}
return get.Body, err
go app.mongoLog(url, params, method, get)
return get, err
case http.MethodPost:
// 请求
postJson, err := gohttp.PostForm(url, params)
// 日志
if app.ZapLog != nil {
app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, postJson.Header, postJson.Body))
}
return postJson.Body, err
go app.mongoLog(url, params, method, postJson)
return postJson, err
default:
return nil, errors.New("请求类型不支持")
return resp, errors.New("请求类型不支持")
}
}

@ -1,31 +0,0 @@
module github.com/dtapps/go-library/service/dingdanxia
go 1.18
require (
github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320035257-384fd01c7e13
github.com/go-redis/redis/v8 v8.11.5
go.mongodb.org/mongo-driver v1.8.4
go.uber.org/zap v1.21.0
gorm.io/gorm v1.23.3
)
require (
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/golang/snappy v0.0.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.4 // indirect
github.com/klauspost/compress v1.13.6 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.0.2 // indirect
github.com/xdg-go/stringprep v1.0.2 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/text v0.3.6 // indirect
)

@ -1,6 +1,7 @@
package dingdanxia
import (
"dtapps/dta/library/utils/gohttp"
"encoding/json"
"net/http"
)
@ -29,11 +30,12 @@ type JdJyOrderDetailsResponse struct {
type JdJyOrderDetailsResult struct {
Result JdJyOrderDetailsResponse // 结果
Body []byte // 内容
Http gohttp.Response // 请求
Err error // 错误
}
func NewJdJyOrderDetailsResult(result JdJyOrderDetailsResponse, body []byte, err error) *JdJyOrderDetailsResult {
return &JdJyOrderDetailsResult{Result: result, Body: body, Err: err}
func NewJdJyOrderDetailsResult(result JdJyOrderDetailsResponse, body []byte, http gohttp.Response, err error) *JdJyOrderDetailsResult {
return &JdJyOrderDetailsResult{Result: result, Body: body, Http: http, Err: err}
}
// JdJyOrderDetails 【官方不维护】 京佣订单
@ -41,9 +43,9 @@ func (app *App) JdJyOrderDetails(notMustParams ...Params) *JdJyOrderDetailsResul
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求
body, err := app.request("https://api.tbk.dingdanxia.com/jd/jy_order_details", params, http.MethodPost)
request, err := app.request("https://api.tbk.dingdanxia.com/jd/jy_order_details", params, http.MethodPost)
// 定义
var response JdJyOrderDetailsResponse
err = json.Unmarshal(body, &response)
return NewJdJyOrderDetailsResult(response, body, err)
err = json.Unmarshal(request.Body, &response)
return NewJdJyOrderDetailsResult(response, request.Body, request, err)
}

@ -11,9 +11,9 @@ func (app *App) JdOrderDetails2(notMustParams ...Params) *JdJyOrderDetailsResult
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求
body, err := app.request("https://api.tbk.dingdanxia.com/jd/order_details2", params, http.MethodPost)
request, err := app.request("https://api.tbk.dingdanxia.com/jd/order_details2", params, http.MethodPost)
// 定义
var response JdJyOrderDetailsResponse
err = json.Unmarshal(body, &response)
return NewJdJyOrderDetailsResult(response, body, err)
err = json.Unmarshal(request.Body, &response)
return NewJdJyOrderDetailsResult(response, request.Body, request, err)
}

@ -0,0 +1,47 @@
package dingdanxia
import (
"dtapps/dta/library/utils/gohttp"
"encoding/json"
"gitee.com/dtapps/go-library/utils/gotime"
)
// 日志
type mongoZap struct {
Url string `json:"url" bson:"url"`
Params interface{} `json:"params" bson:"params"`
Method string `json:"method" bson:"method"`
Header interface{} `json:"header" bson:"header"`
Status string `json:"status" bson:"status"`
StatusCode int `json:"status_code" bson:"status_code"`
Body interface{} `json:"body" bson:"body"`
ContentLength int64 `json:"content_length" bson:"content_length"`
CreateTime string `json:"create_time" bson:"create_time"`
}
func (m *mongoZap) Database() string {
return "zap_logs"
}
func (m *mongoZap) TableName() string {
return "dingdanxia_" + gotime.Current().SetFormat("200601")
}
func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) {
if app.Mongo.Db == nil {
return
}
var body map[string]interface{}
_ = json.Unmarshal(request.Body, &body)
app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{
Url: url,
Params: params,
Method: method,
Header: request.Header,
Status: request.Status,
StatusCode: request.StatusCode,
Body: body,
ContentLength: request.ContentLength,
CreateTime: gotime.Current().Format(),
})
}

@ -0,0 +1,63 @@
package dingdanxia
import (
"dtapps/dta/library/utils/gohttp"
"encoding/json"
"net/http"
)
type WaimaiMeituanOrderidResponse struct {
Code int `json:"code"`
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"`
} `json:"order"`
} `json:"data"`
}
type WaimaiMeituanOrderidResult struct {
Result WaimaiMeituanOrderidResponse // 结果
Body []byte // 内容
Http gohttp.Response // 请求
Err error // 错误
}
func NewWaimaiMeituanOrderidResult(result WaimaiMeituanOrderidResponse, body []byte, http gohttp.Response, err error) *WaimaiMeituanOrderidResult {
return &WaimaiMeituanOrderidResult{Result: result, Body: body, Http: http, Err: err}
}
// WaimaiMeituanOrderid 美团联盟外卖/闪购/优选/酒店订单查询API订单号版
// https://www.dingdanxia.com/doc/179/173
func (app *App) WaimaiMeituanOrderid(orderid string) *WaimaiMeituanOrderidResult {
// 参数
param := NewParams()
param.Set("orderid", orderid)
params := app.NewParamsWith(param)
// 请求
request, err := app.request("https://api.tbk.dingdanxia.com/waimai/meituan_orderid", params, http.MethodPost)
// 定义
var response WaimaiMeituanOrderidResponse
err = json.Unmarshal(request.Body, &response)
return NewWaimaiMeituanOrderidResult(response, request.Body, request, err)
}

@ -1,6 +1,7 @@
package dingdanxia
import (
"dtapps/dta/library/utils/gohttp"
"encoding/json"
"net/http"
)
@ -29,11 +30,12 @@ type WaimaiMeituanOrdersResponse struct {
type WaimaiMeituanOrdersResult struct {
Result WaimaiMeituanOrdersResponse // 结果
Body []byte // 内容
Http gohttp.Response // 请求
Err error // 错误
}
func NewWaimaiMeituanOrdersResult(result WaimaiMeituanOrdersResponse, body []byte, err error) *WaimaiMeituanOrdersResult {
return &WaimaiMeituanOrdersResult{Result: result, Body: body, Err: err}
func NewWaimaiMeituanOrdersResult(result WaimaiMeituanOrdersResponse, body []byte, http gohttp.Response, err error) *WaimaiMeituanOrdersResult {
return &WaimaiMeituanOrdersResult{Result: result, Body: body, Http: http, Err: err}
}
// WaimaiMeituanOrders 美团联盟外卖/闪购/优选/酒店订单查询API
@ -42,9 +44,9 @@ func (app *App) WaimaiMeituanOrders(notMustParams ...Params) *WaimaiMeituanOrder
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求
body, err := app.request("https://api.tbk.dingdanxia.com/waimai/meituan_orders", params, http.MethodPost)
request, err := app.request("https://api.tbk.dingdanxia.com/waimai/meituan_orders", params, http.MethodPost)
// 定义
var response WaimaiMeituanOrdersResponse
err = json.Unmarshal(body, &response)
return NewWaimaiMeituanOrdersResult(response, body, err)
err = json.Unmarshal(request.Body, &response)
return NewWaimaiMeituanOrdersResult(response, request.Body, request, err)
}

@ -0,0 +1,53 @@
package dingdanxia
import (
"dtapps/dta/library/utils/gohttp"
"encoding/json"
"net/http"
)
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"`
WeAppInfo struct {
AppId string `json:"app_id"`
PagePath string `json:"page_path"`
MiniCode string `json:"miniCode"`
} `json:"we_app_info"`
Qrcode string `json:"qrcode"`
} `json:"data"`
}
type WaimaiMeituanPrivilegeResult struct {
Result WaimaiMeituanPrivilegeResponse // 结果
Body []byte // 内容
Http gohttp.Response // 请求
Err error // 错误
}
func NewWaimaiMeituanPrivilegeResult(result WaimaiMeituanPrivilegeResponse, body []byte, http gohttp.Response, err error) *WaimaiMeituanPrivilegeResult {
return &WaimaiMeituanPrivilegeResult{Result: result, Body: body, Http: http, Err: err}
}
// WaimaiMeituanPrivilege 美团外卖CPS推广API接口
// https://www.dingdanxia.com/doc/174/173
func (app *App) WaimaiMeituanPrivilege(sid string, generateWeApp, qrcode bool) *WaimaiMeituanPrivilegeResult {
// 参数
param := NewParams()
param.Set("sid", sid)
param.Set("generate_we_app", generateWeApp)
param.Set("qrcode", qrcode)
params := app.NewParamsWith(param)
// 请求
request, err := app.request("https://api.tbk.dingdanxia.com/waimai/meituan_privilege", params, http.MethodPost)
// 定义
var response WaimaiMeituanPrivilegeResponse
err = json.Unmarshal(request.Body, &response)
return NewWaimaiMeituanPrivilegeResult(response, request.Body, request, err)
}

@ -0,0 +1,52 @@
package dingdanxia
import (
"dtapps/dta/library/utils/gohttp"
"encoding/json"
"net/http"
)
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"`
WeAppInfo struct {
AppId string `json:"app_id"`
PagePath string `json:"page_path"`
MiniCode string `json:"miniCode"`
} `json:"we_app_info"`
Qrcode string `json:"qrcode"`
} `json:"data"`
}
type WaimaiMeituanSgPrivilegeResult struct {
Result WaimaiMeituanSgPrivilegeResponse // 结果
Body []byte // 内容
Http gohttp.Response // 请求
Err error // 错误
}
func NewWaimaiMeituanSgPrivilegeResult(result WaimaiMeituanSgPrivilegeResponse, body []byte, http gohttp.Response, err error) *WaimaiMeituanSgPrivilegeResult {
return &WaimaiMeituanSgPrivilegeResult{Result: result, Body: body, Http: http, Err: err}
}
// WaimaiMeituanSgPrivilege 美团闪购CPS推广API接口
// https://www.dingdanxia.com/doc/195/173
func (app *App) WaimaiMeituanSgPrivilege(sid string, generateWeApp, qrcode bool) *WaimaiMeituanSgPrivilegeResult {
// 参数
param := NewParams()
param.Set("sid", sid)
param.Set("generate_we_app", generateWeApp)
param.Set("qrcode", qrcode)
params := app.NewParamsWith(param)
// 请求
request, err := app.request("https://api.tbk.dingdanxia.com/waimai/meituan_sg_privilege", params, http.MethodPost)
// 定义
var response WaimaiMeituanSgPrivilegeResponse
err = json.Unmarshal(request.Body, &response)
return NewWaimaiMeituanSgPrivilegeResult(response, request.Body, request, err)
}

@ -1,24 +1,17 @@
package dingtalk
import (
"dtapps/dta/library/utils/gohttp"
"dtapps/dta/library/utils/gomongo"
"encoding/json"
"errors"
"fmt"
"github.com/dtapps/go-library/utils/gohttp"
"github.com/go-redis/redis/v8"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
"gorm.io/gorm"
"net/http"
)
type App struct {
Secret string
AccessToken string
ZapLog *zap.Logger // 日志服务
Db *gorm.DB // 关系数据库服务
RDb *redis.Client // 缓存数据库服务
MDb *mongo.Client // 非关系数据库服务
Mongo gomongo.App // 日志数据库
}
func (app *App) request(url string, params map[string]interface{}, method string) ([]byte, error) {
@ -27,9 +20,7 @@ func (app *App) request(url string, params map[string]interface{}, method string
// 请求
get, err := gohttp.Get(url, params)
// 日志
if app.ZapLog != nil {
app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, get.Header, get.Body))
}
go app.mongoLog(url, params, method, get)
return get.Body, err
case http.MethodPost:
// 请求参数
@ -40,9 +31,7 @@ func (app *App) request(url string, params map[string]interface{}, method string
// 请求
postJson, err := gohttp.PostJson(url, paramsMarshal)
// 日志
if app.ZapLog != nil {
app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, postJson.Header, postJson.Body))
}
go app.mongoLog(url, params, method, postJson)
return postJson.Body, err
default:
return nil, errors.New("请求类型不支持")

@ -1,31 +0,0 @@
module github.com/dtapps/go-library/service/dingtalk
go 1.18
require (
github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320035257-384fd01c7e13
github.com/go-redis/redis/v8 v8.11.5
go.mongodb.org/mongo-driver v1.8.4
go.uber.org/zap v1.21.0
gorm.io/gorm v1.23.3
)
require (
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/golang/snappy v0.0.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.4 // indirect
github.com/klauspost/compress v1.13.6 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.0.2 // indirect
github.com/xdg-go/stringprep v1.0.2 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/text v0.3.6 // indirect
)

@ -0,0 +1,47 @@
package dingtalk
import (
"dtapps/dta/library/utils/gohttp"
"encoding/json"
"gitee.com/dtapps/go-library/utils/gotime"
)
// 日志
type mongoZap struct {
Url string `json:"url" bson:"url"`
Params interface{} `json:"params" bson:"params"`
Method string `json:"method" bson:"method"`
Header interface{} `json:"header" bson:"header"`
Status string `json:"status" bson:"status"`
StatusCode int `json:"status_code" bson:"status_code"`
Body interface{} `json:"body" bson:"body"`
ContentLength int64 `json:"content_length" bson:"content_length"`
CreateTime string `json:"create_time" bson:"create_time"`
}
func (m *mongoZap) Database() string {
return "zap_logs"
}
func (m *mongoZap) TableName() string {
return "dingtalk_" + gotime.Current().SetFormat("200601")
}
func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) {
if app.Mongo.Db == nil {
return
}
var body map[string]interface{}
_ = json.Unmarshal(request.Body, &body)
app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{
Url: url,
Params: params,
Method: method,
Header: request.Header,
Status: request.Status,
StatusCode: request.StatusCode,
Body: body,
ContentLength: request.ContentLength,
CreateTime: gotime.Current().Format(),
})
}

@ -15,7 +15,7 @@ type IotApiQueryOrderedPkgInfoResponse struct {
Ntraffic float64 `json:"ntraffic"` // 已用量,单位:MB
Starttime int `json:"starttime"` // 流量生效起始时间时间戳
Endtime int `json:"endtime"` // 流量生效结束时间时间戳
Addtime int `json:"addtime"` // 订购时间时间戳
Addtime int64 `json:"addtime"` // 订购时间时间戳
} `json:"data"`
Msg string `json:"msg"`
}

@ -1,13 +1,9 @@
package eastiot
import (
"dtapps/dta/library/utils/gohttp"
"dtapps/dta/library/utils/gomongo"
"errors"
"fmt"
"github.com/dtapps/go-library/utils/gohttp"
"github.com/go-redis/redis/v8"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
"gorm.io/gorm"
"net/http"
"time"
)
@ -15,10 +11,7 @@ import (
type App struct {
AppID string
ApiKey string
ZapLog *zap.Logger // 日志服务
Db *gorm.DB // 关系数据库服务
RDb *redis.Client // 缓存数据库服务
MDb *mongo.Client // 非关系数据库服务
Mongo gomongo.App // 日志数据库
}
func (app *App) request(url string, params map[string]interface{}, method string) ([]byte, error) {
@ -32,17 +25,13 @@ func (app *App) request(url string, params map[string]interface{}, method string
// 请求
get, err := gohttp.Get(url, params)
// 日志
if app.ZapLog != nil {
app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, get.Header, get.Body))
}
go app.mongoLog(url, params, method, get)
return get.Body, err
case http.MethodPost:
// 请求
postJson, err := gohttp.PostForm(url, params)
// 日志
if app.ZapLog != nil {
app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, postJson.Header, postJson.Body))
}
go app.mongoLog(url, params, method, postJson)
return postJson.Body, err
default:
return nil, errors.New("请求类型不支持")

@ -1,32 +0,0 @@
module github.com/dtapps/go-library/service/eastiot
go 1.18
require (
github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320035257-384fd01c7e13
github.com/dtapps/go-library/utils/gomd5 v0.0.0-20220320035257-384fd01c7e13
github.com/go-redis/redis/v8 v8.11.5
go.mongodb.org/mongo-driver v1.8.4
go.uber.org/zap v1.21.0
gorm.io/gorm v1.23.3
)
require (
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/golang/snappy v0.0.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.4 // indirect
github.com/klauspost/compress v1.13.6 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.0.2 // indirect
github.com/xdg-go/stringprep v1.0.2 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/text v0.3.6 // indirect
)

@ -0,0 +1,47 @@
package eastiot
import (
"dtapps/dta/library/utils/gohttp"
"encoding/json"
"gitee.com/dtapps/go-library/utils/gotime"
)
// 日志
type mongoZap struct {
Url string `json:"url" bson:"url"`
Params interface{} `json:"params" bson:"params"`
Method string `json:"method" bson:"method"`
Header interface{} `json:"header" bson:"header"`
Status string `json:"status" bson:"status"`
StatusCode int `json:"status_code" bson:"status_code"`
Body interface{} `json:"body" bson:"body"`
ContentLength int64 `json:"content_length" bson:"content_length"`
CreateTime string `json:"create_time" bson:"create_time"`
}
func (m *mongoZap) Database() string {
return "zap_logs"
}
func (m *mongoZap) TableName() string {
return "eastiot_" + gotime.Current().SetFormat("200601")
}
func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) {
if app.Mongo.Db == nil {
return
}
var body map[string]interface{}
_ = json.Unmarshal(request.Body, &body)
app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{
Url: url,
Params: params,
Method: method,
Header: request.Header,
Status: request.Status,
StatusCode: request.StatusCode,
Body: body,
ContentLength: request.ContentLength,
CreateTime: gotime.Current().Format(),
})
}

@ -3,7 +3,7 @@ package eastiot
import (
"encoding/json"
"fmt"
"github.com/dtapps/go-library/utils/gomd5"
"gitee.com/dtapps/go-library/utils/gomd5"
"sort"
"strconv"
)

@ -1,14 +1,11 @@
package ejiaofei
import (
"dtapps/dta/library/utils/gohttp"
"dtapps/dta/library/utils/gomongo"
"errors"
"fmt"
"github.com/dtapps/go-library/utils/gohttp"
"github.com/dtapps/go-library/utils/gomd5"
"github.com/go-redis/redis/v8"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
"gorm.io/gorm"
"gitee.com/dtapps/go-library/utils/gomd5"
"net/http"
)
@ -17,10 +14,7 @@ type App struct {
Pwd string
Key string
signStr string
ZapLog *zap.Logger // 日志服务
Db *gorm.DB // 关系数据库服务
RDb *redis.Client // 缓存数据库服务
MDb *mongo.Client // 非关系数据库服务
Mongo gomongo.App // 日志数据库
}
func (app *App) request(url string, params map[string]interface{}, method string) ([]byte, error) {
@ -34,17 +28,13 @@ func (app *App) request(url string, params map[string]interface{}, method string
// 请求
get, err := gohttp.Get(url, params)
// 日志
if app.ZapLog != nil {
app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, get.Header, get.Body))
}
go app.mongoLog(url, params, method, get)
return get.Body, err
case http.MethodPost:
// 请求
postJson, err := gohttp.PostForm(url, params)
// 日志
if app.ZapLog != nil {
app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, postJson.Header, postJson.Body))
}
go app.mongoLog(url, params, method, postJson)
return postJson.Body, err
default:
return nil, errors.New("请求类型不支持")

@ -1,32 +0,0 @@
module github.com/dtapps/go-library/service/ejiaofei
go 1.18
require (
github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320040709-ad8a5f0e9e40
github.com/dtapps/go-library/utils/gomd5 v0.0.0-20220320040709-ad8a5f0e9e40
github.com/go-redis/redis/v8 v8.11.5
go.mongodb.org/mongo-driver v1.8.4
go.uber.org/zap v1.21.0
gorm.io/gorm v1.23.3
)
require (
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/golang/snappy v0.0.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.4 // indirect
github.com/klauspost/compress v1.13.6 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.0.2 // indirect
github.com/xdg-go/stringprep v1.0.2 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/text v0.3.6 // indirect
)

@ -0,0 +1,44 @@
package ejiaofei
import (
"dtapps/dta/library/utils/gohttp"
"gitee.com/dtapps/go-library/utils/gotime"
)
// 日志
type mongoZap struct {
Url string `json:"url" bson:"url"`
Params interface{} `json:"params" bson:"params"`
Method string `json:"method" bson:"method"`
Header interface{} `json:"header" bson:"header"`
Status string `json:"status" bson:"status"`
StatusCode int `json:"status_code" bson:"status_code"`
Body interface{} `json:"body" bson:"body"`
ContentLength int64 `json:"content_length" bson:"content_length"`
CreateTime string `json:"create_time" bson:"create_time"`
}
func (m *mongoZap) Database() string {
return "zap_logs"
}
func (m *mongoZap) TableName() string {
return "ejiaofei_" + gotime.Current().SetFormat("200601")
}
func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) {
if app.Mongo.Db == nil {
return
}
app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{
Url: url,
Params: params,
Method: method,
Header: request.Header,
Status: request.Status,
StatusCode: request.StatusCode,
Body: string(request.Body),
ContentLength: request.ContentLength,
CreateTime: gotime.Current().Format(),
})
}

@ -0,0 +1,23 @@
package feishu
import (
"dtapps/dta/library/utils/gohttp"
"dtapps/dta/library/utils/gomongo"
"encoding/json"
"net/http"
)
type App struct {
Key string
Mongo gomongo.App // 日志数据库
}
func (app *App) request(url string, params map[string]interface{}) (body []byte, err error) {
// 请求参数
paramsStr, err := json.Marshal(params)
// 请求
postJson, err := gohttp.PostJson(url, paramsStr)
// 日志
go app.mongoLog(url, params, http.MethodPost, postJson)
return postJson.Body, err
}

@ -0,0 +1,47 @@
package feishu
import (
"dtapps/dta/library/utils/gohttp"
"encoding/json"
"gitee.com/dtapps/go-library/utils/gotime"
)
// 日志
type mongoZap struct {
Url string `json:"url" bson:"url"`
Params interface{} `json:"params" bson:"params"`
Method string `json:"method" bson:"method"`
Header interface{} `json:"header" bson:"header"`
Status string `json:"status" bson:"status"`
StatusCode int `json:"status_code" bson:"status_code"`
Body interface{} `json:"body" bson:"body"`
ContentLength int64 `json:"content_length" bson:"content_length"`
CreateTime string `json:"create_time" bson:"create_time"`
}
func (m *mongoZap) Database() string {
return "zap_logs"
}
func (m *mongoZap) TableName() string {
return "feishu_" + gotime.Current().SetFormat("200601")
}
func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) {
if app.Mongo.Db == nil {
return
}
var body map[string]interface{}
_ = json.Unmarshal(request.Body, &body)
app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{
Url: url,
Params: params,
Method: method,
Header: request.Header,
Status: request.Status,
StatusCode: request.StatusCode,
Body: body,
ContentLength: request.ContentLength,
CreateTime: gotime.Current().Format(),
})
}

@ -0,0 +1,27 @@
package feishu
// Params 请求参数
type Params map[string]interface{}
func NewParams() Params {
p := make(Params)
return p
}
func (app *App) NewParamsWith(params ...Params) Params {
p := make(Params)
for _, v := range params {
p.SetParams(v)
}
return p
}
func (p Params) Set(key string, value interface{}) {
p[key] = value
}
func (p Params) SetParams(params Params) {
for key, value := range params {
p[key] = value
}
}

@ -0,0 +1,36 @@
package feishu
import (
"encoding/json"
"fmt"
)
type WebhookSendResponse struct {
Errcode int64 `json:"errcode"`
Errmsg string `json:"errmsg"`
Type string `json:"type"`
MediaId string `json:"media_id"`
CreatedAt string `json:"created_at"`
}
type WebhookSendResult struct {
Result WebhookSendResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewWebhookSendResult(result WebhookSendResponse, body []byte, err error) *WebhookSendResult {
return &WebhookSendResult{Result: result, Body: body, Err: err}
}
// WebhookSend https://open.feishu.cn/document/ukTMukTMukTM/ucTM5YjL3ETO24yNxkjN
func (app *App) WebhookSend(notMustParams ...Params) *WebhookSendResult {
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求
body, err := app.request(fmt.Sprintf("https://open.feishu.cn/open-apis/bot/v2/hook/%s", app.Key), params)
// 定义
var response WebhookSendResponse
err = json.Unmarshal(body, &response)
return NewWebhookSendResult(response, body, err)
}

@ -1,3 +0,0 @@
module github.com/dtapps/go-library/service
go 1.18

@ -1,9 +1,10 @@
package ip
import (
"github.com/dtapps/go-library/service/ip/ip2region"
v4 "github.com/dtapps/go-library/service/ip/v4"
v6 "github.com/dtapps/go-library/service/ip/v6"
"dtapps/dta/library/service/ip/ip2region"
v4 "dtapps/dta/library/service/ip/v4"
v6 "dtapps/dta/library/service/ip/v6"
"dtapps/dta/library/utils/gopostgresql"
"os"
"strings"
)
@ -12,6 +13,7 @@ type App struct {
V4Region ip2region.Ip2Region
V4db v4.Pointer
V6db v6.Pointer
Pgsql gopostgresql.App // 日志数据库
}
type FileData struct {
@ -19,6 +21,21 @@ type FileData struct {
Path *os.File
}
func (app *App) Ipv4(ip string) (res v4.Result, resInfo ip2region.IpInfo) {
res = app.V4db.Find(ip)
resInfo, _ = app.V4Region.MemorySearch(ip)
// 日志
go app.postgresqlIpv4Log(res, resInfo)
return res, resInfo
}
func (app *App) Ipv6(ip string) (res v6.Result) {
res = app.V6db.Find(ip)
// 日志
go app.postgresqlIpv6Log(res)
return res
}
func (app *App) isIpv4OrIpv6(ip string) string {
if len(ip) < 7 {
return ""

@ -1,8 +0,0 @@
module github.com/dtapps/go-library/service/ip
go 1.18
require (
github.com/dtapps/go-library/utils/gostring v0.0.0-20220320035257-384fd01c7e13
golang.org/x/text v0.3.7
)

@ -1,9 +1,9 @@
package ip2region
import (
"dtapps/dta/library/utils/gostring"
_ "embed"
"errors"
"github.com/dtapps/go-library/utils/gostring"
"os"
"strconv"
"strings"

@ -0,0 +1,108 @@
package ip
import (
"dtapps/dta/library/service/ip/ip2region"
v4 "dtapps/dta/library/service/ip/v4"
v6 "dtapps/dta/library/service/ip/v6"
)
func (app *App) InitLog() {
if app.Pgsql.Db == nil {
return
}
err := app.Pgsql.Db.AutoMigrate(&postgresqlIpv4{}, &postgresqlIpv6{})
if err != nil {
panic(err.Error())
}
}
// Ipv4 数据库
type postgresqlIpv4 struct {
Id int64
Ip string `gorm:"type:cidr"` // 输入的ip地址
Country string `gorm:"type:text"` // 国家
Province string `gorm:"type:text"` // 省份
City string `gorm:"type:text"` // 城市
Area string `gorm:"type:text"` // 区域
Isp string `gorm:"type:text"` // 运营商
Idc string `gorm:"type:text"` // 运营商
}
func (m *postgresqlIpv4) TableName() string {
return "ip_v4"
}
func (app *App) postgresqlIpv4Log(res v4.Result, resInfo ip2region.IpInfo) {
if app.Pgsql.Db == nil {
return
}
var query postgresqlIpv4
app.Pgsql.Db.Where("ip = ?", resInfo.IP).Select("id").Take(&query)
if query.Id == 0 {
app.Pgsql.Db.Create(&postgresqlIpv4{
Ip: resInfo.IP,
Country: resInfo.Country,
Province: resInfo.Province,
City: resInfo.City,
Isp: resInfo.ISP,
Idc: res.Area,
})
} else {
app.Pgsql.Db.Model(&postgresqlIpv4{}).
Where("ip = ?", res.IP).
Select("country", "province", "city", "isp", "idc").
Updates(postgresqlIpv4{
Country: resInfo.Country,
Province: resInfo.Province,
City: resInfo.City,
Isp: resInfo.ISP,
Idc: res.Area,
})
}
}
// Ipv6 数据库
type postgresqlIpv6 struct {
Id int64
Ip string `gorm:"type:cidr"` // 输入的ip地址
Country string `gorm:"type:text"` // 国家
Province string `gorm:"type:text"` // 省份
City string `gorm:"type:text"` // 城市
Area string `gorm:"type:text"` // 区域
Isp string `gorm:"type:text"` // 运营商
}
func (m *postgresqlIpv6) TableName() string {
return "ip_v6"
}
func (app *App) postgresqlIpv6Log(res v6.Result) {
if app.Pgsql.Db == nil {
return
}
var query postgresqlIpv6
app.Pgsql.Db.Where("ip = ?", res.IP).Select("id").Take(&query)
if query.Id == 0 {
app.Pgsql.Db.Create(&postgresqlIpv6{
Ip: res.IP,
Country: res.Country,
Province: res.Province,
City: res.City,
Area: res.Area,
Isp: res.Isp,
})
} else {
app.Pgsql.Db.Model(&postgresqlIpv6{}).
Where("ip = ?", res.IP).
Select("country", "area").
Select("country", "province", "city", "area", "isp").
Updates(postgresqlIpv6{
Country: res.Country,
Province: res.Province,
City: res.City,
Area: res.Area,
Isp: res.Isp,
})
}
}

@ -1,9 +1,9 @@
package v4
import (
"dtapps/dta/library/utils/gostring"
_ "embed"
"encoding/binary"
"github.com/dtapps/go-library/utils/gostring"
"golang.org/x/text/encoding/simplifiedchinese"
"net"
)

@ -1,9 +1,9 @@
package v6
import (
"dtapps/dta/library/utils/gostring"
_ "embed"
"encoding/binary"
"github.com/dtapps/go-library/utils/gostring"
"math/big"
"net"
"strings"

@ -1,21 +1,18 @@
package jd
import (
"dtapps/dta/library/utils/gohttp"
"dtapps/dta/library/utils/gomongo"
"fmt"
"github.com/dtapps/go-library/utils/gohttp"
"github.com/go-redis/redis/v8"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
"gorm.io/gorm"
"net/http"
)
type App struct {
AppKey string // 应用Key
SecretKey string // 密钥
ZapLog *zap.Logger // 日志服务
Db *gorm.DB // 关系数据库服务
RDb *redis.Client // 缓存数据库服务
MDb *mongo.Client // 非关系数据库服务
AppKey string // 应用Key
SecretKey string // 密钥
SiteId string // 网站ID/APP ID
PositionId string // 推广位id
Mongo gomongo.App // 日志数据库
}
func (app *App) request(params map[string]interface{}) (resp []byte, err error) {
@ -24,9 +21,7 @@ func (app *App) request(params map[string]interface{}) (resp []byte, err error)
// 发送请求
get, err := gohttp.PostForm("https://api.jd.com/routerjson", params)
// 日志
if app.ZapLog != nil {
app.ZapLog.Sugar().Info(fmt.Sprintf("https://api.jd.com/routerjson?method=%s %s %s", params["method"], get.Header, get.Body))
}
go app.mongoLog(fmt.Sprintf("https://api.jd.com/routerjson?method=%s", params["method"]), params, http.MethodPost, get)
return get.Body, err
}

@ -1,31 +0,0 @@
module github.com/dtapps/go-library/service/jd
go 1.18
require (
github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320040709-ad8a5f0e9e40
github.com/go-redis/redis/v8 v8.11.5
go.mongodb.org/mongo-driver v1.8.4
go.uber.org/zap v1.21.0
gorm.io/gorm v1.23.3
)
require (
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/golang/snappy v0.0.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.4 // indirect
github.com/klauspost/compress v1.13.6 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.0.2 // indirect
github.com/xdg-go/stringprep v1.0.2 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/text v0.3.6 // indirect
)

@ -0,0 +1,71 @@
package jd
import "encoding/json"
type UnionOpenActivityQueryResultResponse struct {
JdUnionOpenActivityQueryResponce struct {
Code string `json:"code"`
QueryResult string `json:"queryResult"`
} `json:"jd_union_open_activity_query_responce"`
}
type UnionOpenActivityQueryQueryResult struct {
Code int `json:"code"`
Data []struct {
ActStatus int `json:"actStatus"`
Advantage string `json:"advantage"`
CategoryList []struct {
CategoryId int `json:"categoryId"`
Type int `json:"type"`
} `json:"categoryList,omitempty"`
Content string `json:"content"`
DownloadCode string `json:"downloadCode"`
DownloadUrl string `json:"downloadUrl"`
EndTime int64 `json:"endTime"`
Id int `json:"id"`
ImgList []struct {
ImgName string `json:"imgName"`
ImgUrl string `json:"imgUrl"`
WidthHeight string `json:"widthHeight"`
} `json:"imgList,omitempty"`
PlatformType int `json:"platformType"`
PromotionEndTime int64 `json:"promotionEndTime,omitempty"`
PromotionStartTime int64 `json:"promotionStartTime,omitempty"`
Recommend int `json:"recommend,omitempty"`
StartTime int64 `json:"startTime"`
Tag string `json:"tag"`
Title string `json:"title"`
UpdateTime int64 `json:"updateTime"`
UrlM string `json:"urlM"`
UrlPC string `json:"urlPC"`
} `json:"data"`
Message string `json:"message"`
RequestId string `json:"requestId"`
TotalCount int `json:"totalCount"`
}
type UnionOpenActivityQueryResult struct {
Responce UnionOpenActivityQueryResultResponse // 结果
Result UnionOpenActivityQueryQueryResult // 结果
Body []byte // 内容
Err error // 错误
}
func NewUnionOpenActivityQueryResult(responce UnionOpenActivityQueryResultResponse, result UnionOpenActivityQueryQueryResult, body []byte, err error) *UnionOpenActivityQueryResult {
return &UnionOpenActivityQueryResult{Responce: responce, Result: result, Body: body, Err: err}
}
// UnionOpenActivityQuery 活动查询接口
// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.activity.query
func (app *App) UnionOpenActivityQuery(notMustParams ...Params) *UnionOpenActivityQueryResult {
// 参数
params := NewParamsWithType("jd.union.open.activity.query", notMustParams...)
// 请求
body, err := app.request(params)
// 定义
var responce UnionOpenActivityQueryResultResponse
var result UnionOpenActivityQueryQueryResult
err = json.Unmarshal(body, &responce)
err = json.Unmarshal([]byte(responce.JdUnionOpenActivityQueryResponce.QueryResult), &result)
return NewUnionOpenActivityQueryResult(responce, result, body, err)
}

@ -0,0 +1,48 @@
package jd
import "encoding/json"
type UnionOpenCategoryGoodsGetResultResponse struct {
JdUnionOpenCategoryGoodsGetResponce struct {
Code string `json:"code"`
GetResult string `json:"getResult"`
} `json:"jd_union_open_category_goods_get_responce"`
}
type UnionOpenCategoryGoodsGetQueryResult struct {
Code int `json:"code"`
Data []struct {
Grade int `json:"grade"` // 类目级别(类目级别 012 代表一、二、三级类目)
Name string `json:"name"` // 类目名称
Id int `json:"id"` // 类目Id
ParentId int `json:"parentId"` // 父类目Id
} `json:"data"`
Message string `json:"message"`
RequestId string `json:"requestId"`
}
type UnionOpenCategoryGoodsGetResult struct {
Responce UnionOpenCategoryGoodsGetResultResponse // 结果
Result UnionOpenCategoryGoodsGetQueryResult // 结果
Body []byte // 内容
Err error // 错误
}
func NewUnionOpenCategoryGoodsGetResult(responce UnionOpenCategoryGoodsGetResultResponse, result UnionOpenCategoryGoodsGetQueryResult, body []byte, err error) *UnionOpenCategoryGoodsGetResult {
return &UnionOpenCategoryGoodsGetResult{Responce: responce, Result: result, Body: body, Err: err}
}
// UnionOpenCategoryGoodsGet 商品类目查询接口
// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.category.goods.get
func (app *App) UnionOpenCategoryGoodsGet(notMustParams ...Params) *UnionOpenCategoryGoodsGetResult {
// 参数
params := NewParamsWithType("jd.union.open.category.goods.get", notMustParams...)
// 请求
body, err := app.request(params)
// 定义
var responce UnionOpenCategoryGoodsGetResultResponse
var result UnionOpenCategoryGoodsGetQueryResult
err = json.Unmarshal(body, &responce)
err = json.Unmarshal([]byte(responce.JdUnionOpenCategoryGoodsGetResponce.GetResult), &result)
return NewUnionOpenCategoryGoodsGetResult(responce, result, body, err)
}

@ -0,0 +1,68 @@
package jd
import "encoding/json"
type UnionOpenGoodsBigfieldQueryResultResponse struct {
JdUnionOpenGoodsBigfieldQueryResponce struct {
Code string `json:"code"`
QueryResult string `json:"queryResult"`
} `json:"jd_union_open_goods_bigfield_query_responce"`
}
type UnionOpenGoodsBigfieldQueryQueryResult struct {
Code int `json:"code"`
Data []struct {
BaseBigFieldInfo struct {
WareQD string `json:"wareQD"`
Wdis string `json:"wdis"`
} `json:"baseBigFieldInfo"`
CategoryInfo struct {
Cid1 int `json:"cid1"`
Cid1Name string `json:"cid1Name"`
Cid2 int `json:"cid2"`
Cid2Name string `json:"cid2Name"`
Cid3 int `json:"cid3"`
Cid3Name string `json:"cid3Name"`
} `json:"categoryInfo"`
DetailImages string `json:"detailImages"`
ImageInfo struct {
ImageList []struct {
Url string `json:"url"`
} `json:"imageList"`
} `json:"imageInfo"`
MainSkuId int64 `json:"mainSkuId"`
Owner string `json:"owner"`
ProductId int64 `json:"productId"`
SkuId int64 `json:"skuId"`
SkuName string `json:"skuName"`
SkuStatus int `json:"skuStatus"`
} `json:"data"`
Message string `json:"message"`
RequestId string `json:"requestId"`
}
type UnionOpenGoodsBigfieldQueryResult struct {
Responce UnionOpenGoodsBigfieldQueryResultResponse // 结果
Result UnionOpenGoodsBigfieldQueryQueryResult // 结果
Body []byte // 内容
Err error // 错误
}
func NewUnionOpenGoodsBigfieldQueryResult(responce UnionOpenGoodsBigfieldQueryResultResponse, result UnionOpenGoodsBigfieldQueryQueryResult, body []byte, err error) *UnionOpenGoodsBigfieldQueryResult {
return &UnionOpenGoodsBigfieldQueryResult{Responce: responce, Result: result, Body: body, Err: err}
}
// UnionOpenGoodsBigfieldQuery 商品详情查询接口
// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.goods.bigfield.query
func (app *App) UnionOpenGoodsBigfieldQuery(notMustParams ...Params) *UnionOpenGoodsBigfieldQueryResult {
// 参数
params := NewParamsWithType("jd.union.open.goods.bigfield.query", notMustParams...)
// 请求
body, err := app.request(params)
// 定义
var responce UnionOpenGoodsBigfieldQueryResultResponse
var result UnionOpenGoodsBigfieldQueryQueryResult
err = json.Unmarshal(body, &responce)
err = json.Unmarshal([]byte(responce.JdUnionOpenGoodsBigfieldQueryResponce.QueryResult), &result)
return NewUnionOpenGoodsBigfieldQueryResult(responce, result, body, err)
}

@ -102,7 +102,7 @@ type UnionOpenGoodsJIngFenQueryQueryResult struct {
Spuid int64 `json:"spuid"`
} `json:"data"`
Message string `json:"message"`
TotalCount int `json:"totalCount"`
TotalCount int64 `json:"totalCount"`
}
type UnionOpenGoodsJIngFenQueryResult struct {
@ -116,8 +116,7 @@ func NewUnionOpenGoodsJIngFenQueryResult(responce UnionOpenGoodsJIngFenQueryResu
return &UnionOpenGoodsJIngFenQueryResult{Responce: responce, Result: result, Body: body, Err: err}
}
// UnionOpenGoodsJIngFenQuery
// 京东联盟精选优质商品每日更新可通过频道ID查询各个频道下的精选商品。用获取的优惠券链接调用转链接口时需传入搜索接口link字段返回的原始优惠券链接切勿对链接进行任何encode、decode操作否则将导致转链二合一推广链接时校验失败
// UnionOpenGoodsJIngFenQuery 京粉精选商品查询接口
// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.goods.jingfen.query
func (app *App) UnionOpenGoodsJIngFenQuery(notMustParams ...Params) *UnionOpenGoodsJIngFenQueryResult {
// 参数

@ -0,0 +1,129 @@
package jd
import "encoding/json"
type UnionOpenGoodsMaterialQueryResultResponse struct {
JdUnionOpenGoodsMaterialQueryResponce struct {
Code string `json:"code"`
QueryResult string `json:"queryResult"`
} `json:"jd_union_open_goods_material_query_responce"`
}
type UnionOpenGoodsMaterialQueryQueryResult struct {
Code int `json:"code"`
Data []struct {
BrandCode string `json:"brandCode"`
BrandName string `json:"brandName"`
CategoryInfo struct {
Cid1 int `json:"cid1"`
Cid1Name string `json:"cid1Name"`
Cid2 int `json:"cid2"`
Cid2Name string `json:"cid2Name"`
Cid3 int `json:"cid3"`
Cid3Name string `json:"cid3Name"`
} `json:"categoryInfo"`
Comments int `json:"comments"`
CommissionInfo struct {
Commission float64 `json:"commission"`
CommissionShare float64 `json:"commissionShare"`
CouponCommission float64 `json:"couponCommission"`
PlusCommissionShare float64 `json:"plusCommissionShare"`
} `json:"commissionInfo"`
CouponInfo struct {
CouponList []struct {
BindType int `json:"bindType"`
Discount float64 `json:"discount"`
GetEndTime int64 `json:"getEndTime"`
GetStartTime int64 `json:"getStartTime"`
IsBest int `json:"isBest"`
Link string `json:"link"`
PlatformType int `json:"platformType"`
Quota float64 `json:"quota"`
UseEndTime int64 `json:"useEndTime"`
UseStartTime int64 `json:"useStartTime"`
} `json:"couponList"`
} `json:"couponInfo"`
DeliveryType int `json:"deliveryType"`
ForbidTypes []int `json:"forbidTypes"`
GoodCommentsShare float64 `json:"goodCommentsShare"`
ImageInfo struct {
ImageList []struct {
Url string `json:"url"`
} `json:"imageList"`
WhiteImage string `json:"whiteImage,omitempty"`
} `json:"imageInfo"`
InOrderCount30Days int `json:"inOrderCount30Days"`
InOrderCount30DaysSku int `json:"inOrderCount30DaysSku"`
IsHot int `json:"isHot"`
JxFlags []int `json:"jxFlags,omitempty"`
MaterialUrl string `json:"materialUrl"`
Owner string `json:"owner"`
PinGouInfo struct {
PingouEndTime int64 `json:"pingouEndTime,omitempty"`
PingouPrice float64 `json:"pingouPrice,omitempty"`
PingouStartTime int64 `json:"pingouStartTime,omitempty"`
PingouTmCount int `json:"pingouTmCount,omitempty"`
PingouUrl string `json:"pingouUrl,omitempty"`
} `json:"pinGouInfo"`
PriceInfo struct {
LowestCouponPrice float64 `json:"lowestCouponPrice"`
LowestPrice float64 `json:"lowestPrice"`
LowestPriceType int `json:"lowestPriceType"`
Price float64 `json:"price"`
} `json:"priceInfo"`
PromotionInfo struct {
ClickURL string `json:"clickURL"`
} `json:"promotionInfo"`
ResourceInfo struct {
EliteId int `json:"eliteId"`
EliteName string `json:"eliteName"`
} `json:"resourceInfo"`
ShopInfo struct {
ShopId int `json:"shopId"`
ShopLabel string `json:"shopLabel"`
ShopLevel float64 `json:"shopLevel"`
ShopName string `json:"shopName"`
AfsFactorScoreRankGrade string `json:"afsFactorScoreRankGrade,omitempty"`
AfterServiceScore string `json:"afterServiceScore,omitempty"`
CommentFactorScoreRankGrade string `json:"commentFactorScoreRankGrade,omitempty"`
LogisticsFactorScoreRankGrade string `json:"logisticsFactorScoreRankGrade,omitempty"`
LogisticsLvyueScore string `json:"logisticsLvyueScore,omitempty"`
ScoreRankRate string `json:"scoreRankRate,omitempty"`
UserEvaluateScore string `json:"userEvaluateScore,omitempty"`
} `json:"shopInfo"`
SkuId int64 `json:"skuId"`
SkuName string `json:"skuName"`
Spuid int64 `json:"spuid"`
VideoInfo struct {
} `json:"videoInfo"`
} `json:"data"`
Message string `json:"message"`
RequestId string `json:"requestId"`
TotalCount int `json:"totalCount"`
}
type UnionOpenGoodsMaterialQueryResult struct {
Responce UnionOpenGoodsMaterialQueryResultResponse // 结果
Result UnionOpenGoodsMaterialQueryQueryResult // 结果
Body []byte // 内容
Err error // 错误
}
func NewUnionOpenGoodsMaterialQueryResult(responce UnionOpenGoodsMaterialQueryResultResponse, result UnionOpenGoodsMaterialQueryQueryResult, body []byte, err error) *UnionOpenGoodsMaterialQueryResult {
return &UnionOpenGoodsMaterialQueryResult{Responce: responce, Result: result, Body: body, Err: err}
}
// UnionOpenGoodsMaterialQuery 猜你喜欢商品推荐
// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.goods.material.query
func (app *App) UnionOpenGoodsMaterialQuery(notMustParams ...Params) *UnionOpenGoodsMaterialQueryResult {
// 参数
params := NewParamsWithType("jd.union.open.goods.material.query", notMustParams...)
// 请求
body, err := app.request(params)
// 定义
var responce UnionOpenGoodsMaterialQueryResultResponse
var result UnionOpenGoodsMaterialQueryQueryResult
err = json.Unmarshal(body, &responce)
err = json.Unmarshal([]byte(responce.JdUnionOpenGoodsMaterialQueryResponce.QueryResult), &result)
return NewUnionOpenGoodsMaterialQueryResult(responce, result, body, err)
}

@ -51,8 +51,7 @@ func NewUnionOpenGoodsPromotionGoodsInfoQueryResult(responce UnionOpenGoodsPromo
return &UnionOpenGoodsPromotionGoodsInfoQueryResult{Responce: responce, Result: result, Body: body, Err: err}
}
// UnionOpenGoodsPromotionGoodsInfoQuery
// 通过SKUID查询推广商品的名称、主图、类目、价格、物流、是否自营、30天引单数量等详细信息支持批量获取。通常用于在媒体侧展示商品详情。
// UnionOpenGoodsPromotionGoodsInfoQuery 根据skuid查询商品信息接口
// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.goods.promotiongoodsinfo.query
func (app *App) UnionOpenGoodsPromotionGoodsInfoQuery(notMustParams ...Params) *UnionOpenGoodsPromotionGoodsInfoQueryResult {
// 参数

@ -0,0 +1,92 @@
package jd
import "encoding/json"
type UnionOpenOrderQueryResultResponse struct {
JdUnionOpenOrderQueryResponce struct {
Code string `json:"code"`
QueryResult string `json:"queryResult"`
} `json:"jd_union_open_order_query_responce"`
}
type UnionOpenOrderQueryQueryResult struct {
Code int `json:"code"`
Data []struct {
Ext1 string `json:"ext1"`
FinishTime int64 `json:"finishTime"`
OrderEmt int `json:"orderEmt"`
OrderId int64 `json:"orderId"`
OrderTime int64 `json:"orderTime"`
ParentId int `json:"parentId"`
PayMonth int `json:"payMonth"`
Plus int `json:"plus"`
PopId int `json:"popId"`
SkuList []struct {
ActualCosPrice float64 `json:"actualCosPrice"`
ActualFee float64 `json:"actualFee"`
Cid1 int `json:"cid1"`
Cid2 int `json:"cid2"`
Cid3 int `json:"cid3"`
CommissionRate float64 `json:"commissionRate"`
CpActId int `json:"cpActId"`
EstimateCosPrice float64 `json:"estimateCosPrice"`
EstimateFee float64 `json:"estimateFee"`
Ext1 string `json:"ext1"`
FinalRate float64 `json:"finalRate"`
FrozenSkuNum int `json:"frozenSkuNum"`
GiftCouponKey string `json:"giftCouponKey"`
GiftCouponOcsAmount float64 `json:"giftCouponOcsAmount"`
PayMonth int `json:"payMonth"`
Pid string `json:"pid"`
PopId int `json:"popId"`
PositionId int `json:"positionId"`
Price float64 `json:"price"`
ProPriceAmount float64 `json:"proPriceAmount"`
SiteId int `json:"siteId"`
SkuId int64 `json:"skuId"`
SkuName string `json:"skuName"`
SkuNum int `json:"skuNum"`
SkuReturnNum int `json:"skuReturnNum"`
SubSideRate float64 `json:"subSideRate"`
SubUnionId string `json:"subUnionId"`
SubsidyRate float64 `json:"subsidyRate"`
TraceType int `json:"traceType"`
UnionAlias string `json:"unionAlias"`
UnionRole int `json:"unionRole"`
UnionTag string `json:"unionTag"`
UnionTrafficGroup int `json:"unionTrafficGroup"`
ValidCode int `json:"validCode"`
} `json:"skuList"`
UnionId int `json:"unionId"`
ValidCode int `json:"validCode"`
} `json:"data"`
HasMore bool `json:"hasMore"`
Message string `json:"message"`
RequestId string `json:"requestId"`
}
type UnionOpenOrderQueryResult struct {
Responce UnionOpenOrderQueryResultResponse // 结果
Result UnionOpenOrderQueryQueryResult // 结果
Body []byte // 内容
Err error // 错误
}
func NewUnionOpenOrderQueryResult(responce UnionOpenOrderQueryResultResponse, result UnionOpenOrderQueryQueryResult, body []byte, err error) *UnionOpenOrderQueryResult {
return &UnionOpenOrderQueryResult{Responce: responce, Result: result, Body: body, Err: err}
}
// UnionOpenOrderQuery 订单查询接口
// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.order.query
func (app *App) UnionOpenOrderQuery(notMustParams ...Params) *UnionOpenOrderQueryResult {
// 参数
params := NewParamsWithType("jd.union.open.order.query", notMustParams...)
// 请求
body, err := app.request(params)
// 定义
var responce UnionOpenOrderQueryResultResponse
var result UnionOpenOrderQueryQueryResult
err = json.Unmarshal(body, &responce)
err = json.Unmarshal([]byte(responce.JdUnionOpenOrderQueryResponce.QueryResult), &result)
return NewUnionOpenOrderQueryResult(responce, result, body, err)
}

@ -0,0 +1,101 @@
package jd
import "encoding/json"
type UnionOpenOrderRowQueryResultResponse struct {
JdUnionOpenOrderRowQueryResponce struct {
Code string `json:"code"`
QueryResult string `json:"queryResult"`
} `json:"jd_union_open_order_row_query_responce"`
}
type UnionOpenOrderRowQueryQueryResult struct {
Code int `json:"code"`
Data []struct {
ActualCosPrice float64 `json:"actualCosPrice"`
ActualFee float64 `json:"actualFee"`
BalanceExt string `json:"balanceExt"`
CategoryInfo struct {
Cid1 int `json:"cid1"`
Cid2 int `json:"cid2"`
Cid3 int `json:"cid3"`
} `json:"categoryInfo"`
ChannelId int `json:"channelId"`
Cid1 int `json:"cid1"`
Cid2 int `json:"cid2"`
Cid3 int `json:"cid3"`
CommissionRate float64 `json:"commissionRate"`
CpActId int `json:"cpActId"`
EstimateCosPrice float64 `json:"estimateCosPrice"`
EstimateFee float64 `json:"estimateFee"`
ExpressStatus int `json:"expressStatus"`
Ext1 string `json:"ext1"`
FinalRate float64 `json:"finalRate"`
FinishTime string `json:"finishTime"`
GiftCouponKey string `json:"giftCouponKey"`
GiftCouponOcsAmount float64 `json:"giftCouponOcsAmount"`
GoodsInfo struct {
MainSkuId int `json:"mainSkuId"`
ProductId int `json:"productId"`
ShopId int `json:"shopId"`
} `json:"goodsInfo"`
Id string `json:"id"`
ModifyTime string `json:"modifyTime"`
OrderEmt int `json:"orderEmt"`
OrderId int64 `json:"orderId"`
OrderTime string `json:"orderTime"`
ParentId int `json:"parentId"`
PayMonth int `json:"payMonth"`
Pid string `json:"pid"`
Plus int `json:"plus"`
PopId int `json:"popId"`
PositionId int `json:"positionId"`
Price float64 `json:"price"`
ProPriceAmount float64 `json:"proPriceAmount"`
Rid int `json:"rid"`
SiteId int `json:"siteId"`
SkuFrozenNum int `json:"skuFrozenNum"`
SkuId int64 `json:"skuId"`
SkuName string `json:"skuName"`
SkuNum int `json:"skuNum"`
SkuReturnNum int `json:"skuReturnNum"`
SubSideRate float64 `json:"subSideRate"`
SubUnionId string `json:"subUnionId"`
SubsidyRate float64 `json:"subsidyRate"`
TraceType int `json:"traceType"`
UnionAlias string `json:"unionAlias"`
UnionId int `json:"unionId"`
UnionRole int `json:"unionRole"`
UnionTag string `json:"unionTag"`
ValidCode int `json:"validCode"`
} `json:"data"`
HasMore bool `json:"hasMore"`
Message string `json:"message"`
RequestId string `json:"requestId"`
}
type UnionOpenOrderRowQueryResult struct {
Responce UnionOpenOrderRowQueryResultResponse // 结果
Result UnionOpenOrderRowQueryQueryResult // 结果
Body []byte // 内容
Err error // 错误
}
func NewUnionOpenOrderRowQueryResult(responce UnionOpenOrderRowQueryResultResponse, result UnionOpenOrderRowQueryQueryResult, body []byte, err error) *UnionOpenOrderRowQueryResult {
return &UnionOpenOrderRowQueryResult{Responce: responce, Result: result, Body: body, Err: err}
}
// UnionOpenOrderRowQuery 订单行查询接口
// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.order.row.query
func (app *App) UnionOpenOrderRowQuery(notMustParams ...Params) *UnionOpenOrderRowQueryResult {
// 参数
params := NewParamsWithType("jd.union.open.order.row.query", notMustParams...)
// 请求
body, err := app.request(params)
// 定义
var responce UnionOpenOrderRowQueryResultResponse
var result UnionOpenOrderRowQueryQueryResult
err = json.Unmarshal(body, &responce)
err = json.Unmarshal([]byte(responce.JdUnionOpenOrderRowQueryResponce.QueryResult), &result)
return NewUnionOpenOrderRowQueryResult(responce, result, body, err)
}

@ -0,0 +1,46 @@
package jd
import "encoding/json"
type UnionOpenPromotionBySubUnionIdGetResultResponse struct {
JdUnionOpenPromotionBySubUnionIdGetResponce struct {
Code string `json:"code"`
GetResult string `json:"getResult"`
} `json:"jd_union_open_promotion_common_get_responce"`
}
type UnionOpenPromotionBySubUnionIdGetGetResult struct {
Code int `json:"code"`
Data struct {
ClickURL string `json:"clickURL"`
JCommand string `json:"jCommand"`
} `json:"data"`
Message string `json:"message"`
RequestId string `json:"requestId"`
}
type UnionOpenPromotionBySubUnionIdGetResult struct {
Responce UnionOpenPromotionBySubUnionIdGetResultResponse // 结果
Result UnionOpenPromotionBySubUnionIdGetGetResult // 结果
Body []byte // 内容
Err error // 错误
}
func NewUnionOpenPromotionBySubUnionIdGetResult(responce UnionOpenPromotionBySubUnionIdGetResultResponse, result UnionOpenPromotionBySubUnionIdGetGetResult, body []byte, err error) *UnionOpenPromotionBySubUnionIdGetResult {
return &UnionOpenPromotionBySubUnionIdGetResult{Responce: responce, Result: result, Body: body, Err: err}
}
// UnionOpenPromotionBySubUnionIdGet 社交媒体获取推广链接接口【申请】
// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.promotion.bysubunionid.get
func (app *App) UnionOpenPromotionBySubUnionIdGet(notMustParams ...Params) *UnionOpenPromotionBySubUnionIdGetResult {
// 参数
params := NewParamsWithType("jd.union.open.promotion.bysubunionid.get", notMustParams...)
// 请求
body, err := app.request(params)
// 定义
var responce UnionOpenPromotionBySubUnionIdGetResultResponse
var result UnionOpenPromotionBySubUnionIdGetGetResult
err = json.Unmarshal(body, &responce)
err = json.Unmarshal([]byte(responce.JdUnionOpenPromotionBySubUnionIdGetResponce.GetResult), &result)
return NewUnionOpenPromotionBySubUnionIdGetResult(responce, result, body, err)
}

@ -30,8 +30,7 @@ func NewUnionOpenPromotionCommonGetResult(responce UnionOpenPromotionCommonGetRe
return &UnionOpenPromotionCommonGetResult{Responce: responce, Result: result, Body: body, Err: err}
}
// UnionOpenPromotionCommonGet
// 网站/APP来获取的推广链接功能同宙斯接口的自定义链接转换、 APP领取代码接口通过商品链接、活动链接获取普通推广链接支持传入subunionid参数可用于区分媒体自身的用户ID该参数可在订单查询接口返回需向cps-qxsq@jd.com申请权限。
// UnionOpenPromotionCommonGet 网站/APP获取推广链接接口
// https://union.jd.com/openplatform/api/v2?apiName=jd.union.open.promotion.common.get
func (app *App) UnionOpenPromotionCommonGet(notMustParams ...Params) *UnionOpenPromotionCommonGetResult {
// 参数

@ -0,0 +1,47 @@
package jd
import (
"dtapps/dta/library/utils/gohttp"
"encoding/json"
"gitee.com/dtapps/go-library/utils/gotime"
)
// 日志
type mongoZap struct {
Url string `json:"url" bson:"url"`
Params interface{} `json:"params" bson:"params"`
Method string `json:"method" bson:"method"`
Header interface{} `json:"header" bson:"header"`
Status string `json:"status" bson:"status"`
StatusCode int `json:"status_code" bson:"status_code"`
Body interface{} `json:"body" bson:"body"`
ContentLength int64 `json:"content_length" bson:"content_length"`
CreateTime string `json:"create_time" bson:"create_time"`
}
func (m *mongoZap) Database() string {
return "zap_logs"
}
func (m *mongoZap) TableName() string {
return "jd_" + gotime.Current().SetFormat("200601")
}
func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) {
if app.Mongo.Db == nil {
return
}
var body map[string]interface{}
_ = json.Unmarshal(request.Body, &body)
app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{
Url: url,
Params: params,
Method: method,
Header: request.Header,
Status: request.Status,
StatusCode: request.StatusCode,
Body: body,
ContentLength: request.ContentLength,
CreateTime: gotime.Current().Format(),
})
}

@ -16,6 +16,14 @@ func NewParams() Params {
return p
}
func NewParamsWith(params ...Params) Params {
p := make(Params)
for _, v := range params {
p.SetParams(v)
}
return p
}
func NewParamsWithType(_method string, params ...Params) Params {
p := make(Params)
p["method"] = _method

@ -0,0 +1,19 @@
package jobs
import (
"gitee.com/dtapps/go-library/utils/gotime"
"log"
)
// Check 任务检查
func (app *App) Check(vs []Task) {
if app.MainService > 0 && len(vs) > 0 {
for _, v := range vs {
diffInSecondWithAbs := gotime.Current().DiffInSecondWithAbs(gotime.SetCurrentParse(v.UpdatedAt).Time)
if diffInSecondWithAbs >= v.Frequency*3 {
log.Printf("每隔%v秒任务%v相差%v秒\n", v.Frequency, v.Id, diffInSecondWithAbs)
app.Db.Where("task_id = ?", v.Id).Where("run_id = ?", v.RunId).Delete(&TaskLogRun{}) // 删除
}
}
}
}

@ -0,0 +1,144 @@
package jobs
import "gitee.com/dtapps/go-library/utils/goip"
var TypeIp = map[string]string{
// 微信支付查询
TypeWechatPayPrepaidRefill: "",
TypeWechatPayPower: "",
TypeWechatPayKashangwl: "",
TypeWechatPayEastiot: "",
TypeWechatPayEjiaofei: "",
TypeWechatPayMovie: "",
// 接口支付申请
TypeApiPaySubmitPrepaidRefill: "",
TypeApiPaySubmitPower: "",
TypeApiPaySubmitKashangwl: "",
TypeApiPaySubmitEastiot: "47.112.146.193",
TypeApiPaySubmitEjiaofei: "47.112.146.193",
TypeApiPaySubmitMovie: "",
// 接口支付查询
TypeApiPayQueryPrepaidRefill: "",
TypeApiPayQueryPower: "",
TypeApiPayQueryKashangwl: "",
TypeApiPayQueryEastiot: "47.112.146.193",
TypeApiPayQueryEjiaofei: "",
TypeApiPayQueryMovie: "",
TypeApiPayQueryPinduoduo: "",
TypeApiPayQueryMeituan: "",
// 微信支付退款申请
TypeWechatRefundsSubmitPrepaidRefill: "",
TypeWechatRefundsSubmitPower: "",
TypeWechatRefundsSubmitKashangwl: "",
TypeWechatRefundsSubmitEastiot: "",
TypeWechatRefundsSubmitEjiaofei: "",
TypeWechatRefundsSubmitMovie: "",
// 微信支付退款查询
TypeWechatRefundsQueryPrepaidRefill: "",
TypeWechatRefundsQueryPower: "",
TypeWechatRefundsQueryKashangwl: "",
TypeWechatRefundsQueryEastiot: "",
TypeWechatRefundsQueryEjiaofei: "",
TypeWechatRefundsQueryMovie: "",
// 返拥
TypeGoldenBeansIssuePrepaidRefill: "",
TypeGoldenBeansIssuePower: "",
TypeGoldenBeansIssueKashangwl: "",
TypeGoldenBeansIssueEastiot: "",
TypeGoldenBeansIssueMovie: "",
TypeGoldenBeansIssueRewardedvideo: "",
// 冻结返拥金豆
TypeGoldenBeansFrozenPinduoduo: "",
TypeGoldenBeansFrozenMeituan: "",
// 解冻返拥金豆正常发放
TypeGoldenBeansThawSuccessPinduoduo: "",
TypeGoldenBeansThawSuccessMeituan: "",
// 解冻返拥金豆扣款
TypeGoldenBeansThawErrorPinduoduo: "",
TypeGoldenBeansThawErrorMeituan: "",
// 抵扣金豆退款
TypeGoldenBeansRefundsPrepaidRefill: "",
TypeGoldenBeansRefundsPower: "",
// 金豆退款
TypeGoldenBeansRefundsEjiaofei: "",
// 客服进度
TypeCustomerAutoPrepaidRefill: "",
TypeCustomerAutoPower: "",
TypeCustomerAutoKashangwl: "",
TypeCustomerAutoEjiaofei: "",
TypeCustomerAutoMovie: "",
// 订单同步
TypeSyncOrderPinduoduo: "",
TypeSyncOrderMeituan: "",
// 商品同步
TypeSyncGoodsEastiot: "47.112.146.193",
TypeSyncGoodsTypeEastiot: "47.112.146.193",
TypeSyncGoodsPriceAllKashangwl: "",
TypeSyncGoodsPriceSingleKashangwl: "",
TypeCheckGoodsAllPinduoduo: "",
TypeCheckGoodsSinglePinduoduo: "",
// 微信更新
TypeSyncWechat: "119.3.235.113,119.3.132.197,47.112.146.193",
// 商家金豆转换
TypeGoldenBeanConversionUserGoldenBean: "",
TypeGoldenBeanConversionUserDeductGoldenBean: "",
// 企业自定义
TypeNewServiceAgentIssue: "",
TypeNewServiceAgentIssueNext: "",
// 团队
TypeTeamInv: "",
// 修复商家账号数量
TypeRepairMerchantAccountQuantityTesting: "",
TypeRepairMerchantAccountQuantityLevel: "",
// 观察接口
TypeApiPayObservationPrepaidRefill: "",
TypeApiPayObservationPower: "",
TypeApiPayObservationKashangwl: "",
TypeApiPayObservationEjiaofei: "47.112.146.193",
TypeApiPayObservationMovie: "",
TypeApiPayObservationPinduoduo: "",
TypeApiPayObservationMeituan: "",
TypeApiPayObservationWechat: "",
TypeApiPayObservationWechatRefunds: "",
TypeApiPayObservationWechatWithdrawal: "",
// 微信提现
TypeWechatPayWithdrawalSubmit: "47.112.146.193",
TypeWechatPayWithdrawalQuery: "",
TypeWechatPayWithdrawalRefunds: "",
}
func (app *App) Ip(Type string) string {
return TypeIp[Type]
}
func (app *App) RefreshIp() {
xip := goip.GetOutsideIp()
if app.OutsideIp == "" || app.OutsideIp == "0.0.0.0" {
return
}
if app.OutsideIp == xip {
return
}
app.Db.Where("ips = ?", app.OutsideIp).Delete(&TaskIp{}) // 删除
app.OutsideIp = xip
}

@ -0,0 +1,379 @@
package jobs
import (
"dtapps/dta/library/utils/goredis"
"fmt"
"gitee.com/dtapps/go-library/utils/gojson"
"gitee.com/dtapps/go-library/utils/gotime"
"gitee.com/dtapps/go-library/utils/gouuid"
"gorm.io/gorm"
"net/http"
)
type App struct {
RunVersion int `json:"run_version"` // 运行版本
Os string `json:"os"` // 系统类型
Arch string `json:"arch"` // 系统架构
MaxProCs int `json:"max_pro_cs"` // CPU核数
Version string `json:"version"` // GO版本
MacAddrS string `json:"mac_addr_s"` // Mac地址
InsideIp string `json:"inside_ip"` // 内网ip
OutsideIp string `json:"outside_ip"` // 外网ip
MainService int `json:"main_service"` // 主要服务
AddIpService int `json:"add_ip_service"` // 添加IP
Db *gorm.DB // 数据库
Redis goredis.App // 缓存数据库服务
}
// Add 添加任务
func (app *App) Add(Type string, params interface{}, frequency int64) int64 {
return app.Db.Create(&Task{
Status: TASK_IN,
Params: gojson.JsonEncodeNoError(params),
StatusDesc: "首次添加任务",
Frequency: frequency,
RunId: gouuid.GetUuId(),
Type: Type,
CreatedIp: app.OutsideIp,
UpdatedIp: app.OutsideIp,
CreatedAt: gotime.Current().Format(),
UpdatedAt: gotime.Current().Format(),
}).RowsAffected
}
// AddCustomId 添加任务
func (app *App) AddCustomId(Type string, params interface{}, frequency int64, customId string) int64 {
query := app.TaskCustomIdTake(Type, customId)
if query.Id != 0 {
return 0
}
return app.Db.Create(&Task{
Status: TASK_IN,
Params: gojson.JsonEncodeNoError(params),
StatusDesc: "首次添加任务",
Frequency: frequency,
RunId: gouuid.GetUuId(),
CustomId: customId,
Type: Type,
CreatedIp: app.OutsideIp,
UpdatedIp: app.OutsideIp,
CreatedAt: gotime.Current().Format(),
UpdatedAt: gotime.Current().Format(),
}).RowsAffected
}
// AddCustomIdMaxNumber 添加任务并设置最大数量
func (app *App) AddCustomIdMaxNumber(Type string, params interface{}, frequency int64, customId string, maxNumber int64) int64 {
query := app.TaskCustomIdTakeStatus(Type, customId, TASK_IN)
if query.Id != 0 {
return 0
}
return app.Db.Create(&Task{
Status: TASK_IN,
Params: gojson.JsonEncodeNoError(params),
StatusDesc: "首次添加任务",
Frequency: frequency,
MaxNumber: maxNumber,
RunId: gouuid.GetUuId(),
CustomId: customId,
Type: Type,
CreatedIp: app.OutsideIp,
UpdatedIp: app.OutsideIp,
CreatedAt: gotime.Current().Format(),
UpdatedAt: gotime.Current().Format(),
}).RowsAffected
}
type TaskParams = Task
// AddInOrder 添加订单可执行任务
func (app *App) AddInOrder(Type string, params interface{}, frequency int64) int64 {
var param TaskParams
param.Type = Type
param.Frequency = frequency
param.ParamsType = ParamsOrderType
return app.AddIn(param, params)
}
// AddInOrderCustomId 添加订单可执行任务
func (app *App) AddInOrderCustomId(Type string, params interface{}, frequency int64, customId string) int64 {
query := app.TaskCustomIdTakeStatus(Type, customId, TASK_IN)
if query.Id != 0 {
return 0
}
var param TaskParams
param.Type = Type
param.Frequency = frequency
param.CustomId = customId
param.ParamsType = ParamsOrderType
return app.AddIn(param, params)
}
// AddInOrderCustomIdSpecifyIp 添加订单可执行任务
func (app *App) AddInOrderCustomIdSpecifyIp(Type string, params interface{}, frequency int64, customId, specifyIp string) int64 {
query := app.TaskCustomIdTakeStatus(Type, customId, TASK_IN)
if query.Id != 0 {
return 0
}
var param TaskParams
param.Type = Type
param.Frequency = frequency
param.CustomId = customId
param.SpecifyIp = specifyIp
param.ParamsType = ParamsOrderType
return app.AddIn(param, params)
}
// AddInMerchantGoldenBean 添加商家金豆可执行任务
func (app *App) AddInMerchantGoldenBean(Type string, params interface{}, frequency int64) int64 {
var param TaskParams
param.Type = Type
param.Frequency = frequency
param.ParamsType = ParamsMerchantGoldenBeanType
return app.AddIn(param, params)
}
// AddInTeamInv 添加团队邀请可执行任务
func (app *App) AddInTeamInv(Type string, params interface{}, frequency int64) int64 {
var param TaskParams
param.Type = Type
param.Frequency = frequency
param.ParamsType = ParamsTeamInvType
return app.AddIn(param, params)
}
// AddInNewService 添加企业自定义可执行任务
func (app *App) AddInNewService(Type string, params interface{}, frequency int64) int64 {
var param TaskParams
param.Type = Type
param.Frequency = frequency
param.ParamsType = ParamsNewServiceType
return app.AddIn(param, params)
}
// AddInNewServiceNext 添加企业自定义下一步可执行任务
func (app *App) AddInNewServiceNext(param TaskParams, params interface{}) int64 {
param.ParamsType = ParamsNewServiceNextType
return app.AddIn(param, params)
}
// AddInRepairMerchantAccountQuantity 添加可执行任务
func (app *App) AddInRepairMerchantAccountQuantity() int64 {
var param TaskParams
param.Type = TypeRepairMerchantAccountQuantityTesting
param.Frequency = 90000
return app.AddIn(param, map[string]interface{}{})
}
// AddInRepairMerchantAccountQuantityLevel 添加修复商家账号数量下一步可执行任务
func (app *App) AddInRepairMerchantAccountQuantityLevel(param TaskParams, params interface{}) int64 {
param.ParamsType = ParamsRepairMerchantAccountQuantityLevelType
return app.AddIn(param, params)
}
// AddInOrderCustomIdObservation 添加观察接口任务
func (app *App) AddInOrderCustomIdObservation(Type string, customId string) int64 {
query := app.TaskCustomIdTakeStatus(Type, customId, TASK_IN)
if query.Id != 0 {
return query.Id
}
var param TaskParams
param.Type = Type
param.Frequency = 3600
param.MaxNumber = 24 * 5 // 一个星期
param.CustomId = customId
param.ParamsType = ParamsOrderType
return app.AddIn(param, ParamsOrderId{
OrderId: customId,
})
}
// AddInOrderCustomIdObservationClone 观察接口关闭
func (app *App) AddInOrderCustomIdObservationClone(Type string, customId string) int64 {
query := app.TaskCustomIdTakeStatus(Type, customId, TASK_IN)
if query.Id == 0 {
return 0
}
return app.Edit(query.Id).Select("status", "status_desc", "run_id", "updated_ip", "updated_at").Updates(Task{
Status: TASK_SUCCESS,
StatusDesc: "已完成,停止观察",
RunId: gouuid.GetUuId(),
UpdatedIp: app.OutsideIp,
UpdatedAt: gotime.Current().Format(),
}).RowsAffected
}
// AddIn 添加可执行任务
// params.Type 任务类型
// params.Frequency 任务频率
// params.CustomId 自定义编号
// params 任务参数
func (app *App) AddIn(param TaskParams, params interface{}) int64 {
param.Status = TASK_IN
param.StatusDesc = "首次添加任务"
param.RunId = gouuid.GetUuId()
param.Params = gojson.JsonEncodeNoError(params)
param.CreatedIp = app.OutsideIp
param.UpdatedIp = app.OutsideIp
param.CreatedAt = gotime.Current().Format()
param.UpdatedAt = gotime.Current().Format()
return app.Db.Create(&param).RowsAffected
}
// AddWaitNewServiceNext 添加企业自定义下一步等待执行任务
func (app *App) AddWaitNewServiceNext(param TaskParams, params interface{}) int64 {
param.ParamsType = ParamsNewServiceNextType
return app.AddWait(param, params)
}
// AddWaitRepairMerchantAccountQuantityLevel 添加修复商家账号数量下一步等待执行任务
func (app *App) AddWaitRepairMerchantAccountQuantityLevel(param TaskParams, params interface{}) int64 {
param.ParamsType = ParamsRepairMerchantAccountQuantityLevelType
return app.AddWait(param, params)
}
// AddInKashangwlPriceCustomId 添加刷新卡商网价格任务
func (app *App) AddInKashangwlPriceCustomId(productId int64) int64 {
query := app.TaskCustomIdTakeStatus(TypeSyncGoodsPriceSingleKashangwl, fmt.Sprintf("%v", productId), TASK_IN)
if query.Id != 0 {
return query.Id
}
var param TaskParams
param.Type = TypeSyncGoodsPriceSingleKashangwl
param.Frequency = 1800
param.CustomId = fmt.Sprintf("%v", productId)
param.ParamsType = ParamsKashangwlType
return app.AddIn(param, ParamsKashangwlId{
ProductID: productId,
})
}
// AddWait 添加等待执行任务
// params.Type 任务类型
// params.Frequency 任务频率
// params.CustomId 自定义编号
// params.CustomSequence 自定义顺序
// params 任务参数
func (app *App) AddWait(param TaskParams, params interface{}) int64 {
param.Status = TASK_WAIT
param.StatusDesc = "首次添加任务"
param.RunId = gouuid.GetUuId()
param.Params = gojson.JsonEncodeNoError(params)
param.CreatedIp = app.OutsideIp
param.UpdatedIp = app.OutsideIp
param.CreatedAt = gotime.Current().Format()
param.UpdatedAt = gotime.Current().Format()
return app.Db.Create(&param).RowsAffected
}
// Edit 任务修改
func (app *App) Edit(id int64) *gorm.DB {
return app.Db.Model(&Task{}).Where("id = ?", id)
}
// UpdateFrequency 更新任务频率
func (app *App) UpdateFrequency(id, frequency int64) *gorm.DB {
return app.Edit(id).Updates(map[string]interface{}{
"frequency": frequency,
})
}
// Start 任务启动
func (app *App) Start(customId string, customSequence int64) int64 {
return app.Db.Model(&Task{}).
Where("custom_id = ?", customId).
Where("custom_sequence = ?", customSequence).
Where("status = ?", TASK_WAIT).
Select("status", "status_desc", "updated_ip", "updated_at").Updates(Task{
Status: TASK_IN,
StatusDesc: "启动任务",
UpdatedIp: app.OutsideIp,
UpdatedAt: gotime.Current().Format(),
}).RowsAffected
}
// RunAddLog 任务执行日志
func (app *App) RunAddLog(id int64, runId string) int64 {
return app.Db.Create(&TaskLogRun{
TaskId: id,
RunId: runId,
InsideIp: app.InsideIp,
OutsideIp: app.OutsideIp,
Os: app.Os,
Arch: app.Arch,
Gomaxprocs: app.MaxProCs,
GoVersion: app.Version,
MacAddrs: app.MacAddrS,
CreatedAt: gotime.Current().Format(),
}).RowsAffected
}
type CronParamsResp struct {
ParamsOrderId
ParamsMerchantUserIdOpenid
ParamsTaskId
ParamsTaskIdNext
ParamsWechat
ParamsTeamInv
ParamsRepairMerchantAccountQuantityLevel
}
// Run 任务执行
func (app *App) Run(info Task, status int, desc string) {
// 请求函数记录
app.Db.Create(&TaskLog{
TaskId: info.Id,
StatusCode: status,
Desc: desc,
Version: app.RunVersion,
CreatedAt: gotime.Current().Format(),
})
if status == 0 {
app.Edit(info.Id).Select("run_id").Updates(Task{
RunId: gouuid.GetUuId(),
})
return
}
// 任务
if status == http.StatusOK {
// 执行成功
app.Edit(info.Id).Select("status_desc", "number", "run_id", "updated_ip", "updated_at", "result").Updates(Task{
StatusDesc: "执行成功",
Number: info.Number + 1,
RunId: gouuid.GetUuId(),
UpdatedIp: app.OutsideIp,
UpdatedAt: gotime.Current().Format(),
Result: desc,
})
}
if status == http.StatusCreated {
// 执行成功、提前结束
app.Edit(info.Id).Select("status", "status_desc", "number", "updated_ip", "updated_at", "result").Updates(Task{
Status: TASK_SUCCESS,
StatusDesc: "结束执行",
Number: info.Number + 1,
UpdatedIp: app.OutsideIp,
UpdatedAt: gotime.Current().Format(),
Result: desc,
})
}
if status == http.StatusInternalServerError {
// 执行失败
app.Edit(info.Id).Select("status_desc", "number", "run_id", "updated_ip", "updated_at", "result").Updates(Task{
StatusDesc: "执行失败",
Number: info.Number + 1,
RunId: gouuid.GetUuId(),
UpdatedIp: app.OutsideIp,
UpdatedAt: gotime.Current().Format(),
Result: desc,
})
}
if info.MaxNumber != 0 {
if info.Number+1 >= info.MaxNumber {
// 关闭执行
app.Edit(info.Id).Select("status").Updates(Task{
Status: TASK_TIMEOUT,
})
}
}
}

@ -0,0 +1,35 @@
package jobs
import (
"dtapps/dta/library/utils/goredis"
"fmt"
"time"
)
// Lock 上锁
func (app *App) Lock(info Task, id any) string {
cacheName := fmt.Sprintf("cron:%v:%v", info.Type, id)
judgeCache := app.Redis.NewStringOperation().Get(cacheName).UnwrapOr("")
if judgeCache != "" {
return judgeCache
}
app.Redis.NewStringOperation().Set(cacheName, fmt.Sprintf("已在%v机器上锁成功", app.OutsideIp), goredis.WithExpire(time.Millisecond*time.Duration(info.Frequency)*3))
return ""
}
// Unlock Lock 解锁
func (app *App) Unlock(info Task, id any) {
cacheName := fmt.Sprintf("cron:%v:%v", info.Type, id)
app.Redis.NewStringOperation().Del(cacheName)
}
// LockForever 永远上锁
func (app *App) LockForever(info Task, id any) string {
cacheName := fmt.Sprintf("cron:%v:%v", info.Type, id)
judgeCache := app.Redis.NewStringOperation().Get(cacheName).UnwrapOr("")
if judgeCache != "" {
return judgeCache
}
app.Redis.NewStringOperation().Set(cacheName, fmt.Sprintf("已在%v机器永远上锁成功", app.OutsideIp))
return ""
}

@ -0,0 +1,169 @@
package jobs
import (
"strings"
)
const (
TASK_IN = "IN" // 任务运行
TASK_SUCCESS = "SUCCESS" // 任务完成
TASK_ERROR = "ERROR" // 任务异常
TASK_TIMEOUT = "TIMEOUT" // 任务超时
TASK_WAIT = "WAIT" // 任务等待
)
// Task 任务
type Task struct {
Id int64
Status string `gorm:"type:text" json:"status"` // 状态码
Params string `gorm:"type:text" json:"params"` // 参数
ParamsType string `gorm:"type:text" json:"params_type"` // 参数类型
StatusDesc string `gorm:"type:text" json:"status_desc"` // 状态描述
Frequency int64 `gorm:"type:bigint" json:"frequency"` // 频率(秒单位)
Number int64 `gorm:"type:bigint" json:"number"` // 当前次数
MaxNumber int64 `gorm:"type:bigint" json:"max_number"` // 最大次数
RunId string `gorm:"type:text" json:"run_id"` // 执行编号
CustomId string `gorm:"type:text" json:"custom_id"` // 自定义编号
CustomSequence int64 `gorm:"type:bigint" json:"custom_sequence"` // 自定义顺序
Type string `gorm:"type:text" json:"type"` // 类型
CreatedIp string `gorm:"type:text" json:"created_ip"` // 创建外网IP
SpecifyIp string `gorm:"type:text" json:"specify_ip"` // 指定外网IP
UpdatedIp string `gorm:"type:text" json:"updated_ip"` // 更新外网IP
Result string `gorm:"type:text" json:"result"` // 结果
CreatedAt string `gorm:"type:text" json:"created_at"` // 创建时间
UpdatedAt string `gorm:"type:text" json:"updated_at"` // 更新时间
}
func (m *Task) TableName() string {
return "task"
}
// TaskTake 查询任务
func (app *App) TaskTake(customId string) (result Task) {
app.Db.Where("custom_id = ?", customId).Where("status = ?", TASK_IN).Take(&result)
return result
}
// TaskCustomIdTake 查询任务
func (app *App) TaskCustomIdTake(Type, customId string) (result Task) {
app.Db.Where("type = ?", Type).Where("custom_id = ?", customId).Take(&result)
return result
}
// TaskCustomIdTakeStatus 查询任务
func (app *App) TaskCustomIdTakeStatus(Type, customId, status string) (result Task) {
app.Db.Where("type = ?", Type).Where("custom_id = ?", customId).Where("status = ?", status).Take(&result)
return result
}
// TaskFind 查询任务
func (app *App) TaskFind(frequency int) (results []Task) {
app.Db.Table("task").Select("task.*").Where("task.frequency = ?", frequency).Where("task.status = ?", TASK_IN).Where("task_ip.ips = ?", app.OutsideIp).Order("task.id asc").Joins("left join task_ip on task_ip.task_type = task.type").Find(&results)
return app.taskFindCheck(results)
}
// 检查任务
func (app *App) taskFindCheck(lists []Task) (results []Task) {
for _, v := range lists {
if v.SpecifyIp == "" {
results = append(results, v)
} else {
if app.OutsideIp == v.SpecifyIp {
results = append(results, v)
}
}
}
return results
}
// TaskLog 任务日志
type TaskLog struct {
Id int64
TaskId int64 `gorm:"type:bigint" json:"task_id"` // 任务编号
StatusCode int `gorm:"type:bigint" json:"status_code"` // 状态码
Desc string `gorm:"type:text" json:"desc"` // 结果
Version int `gorm:"type:bigint" json:"version"` // 版本
CreatedAt string `gorm:"type:text" json:"created_at"` // 创建时间
}
func (m *TaskLog) TableName() string {
return "task_log"
}
// TaskLogRun 任务执行日志
type TaskLogRun struct {
Id int64
TaskId int64 `gorm:"type:bigint" json:"task_id"` // 任务编号
RunId string `gorm:"type:text" json:"run_id"` // 执行编号
OutsideIp string `gorm:"type:text" json:"outside_ip"` // 外网ip
InsideIp string `gorm:"type:text" json:"inside_ip"` // 内网ip
Os string `gorm:"type:text" json:"os"` // 系统类型
Arch string `gorm:"type:text" json:"arch"` // 系统架构
Gomaxprocs int `gorm:"type:bigint" json:"gomaxprocs"` // CPU核数
GoVersion string `gorm:"type:text" json:"go_version"` // GO版本
MacAddrs string `gorm:"type:text" json:"mac_addrs"` // Mac地址
CreatedAt string `gorm:"type:text" json:"created_at"` // 创建时间
}
func (m *TaskLogRun) TableName() string {
return "task_log_run"
}
// TaskLogRunTake 查询任务执行日志
func (app *App) TaskLogRunTake(taskId int64, runId string) (result TaskLogRun) {
app.Db.Select("id", "os", "arch", "outside_ip", "created_at").Where("task_id = ?", taskId).Where("run_id = ?", runId).Take(&result)
return result
}
// TaskIp 任务Ip
type TaskIp struct {
Id int64
TaskType string `gorm:"type:text" json:"task_type"` // 任务编号
Ips string `gorm:"type:text" json:"ips"` // 任务IP
}
func (m *TaskIp) TableName() string {
return "task_ip"
}
func (app *App) TaskIpUpdate(taskType, ips string) int64 {
var query TaskIp
app.Db.Where("task_type = ?", taskType).Where("ips = ?", ips).Take(&query)
if query.Id != 0 {
return query.Id
}
return app.Db.Create(&TaskIp{
TaskType: taskType,
Ips: ips,
}).RowsAffected
}
// TaskIpInit 实例任务ip
func (app *App) TaskIpInit(ips map[string]string) bool {
if app.OutsideIp == "" || app.OutsideIp == "0.0.0.0" {
return false
}
app.Db.Where("ips = ?", app.OutsideIp).Delete(&TaskIp{}) // 删除
for k, v := range ips {
if v == "" {
app.TaskIpUpdate(k, app.OutsideIp)
} else {
find := strings.Contains(v, ",")
if find == true {
// 包含
parts := strings.Split(v, ",")
for _, vv := range parts {
if vv == app.OutsideIp {
app.TaskIpUpdate(k, app.OutsideIp)
}
}
} else {
// 不包含
if v == app.OutsideIp {
app.TaskIpUpdate(k, app.OutsideIp)
}
}
}
}
return true
}

@ -0,0 +1,168 @@
package jobs
import (
"encoding/json"
"errors"
"fmt"
)
var ParamsOrderType = "order"
// ParamsOrderId 订单任务
type ParamsOrderId struct {
OrderId string `json:"order_id,omitempty"`
}
var ParamsMerchantGoldenBeanType = "merchant.golden_bean"
// ParamsMerchantUserIdOpenid 商家金豆任务
type ParamsMerchantUserIdOpenid struct {
MerchantUserId int64 `json:"merchant_user_id,omitempty"`
Openid string `json:"openid,omitempty"`
}
var ParamsNewServiceType = "new_service"
// ParamsTaskId 企业自定义任务
type ParamsTaskId struct {
TaskId int64 `json:"task_id,omitempty"`
}
var ParamsNewServiceNextType = "new_service.next"
// ParamsTaskIdNext 企业自定义下一步任务
type ParamsTaskIdNext struct {
TaskId int64 `json:"task_id,omitempty"`
MerchantUserId int64 `json:"merchant_user_id,omitempty"`
CurrentNumber int `json:"current_number,omitempty"`
MaxNumber int `json:"max_number,omitempty"`
}
var ParamsWechatType = "wechat"
// ParamsWechat 微信任务
type ParamsWechat struct {
Appid string `json:"appid,omitempty"`
Type string `json:"type,omitempty"`
}
var ParamsTeamInvType = "team.inv"
// ParamsTeamInv 团队邀请任务
type ParamsTeamInv struct {
MerchantUserId int64 `json:"merchant_user_id,omitempty"`
Openid string `json:"openid,omitempty"`
ShareOpenid string `json:"share_openid,omitempty"`
}
var ParamsRepairMerchantAccountQuantityLevelType = "repair.merchant.account.quantity.level"
// ParamsRepairMerchantAccountQuantityLevel 修复商家账号数量下一步任务
type ParamsRepairMerchantAccountQuantityLevel struct {
Level int `json:"level,omitempty"`
}
var ParamsKashangwlType = "kashangwl"
type ParamsKashangwlId struct {
ProductID int64 `json:"product_id"`
}
// Params 任务参数
func Params(v Task) (response CronParamsResp, err error) {
switch v.ParamsType {
case ParamsOrderType:
// 订单任务
var resp ParamsOrderId
err = json.Unmarshal([]byte(v.Params), &resp)
if err != nil {
return response, errors.New(fmt.Sprintf("解析失败,%v", err))
}
if resp.OrderId == "" {
return response, errors.New("参数不存在")
}
response.ParamsOrderId.OrderId = resp.OrderId
return response, nil
case ParamsMerchantGoldenBeanType:
// 商家金豆任务
var resp ParamsMerchantUserIdOpenid
err = json.Unmarshal([]byte(v.Params), &resp)
if err != nil {
return response, errors.New(fmt.Sprintf("解析失败,%v", err))
}
if resp.MerchantUserId == 0 || resp.Openid == "" {
return response, errors.New("参数不存在")
}
response.ParamsMerchantUserIdOpenid.MerchantUserId = resp.MerchantUserId
response.ParamsMerchantUserIdOpenid.Openid = resp.Openid
return response, nil
case ParamsNewServiceType:
// 企业自定义任务
var resp ParamsTaskId
err = json.Unmarshal([]byte(v.Params), &resp)
if err != nil {
return response, errors.New(fmt.Sprintf("解析失败,%v", err))
}
if resp.TaskId == 0 {
return response, errors.New("参数不存在")
}
response.ParamsTaskId.TaskId = resp.TaskId
return response, nil
case ParamsNewServiceNextType:
// 企业自定义下一步任务
var resp ParamsTaskIdNext
err = json.Unmarshal([]byte(v.Params), &resp)
if err != nil {
return response, errors.New(fmt.Sprintf("解析失败,%v", err))
}
if resp.TaskId == 0 || resp.MerchantUserId == 0 || resp.CurrentNumber == 0 || resp.MaxNumber == 0 {
return response, errors.New("参数不存在")
}
response.ParamsTaskIdNext.TaskId = resp.TaskId
response.ParamsTaskIdNext.MerchantUserId = resp.MerchantUserId
response.ParamsTaskIdNext.CurrentNumber = resp.CurrentNumber
response.ParamsTaskIdNext.MaxNumber = resp.MaxNumber
return response, nil
case ParamsWechatType:
// 微信任务
var resp ParamsWechat
err = json.Unmarshal([]byte(v.Params), &resp)
if err != nil {
return response, errors.New(fmt.Sprintf("解析失败,%v", err))
}
if resp.Appid == "" || resp.Type == "" {
return response, errors.New("参数不存在")
}
response.ParamsWechat.Appid = resp.Appid
response.ParamsWechat.Type = resp.Type
return response, nil
case ParamsTeamInvType:
// 团队邀请任务
var resp ParamsTeamInv
err = json.Unmarshal([]byte(v.Params), &resp)
if err != nil {
return response, errors.New(fmt.Sprintf("解析失败,%v", err))
}
if resp.MerchantUserId == 0 || resp.Openid == "" || resp.ShareOpenid == "" {
return response, errors.New("参数不存在")
}
response.ParamsTeamInv.MerchantUserId = resp.MerchantUserId
response.ParamsTeamInv.Openid = resp.Openid
response.ParamsTeamInv.ShareOpenid = resp.ShareOpenid
return response, nil
case ParamsRepairMerchantAccountQuantityLevelType:
// 修复商家账号数量下一步任务
var resp ParamsRepairMerchantAccountQuantityLevel
err = json.Unmarshal([]byte(v.Params), &resp)
if err != nil {
return response, errors.New(fmt.Sprintf("解析失败,%v", err))
}
if resp.Level == 0 {
return response, errors.New("参数不存在")
}
response.ParamsRepairMerchantAccountQuantityLevel.Level = resp.Level
return response, nil
default:
return response, nil
}
}

@ -0,0 +1,161 @@
package jobs
const (
// 微信支付查询
TypeWechatPayPrepaidRefill = "wechat.pay.prepaid_refill" //【话费充值】
TypeWechatPayPower = "wechat.pay.power" //【电费充值】
TypeWechatPayKashangwl = "wechat.pay.kashangwl" //【特惠充值】
TypeWechatPayEastiot = "wechat.pay.eastiot" //【东方物联】
TypeWechatPayEjiaofei = "wechat.pay.ejiaofei" //【易缴费】
TypeWechatPayMovie = "wechat.pay.movie" //【守兔】
// 接口支付申请
TypeApiPaySubmitPrepaidRefill = "api.pay.submit.prepaid_refill" //【话费充值】
TypeApiPaySubmitPower = "api.pay.submit.power" //【电费充值】
TypeApiPaySubmitKashangwl = "api.pay.submit.kashangwl" //【特惠充值】
TypeApiPaySubmitEastiot = "api.pay.submit.eastiot" //【东方物联】
TypeApiPaySubmitEjiaofei = "api.pay.submit.ejiaofei" //【易缴费】
TypeApiPaySubmitMovie = "api.pay.submit.movie" //【守兔】
// 接口支付查询
TypeApiPayQueryPrepaidRefill = "api.pay.query.prepaid_refill" //【话费充值】
TypeApiPayQueryPower = "api.pay.query.power" //【电费充值】
TypeApiPayQueryKashangwl = "api.pay.query.kashangwl" //【特惠充值】
TypeApiPayQueryEastiot = "api.pay.query.eastiot" //【东方物联】
TypeApiPayQueryEjiaofei = "api.pay.query.ejiaofei" //【易缴费】
TypeApiPayQueryMovie = "api.pay.query.movie" //【守兔】
TypeApiPayQueryPinduoduo = "api.pay.query.pinduoduo" //【拼多多】
TypeApiPayQueryMeituan = "api.pay.query.meituan" //【美团】
// 微信支付退款申请
TypeWechatRefundsSubmitPrepaidRefill = "wechat.refunds.submit.prepaid_refill" //【话费充值】
TypeWechatRefundsSubmitPower = "wechat.refunds.submit.power" //【电费充值】
TypeWechatRefundsSubmitKashangwl = "wechat.refunds.submit.kashangwl" //【特惠充值】
TypeWechatRefundsSubmitEastiot = "wechat.refunds.submit.eastiot" //【东方物联】
TypeWechatRefundsSubmitEjiaofei = "wechat.refunds.submit.ejiaofei" //【易缴费】
TypeWechatRefundsSubmitMovie = "wechat.refunds.submit.movie" //【守兔】
// 微信支付退款查询
TypeWechatRefundsQueryPrepaidRefill = "wechat.refunds.query.prepaid_refill" //【话费充值】
TypeWechatRefundsQueryPower = "wechat.refunds.query.power" //【电费充值】
TypeWechatRefundsQueryKashangwl = "wechat.refunds.query.kashangwl" //【特惠充值】
TypeWechatRefundsQueryEastiot = "wechat.refunds.query.eastiot" //【东方物联】
TypeWechatRefundsQueryEjiaofei = "wechat.refunds.query.ejiaofei" //【易缴费】
TypeWechatRefundsQueryMovie = "wechat.refunds.query.movie" //【守兔】
// 返拥
TypeGoldenBeansIssuePrepaidRefill = "golden_beans.issue.prepaid_refill" //【话费充值】
TypeGoldenBeansIssuePower = "golden_beans.issue.power" //【电费充值】
TypeGoldenBeansIssueKashangwl = "golden_beans.issue.kashangwl" //【特惠充值】
TypeGoldenBeansIssueEastiot = "golden_beans.issue.eastiot" //【东方物联】
TypeGoldenBeansIssueMovie = "golden_beans.issue.movie" //【守兔】
TypeGoldenBeansIssueRewardedvideo = "golden_beans.issue.rewardedvideo" //【激励视频】
// TypeGoldenBeansFrozenPinduoduo 【拼多多】冻结返拥金豆
TypeGoldenBeansFrozenPinduoduo = "golden_beans.frozen.pinduoduo"
// TypeGoldenBeansFrozenMeituan 【美团】冻结返拥金豆
TypeGoldenBeansFrozenMeituan = "golden_beans.frozen.meituan"
// TypeGoldenBeansThawSuccessPinduoduo 【拼多多】解冻返拥金豆正常发放
TypeGoldenBeansThawSuccessPinduoduo = "golden_beans.thaw.success.pinduoduo"
// TypeGoldenBeansThawSuccessMeituan 【美团】解冻返拥金豆正常发放
TypeGoldenBeansThawSuccessMeituan = "golden_beans.thaw.success.meituan"
// TypeGoldenBeansThawErrorPinduoduo 【拼多多】解冻返拥金豆扣款
TypeGoldenBeansThawErrorPinduoduo = "golden_beans.thaw.error.pinduoduo"
// TypeGoldenBeansThawErrorMeituan 【美团】解冻返拥金豆扣款
TypeGoldenBeansThawErrorMeituan = "golden_beans.thaw.error.meituan"
// 抵扣金豆退款
TypeGoldenBeansRefundsPrepaidRefill = "golden_beans.refunds.prepaid_refill" //【话费充值】
TypeGoldenBeansRefundsPower = "golden_beans.refunds.power" //【电费充值】
// 金豆退款
TypeGoldenBeansRefundsEjiaofei = "golden_beans.refunds.ejiaofei" //【易缴费】
// 客服进度
TypeCustomerAutoPrepaidRefill = "customer.auto.prepaid_refill" //【话费充值】
TypeCustomerAutoPower = "customer.auto.power" //【电费充值】
TypeCustomerAutoKashangwl = "customer.auto.kashangwl" //【特惠充值】
TypeCustomerAutoEjiaofei = "customer.auto.ejiaofei" //【易缴费】
TypeCustomerAutoMovie = "customer.auto.movie" //【守兔】
// 订单同步
TypeSyncOrderPinduoduo = "sync.order.pinduoduo" //【拼多多】
TypeSyncOrderMeituan = "sync.order.meituan" //【美团】
// 商品同步
TypeSyncGoodsEastiot = "sync.goods.eastiot" //【东方物联】
TypeSyncGoodsTypeEastiot = "sync.goods.type.eastiot" //【东方物联】
TypeSyncGoodsPriceAllKashangwl = "sync.goods.price.all.kashangwl" //【特惠充值】
TypeSyncGoodsPriceSingleKashangwl = "sync.goods.price.single.kashangwl" //【特惠充值】
TypeCheckGoodsAllPinduoduo = "check.goods.all.pinduoduo" //【拼多多】
TypeCheckGoodsSinglePinduoduo = "check.goods.single.pinduoduo" //【拼多多】
// 微信更新
TypeSyncWechat = "sync.wechat" //【微信】token/ticket同步
// 商家金豆转换
TypeGoldenBeanConversionUserGoldenBean = "admin.golden_bean.conversion.user.golden_bean" //【商家金豆】转用户金豆
TypeGoldenBeanConversionUserDeductGoldenBean = "admin.golden_bean.conversion.user.deduct.golden_bean" //【商家金豆】转用户抵扣金豆
// 企业自定义
TypeNewServiceAgentIssue = "new_service.agent.issue" //【企业自定义】【代理商】下发检查
TypeNewServiceAgentIssueNext = "new_service.agent.issue.next" //【企业自定义】【代理商】下发到商家
// 团队
TypeTeamInv = "team.inv" //【团队邀请】
// 修复商家账号数量
TypeRepairMerchantAccountQuantityTesting = "repair_merchant.account.quantity.testing" //【修复】【商家账号】【数量】查询出等级进行下一步
TypeRepairMerchantAccountQuantityLevel = "repair_merchant.account.quantity.level" //【修复】【商家账号】【数量】通过等级来修复
// 观察接口
TypeApiPayObservationPrepaidRefill = "api.pay.observation.prepaid_refill" //{600}【话费充值】
TypeApiPayObservationPower = "api.pay.observation.power" //{600}【电费充值】
TypeApiPayObservationKashangwl = "api.pay.observation.kashangwl" //{600}【特惠充值】
TypeApiPayObservationEjiaofei = "api.pay.observation.ejiaofei" //{600}【易缴费】
TypeApiPayObservationMovie = "api.pay.observation.movie" //{600}【守兔】
TypeApiPayObservationPinduoduo = "api.pay.observation.pinduoduo" //{600}【拼多多】
TypeApiPayObservationMeituan = "api.pay.observation.meituan" //{600}【美团】
TypeApiPayObservationWechat = "api.pay.observation.wechat" //{600}【微信支付】
TypeApiPayObservationWechatRefunds = "api.pay.observation.wechat.refunds" //{600}【微信支付退款】
TypeApiPayObservationWechatWithdrawal = "api.pay.observation.wechat.withdrawal" //{600}【微信支付提现】
// 微信提现
TypeWechatPayWithdrawalSubmit = "wechat.pay.withdrawal.submit" // 微信支付提现申请
TypeWechatPayWithdrawalQuery = "wechat.pay.withdrawal.query" // 微信支付提现查询
TypeWechatPayWithdrawalRefunds = "wechat.pay.withdrawal.refunds" // 微信支付提现退款
)
func GetTypeWechatPay(Type string) string {
return "wechat.pay." + Type
}
func GetTypeApiPaySubmit(Type string) string {
return "api.pay.submit." + Type
}
func GetTypeApiPayQuery(Type string) string {
return "api.pay.query." + Type
}
func GetTypeWechatRefundsSubmit(Type string) string {
return "wechat.refunds.submit." + Type
}
func GetTypeWechatRefundsQuery(Type string) string {
return "wechat.refunds.query." + Type
}
func GetTypeGoldenBeansIssue(Type string) string {
return "golden_beans.issue." + Type
}
func GetTypeGoldenBeansRefunds(Type string) string {
return "golden_beans.refunds." + Type
}
func GetTypeCustomerAuto(Type string) string {
return "customer.auto." + Type
}

@ -2,7 +2,7 @@ package kashangwl
import "encoding/json"
type BuyResponse struct {
type ApiBuyResponse struct {
Code string `json:"code"`
Message string `json:"message"`
Data struct {
@ -22,25 +22,25 @@ type BuyResponse struct {
} `json:"data"`
}
type BuyResult struct {
Result BuyResponse // 结果
Body []byte // 内容
Err error // 错误
type ApiBuyResult struct {
Result ApiBuyResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewBuyResult(result BuyResponse, body []byte, err error) *BuyResult {
return &BuyResult{Result: result, Body: body, Err: err}
func NewApiBuyResult(result ApiBuyResponse, body []byte, err error) *ApiBuyResult {
return &ApiBuyResult{Result: result, Body: body, Err: err}
}
// Buy 购买商品
// http://doc.cqmeihu.cn/sales/BuyProduct.html
func (app *App) Buy(notMustParams ...Params) *BuyResult {
// ApiBuy 购买商品
// http://doc.cqmeihu.cn/sales/buy.html
func (app *App) ApiBuy(notMustParams ...Params) *ApiBuyResult {
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求
body, err := app.request("http://www.kashangwl.com/api/buy", params)
// 定义
var response BuyResponse
var response ApiBuyResponse
err = json.Unmarshal(body, &response)
return NewBuyResult(response, body, err)
return NewApiBuyResult(response, body, err)
}

@ -0,0 +1,34 @@
package kashangwl
import "encoding/json"
type ApiCustomerResponse struct {
Code string `json:"code"`
Message string `json:"message"`
Data struct {
Id int `json:"id"` // 商家编号
Name string `json:"name"` // 商家名称
Balance string `json:"balance"` // 余额
} `json:"data"`
}
type ApiCustomerResult struct {
Result ApiCustomerResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewApiCustomerResult(result ApiCustomerResponse, body []byte, err error) *ApiCustomerResult {
return &ApiCustomerResult{Result: result, Body: body, Err: err}
}
// ApiCustomer 获取商家信息
// http://doc.cqmeihu.cn/sales/merchant-info.html
func (app *App) ApiCustomer() *ApiCustomerResult {
// 请求
body, err := app.request("http://www.kashangwl.com/api/customer", map[string]interface{}{})
// 定义
var response ApiCustomerResponse
err = json.Unmarshal(body, &response)
return NewApiCustomerResult(response, body, err)
}

@ -4,7 +4,7 @@ import (
"encoding/json"
)
type OrderResponse struct {
type ApiOrderResponse struct {
Code string `json:"code"`
Message string `json:"message"`
Data struct {
@ -32,25 +32,25 @@ type OrderResponse struct {
No string `json:"no"`
Password string `json:"password"`
} `json:"cards"` //【卡密类订单】卡密
RechargeParams string `json:"recharge_params"` //【充值类订单】
OuterOrderID string `json:"outer_order_id,omitempty"` // 外部订单号
RechargeParams string `json:"recharge_params"` //【充值类订单】
OuterApiOrderID string `json:"outer_ApiOrder_id,omitempty"` // 外部订单号
} `json:"data"`
}
type OrderResult struct {
Result OrderResponse // 结果
Body []byte // 内容
Err error // 错误
type ApiOrderResult struct {
Result ApiOrderResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewOrderResult(result OrderResponse, body []byte, err error) *OrderResult {
return &OrderResult{Result: result, Body: body, Err: err}
func NewApiOrderResult(result ApiOrderResponse, body []byte, err error) *ApiOrderResult {
return &ApiOrderResult{Result: result, Body: body, Err: err}
}
// Order 获取单个订单信息。
// ApiOrder 获取单个订单信息。
// 仅能获取自己购买的订单。
// http://doc.cqmeihu.cn/sales/OrderInfo.html
func (app App) Order(orderId string) *OrderResult {
// http://doc.cqmeihu.cn/sales/order-info.html
func (app App) ApiOrder(orderId string) *ApiOrderResult {
// 参数
param := NewParams()
param.Set("order_id", orderId)
@ -58,7 +58,7 @@ func (app App) Order(orderId string) *OrderResult {
// 请求
body, err := app.request("http://www.kashangwl.com/api/order", params)
// 定义
var response OrderResponse
var response ApiOrderResponse
err = json.Unmarshal(body, &response)
return NewOrderResult(response, body, err)
return NewApiOrderResult(response, body, err)
}

@ -0,0 +1,64 @@
package kashangwl
import (
"encoding/json"
)
type ApiOuterOrderResponse struct {
Code string `json:"code"`
Message string `json:"message"`
Data struct {
ID int64 `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"` // 买家编号
BuyerCustomerName string `json:"buyer_customer_name"` // 买家名称
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"` // 下单时间
RechargeAccount string `json:"recharge_account"` // 充值账号
ProgressInit int `json:"progress_init"` // 充值进度:初始值
ProgressNow int `json:"progress_now"` // 充值进度:现在值
ProgressTarget int `json:"progress_target"` // 充值进度:目标值
RechargeInfo string `json:"recharge_info"` // 返回信息
RechargeUrl string `json:"recharge_url"` // 卡密充值网址
Cards []struct {
No string `json:"no"`
Password string `json:"password"`
} `json:"cards"` //【卡密类订单】卡密
RechargeParams string `json:"recharge_params"` //【充值类订单】
OuterOrderID string `json:"outer_order_id,omitempty"` // 外部订单号
} `json:"data"`
}
type ApiOuterOrderResult struct {
Result ApiOuterOrderResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewApiOuterOrderResult(result ApiOuterOrderResponse, body []byte, err error) *ApiOuterOrderResult {
return &ApiOuterOrderResult{Result: result, Body: body, Err: err}
}
// ApiOuterOrder 使用外部订单号获取单个订单信息
// 仅能获取自己购买的订单
// http://doc.cqmeihu.cn/sales/outer-order-info.html
func (app App) ApiOuterOrder(orderId string) *ApiOuterOrderResult {
// 参数
param := NewParams()
param.Set("outer_order_id", orderId)
params := app.NewParamsWith(param)
// 请求
body, err := app.request("http://www.kashangwl.com/api/outer-order", params)
// 定义
var response ApiOuterOrderResponse
err = json.Unmarshal(body, &response)
return NewApiOuterOrderResult(response, body, err)
}

@ -2,12 +2,12 @@ package kashangwl
import "encoding/json"
type ProductResponse struct {
type ApiProductResponse struct {
Code string `json:"code"`
Message string `json:"message"`
Data struct {
Id int64 `json:"id"`
ProductName string `json:"product_name,omitempty"`
Id int `json:"id"`
ProductName string `json:"product_name"`
Name string `json:"name"`
Price float64 `json:"price"`
ValidPurchasingQuantity string `json:"valid_purchasing_quantity"`
@ -15,31 +15,31 @@ type ProductResponse struct {
Type int `json:"type"`
SupplyState int `json:"supply_state"`
StockState int `json:"stock_state"`
BanStartAt string `json:"ban_start_at,omitempty"`
BanEndAt string `json:"ban_end_at,omitempty"`
BanStartAt string `json:"ban_start_at"`
BanEndAt string `json:"ban_end_at"`
} `json:"data"`
}
type ProductResult struct {
Result ProductResponse // 结果
Body []byte // 内容
Err error // 错误
type ApiProductResult struct {
Result ApiProductResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewProductResult(result ProductResponse, body []byte, err error) *ProductResult {
return &ProductResult{Result: result, Body: body, Err: err}
func NewApiProductResult(result ApiProductResponse, body []byte, err error) *ApiProductResult {
return &ApiProductResult{Result: result, Body: body, Err: err}
}
// Product 获取单个商品信息
// ApiProduct 获取单个商品信息
// http://doc.cqmeihu.cn/sales/product-info.html
func (app App) Product(productId int64) *ProductResult {
func (app App) ApiProduct(productId int64) *ApiProductResult {
// 参数
params := NewParams()
params.Set("product_id", productId)
// 请求
body, err := app.request("http://www.kashangwl.com/api/product", params)
// 定义
var response ProductResponse
var response ApiProductResponse
err = json.Unmarshal(body, &response)
return NewProductResult(response, body, err)
return NewApiProductResult(response, body, err)
}

@ -0,0 +1,40 @@
package kashangwl
import "encoding/json"
type ApiProductRechargeParamsResponse struct {
Code string `json:"code"`
Message string `json:"message"`
Data struct {
RechargeAccountLabel string `json:"recharge_account_label"`
RechargeParams []struct {
Name string `json:"name"`
Type string `json:"type"`
Options string `json:"options"`
} `json:"recharge_params"`
} `json:"data"`
}
type ApiProductRechargeParamsResult struct {
Result ApiProductRechargeParamsResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewApiProductRechargeParamsResult(result ApiProductRechargeParamsResponse, body []byte, err error) *ApiProductRechargeParamsResult {
return &ApiProductRechargeParamsResult{Result: result, Body: body, Err: err}
}
// ApiProductRechargeParams 接口说明
// 获取商品的充值参数(仅支持充值类商品)
// http://doc.cqmeihu.cn/sales/ProductParams.html
func (app App) ApiProductRechargeParams(notMustParams ...Params) *ApiProductRechargeParamsResult {
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求
body, err := app.request("http://www.kashangwl.com/api/product/recharge-params", params)
// 定义
var response ApiProductRechargeParamsResponse
err = json.Unmarshal(body, &response)
return NewApiProductRechargeParamsResult(response, body, err)
}

@ -1,24 +1,18 @@
package kashangwl
import (
"dtapps/dta/library/utils/gohttp"
"dtapps/dta/library/utils/gomongo"
"encoding/json"
"fmt"
"github.com/dtapps/go-library/utils/gohttp"
"github.com/go-redis/redis/v8"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
"gorm.io/gorm"
"net/http"
"time"
)
// App 卡商网服务
type App struct {
CustomerId int // 商家编号
CustomerKey string // 商家密钥
ZapLog *zap.Logger // 日志服务
Db *gorm.DB // 关系数据库服务
RDb *redis.Client // 缓存数据库服务
MDb *mongo.Client // 非关系数据库服务
CustomerId int // 商家编号
CustomerKey string // 商家密钥
Mongo gomongo.App // 日志数据库
}
func (app *App) request(url string, params map[string]interface{}) ([]byte, error) {
@ -32,8 +26,6 @@ func (app *App) request(url string, params map[string]interface{}) ([]byte, erro
// 请求
postJson, err := gohttp.PostJson(url, paramsStr)
// 日志
if app.ZapLog != nil {
app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, postJson.Header, postJson.Body))
}
go app.mongoLog(url, params, http.MethodPost, postJson)
return postJson.Body, err
}

@ -1,33 +0,0 @@
module github.com/dtapps/go-library/service/kashangwl
go 1.18
require (
github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320040709-ad8a5f0e9e40
github.com/dtapps/go-library/utils/goparams v0.0.0-20220320040709-ad8a5f0e9e40
github.com/go-redis/redis/v8 v8.11.5
go.mongodb.org/mongo-driver v1.8.4
go.uber.org/zap v1.21.0
gorm.io/gorm v1.23.3
)
require (
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/golang/snappy v0.0.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.4 // indirect
github.com/klauspost/compress v1.13.6 // indirect
github.com/nilorg/sdk v0.0.0-20210429091026-95b6cdc95c84 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.0.2 // indirect
github.com/xdg-go/stringprep v1.0.2 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/text v0.3.6 // indirect
)

@ -0,0 +1,47 @@
package kashangwl
import (
"dtapps/dta/library/utils/gohttp"
"encoding/json"
"gitee.com/dtapps/go-library/utils/gotime"
)
// 日志
type mongoZap struct {
Url string `json:"url" bson:"url"`
Params interface{} `json:"params" bson:"params"`
Method string `json:"method" bson:"method"`
Header interface{} `json:"header" bson:"header"`
Status string `json:"status" bson:"status"`
StatusCode int `json:"status_code" bson:"status_code"`
Body interface{} `json:"body" bson:"body"`
ContentLength int64 `json:"content_length" bson:"content_length"`
CreateTime string `json:"create_time" bson:"create_time"`
}
func (m *mongoZap) Database() string {
return "zap_logs"
}
func (m *mongoZap) TableName() string {
return "kashangwl_" + gotime.Current().SetFormat("200601")
}
func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) {
if app.Mongo.Db == nil {
return
}
var body map[string]interface{}
_ = json.Unmarshal(request.Body, &body)
app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{
Url: url,
Params: params,
Method: method,
Header: request.Header,
Status: request.Status,
StatusCode: request.StatusCode,
Body: body,
ContentLength: request.ContentLength,
CreateTime: gotime.Current().Format(),
})
}

@ -1,40 +0,0 @@
package kashangwl
import "encoding/json"
type ProductRechargeParamsResponse struct {
Code string `json:"code"`
Message string `json:"message"`
Data struct {
RechargeAccountLabel string `json:"recharge_account_label"`
RechargeParams []struct {
Name string `json:"name"`
Type string `json:"type"`
Options string `json:"options"`
} `json:"recharge_params"`
} `json:"data"`
}
type ProductRechargeParamsResult struct {
Result ProductRechargeParamsResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewProductRechargeParamsResult(result ProductRechargeParamsResponse, body []byte, err error) *ProductRechargeParamsResult {
return &ProductRechargeParamsResult{Result: result, Body: body, Err: err}
}
// ProductRechargeParams 接口说明
// 获取商品的充值参数(仅支持充值类商品)
// http://doc.cqmeihu.cn/sales/ProductParams.html
func (app App) ProductRechargeParams(notMustParams ...Params) *ProductRechargeParamsResult {
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求
body, err := app.request("http://www.kashangwl.com/api/product/recharge-params", params)
// 定义
var response ProductRechargeParamsResponse
err = json.Unmarshal(body, &response)
return NewProductRechargeParamsResult(response, body, err)
}

@ -3,9 +3,9 @@ package kashangwl
import (
"bytes"
"crypto/md5"
"dtapps/dta/library/utils/goparams"
"encoding/hex"
"encoding/json"
"github.com/dtapps/go-library/utils/goparams"
"io"
"net/url"
"sort"

@ -0,0 +1,32 @@
package leshuazf
import (
"encoding/json"
"net/http"
)
type ApiV2MerchantUpdateAuthorityResponse struct {
}
type ApiV2MerchantUpdateAuthorityResult struct {
Result ApiV2MerchantUpdateAuthorityResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewApiV2MerchantUpdateAuthorityResult(result ApiV2MerchantUpdateAuthorityResponse, body []byte, err error) *ApiV2MerchantUpdateAuthorityResult {
return &ApiV2MerchantUpdateAuthorityResult{Result: result, Body: body, Err: err}
}
// ApiV2MerchantUpdateAuthority 给商户开通D0交易/结算权限接口。其中D0交易影响交易接口内t0字段能否标1D0结算影响商户该种支付方式的秒到
// https://www.yuque.com/leshuazf/doc/dbmxyi#Vw97n
func (app *App) ApiV2MerchantUpdateAuthority(notMustParams ...Params) *ApiV2MerchantUpdateAuthorityResult {
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求
body, err := app.request("apiv2/merchant/updateAuthority", params, http.MethodPost)
// 定义
var response ApiV2MerchantUpdateAuthorityResponse
err = json.Unmarshal(body, &response)
return NewApiV2MerchantUpdateAuthorityResult(response, body, err)
}

@ -0,0 +1,51 @@
package leshuazf
import (
"dtapps/dta/library/utils/gohttp"
"dtapps/dta/library/utils/gomongo"
"dtapps/dta/library/utils/gopostgresql"
"errors"
"gitee.com/dtapps/go-library/utils/gorandom"
"gitee.com/dtapps/go-library/utils/gotime"
"log"
"net/http"
)
// App 乐刷
type App struct {
AgentId string // 服务商编号,由乐刷分配的接入方唯一标识,明文传输。
Environment string // 环境
KeyAgent string
Pgsql gopostgresql.App // 日志数据库
Mongo gomongo.App // 日志数据库
}
func (app *App) request(url string, params map[string]interface{}, method string) (resp []byte, err error) {
// 环境
if app.Environment == "test" {
url = "http://t-saas-mch.lepass.cn/" + url
} else {
url = "https://saas-mch.leshuazf.com/" + url
}
// 参数
params["agentId"] = app.AgentId // 服务商编号,由乐刷分配的接入方唯一标识,明文传输。
params["version"] = "2.0" // 目前固定值2.0
params["reqSerialNo"] = gotime.Current().SetFormat("20060102150405") + gorandom.Numeric(5) // 请求流水号(yyyyMMddHHmmssSSSXXXXX其中 XXXXX为5位顺序号,禁止使用UUID等无意义数据)
params["sign"] = app.getSign(params)
log.Println(app)
log.Println(url)
log.Println(params)
switch method {
case http.MethodGet:
// 请求
get, err := gohttp.Get(url, params)
return get.Body, err
case http.MethodPost:
postJson, err := gohttp.PostForm(url, params)
return postJson.Body, err
default:
return nil, errors.New("请求类型不支持")
}
}

@ -0,0 +1,40 @@
package leshuazf
import (
"encoding/json"
"net/http"
)
type DataAreaResponse struct {
RespCode string `json:"respCode"`
RespMsg string `json:"respMsg"`
ReqSerialNo string `json:"reqSerialNo"`
Data []struct {
AreaName string `json:"areaName"`
AreaCode string `json:"areaCode"`
ParentAreaCode string `json:"parentAreaCode"`
} `json:"data"`
}
type DataAreaResult struct {
Result DataAreaResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewDataAreaResult(result DataAreaResponse, body []byte, err error) *DataAreaResult {
return &DataAreaResult{Result: result, Body: body, Err: err}
}
// DataArea 代理商通过地区信息来查地区详细信息
// https://www.yuque.com/leshuazf/doc/dbmxyi#YwJl7
func (app *App) DataArea(notMustParams ...Params) *DataAreaResult {
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求
body, err := app.request("data/area", params, http.MethodPost)
// 定义
var response DataAreaResponse
err = json.Unmarshal(body, &response)
return NewDataAreaResult(response, body, err)
}

@ -0,0 +1,53 @@
package leshuazf
import (
"encoding/json"
"net/http"
)
type DataBankBranch2Response struct {
RespCode string `json:"respCode"`
RespMsg string `json:"respMsg"`
ReqSerialNo string `json:"reqSerialNo"`
Data struct {
Total int `json:"total"`
Page int `json:"page"`
PageSize int `json:"pageSize"`
List []struct {
UnionpayCode string `json:"unionpayCode"`
FinInstitutionCode string `json:"finInstitutionCode"`
BankArea string `json:"bankArea"`
BankCity string `json:"bankCity"`
BranchName string `json:"branchName"`
CftAreaCode string `json:"cftAreaCode"`
CftCityCode string `json:"cftCityCode"`
UnionAreaCode interface{} `json:"unionAreaCode"`
UnionCityCode interface{} `json:"unionCityCode"`
FinInstitutionName string `json:"finInstitutionName"`
BankName string `json:"bankName"`
} `json:"list"`
} `json:"data"`
}
type DataBankBranch2Result struct {
Result DataBankBranch2Response // 结果
Body []byte // 内容
Err error // 错误
}
func NewDataBankBranch2Result(result DataBankBranch2Response, body []byte, err error) *DataBankBranch2Result {
return &DataBankBranch2Result{Result: result, Body: body, Err: err}
}
// DataBankBranch2 代理商通过联行号来查支行信息
// https://www.yuque.com/leshuazf/doc/dbmxyi#QYl0c
func (app *App) DataBankBranch2(notMustParams ...Params) *DataBankBranch2Result {
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求
body, err := app.request("data/bankbranch2", params, http.MethodPost)
// 定义
var response DataBankBranch2Response
err = json.Unmarshal(body, &response)
return NewDataBankBranch2Result(response, body, err)
}

@ -0,0 +1,39 @@
package leshuazf
import (
"encoding/json"
"net/http"
)
type DataMccResponse struct {
RespCode string `json:"respCode"`
RespMsg string `json:"respMsg"`
ReqSerialNo string `json:"reqSerialNo"`
Data []struct {
GrandpaCode string `json:"grandpaCode"`
GrandpaText string `json:"grandpaText"`
} `json:"data"`
}
type DataMccResult struct {
Result DataMccResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewDataMccResult(result DataMccResponse, body []byte, err error) *DataMccResult {
return &DataMccResult{Result: result, Body: body, Err: err}
}
// DataMcc 代理商通过MccCode来查商户类别明细
// https://www.yuque.com/leshuazf/doc/dbmxyi#jRTHN
func (app *App) DataMcc(notMustParams ...Params) *DataMccResult {
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求
body, err := app.request("data/mcc", params, http.MethodPost)
// 定义
var response DataMccResponse
err = json.Unmarshal(body, &response)
return NewDataMccResult(response, body, err)
}

@ -0,0 +1,47 @@
package leshuazf
import (
"dtapps/dta/library/utils/gohttp"
"encoding/json"
"gitee.com/dtapps/go-library/utils/gotime"
)
// 日志
type mongoZap struct {
Url string `json:"url" bson:"url"`
Params interface{} `json:"params" bson:"params"`
Method string `json:"method" bson:"method"`
Header interface{} `json:"header" bson:"header"`
Status string `json:"status" bson:"status"`
StatusCode int `json:"status_code" bson:"status_code"`
Body interface{} `json:"body" bson:"body"`
ContentLength int64 `json:"content_length" bson:"content_length"`
CreateTime string `json:"create_time" bson:"create_time"`
}
func (m *mongoZap) Database() string {
return "zap_logs"
}
func (m *mongoZap) TableName() string {
return "leshuazf_" + gotime.Current().SetFormat("200601")
}
func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) {
if app.Mongo.Db == nil {
return
}
var body map[string]interface{}
_ = json.Unmarshal(request.Body, &body)
app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{
Url: url,
Params: params,
Method: method,
Header: request.Header,
Status: request.Status,
StatusCode: request.StatusCode,
Body: body,
ContentLength: request.ContentLength,
CreateTime: gotime.Current().Format(),
})
}

@ -0,0 +1,27 @@
package leshuazf
// Params 请求参数
type Params map[string]interface{}
func NewParams() Params {
p := make(Params)
return p
}
func (app *App) NewParamsWith(params ...Params) Params {
p := make(Params)
for _, v := range params {
p.SetParams(v)
}
return p
}
func (p Params) Set(key string, value interface{}) {
p[key] = value
}
func (p Params) SetParams(params Params) {
for key, value := range params {
p[key] = value
}
}

@ -0,0 +1,21 @@
package leshuazf
import (
"dtapps/dta/library/utils/gobase64"
"encoding/json"
"gitee.com/dtapps/go-library/utils/gomd5"
"sort"
)
// 数据签名
// https://www.yuque.com/leshuazf/doc/dbmxyi#Nr9Ps
func (app *App) getSign(params map[string]interface{}) string {
// 参数按照参数名的字典升序排列
var keys []string
for k := range params {
keys = append(keys, k)
}
sort.Strings(keys)
str, _ := json.Marshal(keys) // data字符串值
return gobase64.Encode(gomd5.ToLower("lepos" + app.KeyAgent + string(str)))
}

@ -0,0 +1,43 @@
package meituan
import (
"encoding/json"
"net/http"
)
type ApiGenerateLinkResponse struct {
Status int `json:"status"` // 状态值0为成功非0为异常
Des string `json:"des,omitempty"` // 异常描述信息
Data string `json:"data,omitempty"` // 最终的推广链接
}
type ApiGenerateLinkResult struct {
Result ApiGenerateLinkResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewApiGenerateLinkResult(result ApiGenerateLinkResponse, body []byte, err error) *ApiGenerateLinkResult {
return &ApiGenerateLinkResult{Result: result, Body: body, Err: err}
}
// ApiGenerateLink 自助取链接口(新版)
// https://union.meituan.com/v2/apiDetail?id=25
func (app *App) ApiGenerateLink(actId int64, sid string, linkType, shortLink int) *ApiGenerateLinkResult {
// 参数
param := NewParams()
param.Set("actId", actId) // 活动id可以在联盟活动列表中查看获取
param.Set("appkey", app.AppKey) // 媒体名称,可在推广者备案-媒体管理中查询
param.Set("sid", sid) // 推广位sid支持通过接口自定义创建不受平台200个上限限制长度不能超过64个字符支持小写字母和数字历史已创建的推广位不受这个约束
param.Set("linkType", linkType) // 投放链接的类型
param.Set("shortLink", shortLink) // 获取长链还是短链
// 转换
params := app.NewParamsWith(param)
params["sign"] = app.getSign(app.Secret, params)
// 请求
body, err := app.request("https://openapi.meituan.com/api/generateLink", params, http.MethodGet)
// 定义
var response ApiGenerateLinkResponse
err = json.Unmarshal(body, &response)
return NewApiGenerateLinkResult(response, body, err)
}

@ -2,11 +2,11 @@ package meituan
import (
"encoding/json"
"github.com/dtapps/go-library/utils/gotime"
"gitee.com/dtapps/go-library/utils/gotime"
"net/http"
)
type GetQuaLitYsCoreBySidResponse struct {
type ApiGetQuaLitYsCoreBySidResponse struct {
Status int `json:"status"`
Des string `json:"des"`
Data struct {
@ -20,19 +20,19 @@ type GetQuaLitYsCoreBySidResponse struct {
Total int `json:"total"`
} `json:"data"`
}
type GetQuaLitYsCoreBySidResult struct {
Result GetQuaLitYsCoreBySidResponse // 结果
Body []byte // 内容
Err error // 错误
type ApiGetQuaLitYsCoreBySidResult struct {
Result ApiGetQuaLitYsCoreBySidResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewGetQuaLitYsCoreBySidResult(result GetQuaLitYsCoreBySidResponse, body []byte, err error) *GetQuaLitYsCoreBySidResult {
return &GetQuaLitYsCoreBySidResult{Result: result, Body: body, Err: err}
func NewApiGetQuaLitYsCoreBySidResult(result ApiGetQuaLitYsCoreBySidResponse, body []byte, err error) *ApiGetQuaLitYsCoreBySidResult {
return &ApiGetQuaLitYsCoreBySidResult{Result: result, Body: body, Err: err}
}
// GetQuaLitYsCoreBySid 优选sid质量分&复购率查询
// ApiGetQuaLitYsCoreBySid 优选sid质量分&复购率查询
// https://union.meituan.com/v2/apiDetail?id=28
func (app *App) GetQuaLitYsCoreBySid(notMustParams ...Params) *GetQuaLitYsCoreBySidResult {
func (app *App) ApiGetQuaLitYsCoreBySid(notMustParams ...Params) *ApiGetQuaLitYsCoreBySidResult {
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求时刻10位时间戳(秒级)有效期60s
@ -42,7 +42,7 @@ func (app *App) GetQuaLitYsCoreBySid(notMustParams ...Params) *GetQuaLitYsCoreBy
// 请求
body, err := app.request("https://openapi.meituan.com/api/getqualityscorebysid", params, http.MethodGet)
// 定义
var response GetQuaLitYsCoreBySidResponse
var response ApiGetQuaLitYsCoreBySidResponse
err = json.Unmarshal(body, &response)
return NewGetQuaLitYsCoreBySidResult(response, body, err)
return NewApiGetQuaLitYsCoreBySidResult(response, body, err)
}

@ -5,25 +5,25 @@ import (
"net/http"
)
type MiniCodeResponse struct {
type ApiMiniCodeResponse struct {
Status int `json:"status"` // 状态值0为成功非0为异常
Des string `json:"des,omitempty"` // 异常描述信息
Data string `json:"data,omitempty"` // 小程序二维码图片地址
}
type MiniCodeResult struct {
Result MiniCodeResponse // 结果
Body []byte // 内容
Err error // 错误
type ApiMiniCodeResult struct {
Result ApiMiniCodeResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewMiniCodeResult(result MiniCodeResponse, body []byte, err error) *MiniCodeResult {
return &MiniCodeResult{Result: result, Body: body, Err: err}
func NewApiMiniCodeResult(result ApiMiniCodeResponse, body []byte, err error) *ApiMiniCodeResult {
return &ApiMiniCodeResult{Result: result, Body: body, Err: err}
}
// MiniCode 小程序生成二维码(新版)
// ApiMiniCode 小程序生成二维码(新版)
// https://union.meituan.com/v2/apiDetail?id=26
func (app *App) MiniCode(actId int64, sid string) *MiniCodeResult {
func (app *App) ApiMiniCode(actId int64, sid string) *ApiMiniCodeResult {
// 参数
param := NewParams()
param.Set("appkey", app.AppKey)
@ -35,7 +35,7 @@ func (app *App) MiniCode(actId int64, sid string) *MiniCodeResult {
// 请求
body, err := app.request("https://openapi.meituan.com/api/miniCode", params, http.MethodGet)
// 定义
var response MiniCodeResponse
var response ApiMiniCodeResponse
err = json.Unmarshal(body, &response)
return NewMiniCodeResult(response, body, err)
return NewApiMiniCodeResult(response, body, err)
}

@ -5,7 +5,7 @@ import (
"net/http"
)
type OrderResponse struct {
type ApiOrderResponse struct {
Status int `json:"status"`
Des string `json:"des"`
Data struct {
@ -13,7 +13,7 @@ type OrderResponse struct {
SubBusinessLine int `json:"subBusinessLine"` // 子业务线
ActId int `json:"actId"` // 活动id可以在联盟活动列表中查看获取
Quantity int `json:"quantity"` // 商品数量
OrderId string `json:"orderId"` // 订单id
ApiOrderId string `json:"ApiOrderId"` // 订单id
Paytime string `json:"paytime"` // 订单支付时间10位时间戳
ModTime string `json:"modTime"` // 订单信息修改时间10位时间戳
Payprice string `json:"payprice"` // 订单用户实际支付金额
@ -24,7 +24,7 @@ type OrderResponse struct {
Smstitle string `json:"smstitle"` // 订单标题
Status int `json:"status"` // 订单状态,外卖、话费、闪购、优选、酒店订单会返回该字段 1 已付款 8 已完成 9 已退款或风控
TradeTypeList []int `json:"tradeTypeList"` // 订单的奖励类型 3 首购奖励 5 留存奖励 2 cps 3 首购奖励
RiskOrder int `json:"riskOrder"` // 0表示非风控订单1表示风控订单
RiskApiOrder int `json:"riskApiOrder"` // 0表示非风控订单1表示风控订单
Refundprofit string `json:"refundprofit,omitempty"` // 订单需要扣除的返佣金额,外卖、话费、闪购、优选、酒店订单若发生退款会返回该字段
CpaRefundProfit interface{} `json:"cpaRefundProfit"` // 订单需要扣除的cpa返佣金额优选、话费券
RefundInfoList interface{} `json:"refundInfoList"` // 退款列表
@ -33,19 +33,19 @@ type OrderResponse struct {
} `json:"data"`
}
type OrderResult struct {
Result OrderResponse // 结果
Body []byte // 内容
Err error // 错误
type ApiOrderResult struct {
Result ApiOrderResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewOrderResult(result OrderResponse, body []byte, err error) *OrderResult {
return &OrderResult{Result: result, Body: body, Err: err}
func NewApiOrderResult(result ApiOrderResponse, body []byte, err error) *ApiOrderResult {
return &ApiOrderResult{Result: result, Body: body, Err: err}
}
// Order 单订单查询接口(新版)
// ApiOrder 单订单查询接口(新版)
// https://union.meituan.com/v2/apiDetail?id=24
func (app *App) Order(notMustParams ...Params) *OrderResult {
func (app *App) ApiOrder(notMustParams ...Params) *ApiOrderResult {
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求时刻10位时间戳(秒级)有效期60s
@ -54,7 +54,7 @@ func (app *App) Order(notMustParams ...Params) *OrderResult {
// 请求
body, err := app.request("https://openapi.meituan.com/api/order", params, http.MethodGet)
// 定义
var response OrderResponse
var response ApiOrderResponse
err = json.Unmarshal(body, &response)
return NewOrderResult(response, body, err)
return NewApiOrderResult(response, body, err)
}

@ -2,11 +2,11 @@ package meituan
import (
"encoding/json"
"github.com/dtapps/go-library/utils/gotime"
"gitee.com/dtapps/go-library/utils/gotime"
"net/http"
)
type OrderListResponse struct {
type ApiOrderListResponse struct {
DataList []struct {
Orderid string `json:"orderid"` // 订单id
Paytime string `json:"paytime"` // 订单支付时间10位时间戳
@ -32,19 +32,19 @@ type OrderListResponse struct {
Total int `json:"total"` // 查询条件命中的总数据条数,用于计算分页参数
}
type OrderListResult struct {
Result OrderListResponse // 结果
Body []byte // 内容
Err error // 错误
type ApiOrderListResult struct {
Result ApiOrderListResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewOrderListResult(result OrderListResponse, body []byte, err error) *OrderListResult {
return &OrderListResult{Result: result, Body: body, Err: err}
func NewApiOrderListResult(result ApiOrderListResponse, body []byte, err error) *ApiOrderListResult {
return &ApiOrderListResult{Result: result, Body: body, Err: err}
}
// OrderList 订单列表查询接口(新版)
// ApiOrderList 订单列表查询接口(新版)
// https://union.meituan.com/v2/apiDetail?id=23
func (app *App) OrderList(notMustParams ...Params) *OrderListResult {
func (app *App) ApiOrderList(notMustParams ...Params) *ApiOrderListResult {
// 参数
params := app.NewParamsWith(notMustParams...)
// 请求时刻10位时间戳(秒级)有效期60s
@ -54,7 +54,7 @@ func (app *App) OrderList(notMustParams ...Params) *OrderListResult {
// 请求
body, err := app.request("https://openapi.meituan.com/api/orderList", params, http.MethodGet)
// 定义
var response OrderListResponse
var response ApiOrderListResponse
err = json.Unmarshal(body, &response)
return NewOrderListResult(response, body, err)
return NewApiOrderListResult(response, body, err)
}

@ -1,25 +1,18 @@
package meituan
import (
"dtapps/dta/library/utils/gohttp"
"dtapps/dta/library/utils/gomongo"
"encoding/json"
"errors"
"fmt"
"github.com/dtapps/go-library/utils/gohttp"
"github.com/go-redis/redis/v8"
"go.mongodb.org/mongo-driver/mongo"
"go.uber.org/zap"
"gorm.io/gorm"
"net/http"
)
// App 美团联盟
type App struct {
Secret string // 秘钥
AppKey string // 渠道标记
ZapLog *zap.Logger // 日志服务
Db *gorm.DB // 关系数据库服务
RDb *redis.Client // 缓存数据库服务
MDb *mongo.Client // 非关系数据库服务
Secret string // 秘钥
AppKey string // 渠道标记
Mongo gomongo.App // 日志数据库
}
func (app *App) request(url string, params map[string]interface{}, method string) (resp []byte, err error) {
@ -28,18 +21,14 @@ func (app *App) request(url string, params map[string]interface{}, method string
// 请求
get, err := gohttp.Get(url, params)
// 日志
if app.ZapLog != nil {
app.ZapLog.Sugar().Info(get)
}
go app.mongoLog(url, params, method, get)
return get.Body, err
case http.MethodPost:
// 请求
paramsStr, err := json.Marshal(params)
postJson, err := gohttp.PostJson(url, paramsStr)
// 日志
if app.ZapLog != nil {
app.ZapLog.Sugar().Info(fmt.Sprintf("%s %s %s", url, postJson.Header, postJson.Body))
}
go app.mongoLog(url, params, method, postJson)
return postJson.Body, err
default:
return nil, errors.New("请求类型不支持")

@ -1,43 +0,0 @@
package meituan
import (
"encoding/json"
"net/http"
)
type GenerateLinkResponse struct {
Status int `json:"status"` // 状态值0为成功非0为异常
Des string `json:"des,omitempty"` // 异常描述信息
Data string `json:"data,omitempty"` // 最终的推广链接
}
type GenerateLinkResult struct {
Result GenerateLinkResponse // 结果
Body []byte // 内容
Err error // 错误
}
func NewGenerateLinkResult(result GenerateLinkResponse, body []byte, err error) *GenerateLinkResult {
return &GenerateLinkResult{Result: result, Body: body, Err: err}
}
// GenerateLink 自助取链接口(新版)
// https://union.meituan.com/v2/apiDetail?id=25
func (app *App) GenerateLink(actId int64, sid string, linkType, shortLink int) *GenerateLinkResult {
// 参数
param := NewParams()
param.Set("appkey", app.AppKey)
param.Set("actId", actId)
param.Set("sid", sid)
param.Set("linkType", linkType)
param.Set("shortLink", shortLink)
// 转换
params := app.NewParamsWith(param)
params["sign"] = app.getSign(app.Secret, params)
// 请求
body, err := app.request("https://openapi.meituan.com/api/generateLink", params, http.MethodGet)
// 定义
var response GenerateLinkResponse
err = json.Unmarshal(body, &response)
return NewGenerateLinkResult(response, body, err)
}

@ -1,32 +0,0 @@
module github.com/dtapps/go-library/service/meituan
go 1.18
require (
github.com/dtapps/go-library/utils/gohttp v0.0.0-20220320040709-ad8a5f0e9e40
github.com/dtapps/go-library/utils/gotime v0.0.0-20220320040709-ad8a5f0e9e40
github.com/go-redis/redis/v8 v8.11.5
go.mongodb.org/mongo-driver v1.8.4
go.uber.org/zap v1.21.0
gorm.io/gorm v1.23.3
)
require (
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/golang/snappy v0.0.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.4 // indirect
github.com/klauspost/compress v1.13.6 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.0.2 // indirect
github.com/xdg-go/stringprep v1.0.2 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/text v0.3.6 // indirect
)

@ -0,0 +1,47 @@
package meituan
import (
"dtapps/dta/library/utils/gohttp"
"encoding/json"
"gitee.com/dtapps/go-library/utils/gotime"
)
// 日志
type mongoZap struct {
Url string `json:"url" bson:"url"`
Params interface{} `json:"params" bson:"params"`
Method string `json:"method" bson:"method"`
Header interface{} `json:"header" bson:"header"`
Status string `json:"status" bson:"status"`
StatusCode int `json:"status_code" bson:"status_code"`
Body interface{} `json:"body" bson:"body"`
ContentLength int64 `json:"content_length" bson:"content_length"`
CreateTime string `json:"create_time" bson:"create_time"`
}
func (m *mongoZap) Database() string {
return "zap_logs"
}
func (m *mongoZap) TableName() string {
return "meituan_" + gotime.Current().SetFormat("200601")
}
func (app *App) mongoLog(url string, params map[string]interface{}, method string, request gohttp.Response) {
if app.Mongo.Db == nil {
return
}
var body map[string]interface{}
_ = json.Unmarshal(request.Body, &body)
app.Mongo.Model(&mongoZap{}).InsertOne(mongoZap{
Url: url,
Params: params,
Method: method,
Header: request.Header,
Status: request.Status,
StatusCode: request.StatusCode,
Body: body,
ContentLength: request.ContentLength,
CreateTime: gotime.Current().Format(),
})
}

@ -0,0 +1,36 @@
package gitee
import (
"encoding/json"
"fmt"
)
// GetAccessToken 请求参数
type GetAccessToken struct {
Code string
}
// GetAccessTokenResult 返回参数
type GetAccessTokenResult struct {
AccessToken string `json:"access_token"`
}
// GetAccessToken OAuth2 获取 AccessToken 认证步骤 https://gitee.com/api/v5/oauth_doc#/list-item-2
func (app *App) GetAccessToken(param GetAccessToken) (result GetAccessTokenResult, err error) {
url := fmt.Sprintf("https://gitee.com/oauth/token?grant_type=authorization_code&code=%s&client_id=%s&redirect_uri=%s&client_secret=%s", param.Code, app.ClientID, app.RedirectUri, app.ClientSecret)
// api params
params := map[string]interface{}{}
// common params
// request
body, err := app.request(url, params, "POST")
if err != nil {
return
}
if err = json.Unmarshal(body, &result); err != nil {
return
}
return
}

@ -0,0 +1,53 @@
package gitee
import (
"encoding/json"
"fmt"
"time"
)
// UserResult 返回参数
type UserResult struct {
Id int64 `json:"id"`
Login string `json:"login"`
Name string `json:"name"`
AvatarUrl string `json:"avatar_url"`
Url string `json:"url"`
HtmlUrl string `json:"html_url"`
FollowersUrl string `json:"followers_url"`
FollowingUrl string `json:"following_url"`
GistsUrl string `json:"gists_url"`
StarredUrl string `json:"starred_url"`
SubscriptionsUrl string `json:"subscriptions_url"`
OrganizationsUrl string `json:"organizations_url"`
ReposUrl string `json:"repos_url"`
EventsUrl string `json:"events_url"`
ReceivedEventsUrl string `json:"received_events_url"`
Type string `json:"type"`
Blog string `json:"blog"`
Weibo string `json:"weibo"`
Bio string `json:"bio"`
PublicRepos int `json:"public_repos"`
PublicGists int `json:"public_gists"`
Followers int `json:"followers"`
Following int `json:"following"`
Stared int `json:"stared"`
Watched int `json:"watched"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
Email string `json:"email"`
}
// User 获取授权用户的资料 https://gitee.com/api/v5/swagger#/getV5User
func (app *App) User() (result UserResult, err error) {
// request
body, err := app.request(fmt.Sprintf("https://gitee.com/api/v5/user?access_token=%s", app.AccessToken), map[string]interface{}{}, "GET")
if err != nil {
return
}
if err = json.Unmarshal(body, &result); err != nil {
return
}
return
}

@ -0,0 +1,42 @@
package gitee
import (
"bytes"
"encoding/json"
"io/ioutil"
"net/http"
// "strconv"
)
// App 基本配置
type App struct {
ClientID string
ClientSecret string
RedirectUri string
AccessToken string
}
func (app *App) request(url string, params map[string]interface{}, method string) (resp []byte, err error) {
// 请求参数
marshal, _ := json.Marshal(params)
var req *http.Request
req, err = http.NewRequest(method, url, bytes.NewReader(marshal))
if err != nil {
return nil, err
}
httpClient := &http.Client{}
var response *http.Response
response, err = httpClient.Do(req)
if err != nil {
return nil, err
}
// 处理成功
defer response.Body.Close()
resp, err = ioutil.ReadAll(response.Body)
return resp, err
}

@ -0,0 +1,8 @@
package gitee
import "fmt"
// GetRedirectUri 获取登录地址
func (app *App) GetRedirectUri() string {
return fmt.Sprintf("https://gitee.com/oauth/authorize?client_id=%s&redirect_uri=%s&response_type=code", app.ClientID, app.RedirectUri)
}

@ -0,0 +1,6 @@
package gitee
const (
GiteeOAuth2AuthorizeServer = "https://gitee.com/oauth/authorize"
GiteeOAuth2TokenServer = "https://gitee.com/oauth/token"
)

@ -0,0 +1,29 @@
package workwechat
import (
"encoding/json"
"fmt"
)
// AuthAccessTokenResult 返回参数
type AuthAccessTokenResult struct {
Errcode int `json:"errcode"`
Errmsg string `json:"errmsg"`
AccessToken string `json:"access_token"`
ExpiresIn int `json:"expires_in"`
}
// AuthAccessToken 获取access_token https://open.work.weixin.qq.com/api/doc/90000/90135/91039
func (app *App) AuthAccessToken() (result AuthAccessTokenResult, err error) {
url := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s", app.AppID, app.Secret)
// request
body, err := app.request(url, map[string]interface{}{}, "GET")
if err != nil {
return
}
if err = json.Unmarshal(body, &result); err != nil {
return
}
return
}

@ -0,0 +1,41 @@
package workwechat
import (
"bytes"
"encoding/json"
"io/ioutil"
"net/http"
)
// App 基本配置
type App struct {
AppID string
AgentID int
Secret string
RedirectUri string
AccessToken string
}
func (app *App) request(url string, params map[string]interface{}, method string) (resp []byte, err error) {
// 请求参数
marshal, _ := json.Marshal(params)
var req *http.Request
req, err = http.NewRequest(method, url, bytes.NewReader(marshal))
if err != nil {
return nil, err
}
httpClient := &http.Client{}
var response *http.Response
response, err = httpClient.Do(req)
if err != nil {
return nil, err
}
// 处理成功
defer response.Body.Close()
resp, err = ioutil.ReadAll(response.Body)
return resp, err
}

@ -0,0 +1,8 @@
package workwechat
import "fmt"
// GetRedirectUri 构造网页授权链接 https://work.weixin.qq.com/api/doc/90000/90135/91022
func (app *App) GetRedirectUri() string {
return fmt.Sprintf("https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect", app.AppID, app.RedirectUri)
}

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

Loading…
Cancel
Save