1
0
mirror of https://github.com/silenceper/wechat.git synced 2026-02-04 12:52:27 +08:00

[feature] Format the code and improve Mini Program authorization to o… (#473)

* [feature] Format the code and improve Mini Program authorization to obtain openid(miniprogram/auth/auth.go Code2Session)

* [feature] CheckEncryptedData (https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/user-info/auth.checkEncryptedData.html)

* upgrade json error

* upgrade json error

Co-authored-by: houseme <houseme@outlook.com>
This commit is contained in:
houseme
2021-09-08 11:03:23 +08:00
committed by GitHub
parent 47adf42208
commit 96c1f98944
90 changed files with 787 additions and 760 deletions

10
cache/memory.go vendored
View File

@@ -5,7 +5,7 @@ import (
"time" "time"
) )
//Memory struct contains *memcache.Client // Memory struct contains *memcache.Client
type Memory struct { type Memory struct {
sync.Mutex sync.Mutex
@@ -17,14 +17,14 @@ type data struct {
Expired time.Time Expired time.Time
} }
//NewMemory create new memcache // NewMemory create new memcache
func NewMemory() *Memory { func NewMemory() *Memory {
return &Memory{ return &Memory{
data: map[string]*data{}, data: map[string]*data{},
} }
} }
//Get return cached value // Get return cached value
func (mem *Memory) Get(key string) interface{} { func (mem *Memory) Get(key string) interface{} {
if ret, ok := mem.data[key]; ok { if ret, ok := mem.data[key]; ok {
if ret.Expired.Before(time.Now()) { if ret.Expired.Before(time.Now()) {
@@ -48,7 +48,7 @@ func (mem *Memory) IsExist(key string) bool {
return false return false
} }
//Set cached value with key and expire time. // Set cached value with key and expire time.
func (mem *Memory) Set(key string, val interface{}, timeout time.Duration) (err error) { func (mem *Memory) Set(key string, val interface{}, timeout time.Duration) (err error) {
mem.Lock() mem.Lock()
defer mem.Unlock() defer mem.Unlock()
@@ -60,7 +60,7 @@ func (mem *Memory) Set(key string, val interface{}, timeout time.Duration) (err
return nil return nil
} }
//Delete delete value in memcache. // Delete delete value in memcache.
func (mem *Memory) Delete(key string) error { func (mem *Memory) Delete(key string) error {
mem.deleteKey(key) mem.deleteKey(key)
return nil return nil

20
cache/redis.go vendored
View File

@@ -7,22 +7,22 @@ import (
"github.com/gomodule/redigo/redis" "github.com/gomodule/redigo/redis"
) )
//Redis redis cache // Redis .redis cache
type Redis struct { type Redis struct {
conn *redis.Pool conn *redis.Pool
} }
//RedisOpts redis 连接属性 // RedisOpts redis 连接属性
type RedisOpts struct { type RedisOpts struct {
Host string `yml:"host" json:"host"` Host string `yml:"host" json:"host"`
Password string `yml:"password" json:"password"` Password string `yml:"password" json:"password"`
Database int `yml:"database" json:"database"` Database int `yml:"database" json:"database"`
MaxIdle int `yml:"max_idle" json:"max_idle"` MaxIdle int `yml:"max_idle" json:"max_idle"`
MaxActive int `yml:"max_active" json:"max_active"` MaxActive int `yml:"max_active" json:"max_active"`
IdleTimeout int `yml:"idle_timeout" json:"idle_timeout"` //second IdleTimeout int `yml:"idle_timeout" json:"idle_timeout"` // second
} }
//NewRedis 实例化 // NewRedis 实例化
func NewRedis(opts *RedisOpts) *Redis { func NewRedis(opts *RedisOpts) *Redis {
pool := &redis.Pool{ pool := &redis.Pool{
MaxActive: opts.MaxActive, MaxActive: opts.MaxActive,
@@ -45,17 +45,17 @@ func NewRedis(opts *RedisOpts) *Redis {
return &Redis{pool} return &Redis{pool}
} }
//SetRedisPool 设置redis连接池 // SetRedisPool 设置redis连接池
func (r *Redis) SetRedisPool(pool *redis.Pool) { func (r *Redis) SetRedisPool(pool *redis.Pool) {
r.conn = pool r.conn = pool
} }
//SetConn 设置conn // SetConn 设置conn
func (r *Redis) SetConn(conn *redis.Pool) { func (r *Redis) SetConn(conn *redis.Pool) {
r.conn = conn r.conn = conn
} }
//Get 获取一个值 // Get 获取一个值
func (r *Redis) Get(key string) interface{} { func (r *Redis) Get(key string) interface{} {
conn := r.conn.Get() conn := r.conn.Get()
defer conn.Close() defer conn.Close()
@@ -73,7 +73,7 @@ func (r *Redis) Get(key string) interface{} {
return reply return reply
} }
//Set 设置一个值 // Set 设置一个值
func (r *Redis) Set(key string, val interface{}, timeout time.Duration) (err error) { func (r *Redis) Set(key string, val interface{}, timeout time.Duration) (err error) {
conn := r.conn.Get() conn := r.conn.Get()
defer conn.Close() defer conn.Close()
@@ -88,7 +88,7 @@ func (r *Redis) Set(key string, val interface{}, timeout time.Duration) (err err
return return
} }
//IsExist 判断key是否存在 // IsExist 判断key是否存在
func (r *Redis) IsExist(key string) bool { func (r *Redis) IsExist(key string) bool {
conn := r.conn.Get() conn := r.conn.Get()
defer conn.Close() defer conn.Close()
@@ -98,7 +98,7 @@ func (r *Redis) IsExist(key string) bool {
return i > 0 return i > 0
} }
//Delete 删除 // Delete 删除
func (r *Redis) Delete(key string) error { func (r *Redis) Delete(key string) error {
conn := r.conn.Get() conn := r.conn.Get()
defer conn.Close() defer conn.Close()

View File

@@ -1,6 +1,6 @@
package credential package credential
//AccessTokenHandle AccessToken 接口 // AccessTokenHandle AccessToken 接口
type AccessTokenHandle interface { type AccessTokenHandle interface {
GetAccessToken() (accessToken string, err error) GetAccessToken() (accessToken string, err error)
} }

View File

@@ -11,19 +11,19 @@ import (
) )
const ( const (
//AccessTokenURL 获取access_token的接口 // AccessTokenURL 获取access_token的接口
accessTokenURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s" accessTokenURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"
//AccessTokenURL 企业微信获取access_token的接口 // AccessTokenURL 企业微信获取access_token的接口
workAccessTokenURL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s" workAccessTokenURL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s"
//CacheKeyOfficialAccountPrefix 微信公众号cache key前缀 // CacheKeyOfficialAccountPrefix 微信公众号cache key前缀
CacheKeyOfficialAccountPrefix = "gowechat_officialaccount_" CacheKeyOfficialAccountPrefix = "gowechat_officialaccount_"
//CacheKeyMiniProgramPrefix 小程序cache key前缀 // CacheKeyMiniProgramPrefix 小程序cache key前缀
CacheKeyMiniProgramPrefix = "gowechat_miniprogram_" CacheKeyMiniProgramPrefix = "gowechat_miniprogram_"
//CacheKeyWorkPrefix 企业微信cache key前缀 // CacheKeyWorkPrefix 企业微信cache key前缀
CacheKeyWorkPrefix = "gowechat_work_" CacheKeyWorkPrefix = "gowechat_work_"
) )
//DefaultAccessToken 默认AccessToken 获取 // DefaultAccessToken 默认AccessToken 获取
type DefaultAccessToken struct { type DefaultAccessToken struct {
appID string appID string
appSecret string appSecret string
@@ -32,7 +32,7 @@ type DefaultAccessToken struct {
accessTokenLock *sync.Mutex accessTokenLock *sync.Mutex
} }
//NewDefaultAccessToken new DefaultAccessToken // NewDefaultAccessToken new DefaultAccessToken
func NewDefaultAccessToken(appID, appSecret, cacheKeyPrefix string, cache cache.Cache) AccessTokenHandle { func NewDefaultAccessToken(appID, appSecret, cacheKeyPrefix string, cache cache.Cache) AccessTokenHandle {
if cache == nil { if cache == nil {
panic("cache is ineed") panic("cache is ineed")
@@ -46,7 +46,7 @@ func NewDefaultAccessToken(appID, appSecret, cacheKeyPrefix string, cache cache.
} }
} }
//ResAccessToken struct // ResAccessToken struct
type ResAccessToken struct { type ResAccessToken struct {
util.CommonError util.CommonError
@@ -54,7 +54,7 @@ type ResAccessToken struct {
ExpiresIn int64 `json:"expires_in"` ExpiresIn int64 `json:"expires_in"`
} }
//GetAccessToken 获取access_token,先从cache中获取没有则从服务端获取 // GetAccessToken 获取access_token,先从cache中获取没有则从服务端获取
func (ak *DefaultAccessToken) GetAccessToken() (accessToken string, err error) { func (ak *DefaultAccessToken) GetAccessToken() (accessToken string, err error) {
// 先从cache中取 // 先从cache中取
accessTokenCacheKey := fmt.Sprintf("%s_access_token_%s", ak.cacheKeyPrefix, ak.appID) accessTokenCacheKey := fmt.Sprintf("%s_access_token_%s", ak.cacheKeyPrefix, ak.appID)
@@ -62,7 +62,7 @@ func (ak *DefaultAccessToken) GetAccessToken() (accessToken string, err error) {
return val.(string), nil return val.(string), nil
} }
//加上lock是为了防止在并发获取token时cache刚好失效导致从微信服务器上获取到不同token // 加上lock是为了防止在并发获取token时cache刚好失效导致从微信服务器上获取到不同token
ak.accessTokenLock.Lock() ak.accessTokenLock.Lock()
defer ak.accessTokenLock.Unlock() defer ak.accessTokenLock.Unlock()
@@ -71,7 +71,7 @@ func (ak *DefaultAccessToken) GetAccessToken() (accessToken string, err error) {
return val.(string), nil return val.(string), nil
} }
//cache失效从微信服务器获取 // cache失效从微信服务器获取
var resAccessToken ResAccessToken var resAccessToken ResAccessToken
resAccessToken, err = GetTokenFromServer(fmt.Sprintf(accessTokenURL, ak.appID, ak.appSecret)) resAccessToken, err = GetTokenFromServer(fmt.Sprintf(accessTokenURL, ak.appID, ak.appSecret))
if err != nil { if err != nil {
@@ -87,7 +87,7 @@ func (ak *DefaultAccessToken) GetAccessToken() (accessToken string, err error) {
return return
} }
//WorkAccessToken 企业微信AccessToken 获取 // WorkAccessToken 企业微信AccessToken 获取
type WorkAccessToken struct { type WorkAccessToken struct {
CorpID string CorpID string
CorpSecret string CorpSecret string
@@ -96,7 +96,7 @@ type WorkAccessToken struct {
accessTokenLock *sync.Mutex accessTokenLock *sync.Mutex
} }
//NewWorkAccessToken new WorkAccessToken // NewWorkAccessToken new WorkAccessToken
func NewWorkAccessToken(corpID, corpSecret, cacheKeyPrefix string, cache cache.Cache) AccessTokenHandle { func NewWorkAccessToken(corpID, corpSecret, cacheKeyPrefix string, cache cache.Cache) AccessTokenHandle {
if cache == nil { if cache == nil {
panic("cache the not exist") panic("cache the not exist")
@@ -110,9 +110,9 @@ func NewWorkAccessToken(corpID, corpSecret, cacheKeyPrefix string, cache cache.C
} }
} }
//GetAccessToken 企业微信获取access_token,先从cache中获取没有则从服务端获取 // GetAccessToken 企业微信获取access_token,先从cache中获取没有则从服务端获取
func (ak *WorkAccessToken) GetAccessToken() (accessToken string, err error) { func (ak *WorkAccessToken) GetAccessToken() (accessToken string, err error) {
//加上lock是为了防止在并发获取token时cache刚好失效导致从微信服务器上获取到不同token // 加上lock是为了防止在并发获取token时cache刚好失效导致从微信服务器上获取到不同token
ak.accessTokenLock.Lock() ak.accessTokenLock.Lock()
defer ak.accessTokenLock.Unlock() defer ak.accessTokenLock.Unlock()
accessTokenCacheKey := fmt.Sprintf("%s_access_token_%s", ak.cacheKeyPrefix, ak.CorpID) accessTokenCacheKey := fmt.Sprintf("%s_access_token_%s", ak.cacheKeyPrefix, ak.CorpID)
@@ -122,7 +122,7 @@ func (ak *WorkAccessToken) GetAccessToken() (accessToken string, err error) {
return return
} }
//cache失效从微信服务器获取 // cache失效从微信服务器获取
var resAccessToken ResAccessToken var resAccessToken ResAccessToken
resAccessToken, err = GetTokenFromServer(fmt.Sprintf(workAccessTokenURL, ak.CorpID, ak.CorpSecret)) resAccessToken, err = GetTokenFromServer(fmt.Sprintf(workAccessTokenURL, ak.CorpID, ak.CorpSecret))
if err != nil { if err != nil {
@@ -138,7 +138,7 @@ func (ak *WorkAccessToken) GetAccessToken() (accessToken string, err error) {
return return
} }
//GetTokenFromServer 强制从微信服务器获取token // GetTokenFromServer 强制从微信服务器获取token
func GetTokenFromServer(url string) (resAccessToken ResAccessToken, err error) { func GetTokenFromServer(url string) (resAccessToken ResAccessToken, err error) {
var body []byte var body []byte
body, err = util.HTTPGet(url) body, err = util.HTTPGet(url)

View File

@@ -7,6 +7,7 @@ import (
"gopkg.in/h2non/gock.v1" "gopkg.in/h2non/gock.v1"
) )
// TestGetTicketFromServer .
func TestGetTicketFromServer(t *testing.T) { func TestGetTicketFromServer(t *testing.T) {
defer gock.Off() defer gock.Off()
gock.New(getTicketURL).Reply(200).JSON(&ResTicket{Ticket: "mock-ticket", ExpiresIn: 10}) gock.New(getTicketURL).Reply(200).JSON(&ResTicket{Ticket: "mock-ticket", ExpiresIn: 10})

View File

@@ -10,19 +10,19 @@ import (
"github.com/silenceper/wechat/v2/util" "github.com/silenceper/wechat/v2/util"
) )
//获取ticket的url // getTicketURL 获取ticket的url
const getTicketURL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi" const getTicketURL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi"
//DefaultJsTicket 默认获取js ticket方法 // DefaultJsTicket 默认获取js ticket方法
type DefaultJsTicket struct { type DefaultJsTicket struct {
appID string appID string
cacheKeyPrefix string cacheKeyPrefix string
cache cache.Cache cache cache.Cache
//jsAPITicket 读写锁 同一个AppID一个 // jsAPITicket 读写锁 同一个AppID一个
jsAPITicketLock *sync.Mutex jsAPITicketLock *sync.Mutex
} }
//NewDefaultJsTicket new // NewDefaultJsTicket new
func NewDefaultJsTicket(appID string, cacheKeyPrefix string, cache cache.Cache) JsTicketHandle { func NewDefaultJsTicket(appID string, cacheKeyPrefix string, cache cache.Cache) JsTicketHandle {
return &DefaultJsTicket{ return &DefaultJsTicket{
appID: appID, appID: appID,
@@ -40,9 +40,9 @@ type ResTicket struct {
ExpiresIn int64 `json:"expires_in"` ExpiresIn int64 `json:"expires_in"`
} }
//GetTicket 获取jsapi_ticket // GetTicket 获取jsapi_ticket
func (js *DefaultJsTicket) GetTicket(accessToken string) (ticketStr string, err error) { func (js *DefaultJsTicket) GetTicket(accessToken string) (ticketStr string, err error) {
//先从cache中取 // 先从cache中取
jsAPITicketCacheKey := fmt.Sprintf("%s_jsapi_ticket_%s", js.cacheKeyPrefix, js.appID) jsAPITicketCacheKey := fmt.Sprintf("%s_jsapi_ticket_%s", js.cacheKeyPrefix, js.appID)
if val := js.cache.Get(jsAPITicketCacheKey); val != nil { if val := js.cache.Get(jsAPITicketCacheKey); val != nil {
return val.(string), nil return val.(string), nil
@@ -67,7 +67,7 @@ func (js *DefaultJsTicket) GetTicket(accessToken string) (ticketStr string, err
return return
} }
//GetTicketFromServer 从服务器中获取ticket // GetTicketFromServer 从服务器中获取ticket
func GetTicketFromServer(accessToken string) (ticket ResTicket, err error) { func GetTicketFromServer(accessToken string) (ticket ResTicket, err error) {
var response []byte var response []byte
url := fmt.Sprintf(getTicketURL, accessToken) url := fmt.Sprintf(getTicketURL, accessToken)

View File

@@ -1,7 +1,7 @@
package credential package credential
//JsTicketHandle js ticket获取 // JsTicketHandle js ticket获取
type JsTicketHandle interface { type JsTicketHandle interface {
//GetTicket 获取ticket // GetTicket 获取ticket
GetTicket(accessToken string) (ticket string, err error) GetTicket(accessToken string) (ticket string, err error)
} }

2
go.mod
View File

@@ -5,7 +5,7 @@ go 1.14
require ( require (
github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b
github.com/fatih/structs v1.1.0 github.com/fatih/structs v1.1.0
github.com/gomodule/redigo v1.8.4 github.com/gomodule/redigo v1.8.5
github.com/kr/text v0.2.0 // indirect github.com/kr/text v0.2.0 // indirect
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
github.com/sirupsen/logrus v1.8.1 github.com/sirupsen/logrus v1.8.1

4
go.sum
View File

@@ -6,8 +6,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/gomodule/redigo v1.8.4 h1:Z5JUg94HMTR1XpwBaSH4vq3+PNSIykBLxMdglbw10gg= github.com/gomodule/redigo v1.8.5 h1:nRAxCa+SVsyjSBrtZmG/cqb6VbTmuRzpg/PoTFlpumc=
github.com/gomodule/redigo v1.8.4/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= github.com/gomodule/redigo v1.8.5/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw=
github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=

View File

@@ -32,12 +32,12 @@ const (
getAnalysisVisitPageURL = "https://api.weixin.qq.com/datacube/getweanalysisappidvisitpage?access_token=%s" getAnalysisVisitPageURL = "https://api.weixin.qq.com/datacube/getweanalysisappidvisitpage?access_token=%s"
) )
//Analysis analyis 数据分析 // Analysis analyis 数据分析
type Analysis struct { type Analysis struct {
*context.Context *context.Context
} }
//NewAnalysis new // NewAnalysis new
func NewAnalysis(ctx *context.Context) *Analysis { func NewAnalysis(ctx *context.Context) *Analysis {
return &Analysis{ctx} return &Analysis{ctx}
} }

View File

@@ -10,14 +10,16 @@ import (
const ( const (
code2SessionURL = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code" code2SessionURL = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"
checkEncryptedDataURL = "https://api.weixin.qq.com/wxa/business/checkencryptedmsg?access_token=%s"
) )
//Auth 登录/用户信息 // Auth 登录/用户信息
type Auth struct { type Auth struct {
*context.Context *context.Context
} }
//NewAuth new auth // NewAuth new auth
func NewAuth(ctx *context.Context) *Auth { func NewAuth(ctx *context.Context) *Auth {
return &Auth{ctx} return &Auth{ctx}
} }
@@ -31,16 +33,21 @@ type ResCode2Session struct {
UnionID string `json:"unionid"` // 用户在开放平台的唯一标识符在满足UnionID下发条件的情况下会返回 UnionID string `json:"unionid"` // 用户在开放平台的唯一标识符在满足UnionID下发条件的情况下会返回
} }
//Code2Session 登录凭证校验。 // RspCheckEncryptedData .
type RspCheckEncryptedData struct {
util.CommonError
Vaild bool `json:"vaild"` // 是否是合法的数据
CreateTime uint `json:"create_time"` // 加密数据生成的时间戳
}
// Code2Session 登录凭证校验。
func (auth *Auth) Code2Session(jsCode string) (result ResCode2Session, err error) { func (auth *Auth) Code2Session(jsCode string) (result ResCode2Session, err error) {
urlStr := fmt.Sprintf(code2SessionURL, auth.AppID, auth.AppSecret, jsCode)
var response []byte var response []byte
response, err = util.HTTPGet(urlStr) if response, err = util.HTTPGet(fmt.Sprintf(code2SessionURL, auth.AppID, auth.AppSecret, jsCode)); err != nil {
if err != nil {
return return
} }
err = json.Unmarshal(response, &result) if err = json.Unmarshal(response, &result); err != nil {
if err != nil {
return return
} }
if result.ErrCode != 0 { if result.ErrCode != 0 {
@@ -50,7 +57,25 @@ func (auth *Auth) Code2Session(jsCode string) (result ResCode2Session, err error
return return
} }
//GetPaidUnionID 用户支付完成后,获取该用户的 UnionId无需用户授权 // GetPaidUnionID 用户支付完成后,获取该用户的 UnionId无需用户授权
func (auth *Auth) GetPaidUnionID() { func (auth *Auth) GetPaidUnionID() {
//TODO // TODO
}
// CheckEncryptedData .检查加密信息是否由微信生成当前只支持手机号加密数据只能检测最近3天生成的加密数据
func (auth *Auth) CheckEncryptedData(encryptedMsgHash string) (result RspCheckEncryptedData, err error) {
var response []byte
var (
at string
)
if at, err = auth.GetAccessToken(); err != nil {
return
}
if response, err = util.HTTPPost(fmt.Sprintf(checkEncryptedDataURL, at), "encrypted_msg_hash="+encryptedMsgHash); err != nil {
return
}
if err = util.DecodeWithError(response, &result, "CheckEncryptedDataAuth"); err != nil {
return
}
return
} }

View File

@@ -5,7 +5,7 @@ import (
"github.com/silenceper/wechat/v2/cache" "github.com/silenceper/wechat/v2/cache"
) )
// Config config for 小程序 // Config .config for 小程序
type Config struct { type Config struct {
AppID string `json:"app_id"` // appid AppID string `json:"app_id"` // appid
AppSecret string `json:"app_secret"` // appsecret AppSecret string `json:"app_secret"` // appsecret

View File

@@ -12,18 +12,18 @@ const (
checkImageURL = "https://api.weixin.qq.com/wxa/img_sec_check?access_token=%s" checkImageURL = "https://api.weixin.qq.com/wxa/img_sec_check?access_token=%s"
) )
//Content 内容安全 // Content 内容安全
type Content struct { type Content struct {
*context.Context *context.Context
} }
//NewContent 内容安全接口 // NewContent 内容安全接口
func NewContent(ctx *context.Context) *Content { func NewContent(ctx *context.Context) *Content {
return &Content{ctx} return &Content{ctx}
} }
//CheckText 检测文字 // CheckText 检测文字
//@text 需要检测的文字 // @text 需要检测的文字
func (content *Content) CheckText(text string) error { func (content *Content) CheckText(text string) error {
accessToken, err := content.GetAccessToken() accessToken, err := content.GetAccessToken()
if err != nil { if err != nil {
@@ -41,9 +41,9 @@ func (content *Content) CheckText(text string) error {
return util.DecodeWithCommonError(response, "ContentCheckText") return util.DecodeWithCommonError(response, "ContentCheckText")
} }
//CheckImage 检测图片 // CheckImage 检测图片
//所传参数为要检测的图片文件的绝对路径图片格式支持PNG、JPEG、JPG、GIF, 像素不超过 750 x 1334同时文件大小以不超过 300K 为宜,否则可能报错 // 所传参数为要检测的图片文件的绝对路径图片格式支持PNG、JPEG、JPG、GIF, 像素不超过 750 x 1334同时文件大小以不超过 300K 为宜,否则可能报错
//@media 图片文件的绝对路径 // @media 图片文件的绝对路径
func (content *Content) CheckImage(media string) error { func (content *Content) CheckImage(media string) error {
accessToken, err := content.GetAccessToken() accessToken, err := content.GetAccessToken()
if err != nil { if err != nil {

View File

@@ -10,12 +10,12 @@ import (
"github.com/silenceper/wechat/v2/miniprogram/context" "github.com/silenceper/wechat/v2/miniprogram/context"
) )
//Encryptor struct // Encryptor struct
type Encryptor struct { type Encryptor struct {
*context.Context *context.Context
} }
//NewEncryptor 实例 // NewEncryptor 实例
func NewEncryptor(context *context.Context) *Encryptor { func NewEncryptor(context *context.Context) *Encryptor {
basic := new(Encryptor) basic := new(Encryptor)
basic.Context = context basic.Context = context

View File

@@ -12,13 +12,13 @@ type EventType string
type InfoType string type InfoType string
const ( const (
//MsgTypeText 文本消息 // MsgTypeText 文本消息
MsgTypeText MsgType = "text" MsgTypeText MsgType = "text"
//MsgTypeImage 图片消息 // MsgTypeImage 图片消息
MsgTypeImage = "image" MsgTypeImage = "image"
//MsgTypeLink 图文链接 // MsgTypeLink 图文链接
MsgTypeLink = "link" MsgTypeLink = "link"
//MsgTypeMiniProgramPage 小程序卡片 // MsgTypeMiniProgramPage 小程序卡片
MsgTypeMiniProgramPage = "miniprogrampage" MsgTypeMiniProgramPage = "miniprogrampage"
) )

View File

@@ -11,29 +11,29 @@ const (
customerSendMessage = "https://api.weixin.qq.com/cgi-bin/message/custom/send" customerSendMessage = "https://api.weixin.qq.com/cgi-bin/message/custom/send"
) )
//Manager 消息管理者,可以发送消息 // Manager 消息管理者,可以发送消息
type Manager struct { type Manager struct {
*context.Context *context.Context
} }
//NewCustomerMessageManager 实例化消息管理者 // NewCustomerMessageManager 实例化消息管理者
func NewCustomerMessageManager(context *context.Context) *Manager { func NewCustomerMessageManager(context *context.Context) *Manager {
return &Manager{ return &Manager{
context, context,
} }
} }
//MediaText 文本消息的文字 // MediaText 文本消息的文字
type MediaText struct { type MediaText struct {
Content string `json:"content"` Content string `json:"content"`
} }
//MediaResource 消息使用的临时素材id // MediaResource 消息使用的临时素材id
type MediaResource struct { type MediaResource struct {
MediaID string `json:"media_id"` MediaID string `json:"media_id"`
} }
//MediaMiniprogrampage 小程序卡片 // MediaMiniprogrampage 小程序卡片
type MediaMiniprogrampage struct { type MediaMiniprogrampage struct {
Title string `json:"title"` Title string `json:"title"`
Appid string `json:"appid"` Appid string `json:"appid"`
@@ -49,17 +49,17 @@ type MediaLink struct {
ThumbURL string `json:"thumb_url"` ThumbURL string `json:"thumb_url"`
} }
//CustomerMessage 客服消息 // CustomerMessage 客服消息
type CustomerMessage struct { type CustomerMessage struct {
ToUser string `json:"touser"` //接受者OpenID ToUser string `json:"touser"` // 接受者OpenID
Msgtype MsgType `json:"msgtype"` //客服消息类型 Msgtype MsgType `json:"msgtype"` // 客服消息类型
Text *MediaText `json:"text,omitempty"` //可选 Text *MediaText `json:"text,omitempty"` // 可选
Image *MediaResource `json:"image,omitempty"` //可选 Image *MediaResource `json:"image,omitempty"` // 可选
Link *MediaLink `json:"link,omitempty"` //可选 Link *MediaLink `json:"link,omitempty"` // 可选
Miniprogrampage *MediaMiniprogrampage `json:"miniprogrampage,omitempty"` //可选 Miniprogrampage *MediaMiniprogrampage `json:"miniprogrampage,omitempty"` // 可选
} }
//NewCustomerTextMessage 文本消息结构体构造方法 // NewCustomerTextMessage 文本消息结构体构造方法
func NewCustomerTextMessage(toUser, text string) *CustomerMessage { func NewCustomerTextMessage(toUser, text string) *CustomerMessage {
return &CustomerMessage{ return &CustomerMessage{
ToUser: toUser, ToUser: toUser,
@@ -70,7 +70,7 @@ func NewCustomerTextMessage(toUser, text string) *CustomerMessage {
} }
} }
//NewCustomerImgMessage 图片消息的构造方法 // NewCustomerImgMessage 图片消息的构造方法
func NewCustomerImgMessage(toUser, mediaID string) *CustomerMessage { func NewCustomerImgMessage(toUser, mediaID string) *CustomerMessage {
return &CustomerMessage{ return &CustomerMessage{
ToUser: toUser, ToUser: toUser,
@@ -81,7 +81,7 @@ func NewCustomerImgMessage(toUser, mediaID string) *CustomerMessage {
} }
} }
//NewCustomerLinkMessage 图文链接消息的构造方法 // NewCustomerLinkMessage 图文链接消息的构造方法
func NewCustomerLinkMessage(toUser, title, description, url, thumbURL string) *CustomerMessage { func NewCustomerLinkMessage(toUser, title, description, url, thumbURL string) *CustomerMessage {
return &CustomerMessage{ return &CustomerMessage{
ToUser: toUser, ToUser: toUser,
@@ -95,7 +95,7 @@ func NewCustomerLinkMessage(toUser, title, description, url, thumbURL string) *C
} }
} }
//NewCustomerMiniprogrampageMessage 小程序卡片消息的构造方法 // NewCustomerMiniprogrampageMessage 小程序卡片消息的构造方法
func NewCustomerMiniprogrampageMessage(toUser, title, pagepath, thumbMediaID string) *CustomerMessage { func NewCustomerMiniprogrampageMessage(toUser, title, pagepath, thumbMediaID string) *CustomerMessage {
return &CustomerMessage{ return &CustomerMessage{
ToUser: toUser, ToUser: toUser,
@@ -108,7 +108,7 @@ func NewCustomerMiniprogrampageMessage(toUser, title, pagepath, thumbMediaID str
} }
} }
//Send 发送客服消息 // Send 发送客服消息
func (manager *Manager) Send(msg *CustomerMessage) error { func (manager *Manager) Send(msg *CustomerMessage) error {
accessToken, err := manager.Context.GetAccessToken() accessToken, err := manager.Context.GetAccessToken()
if err != nil { if err != nil {

View File

@@ -17,12 +17,12 @@ import (
"github.com/silenceper/wechat/v2/miniprogram/werun" "github.com/silenceper/wechat/v2/miniprogram/werun"
) )
//MiniProgram 微信小程序相关API // MiniProgram 微信小程序相关API
type MiniProgram struct { type MiniProgram struct {
ctx *context.Context ctx *context.Context
} }
//NewMiniProgram 实例化小程序API // NewMiniProgram 实例化小程序API
func NewMiniProgram(cfg *config.Config) *MiniProgram { func NewMiniProgram(cfg *config.Config) *MiniProgram {
defaultAkHandle := credential.NewDefaultAccessToken(cfg.AppID, cfg.AppSecret, credential.CacheKeyMiniProgramPrefix, cfg.Cache) defaultAkHandle := credential.NewDefaultAccessToken(cfg.AppID, cfg.AppSecret, credential.CacheKeyMiniProgramPrefix, cfg.Cache)
ctx := &context.Context{ ctx := &context.Context{
@@ -32,7 +32,7 @@ func NewMiniProgram(cfg *config.Config) *MiniProgram {
return &MiniProgram{ctx} return &MiniProgram{ctx}
} }
//SetAccessTokenHandle 自定义access_token获取方式 // SetAccessTokenHandle 自定义access_token获取方式
func (miniProgram *MiniProgram) SetAccessTokenHandle(accessTokenHandle credential.AccessTokenHandle) { func (miniProgram *MiniProgram) SetAccessTokenHandle(accessTokenHandle credential.AccessTokenHandle) {
miniProgram.ctx.AccessTokenHandle = accessTokenHandle miniProgram.ctx.AccessTokenHandle = accessTokenHandle
} }
@@ -47,27 +47,27 @@ func (miniProgram *MiniProgram) GetEncryptor() *encryptor.Encryptor {
return encryptor.NewEncryptor(miniProgram.ctx) return encryptor.NewEncryptor(miniProgram.ctx)
} }
//GetAuth 登录/用户信息相关接口 // GetAuth 登录/用户信息相关接口
func (miniProgram *MiniProgram) GetAuth() *auth.Auth { func (miniProgram *MiniProgram) GetAuth() *auth.Auth {
return auth.NewAuth(miniProgram.ctx) return auth.NewAuth(miniProgram.ctx)
} }
//GetAnalysis 数据分析 // GetAnalysis 数据分析
func (miniProgram *MiniProgram) GetAnalysis() *analysis.Analysis { func (miniProgram *MiniProgram) GetAnalysis() *analysis.Analysis {
return analysis.NewAnalysis(miniProgram.ctx) return analysis.NewAnalysis(miniProgram.ctx)
} }
//GetQRCode 小程序码相关API // GetQRCode 小程序码相关API
func (miniProgram *MiniProgram) GetQRCode() *qrcode.QRCode { func (miniProgram *MiniProgram) GetQRCode() *qrcode.QRCode {
return qrcode.NewQRCode(miniProgram.ctx) return qrcode.NewQRCode(miniProgram.ctx)
} }
//GetTcb 小程序云开发API // GetTcb 小程序云开发API
func (miniProgram *MiniProgram) GetTcb() *tcb.Tcb { func (miniProgram *MiniProgram) GetTcb() *tcb.Tcb {
return tcb.NewTcb(miniProgram.ctx) return tcb.NewTcb(miniProgram.ctx)
} }
//GetSubscribe 小程序订阅消息 // GetSubscribe 小程序订阅消息
func (miniProgram *MiniProgram) GetSubscribe() *subscribe.Subscribe { func (miniProgram *MiniProgram) GetSubscribe() *subscribe.Subscribe {
return subscribe.NewSubscribe(miniProgram.ctx) return subscribe.NewSubscribe(miniProgram.ctx)
} }

View File

@@ -15,12 +15,12 @@ const (
getWXACodeUnlimitURL = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s" getWXACodeUnlimitURL = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s"
) )
//QRCode struct // QRCode struct
type QRCode struct { type QRCode struct {
*context.Context *context.Context
} }
//NewQRCode 实例 // NewQRCode 实例
func NewQRCode(context *context.Context) *QRCode { func NewQRCode(context *context.Context) *QRCode {
qrCode := new(QRCode) qrCode := new(QRCode)
qrCode.Context = context qrCode.Context = context

View File

@@ -8,8 +8,8 @@ import (
) )
const ( const (
//发送订阅消息 // 发送订阅消息
//https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
subscribeSendURL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send" subscribeSendURL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send"
// 获取当前帐号下的个人模板列表 // 获取当前帐号下的个人模板列表
@@ -41,21 +41,21 @@ func NewSubscribe(ctx *context.Context) *Subscribe {
// Message 订阅消息请求参数 // Message 订阅消息请求参数
type Message struct { type Message struct {
ToUser string `json:"touser"` //必选,接收者(用户)的 openid ToUser string `json:"touser"` // 必选,接收者(用户)的 openid
TemplateID string `json:"template_id"` //必选所需下发的订阅模板id TemplateID string `json:"template_id"` // 必选所需下发的订阅模板id
Page string `json:"page"` //可选,点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,示例index?foo=bar。该字段不填则模板无跳转。 Page string `json:"page"` // 可选,点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,示例index?foo=bar。该字段不填则模板无跳转。
Data map[string]*DataItem `json:"data"` //必选, 模板内容 Data map[string]*DataItem `json:"data"` // 必选, 模板内容
MiniprogramState string `json:"miniprogram_state"` //可选跳转小程序类型developer为开发版trial为体验版formal为正式版默认为正式版 MiniprogramState string `json:"miniprogram_state"` // 可选跳转小程序类型developer为开发版trial为体验版formal为正式版默认为正式版
Lang string `json:"lang"` //入小程序查看”的语言类型支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文)默认为zh_CN Lang string `json:"lang"` // 入小程序查看”的语言类型支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文)默认为zh_CN
} }
//DataItem 模版内某个 .DATA 的值 // DataItem 模版内某个 .DATA 的值
type DataItem struct { type DataItem struct {
Value interface{} `json:"value"` Value interface{} `json:"value"`
Color string `json:"color"` Color string `json:"color"`
} }
//TemplateItem template item // TemplateItem template item
type TemplateItem struct { type TemplateItem struct {
PriTmplID string `json:"priTmplId"` PriTmplID string `json:"priTmplId"`
Title string `json:"title"` Title string `json:"title"`
@@ -64,7 +64,7 @@ type TemplateItem struct {
Type int64 `json:"type"` Type int64 `json:"type"`
} }
//TemplateList template list // TemplateList template list
type TemplateList struct { type TemplateList struct {
util.CommonError util.CommonError
Data []TemplateItem `json:"data"` Data []TemplateItem `json:"data"`
@@ -85,7 +85,7 @@ func (s *Subscribe) Send(msg *Message) (err error) {
return util.DecodeWithCommonError(response, "Send") return util.DecodeWithCommonError(response, "Send")
} }
//ListTemplates 获取当前帐号下的个人模板列表 // ListTemplates 获取当前帐号下的个人模板列表
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.getTemplateList.html // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.getTemplateList.html
func (s *Subscribe) ListTemplates() (*TemplateList, error) { func (s *Subscribe) ListTemplates() (*TemplateList, error) {
accessToken, err := s.GetAccessToken() accessToken, err := s.GetAccessToken()

View File

@@ -7,17 +7,17 @@ import (
) )
const ( const (
//触发云函数 // 触发云函数
invokeCloudFunctionURL = "https://api.weixin.qq.com/tcb/invokecloudfunction" invokeCloudFunctionURL = "https://api.weixin.qq.com/tcb/invokecloudfunction"
) )
//InvokeCloudFunctionRes 云函数调用返回结果 // InvokeCloudFunctionRes 云函数调用返回结果
type InvokeCloudFunctionRes struct { type InvokeCloudFunctionRes struct {
util.CommonError util.CommonError
RespData string `json:"resp_data"` //云函数返回的buffer RespData string `json:"resp_data"` // 云函数返回的buffer
} }
//InvokeCloudFunction 云函数调用 // InvokeCloudFunction 云函数调用
//reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/functions/invokeCloudFunction.html //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/functions/invokeCloudFunction.html
func (tcb *Tcb) InvokeCloudFunction(env, name, args string) (*InvokeCloudFunctionRes, error) { func (tcb *Tcb) InvokeCloudFunction(env, name, args string) (*InvokeCloudFunctionRes, error) {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()

View File

@@ -7,191 +7,191 @@ import (
) )
const ( const (
//数据库导入 // 数据库导入
databaseMigrateImportURL = "https://api.weixin.qq.com/tcb/databasemigrateimport" databaseMigrateImportURL = "https://api.weixin.qq.com/tcb/databasemigrateimport"
//数据库导出 // 数据库导出
databaseMigrateExportURL = "https://api.weixin.qq.com/tcb/databasemigrateexport" databaseMigrateExportURL = "https://api.weixin.qq.com/tcb/databasemigrateexport"
//数据库迁移状态查询 // 数据库迁移状态查询
databaseMigrateQueryInfoURL = "https://api.weixin.qq.com/tcb/databasemigratequeryinfo" databaseMigrateQueryInfoURL = "https://api.weixin.qq.com/tcb/databasemigratequeryinfo"
//变更数据库索引 // 变更数据库索引
updateIndexURL = "https://api.weixin.qq.com/tcb/updateindex" updateIndexURL = "https://api.weixin.qq.com/tcb/updateindex"
//新增集合 // 新增集合
databaseCollectionAddURL = "https://api.weixin.qq.com/tcb/databasecollectionadd" databaseCollectionAddURL = "https://api.weixin.qq.com/tcb/databasecollectionadd"
//删除集合 // 删除集合
databaseCollectionDeleteURL = "https://api.weixin.qq.com/tcb/databasecollectiondelete" databaseCollectionDeleteURL = "https://api.weixin.qq.com/tcb/databasecollectiondelete"
//获取特定云环境下集合信息 // 获取特定云环境下集合信息
databaseCollectionGetURL = "https://api.weixin.qq.com/tcb/databasecollectionget" databaseCollectionGetURL = "https://api.weixin.qq.com/tcb/databasecollectionget"
//数据库插入记录 // 数据库插入记录
databaseAddURL = "https://api.weixin.qq.com/tcb/databaseadd" databaseAddURL = "https://api.weixin.qq.com/tcb/databaseadd"
//数据库删除记录 // 数据库删除记录
databaseDeleteURL = "https://api.weixin.qq.com/tcb/databasedelete" databaseDeleteURL = "https://api.weixin.qq.com/tcb/databasedelete"
//数据库更新记录 // 数据库更新记录
databaseUpdateURL = "https://api.weixin.qq.com/tcb/databaseupdate" databaseUpdateURL = "https://api.weixin.qq.com/tcb/databaseupdate"
//数据库查询记录 // 数据库查询记录
databaseQueryURL = "https://api.weixin.qq.com/tcb/databasequery" databaseQueryURL = "https://api.weixin.qq.com/tcb/databasequery"
//统计集合记录数或统计查询语句对应的结果记录数 // 统计集合记录数或统计查询语句对应的结果记录数
databaseCountURL = "https://api.weixin.qq.com/tcb/databasecount" databaseCountURL = "https://api.weixin.qq.com/tcb/databasecount"
//ConflictModeInster 冲突处理模式 插入 // ConflictModeInster 冲突处理模式 插入
ConflictModeInster ConflictMode = 1 ConflictModeInster ConflictMode = 1
//ConflictModeUpsert 冲突处理模式 更新 // ConflictModeUpsert 冲突处理模式 更新
ConflictModeUpsert ConflictMode = 2 ConflictModeUpsert ConflictMode = 2
//FileTypeJSON 的合法值 json // FileTypeJSON 的合法值 json
FileTypeJSON FileType = 1 FileTypeJSON FileType = 1
//FileTypeCsv 的合法值 csv // FileTypeCsv 的合法值 csv
FileTypeCsv FileType = 2 FileTypeCsv FileType = 2
) )
//ConflictMode 冲突处理模式 // ConflictMode 冲突处理模式
type ConflictMode int type ConflictMode int
//FileType 文件上传和导出的允许文件类型 // FileType 文件上传和导出的允许文件类型
type FileType int type FileType int
//ValidDirections 合法的direction值 // ValidDirections 合法的direction值
var ValidDirections = []string{"1", "-1", "2dsphere"} var ValidDirections = []string{"1", "-1", "2dsphere"}
//DatabaseMigrateExportReq 数据库出 请求参数 // DatabaseMigrateExportReq 数据库出 请求参数
type DatabaseMigrateExportReq struct { type DatabaseMigrateExportReq struct {
Env string `json:"env,omitempty"` //云环境ID Env string `json:"env,omitempty"` // 云环境ID
FilePath string `json:"file_path,omitempty"` //导出文件路径(导入文件需先上传到同环境的存储中,可使用开发者工具或 HTTP API的上传文件 API上传 FilePath string `json:"file_path,omitempty"` // 导出文件路径(导入文件需先上传到同环境的存储中,可使用开发者工具或 HTTP API的上传文件 API上传
FileType FileType `json:"file_type,omitempty"` //导出文件类型,文件格式参考数据库导入指引中的文件格式部分 1:json 2:csv FileType FileType `json:"file_type,omitempty"` // 导出文件类型,文件格式参考数据库导入指引中的文件格式部分 1:json 2:csv
Query string `json:"query,omitempty"` //导出条件 Query string `json:"query,omitempty"` // 导出条件
} }
//DatabaseMigrateExportRes 数据库导出 返回结果 // DatabaseMigrateExportRes 数据库导出 返回结果
type DatabaseMigrateExportRes struct { type DatabaseMigrateExportRes struct {
util.CommonError util.CommonError
JobID int64 `json:"job_id"` //导出任务ID可使用数据库迁移进度查询 API 查询导入进度及结果 JobID int64 `json:"job_id"` // 导出任务ID可使用数据库迁移进度查询 API 查询导入进度及结果
} }
//DatabaseMigrateImportReq 数据库导入 请求参数 // DatabaseMigrateImportReq 数据库导入 请求参数
type DatabaseMigrateImportReq struct { type DatabaseMigrateImportReq struct {
Env string `json:"env,omitempty"` //云环境ID Env string `json:"env,omitempty"` // 云环境ID
CollectionName string `json:"collection_name,omitempty"` //集合名称 CollectionName string `json:"collection_name,omitempty"` // 集合名称
FilePath string `json:"file_path,omitempty"` //导出文件路径(文件会导出到同环境的云存储中,可使用获取下载链接 API 获取下载链接) FilePath string `json:"file_path,omitempty"` // 导出文件路径(文件会导出到同环境的云存储中,可使用获取下载链接 API 获取下载链接)
FileType FileType `json:"file_type,omitempty"` //导入文件类型,文件格式参考数据库导入指引中的文件格式部分 1:json 2:csv FileType FileType `json:"file_type,omitempty"` // 导入文件类型,文件格式参考数据库导入指引中的文件格式部分 1:json 2:csv
StopOnError bool `json:"stop_on_error,omitempty"` //是否在遇到错误时停止导入 StopOnError bool `json:"stop_on_error,omitempty"` // 是否在遇到错误时停止导入
ConflictMode ConflictMode `json:"conflict_mode,omitempty"` //冲突处理模式 1:inster 2:UPSERT ConflictMode ConflictMode `json:"conflict_mode,omitempty"` // 冲突处理模式 1:inster 2:UPSERT
} }
//DatabaseMigrateImportRes 数据库导入 返回结果 // DatabaseMigrateImportRes 数据库导入 返回结果
type DatabaseMigrateImportRes struct { type DatabaseMigrateImportRes struct {
util.CommonError util.CommonError
JobID int64 `json:"job_id"` //导入任务ID可使用数据库迁移进度查询 API 查询导入进度及结果 JobID int64 `json:"job_id"` // 导入任务ID可使用数据库迁移进度查询 API 查询导入进度及结果
} }
//DatabaseMigrateQueryInfoRes 数据库迁移状态查询 // DatabaseMigrateQueryInfoRes 数据库迁移状态查询
type DatabaseMigrateQueryInfoRes struct { type DatabaseMigrateQueryInfoRes struct {
util.CommonError util.CommonError
Status string `json:"status"` //导出状态 Status string `json:"status"` // 导出状态
RecordSuccess int64 `json:"record_success"` //导出成功记录数 RecordSuccess int64 `json:"record_success"` // 导出成功记录数
RecordFail int64 `json:"record_fail"` //导出失败记录数 RecordFail int64 `json:"record_fail"` // 导出失败记录数
ErrMsg string `json:"err_msg"` //导出错误信息 ErrMsg string `json:"err_msg"` // 导出错误信息
FileURL string `json:"file_url"` //导出文件下载地址 FileURL string `json:"file_url"` // 导出文件下载地址
} }
//UpdateIndexReq 变更数据库索引 请求参数 // UpdateIndexReq 变更数据库索引 请求参数
type UpdateIndexReq struct { type UpdateIndexReq struct {
Env string `json:"env,omitempty"` //云环境ID Env string `json:"env,omitempty"` // 云环境ID
CollectionName string `json:"collection_name,omitempty"` //集合名称 CollectionName string `json:"collection_name,omitempty"` // 集合名称
CreateIndexes []CreateIndex `json:"create_indexes,omitempty"` //新增索引 CreateIndexes []CreateIndex `json:"create_indexes,omitempty"` // 新增索引
DropIndexes []DropIndex `json:"drop_indexes,omitempty"` //删除索引 DropIndexes []DropIndex `json:"drop_indexes,omitempty"` // 删除索引
} }
//CreateIndex 新增索引 // CreateIndex 新增索引
type CreateIndex struct { type CreateIndex struct {
Name string `json:"name,omitempty"` //索引名 Name string `json:"name,omitempty"` // 索引名
Unique bool `json:"unique,omitempty"` //是否唯一 Unique bool `json:"unique,omitempty"` // 是否唯一
Keys []CreateIndexKey `json:"keys,omitempty"` //索引字段 Keys []CreateIndexKey `json:"keys,omitempty"` // 索引字段
} }
//CreateIndexKey create index key // CreateIndexKey create index key
type CreateIndexKey struct { type CreateIndexKey struct {
Name string `json:"name,omitempty"` //字段名 Name string `json:"name,omitempty"` // 字段名
Direction string `json:"direction,omitempty"` //字段排序 Direction string `json:"direction,omitempty"` // 字段排序
} }
//DropIndex 删除索引 // DropIndex 删除索引
type DropIndex struct { type DropIndex struct {
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
} }
//DatabaseCollectionReq 新增/删除集合请求参数 // DatabaseCollectionReq 新增/删除集合请求参数
type DatabaseCollectionReq struct { type DatabaseCollectionReq struct {
Env string `json:"env,omitempty"` //云环境ID Env string `json:"env,omitempty"` // 云环境ID
CollectionName string `json:"collection_name,omitempty"` //集合名称 CollectionName string `json:"collection_name,omitempty"` // 集合名称
} }
//DatabaseCollectionGetReq 获取特定云环境下集合信息请求 // DatabaseCollectionGetReq 获取特定云环境下集合信息请求
type DatabaseCollectionGetReq struct { type DatabaseCollectionGetReq struct {
Env string `json:"env,omitempty"` //云环境ID Env string `json:"env,omitempty"` // 云环境ID
Limit int64 `json:"limit,omitempty"` //获取数量限制 Limit int64 `json:"limit,omitempty"` // 获取数量限制
Offset int64 `json:"offset,omitempty"` //偏移量 Offset int64 `json:"offset,omitempty"` // 偏移量
} }
//DatabaseCollectionGetRes 获取特定云环境下集合信息结果 // DatabaseCollectionGetRes 获取特定云环境下集合信息结果
type DatabaseCollectionGetRes struct { type DatabaseCollectionGetRes struct {
util.CommonError util.CommonError
Pager struct { Pager struct {
Limit int64 `json:"limit"` //单次查询限制 Limit int64 `json:"limit"` // 单次查询限制
Offset int64 `json:"offset"` //偏移量 Offset int64 `json:"offset"` // 偏移量
Total int64 `json:"total"` //符合查询条件的记录总数 Total int64 `json:"total"` // 符合查询条件的记录总数
} `json:"pager"` } `json:"pager"`
Collections []struct { Collections []struct {
Name string `json:"name"` //集合名 Name string `json:"name"` // 集合名
Count int64 `json:"count"` //表中文档数量 Count int64 `json:"count"` // 表中文档数量
Size int64 `json:"size"` //表的大小(即表中文档总大小),单位:字节 Size int64 `json:"size"` // 表的大小(即表中文档总大小),单位:字节
IndexCount int64 `json:"index_count"` //索引数量 IndexCount int64 `json:"index_count"` // 索引数量
IndexSize int64 `json:"index_size"` //索引占用大小,单位:字节 IndexSize int64 `json:"index_size"` // 索引占用大小,单位:字节
} `json:"collections"` } `json:"collections"`
} }
//DatabaseReq 数据库插入/删除/更新/查询/统计记录请求参数 // DatabaseReq 数据库插入/删除/更新/查询/统计记录请求参数
type DatabaseReq struct { type DatabaseReq struct {
Env string `json:"env,omitempty"` //云环境ID Env string `json:"env,omitempty"` // 云环境ID
Query string `json:"query,omitempty"` //数据库操作语句 Query string `json:"query,omitempty"` // 数据库操作语句
} }
//DatabaseAddRes 数据库插入记录返回结果 // DatabaseAddRes 数据库插入记录返回结果
type DatabaseAddRes struct { type DatabaseAddRes struct {
util.CommonError util.CommonError
IDList []string `json:"id_list"` //插入成功的数据集合主键_id。 IDList []string `json:"id_list"` // 插入成功的数据集合主键_id。
} }
//DatabaseDeleteRes 数据库删除记录返回结果 // DatabaseDeleteRes 数据库删除记录返回结果
type DatabaseDeleteRes struct { type DatabaseDeleteRes struct {
util.CommonError util.CommonError
Deleted int64 `json:"deleted"` //删除记录数量 Deleted int64 `json:"deleted"` // 删除记录数量
} }
//DatabaseUpdateRes 数据库更新记录返回结果 // DatabaseUpdateRes 数据库更新记录返回结果
type DatabaseUpdateRes struct { type DatabaseUpdateRes struct {
util.CommonError util.CommonError
Matched int64 `json:"matched"` //更新条件匹配到的结果数 Matched int64 `json:"matched"` // 更新条件匹配到的结果数
Modified int64 `json:"modified"` //修改的记录数注意使用set操作新插入的数据不计入修改数目 Modified int64 `json:"modified"` // 修改的记录数注意使用set操作新插入的数据不计入修改数目
ID string `json:"id"` ID string `json:"id"`
} }
//DatabaseQueryRes 数据库查询记录 返回结果 // DatabaseQueryRes 数据库查询记录 返回结果
type DatabaseQueryRes struct { type DatabaseQueryRes struct {
util.CommonError util.CommonError
Pager struct { Pager struct {
Limit int64 `json:"limit"` //单次查询限制 Limit int64 `json:"limit"` // 单次查询限制
Offset int64 `json:"offset"` //偏移量 Offset int64 `json:"offset"` // 偏移量
Total int64 `json:"total"` //符合查询条件的记录总数 Total int64 `json:"total"` // 符合查询条件的记录总数
} `json:"pager"` } `json:"pager"`
Data []string `json:"data"` Data []string `json:"data"`
} }
//DatabaseCountRes 统计集合记录数或统计查询语句对应的结果记录数 返回结果 // DatabaseCountRes 统计集合记录数或统计查询语句对应的结果记录数 返回结果
type DatabaseCountRes struct { type DatabaseCountRes struct {
util.CommonError util.CommonError
Count int64 `json:"count"` //记录数量 Count int64 `json:"count"` // 记录数量
} }
//DatabaseMigrateImport 数据库导入 // DatabaseMigrateImport 数据库导入
//reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateImport.html //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateImport.html
func (tcb *Tcb) DatabaseMigrateImport(req *DatabaseMigrateImportReq) (*DatabaseMigrateImportRes, error) { func (tcb *Tcb) DatabaseMigrateImport(req *DatabaseMigrateImportReq) (*DatabaseMigrateImportRes, error) {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()
@@ -208,7 +208,7 @@ func (tcb *Tcb) DatabaseMigrateImport(req *DatabaseMigrateImportReq) (*DatabaseM
return databaseMigrateImportRes, err return databaseMigrateImportRes, err
} }
//DatabaseMigrateExport 数据库导出 // DatabaseMigrateExport 数据库导出
//reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateExport.html //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateExport.html
func (tcb *Tcb) DatabaseMigrateExport(req *DatabaseMigrateExportReq) (*DatabaseMigrateExportRes, error) { func (tcb *Tcb) DatabaseMigrateExport(req *DatabaseMigrateExportReq) (*DatabaseMigrateExportRes, error) {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()
@@ -225,7 +225,7 @@ func (tcb *Tcb) DatabaseMigrateExport(req *DatabaseMigrateExportReq) (*DatabaseM
return databaseMigrateExportRes, err return databaseMigrateExportRes, err
} }
//DatabaseMigrateQueryInfo 数据库迁移状态查询 // DatabaseMigrateQueryInfo 数据库迁移状态查询
//reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateQueryInfo.html //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateQueryInfo.html
func (tcb *Tcb) DatabaseMigrateQueryInfo(env string, jobID int64) (*DatabaseMigrateQueryInfoRes, error) { func (tcb *Tcb) DatabaseMigrateQueryInfo(env string, jobID int64) (*DatabaseMigrateQueryInfoRes, error) {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()
@@ -245,8 +245,8 @@ func (tcb *Tcb) DatabaseMigrateQueryInfo(env string, jobID int64) (*DatabaseMigr
return databaseMigrateQueryInfoRes, err return databaseMigrateQueryInfoRes, err
} }
//UpdateIndex 变更数据库索引 // UpdateIndex 变更数据库索引
//https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/updateIndex.html // https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/updateIndex.html
func (tcb *Tcb) UpdateIndex(req *UpdateIndexReq) error { func (tcb *Tcb) UpdateIndex(req *UpdateIndexReq) error {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()
if err != nil { if err != nil {
@@ -260,7 +260,7 @@ func (tcb *Tcb) UpdateIndex(req *UpdateIndexReq) error {
return util.DecodeWithCommonError(response, "UpdateIndex") return util.DecodeWithCommonError(response, "UpdateIndex")
} }
//DatabaseCollectionAdd 新增集合 // DatabaseCollectionAdd 新增集合
//reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionAdd.html //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionAdd.html
func (tcb *Tcb) DatabaseCollectionAdd(env, collectionName string) error { func (tcb *Tcb) DatabaseCollectionAdd(env, collectionName string) error {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()
@@ -278,7 +278,7 @@ func (tcb *Tcb) DatabaseCollectionAdd(env, collectionName string) error {
return util.DecodeWithCommonError(response, "DatabaseCollectionAdd") return util.DecodeWithCommonError(response, "DatabaseCollectionAdd")
} }
//DatabaseCollectionDelete 删除集合 // DatabaseCollectionDelete 删除集合
//reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionDelete.html //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionDelete.html
func (tcb *Tcb) DatabaseCollectionDelete(env, collectionName string) error { func (tcb *Tcb) DatabaseCollectionDelete(env, collectionName string) error {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()
@@ -296,7 +296,7 @@ func (tcb *Tcb) DatabaseCollectionDelete(env, collectionName string) error {
return util.DecodeWithCommonError(response, "DatabaseCollectionDelete") return util.DecodeWithCommonError(response, "DatabaseCollectionDelete")
} }
//DatabaseCollectionGet 获取特定云环境下集合信息 // DatabaseCollectionGet 获取特定云环境下集合信息
//reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionGet.html //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionGet.html
func (tcb *Tcb) DatabaseCollectionGet(env string, limit, offset int64) (*DatabaseCollectionGetRes, error) { func (tcb *Tcb) DatabaseCollectionGet(env string, limit, offset int64) (*DatabaseCollectionGetRes, error) {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()
@@ -317,7 +317,7 @@ func (tcb *Tcb) DatabaseCollectionGet(env string, limit, offset int64) (*Databas
return databaseCollectionGetRes, err return databaseCollectionGetRes, err
} }
//DatabaseAdd 数据库插入记录 // DatabaseAdd 数据库插入记录
//reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseAdd.html //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseAdd.html
func (tcb *Tcb) DatabaseAdd(env, query string) (*DatabaseAddRes, error) { func (tcb *Tcb) DatabaseAdd(env, query string) (*DatabaseAddRes, error) {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()
@@ -337,7 +337,7 @@ func (tcb *Tcb) DatabaseAdd(env, query string) (*DatabaseAddRes, error) {
return databaseAddRes, err return databaseAddRes, err
} }
//DatabaseDelete 数据库插入记录 // DatabaseDelete 数据库插入记录
//reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseDelete.html //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseDelete.html
func (tcb *Tcb) DatabaseDelete(env, query string) (*DatabaseDeleteRes, error) { func (tcb *Tcb) DatabaseDelete(env, query string) (*DatabaseDeleteRes, error) {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()
@@ -357,7 +357,7 @@ func (tcb *Tcb) DatabaseDelete(env, query string) (*DatabaseDeleteRes, error) {
return databaseDeleteRes, err return databaseDeleteRes, err
} }
//DatabaseUpdate 数据库插入记录 // DatabaseUpdate 数据库插入记录
//reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseUpdate.html //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseUpdate.html
func (tcb *Tcb) DatabaseUpdate(env, query string) (*DatabaseUpdateRes, error) { func (tcb *Tcb) DatabaseUpdate(env, query string) (*DatabaseUpdateRes, error) {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()
@@ -377,7 +377,7 @@ func (tcb *Tcb) DatabaseUpdate(env, query string) (*DatabaseUpdateRes, error) {
return databaseUpdateRes, err return databaseUpdateRes, err
} }
//DatabaseQuery 数据库查询记录 // DatabaseQuery 数据库查询记录
//reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseQuery.html //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseQuery.html
func (tcb *Tcb) DatabaseQuery(env, query string) (*DatabaseQueryRes, error) { func (tcb *Tcb) DatabaseQuery(env, query string) (*DatabaseQueryRes, error) {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()
@@ -397,7 +397,7 @@ func (tcb *Tcb) DatabaseQuery(env, query string) (*DatabaseQueryRes, error) {
return databaseQueryRes, err return databaseQueryRes, err
} }
//DatabaseCount 统计集合记录数或统计查询语句对应的结果记录数 // DatabaseCount 统计集合记录数或统计查询语句对应的结果记录数
//reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCount.html //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCount.html
func (tcb *Tcb) DatabaseCount(env, query string) (*DatabaseCountRes, error) { func (tcb *Tcb) DatabaseCount(env, query string) (*DatabaseCountRes, error) {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()

View File

@@ -7,60 +7,60 @@ import (
) )
const ( const (
//获取文件上传链接 // 获取文件上传链接
uploadFilePathURL = "https://api.weixin.qq.com/tcb/uploadfile" uploadFilePathURL = "https://api.weixin.qq.com/tcb/uploadfile"
//获取文件下载链接 // 获取文件下载链接
batchDownloadFileURL = "https://api.weixin.qq.com/tcb/batchdownloadfile" batchDownloadFileURL = "https://api.weixin.qq.com/tcb/batchdownloadfile"
//删除文件链接 // 删除文件链接
batchDeleteFileURL = "https://api.weixin.qq.com/tcb/batchdeletefile" batchDeleteFileURL = "https://api.weixin.qq.com/tcb/batchdeletefile"
) )
//UploadFileReq 上传文件请求值 // UploadFileReq 上传文件请求值
type UploadFileReq struct { type UploadFileReq struct {
Env string `json:"env,omitempty"` Env string `json:"env,omitempty"`
Path string `json:"path,omitempty"` Path string `json:"path,omitempty"`
} }
//UploadFileRes 上传文件返回结果 // UploadFileRes 上传文件返回结果
type UploadFileRes struct { type UploadFileRes struct {
util.CommonError util.CommonError
URL string `json:"url"` //上传url URL string `json:"url"` // 上传url
Token string `json:"token"` //token Token string `json:"token"` // token
Authorization string `json:"authorization"` //authorization Authorization string `json:"authorization"` // authorization
FileID string `json:"file_id"` //文件ID FileID string `json:"file_id"` // 文件ID
CosFileID string `json:"cos_file_id"` //cos文件ID CosFileID string `json:"cos_file_id"` // cos文件ID
} }
//BatchDownloadFileReq 上传文件请求值 // BatchDownloadFileReq 上传文件请求值
type BatchDownloadFileReq struct { type BatchDownloadFileReq struct {
Env string `json:"env,omitempty"` Env string `json:"env,omitempty"`
FileList []*DownloadFile `json:"file_list,omitempty"` FileList []*DownloadFile `json:"file_list,omitempty"`
} }
//DownloadFile 文件信息 // DownloadFile 文件信息
type DownloadFile struct { type DownloadFile struct {
FileID string `json:"fileid"` //文件ID FileID string `json:"fileid"` // 文件ID
MaxAge int64 `json:"max_age"` //下载链接有效期 MaxAge int64 `json:"max_age"` // 下载链接有效期
} }
//BatchDownloadFileRes 上传文件返回结果 // BatchDownloadFileRes 上传文件返回结果
type BatchDownloadFileRes struct { type BatchDownloadFileRes struct {
util.CommonError util.CommonError
FileList []struct { FileList []struct {
FileID string `json:"file_id"` //文件ID FileID string `json:"file_id"` // 文件ID
DownloadURL string `json:"download_url"` //下载链接 DownloadURL string `json:"download_url"` // 下载链接
Status int64 `json:"status"` //状态码 Status int64 `json:"status"` // 状态码
ErrMsg string `json:"errmsg"` //该文件错误信息 ErrMsg string `json:"errmsg"` // 该文件错误信息
} `json:"file_list"` } `json:"file_list"`
} }
//BatchDeleteFileReq 批量删除文件请求参数 // BatchDeleteFileReq 批量删除文件请求参数
type BatchDeleteFileReq struct { type BatchDeleteFileReq struct {
Env string `json:"env,omitempty"` Env string `json:"env,omitempty"`
FileIDList []string `json:"fileid_list,omitempty"` FileIDList []string `json:"fileid_list,omitempty"`
} }
//BatchDeleteFileRes 批量删除文件返回结果 // BatchDeleteFileRes 批量删除文件返回结果
type BatchDeleteFileRes struct { type BatchDeleteFileRes struct {
util.CommonError util.CommonError
DeleteList []struct { DeleteList []struct {
@@ -70,7 +70,7 @@ type BatchDeleteFileRes struct {
} `json:"delete_list"` } `json:"delete_list"`
} }
//UploadFile 上传文件 // UploadFile 上传文件
//reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/storage/uploadFile.html //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/storage/uploadFile.html
func (tcb *Tcb) UploadFile(env, path string) (*UploadFileRes, error) { func (tcb *Tcb) UploadFile(env, path string) (*UploadFileRes, error) {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()
@@ -91,7 +91,7 @@ func (tcb *Tcb) UploadFile(env, path string) (*UploadFileRes, error) {
return uploadFileRes, err return uploadFileRes, err
} }
//BatchDownloadFile 获取文件下载链接 // BatchDownloadFile 获取文件下载链接
//reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/storage/batchDownloadFile.html //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/storage/batchDownloadFile.html
func (tcb *Tcb) BatchDownloadFile(env string, fileList []*DownloadFile) (*BatchDownloadFileRes, error) { func (tcb *Tcb) BatchDownloadFile(env string, fileList []*DownloadFile) (*BatchDownloadFileRes, error) {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()
@@ -112,7 +112,7 @@ func (tcb *Tcb) BatchDownloadFile(env string, fileList []*DownloadFile) (*BatchD
return batchDownloadFileRes, err return batchDownloadFileRes, err
} }
//BatchDeleteFile 批量删除文件 // BatchDeleteFile 批量删除文件
//reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/storage/batchDeleteFile.html //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/storage/batchDeleteFile.html
func (tcb *Tcb) BatchDeleteFile(env string, fileIDList []string) (*BatchDeleteFileRes, error) { func (tcb *Tcb) BatchDeleteFile(env string, fileIDList []string) (*BatchDeleteFileRes, error) {
accessToken, err := tcb.GetAccessToken() accessToken, err := tcb.GetAccessToken()

View File

@@ -2,12 +2,12 @@ package tcb
import "github.com/silenceper/wechat/v2/miniprogram/context" import "github.com/silenceper/wechat/v2/miniprogram/context"
//Tcb Tencent Cloud Base // Tcb Tencent Cloud Base
type Tcb struct { type Tcb struct {
*context.Context *context.Context
} }
//NewTcb new Tencent Cloud Base // NewTcb new Tencent Cloud Base
func NewTcb(context *context.Context) *Tcb { func NewTcb(context *context.Context) *Tcb {
return &Tcb{ return &Tcb{
context, context,

View File

@@ -51,7 +51,6 @@ type ULResult struct {
// Generate 生成url link // Generate 生成url link
func (u *URLLink) Generate(params *ULParams) (string, error) { func (u *URLLink) Generate(params *ULParams) (string, error) {
var accessToken string
accessToken, err := u.GetAccessToken() accessToken, err := u.GetAccessToken()
if err != nil { if err != nil {
return "", err return "", err

View File

@@ -8,34 +8,34 @@ import (
) )
var ( var (
//获取微信服务器IP地址 // 获取微信服务器IP地址
//文档https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html // 文档https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html
getCallbackIPURL = "https://api.weixin.qq.com/cgi-bin/getcallbackip" getCallbackIPURL = "https://api.weixin.qq.com/cgi-bin/getcallbackip"
getAPIDomainIPURL = "https://api.weixin.qq.com/cgi-bin/get_api_domain_ip" getAPIDomainIPURL = "https://api.weixin.qq.com/cgi-bin/get_api_domain_ip"
//清理接口调用次数 // 清理接口调用次数
clearQuotaURL = "https://api.weixin.qq.com/cgi-bin/clear_quota" clearQuotaURL = "https://api.weixin.qq.com/cgi-bin/clear_quota"
) )
//Basic struct // Basic struct
type Basic struct { type Basic struct {
*context.Context *context.Context
} }
//NewBasic 实例 // NewBasic 实例
func NewBasic(context *context.Context) *Basic { func NewBasic(context *context.Context) *Basic {
basic := new(Basic) basic := new(Basic)
basic.Context = context basic.Context = context
return basic return basic
} }
//IPListRes 获取微信服务器IP地址 返回结果 // IPListRes 获取微信服务器IP地址 返回结果
type IPListRes struct { type IPListRes struct {
util.CommonError util.CommonError
IPList []string `json:"ip_list"` IPList []string `json:"ip_list"`
} }
//GetCallbackIP 获取微信callback IP地址 // GetCallbackIP 获取微信callback IP地址
func (basic *Basic) GetCallbackIP() ([]string, error) { func (basic *Basic) GetCallbackIP() ([]string, error) {
ak, err := basic.GetAccessToken() ak, err := basic.GetAccessToken()
if err != nil { if err != nil {
@@ -51,7 +51,7 @@ func (basic *Basic) GetCallbackIP() ([]string, error) {
return ipListRes.IPList, err return ipListRes.IPList, err
} }
//GetAPIDomainIP 获取微信API接口 IP地址 // GetAPIDomainIP 获取微信API接口 IP地址
func (basic *Basic) GetAPIDomainIP() ([]string, error) { func (basic *Basic) GetAPIDomainIP() ([]string, error) {
ak, err := basic.GetAccessToken() ak, err := basic.GetAccessToken()
if err != nil { if err != nil {
@@ -67,7 +67,7 @@ func (basic *Basic) GetAPIDomainIP() ([]string, error) {
return ipListRes.IPList, err return ipListRes.IPList, err
} }
//ClearQuota 清理接口调用次数 // ClearQuota 清理接口调用次数
func (basic *Basic) ClearQuota() error { func (basic *Basic) ClearQuota() error {
ak, err := basic.GetAccessToken() ak, err := basic.GetAccessToken()
if err != nil { if err != nil {

View File

@@ -17,42 +17,42 @@ const (
setSpeedSendURL = "https://api.weixin.qq.com/cgi-bin/message/mass/speed/set" setSpeedSendURL = "https://api.weixin.qq.com/cgi-bin/message/mass/speed/set"
) )
//MsgType 发送消息类型 // MsgType 发送消息类型
type MsgType string type MsgType string
const ( const (
//MsgTypeNews 图文消息 // MsgTypeNews 图文消息
MsgTypeNews MsgType = "mpnews" MsgTypeNews MsgType = "mpnews"
//MsgTypeText 文本 // MsgTypeText 文本
MsgTypeText MsgType = "text" MsgTypeText MsgType = "text"
//MsgTypeVoice 语音/音频 // MsgTypeVoice 语音/音频
MsgTypeVoice MsgType = "voice" MsgTypeVoice MsgType = "voice"
//MsgTypeImage 图片 // MsgTypeImage 图片
MsgTypeImage MsgType = "image" MsgTypeImage MsgType = "image"
//MsgTypeVideo 视频 // MsgTypeVideo 视频
MsgTypeVideo MsgType = "mpvideo" MsgTypeVideo MsgType = "mpvideo"
//MsgTypeWxCard 卡券 // MsgTypeWxCard 卡券
MsgTypeWxCard MsgType = "wxcard" MsgTypeWxCard MsgType = "wxcard"
) )
//Broadcast 群发消息 // Broadcast 群发消息
type Broadcast struct { type Broadcast struct {
*context.Context *context.Context
preview bool preview bool
} }
//NewBroadcast new // NewBroadcast new
func NewBroadcast(ctx *context.Context) *Broadcast { func NewBroadcast(ctx *context.Context) *Broadcast {
return &Broadcast{ctx, false} return &Broadcast{ctx, false}
} }
//User 发送的用户 // User 发送的用户
type User struct { type User struct {
TagID int64 TagID int64
OpenID []string OpenID []string
} }
//Result 群发返回结果 // Result 群发返回结果
type Result struct { type Result struct {
util.CommonError util.CommonError
MsgID int64 `json:"msg_id"` MsgID int64 `json:"msg_id"`
@@ -60,34 +60,34 @@ type Result struct {
MsgStatus string `json:"msg_status"` MsgStatus string `json:"msg_status"`
} }
//SpeedResult 群发速度返回结果 // SpeedResult 群发速度返回结果
type SpeedResult struct { type SpeedResult struct {
util.CommonError util.CommonError
Speed int64 `json:"speed"` Speed int64 `json:"speed"`
RealSpeed int64 `json:"realspeed"` RealSpeed int64 `json:"realspeed"`
} }
//sendRequest 发送请求的数据 // sendRequest 发送请求的数据
type sendRequest struct { type sendRequest struct {
//根据tag获全部发送 // 根据tag获全部发送
Filter map[string]interface{} `json:"filter,omitempty"` Filter map[string]interface{} `json:"filter,omitempty"`
//根据OpenID发送 // 根据OpenID发送
ToUser interface{} `json:"touser,omitempty"` ToUser interface{} `json:"touser,omitempty"`
//发送文本 // 发送文本
Text map[string]interface{} `json:"text,omitempty"` Text map[string]interface{} `json:"text,omitempty"`
//发送图文消息 // 发送图文消息
Mpnews map[string]interface{} `json:"mpnews,omitempty"` Mpnews map[string]interface{} `json:"mpnews,omitempty"`
//发送语音 // 发送语音
Voice map[string]interface{} `json:"voice,omitempty"` Voice map[string]interface{} `json:"voice,omitempty"`
//发送图片 // 发送图片
Images *Image `json:"images,omitempty"` Images *Image `json:"images,omitempty"`
//发送卡券 // 发送卡券
WxCard map[string]interface{} `json:"wxcard,omitempty"` WxCard map[string]interface{} `json:"wxcard,omitempty"`
MsgType MsgType `json:"msgtype"` MsgType MsgType `json:"msgtype"`
SendIgnoreReprint int32 `json:"send_ignore_reprint,omitempty"` SendIgnoreReprint int32 `json:"send_ignore_reprint,omitempty"`
} }
//Image 发送图片 // Image 发送图片
type Image struct { type Image struct {
MediaIDs []string `json:"media_ids"` MediaIDs []string `json:"media_ids"`
Recommend string `json:"recommend"` Recommend string `json:"recommend"`
@@ -95,10 +95,10 @@ type Image struct {
OnlyFansCanComment int32 `json:"only_fans_can_comment"` OnlyFansCanComment int32 `json:"only_fans_can_comment"`
} }
//SendText 群发文本 // SendText 群发文本
//user 为nil表示全员发送 // user 为nil表示全员发送
//&User{TagID:2} 根据tag发送 // &User{TagID:2} 根据tag发送
//&User{OpenID:[]string("xxx","xxx")} 根据openid发送 // &User{OpenID:[]string("xxx","xxx")} 根据openid发送
func (broadcast *Broadcast) SendText(user *User, content string) (*Result, error) { func (broadcast *Broadcast) SendText(user *User, content string) (*Result, error) {
ak, err := broadcast.GetAccessToken() ak, err := broadcast.GetAccessToken()
if err != nil { if err != nil {
@@ -122,7 +122,7 @@ func (broadcast *Broadcast) SendText(user *User, content string) (*Result, error
return res, err return res, err
} }
//SendNews 发送图文 // SendNews 发送图文
func (broadcast *Broadcast) SendNews(user *User, mediaID string, ignoreReprint bool) (*Result, error) { func (broadcast *Broadcast) SendNews(user *User, mediaID string, ignoreReprint bool) (*Result, error) {
ak, err := broadcast.GetAccessToken() ak, err := broadcast.GetAccessToken()
if err != nil { if err != nil {
@@ -149,7 +149,7 @@ func (broadcast *Broadcast) SendNews(user *User, mediaID string, ignoreReprint b
return res, err return res, err
} }
//SendVoice 发送语音 // SendVoice 发送语音
func (broadcast *Broadcast) SendVoice(user *User, mediaID string) (*Result, error) { func (broadcast *Broadcast) SendVoice(user *User, mediaID string) (*Result, error) {
ak, err := broadcast.GetAccessToken() ak, err := broadcast.GetAccessToken()
if err != nil { if err != nil {
@@ -173,7 +173,7 @@ func (broadcast *Broadcast) SendVoice(user *User, mediaID string) (*Result, erro
return res, err return res, err
} }
//SendImage 发送图片 // SendImage 发送图片
func (broadcast *Broadcast) SendImage(user *User, images *Image) (*Result, error) { func (broadcast *Broadcast) SendImage(user *User, images *Image) (*Result, error) {
ak, err := broadcast.GetAccessToken() ak, err := broadcast.GetAccessToken()
if err != nil { if err != nil {
@@ -195,7 +195,7 @@ func (broadcast *Broadcast) SendImage(user *User, images *Image) (*Result, error
return res, err return res, err
} }
//SendVideo 发送视频 // SendVideo 发送视频
func (broadcast *Broadcast) SendVideo(user *User, mediaID string, title, description string) (*Result, error) { func (broadcast *Broadcast) SendVideo(user *User, mediaID string, title, description string) (*Result, error) {
ak, err := broadcast.GetAccessToken() ak, err := broadcast.GetAccessToken()
if err != nil { if err != nil {
@@ -221,7 +221,7 @@ func (broadcast *Broadcast) SendVideo(user *User, mediaID string, title, descrip
return res, err return res, err
} }
//SendWxCard 发送卡券 // SendWxCard 发送卡券
func (broadcast *Broadcast) SendWxCard(user *User, cardID string) (*Result, error) { func (broadcast *Broadcast) SendWxCard(user *User, cardID string) (*Result, error) {
ak, err := broadcast.GetAccessToken() ak, err := broadcast.GetAccessToken()
if err != nil { if err != nil {
@@ -245,7 +245,7 @@ func (broadcast *Broadcast) SendWxCard(user *User, cardID string) (*Result, erro
return res, err return res, err
} }
//Delete 删除群发消息 // Delete 删除群发消息
func (broadcast *Broadcast) Delete(msgID int64, articleIDx int64) error { func (broadcast *Broadcast) Delete(msgID int64, articleIDx int64) error {
ak, err := broadcast.GetAccessToken() ak, err := broadcast.GetAccessToken()
if err != nil { if err != nil {

View File

@@ -4,11 +4,11 @@ import (
"github.com/silenceper/wechat/v2/cache" "github.com/silenceper/wechat/v2/cache"
) )
// Config config for 微信公众号 // Config .config for 微信公众号
type Config struct { type Config struct {
AppID string `json:"app_id"` //appid AppID string `json:"app_id"` // appid
AppSecret string `json:"app_secret"` //appsecret AppSecret string `json:"app_secret"` // appsecret
Token string `json:"token"` //token Token string `json:"token"` // token
EncodingAESKey string `json:"encoding_aes_key"` //EncodingAESKey EncodingAESKey string `json:"encoding_aes_key"` // EncodingAESKey
Cache cache.Cache Cache cache.Cache
} }

View File

@@ -15,7 +15,7 @@ const (
getUserShareHour = "https://api.weixin.qq.com/datacube/getusersharehour" getUserShareHour = "https://api.weixin.qq.com/datacube/getusersharehour"
) )
//ResArticleSummary 获取图文群发每日数据响应 // ResArticleSummary 获取图文群发每日数据响应
type ResArticleSummary struct { type ResArticleSummary struct {
util.CommonError util.CommonError
@@ -34,7 +34,7 @@ type ResArticleSummary struct {
} `json:"list"` } `json:"list"`
} }
//ResArticleTotal 获取图文群发总数据响应 // ResArticleTotal 获取图文群发总数据响应
type ResArticleTotal struct { type ResArticleTotal struct {
util.CommonError util.CommonError
@@ -46,7 +46,7 @@ type ResArticleTotal struct {
} `json:"list"` } `json:"list"`
} }
//ArticleTotalDetails 获取图文群发总数据响应文字详情 // ArticleTotalDetails 获取图文群发总数据响应文字详情
type ArticleTotalDetails struct { type ArticleTotalDetails struct {
StatDate string `json:"stat_date"` StatDate string `json:"stat_date"`
TargetUser int `json:"target_user"` TargetUser int `json:"target_user"`
@@ -76,7 +76,7 @@ type ArticleTotalDetails struct {
FeedShareFromOtherCnt int `json:"feed_share_from_other_cnt"` FeedShareFromOtherCnt int `json:"feed_share_from_other_cnt"`
} }
//ResUserRead 获取图文统计数据响应 // ResUserRead 获取图文统计数据响应
type ResUserRead struct { type ResUserRead struct {
util.CommonError util.CommonError
@@ -94,7 +94,7 @@ type ResUserRead struct {
} `json:"list"` } `json:"list"`
} }
//ResUserReadHour 获取图文统计分时数据 // ResUserReadHour 获取图文统计分时数据
type ResUserReadHour struct { type ResUserReadHour struct {
util.CommonError util.CommonError
@@ -113,7 +113,7 @@ type ResUserReadHour struct {
} `json:"list"` } `json:"list"`
} }
//ResUserShare 获取图文分享转发数据 // ResUserShare 获取图文分享转发数据
type ResUserShare struct { type ResUserShare struct {
util.CommonError util.CommonError
@@ -125,7 +125,7 @@ type ResUserShare struct {
} `json:"list"` } `json:"list"`
} }
//ResUserShareHour 获取图文分享转发分时数据 // ResUserShareHour 获取图文分享转发分时数据
type ResUserShareHour struct { type ResUserShareHour struct {
util.CommonError util.CommonError
@@ -138,7 +138,7 @@ type ResUserShareHour struct {
} `json:"list"` } `json:"list"`
} }
//GetArticleSummary 获取图文群发每日数据 // GetArticleSummary 获取图文群发每日数据
func (cube *DataCube) GetArticleSummary(s string, e string) (resArticleSummary ResArticleSummary, err error) { func (cube *DataCube) GetArticleSummary(s string, e string) (resArticleSummary ResArticleSummary, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {
@@ -160,7 +160,7 @@ func (cube *DataCube) GetArticleSummary(s string, e string) (resArticleSummary R
return return
} }
//GetArticleTotal 获取图文群发总数据 // GetArticleTotal 获取图文群发总数据
func (cube *DataCube) GetArticleTotal(s string, e string) (resArticleTotal ResArticleTotal, err error) { func (cube *DataCube) GetArticleTotal(s string, e string) (resArticleTotal ResArticleTotal, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {
@@ -182,7 +182,7 @@ func (cube *DataCube) GetArticleTotal(s string, e string) (resArticleTotal ResAr
return return
} }
//GetUserRead 获取图文统计数据 // GetUserRead 获取图文统计数据
func (cube *DataCube) GetUserRead(s string, e string) (resUserRead ResUserRead, err error) { func (cube *DataCube) GetUserRead(s string, e string) (resUserRead ResUserRead, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {
@@ -204,7 +204,7 @@ func (cube *DataCube) GetUserRead(s string, e string) (resUserRead ResUserRead,
return return
} }
//GetUserReadHour 获取图文统计分时数据 // GetUserReadHour 获取图文统计分时数据
func (cube *DataCube) GetUserReadHour(s string, e string) (resUserReadHour ResUserReadHour, err error) { func (cube *DataCube) GetUserReadHour(s string, e string) (resUserReadHour ResUserReadHour, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {
@@ -226,7 +226,7 @@ func (cube *DataCube) GetUserReadHour(s string, e string) (resUserReadHour ResUs
return return
} }
//GetUserShare 获取图文分享转发数据 // GetUserShare 获取图文分享转发数据
func (cube *DataCube) GetUserShare(s string, e string) (resUserShare ResUserShare, err error) { func (cube *DataCube) GetUserShare(s string, e string) (resUserShare ResUserShare, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {
@@ -248,7 +248,7 @@ func (cube *DataCube) GetUserShare(s string, e string) (resUserShare ResUserShar
return return
} }
//GetUserShareHour 获取图文分享转发分时数据 // GetUserShareHour 获取图文分享转发分时数据
func (cube *DataCube) GetUserShareHour(s string, e string) (resUserShareHour ResUserShareHour, err error) { func (cube *DataCube) GetUserShareHour(s string, e string) (resUserShareHour ResUserShareHour, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {

View File

@@ -9,12 +9,12 @@ type reqDate struct {
EndDate string `json:"end_date"` EndDate string `json:"end_date"`
} }
//DataCube 数据统计 // DataCube 数据统计
type DataCube struct { type DataCube struct {
*context.Context *context.Context
} }
//NewCube 数据统计 // NewCube 数据统计
func NewCube(context *context.Context) *DataCube { func NewCube(context *context.Context) *DataCube {
dataCube := new(DataCube) dataCube := new(DataCube)
dataCube.Context = context dataCube.Context = context

View File

@@ -11,7 +11,7 @@ const (
getInterfaceSummaryHour = "https://api.weixin.qq.com/datacube/getinterfacesummaryhour" getInterfaceSummaryHour = "https://api.weixin.qq.com/datacube/getinterfacesummaryhour"
) )
//ResInterfaceSummary 接口分析数据响应 // ResInterfaceSummary 接口分析数据响应
type ResInterfaceSummary struct { type ResInterfaceSummary struct {
util.CommonError util.CommonError
@@ -24,7 +24,7 @@ type ResInterfaceSummary struct {
} `json:"list"` } `json:"list"`
} }
//ResInterfaceSummaryHour 接口分析分时数据响应 // ResInterfaceSummaryHour 接口分析分时数据响应
type ResInterfaceSummaryHour struct { type ResInterfaceSummaryHour struct {
util.CommonError util.CommonError
@@ -38,7 +38,7 @@ type ResInterfaceSummaryHour struct {
} `json:"list"` } `json:"list"`
} }
//GetInterfaceSummary 获取接口分析数据 // GetInterfaceSummary 获取接口分析数据
func (cube *DataCube) GetInterfaceSummary(s string, e string) (resInterfaceSummary ResInterfaceSummary, err error) { func (cube *DataCube) GetInterfaceSummary(s string, e string) (resInterfaceSummary ResInterfaceSummary, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {
@@ -60,7 +60,7 @@ func (cube *DataCube) GetInterfaceSummary(s string, e string) (resInterfaceSumma
return return
} }
//GetInterfaceSummaryHour 获取接口分析分时数据 // GetInterfaceSummaryHour 获取接口分析分时数据
func (cube *DataCube) GetInterfaceSummaryHour(s string, e string) (resInterfaceSummaryHour ResInterfaceSummaryHour, err error) { func (cube *DataCube) GetInterfaceSummaryHour(s string, e string) (resInterfaceSummaryHour ResInterfaceSummaryHour, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {

View File

@@ -16,7 +16,7 @@ const (
getUpstreamMsgDistMonth = "https://api.weixin.qq.com/datacube/getupstreammsgdistmonth" getUpstreamMsgDistMonth = "https://api.weixin.qq.com/datacube/getupstreammsgdistmonth"
) )
//ResUpstreamMsg 获取消息发送概况数据响应 // ResUpstreamMsg 获取消息发送概况数据响应
type ResUpstreamMsg struct { type ResUpstreamMsg struct {
util.CommonError util.CommonError
@@ -28,7 +28,7 @@ type ResUpstreamMsg struct {
} `json:"list"` } `json:"list"`
} }
//ResUpstreamMsgHour 获取消息分送分时数据响应 // ResUpstreamMsgHour 获取消息分送分时数据响应
type ResUpstreamMsgHour struct { type ResUpstreamMsgHour struct {
util.CommonError util.CommonError
@@ -41,7 +41,7 @@ type ResUpstreamMsgHour struct {
} `json:"list"` } `json:"list"`
} }
//ResUpstreamMsgWeek 获取消息发送周数据响应 // ResUpstreamMsgWeek 获取消息发送周数据响应
type ResUpstreamMsgWeek struct { type ResUpstreamMsgWeek struct {
util.CommonError util.CommonError
@@ -53,7 +53,7 @@ type ResUpstreamMsgWeek struct {
} `json:"list"` } `json:"list"`
} }
//ResUpstreamMsgMonth 获取消息发送月数据响应 // ResUpstreamMsgMonth 获取消息发送月数据响应
type ResUpstreamMsgMonth struct { type ResUpstreamMsgMonth struct {
util.CommonError util.CommonError
@@ -65,7 +65,7 @@ type ResUpstreamMsgMonth struct {
} `json:"list"` } `json:"list"`
} }
//ResUpstreamMsgDist 获取消息发送分布数据响应 // ResUpstreamMsgDist 获取消息发送分布数据响应
type ResUpstreamMsgDist struct { type ResUpstreamMsgDist struct {
util.CommonError util.CommonError
@@ -76,7 +76,7 @@ type ResUpstreamMsgDist struct {
} `json:"list"` } `json:"list"`
} }
//ResUpstreamMsgDistWeek 获取消息发送分布周数据响应 // ResUpstreamMsgDistWeek 获取消息发送分布周数据响应
type ResUpstreamMsgDistWeek struct { type ResUpstreamMsgDistWeek struct {
util.CommonError util.CommonError
@@ -87,7 +87,7 @@ type ResUpstreamMsgDistWeek struct {
} `json:"list"` } `json:"list"`
} }
//ResUpstreamMsgDistMonth 获取消息发送分布月数据响应 // ResUpstreamMsgDistMonth 获取消息发送分布月数据响应
type ResUpstreamMsgDistMonth struct { type ResUpstreamMsgDistMonth struct {
util.CommonError util.CommonError
@@ -98,7 +98,7 @@ type ResUpstreamMsgDistMonth struct {
} `json:"list"` } `json:"list"`
} }
//GetUpstreamMsg 获取消息发送概况数据 // GetUpstreamMsg 获取消息发送概况数据
func (cube *DataCube) GetUpstreamMsg(s string, e string) (resUpstreamMsg ResUpstreamMsg, err error) { func (cube *DataCube) GetUpstreamMsg(s string, e string) (resUpstreamMsg ResUpstreamMsg, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {
@@ -120,7 +120,7 @@ func (cube *DataCube) GetUpstreamMsg(s string, e string) (resUpstreamMsg ResUpst
return return
} }
//GetUpstreamMsgHour 获取消息分送分时数据 // GetUpstreamMsgHour 获取消息分送分时数据
func (cube *DataCube) GetUpstreamMsgHour(s string, e string) (resUpstreamMsgHour ResUpstreamMsgHour, err error) { func (cube *DataCube) GetUpstreamMsgHour(s string, e string) (resUpstreamMsgHour ResUpstreamMsgHour, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {
@@ -142,7 +142,7 @@ func (cube *DataCube) GetUpstreamMsgHour(s string, e string) (resUpstreamMsgHour
return return
} }
//GetUpstreamMsgWeek 获取消息发送周数据 // GetUpstreamMsgWeek 获取消息发送周数据
func (cube *DataCube) GetUpstreamMsgWeek(s string, e string) (resUpstreamMsgWeek ResUpstreamMsgWeek, err error) { func (cube *DataCube) GetUpstreamMsgWeek(s string, e string) (resUpstreamMsgWeek ResUpstreamMsgWeek, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {
@@ -164,7 +164,7 @@ func (cube *DataCube) GetUpstreamMsgWeek(s string, e string) (resUpstreamMsgWeek
return return
} }
//GetUpstreamMsgMonth 获取消息发送月数据 // GetUpstreamMsgMonth 获取消息发送月数据
func (cube *DataCube) GetUpstreamMsgMonth(s string, e string) (resUpstreamMsgMonth ResUpstreamMsgMonth, err error) { func (cube *DataCube) GetUpstreamMsgMonth(s string, e string) (resUpstreamMsgMonth ResUpstreamMsgMonth, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {
@@ -186,7 +186,7 @@ func (cube *DataCube) GetUpstreamMsgMonth(s string, e string) (resUpstreamMsgMon
return return
} }
//GetUpstreamMsgDist 获取消息发送分布数据 // GetUpstreamMsgDist 获取消息发送分布数据
func (cube *DataCube) GetUpstreamMsgDist(s string, e string) (resUpstreamMsgDist ResUpstreamMsgDist, err error) { func (cube *DataCube) GetUpstreamMsgDist(s string, e string) (resUpstreamMsgDist ResUpstreamMsgDist, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {
@@ -208,7 +208,7 @@ func (cube *DataCube) GetUpstreamMsgDist(s string, e string) (resUpstreamMsgDist
return return
} }
//GetUpstreamMsgDistWeek 获取消息发送分布周数据 // GetUpstreamMsgDistWeek 获取消息发送分布周数据
func (cube *DataCube) GetUpstreamMsgDistWeek(s string, e string) (resUpstreamMsgDistWeek ResUpstreamMsgDistWeek, err error) { func (cube *DataCube) GetUpstreamMsgDistWeek(s string, e string) (resUpstreamMsgDistWeek ResUpstreamMsgDistWeek, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {
@@ -230,7 +230,7 @@ func (cube *DataCube) GetUpstreamMsgDistWeek(s string, e string) (resUpstreamMsg
return return
} }
//GetUpstreamMsgDistMonth 获取消息发送分布月数据 // GetUpstreamMsgDistMonth 获取消息发送分布月数据
func (cube *DataCube) GetUpstreamMsgDistMonth(s string, e string) (resUpstreamMsgDistMonth ResUpstreamMsgDistMonth, err error) { func (cube *DataCube) GetUpstreamMsgDistMonth(s string, e string) (resUpstreamMsgDistMonth ResUpstreamMsgDistMonth, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {

View File

@@ -8,31 +8,31 @@ import (
"github.com/silenceper/wechat/v2/util" "github.com/silenceper/wechat/v2/util"
) )
//AdSlot 广告位类型 // AdSlot 广告位类型
type AdSlot string type AdSlot string
const ( const (
//SlotIDBizBottom 公众号底部广告 // SlotIDBizBottom 公众号底部广告
SlotIDBizBottom AdSlot = "SLOT_ID_BIZ_BOTTOM" SlotIDBizBottom AdSlot = "SLOT_ID_BIZ_BOTTOM"
//SlotIDBizMidContext 公众号文中广告 // SlotIDBizMidContext 公众号文中广告
SlotIDBizMidContext AdSlot = "SLOT_ID_BIZ_MID_CONTEXT" SlotIDBizMidContext AdSlot = "SLOT_ID_BIZ_MID_CONTEXT"
//SlotIDBizVideoEnd 公众号视频后贴 // SlotIDBizVideoEnd 公众号视频后贴
SlotIDBizVideoEnd AdSlot = "SLOT_ID_BIZ_VIDEO_END" SlotIDBizVideoEnd AdSlot = "SLOT_ID_BIZ_VIDEO_END"
//SlotIDBizSponsor 公众号互选广告 // SlotIDBizSponsor 公众号互选广告
SlotIDBizSponsor AdSlot = "SLOT_ID_BIZ_SPONSOR" SlotIDBizSponsor AdSlot = "SLOT_ID_BIZ_SPONSOR"
//SlotIDBizCps 公众号返佣商品 // SlotIDBizCps 公众号返佣商品
SlotIDBizCps AdSlot = "SLOT_ID_BIZ_CPS" SlotIDBizCps AdSlot = "SLOT_ID_BIZ_CPS"
//SlotIDWeappBanner 小程序banner // SlotIDWeappBanner 小程序banner
SlotIDWeappBanner AdSlot = "SLOT_ID_WEAPP_BANNER" SlotIDWeappBanner AdSlot = "SLOT_ID_WEAPP_BANNER"
//SlotIDWeappRewardVideo 小程序激励视频 // SlotIDWeappRewardVideo 小程序激励视频
SlotIDWeappRewardVideo AdSlot = "SLOT_ID_WEAPP_REWARD_VIDEO" SlotIDWeappRewardVideo AdSlot = "SLOT_ID_WEAPP_REWARD_VIDEO"
//SlotIDWeappInterstitial 小程序插屏广告 // SlotIDWeappInterstitial 小程序插屏广告
SlotIDWeappInterstitial AdSlot = "SLOT_ID_WEAPP_INTERSTITIAL" SlotIDWeappInterstitial AdSlot = "SLOT_ID_WEAPP_INTERSTITIAL"
//SlotIDWeappVideoFeeds 小程序视频广告 // SlotIDWeappVideoFeeds 小程序视频广告
SlotIDWeappVideoFeeds AdSlot = "SLOT_ID_WEAPP_VIDEO_FEEDS" SlotIDWeappVideoFeeds AdSlot = "SLOT_ID_WEAPP_VIDEO_FEEDS"
//SlotIDWeappVideoBegin 小程序视频前贴 // SlotIDWeappVideoBegin 小程序视频前贴
SlotIDWeappVideoBegin AdSlot = "SLOT_ID_WEAPP_VIDEO_BEGIN" SlotIDWeappVideoBegin AdSlot = "SLOT_ID_WEAPP_VIDEO_BEGIN"
//SlotIDWeappBox 小程序格子广告 // SlotIDWeappBox 小程序格子广告
SlotIDWeappBox AdSlot = "SLOT_ID_WEAPP_BOX" SlotIDWeappBox AdSlot = "SLOT_ID_WEAPP_BOX"
) )
@@ -46,13 +46,13 @@ const (
actionPublisherSettlement = "publisher_settlement" actionPublisherSettlement = "publisher_settlement"
) )
//BaseResp 错误信息 // BaseResp 错误信息
type BaseResp struct { type BaseResp struct {
ErrMsg string `json:"err_msg"` ErrMsg string `json:"err_msg"`
Ret int `json:"ret"` Ret int `json:"ret"`
} }
//ResPublisherAdPos 公众号分广告位数据响应 // ResPublisherAdPos 公众号分广告位数据响应
type ResPublisherAdPos struct { type ResPublisherAdPos struct {
util.CommonError util.CommonError
@@ -62,7 +62,7 @@ type ResPublisherAdPos struct {
TotalNum int `json:"total_num"` TotalNum int `json:"total_num"`
} }
//ResAdPosList 公众号分广告位列表 // ResAdPosList 公众号分广告位列表
type ResAdPosList struct { type ResAdPosList struct {
SlotID int64 `json:"slot_id"` SlotID int64 `json:"slot_id"`
AdSlot string `json:"ad_slot"` AdSlot string `json:"ad_slot"`
@@ -76,7 +76,7 @@ type ResAdPosList struct {
Ecpm float64 `json:"ecpm"` Ecpm float64 `json:"ecpm"`
} }
//ResAdPosSummary 公众号分广告位概览 // ResAdPosSummary 公众号分广告位概览
type ResAdPosSummary struct { type ResAdPosSummary struct {
ReqSuccCount int `json:"req_succ_count"` ReqSuccCount int `json:"req_succ_count"`
ExposureCount int `json:"exposure_count"` ExposureCount int `json:"exposure_count"`
@@ -87,7 +87,7 @@ type ResAdPosSummary struct {
Ecpm float64 `json:"ecpm"` Ecpm float64 `json:"ecpm"`
} }
//ResPublisherCps 公众号返佣商品数据响应 // ResPublisherCps 公众号返佣商品数据响应
type ResPublisherCps struct { type ResPublisherCps struct {
util.CommonError util.CommonError
@@ -97,7 +97,7 @@ type ResPublisherCps struct {
TotalNum int `json:"total_num"` TotalNum int `json:"total_num"`
} }
//ResCpsList 公众号返佣商品列表 // ResCpsList 公众号返佣商品列表
type ResCpsList struct { type ResCpsList struct {
Date string `json:"date"` Date string `json:"date"`
ExposureCount int `json:"exposure_count"` ExposureCount int `json:"exposure_count"`
@@ -109,7 +109,7 @@ type ResCpsList struct {
TotalCommission int `json:"total_commission"` TotalCommission int `json:"total_commission"`
} }
//ResCpsSummary 公众号返佣概览 // ResCpsSummary 公众号返佣概览
type ResCpsSummary struct { type ResCpsSummary struct {
ExposureCount int `json:"exposure_count"` ExposureCount int `json:"exposure_count"`
ClickCount int `json:"click_count"` ClickCount int `json:"click_count"`
@@ -120,7 +120,7 @@ type ResCpsSummary struct {
TotalCommission int `json:"total_commission"` TotalCommission int `json:"total_commission"`
} }
//ResPublisherSettlement 公众号结算收入数据及结算主体信息响应 // ResPublisherSettlement 公众号结算收入数据及结算主体信息响应
type ResPublisherSettlement struct { type ResPublisherSettlement struct {
util.CommonError util.CommonError
@@ -133,7 +133,7 @@ type ResPublisherSettlement struct {
TotalNum int `json:"total_num"` TotalNum int `json:"total_num"`
} }
//SettlementList 结算单列表 // SettlementList 结算单列表
type SettlementList struct { type SettlementList struct {
Date string `json:"date"` Date string `json:"date"`
Zone string `json:"zone"` Zone string `json:"zone"`
@@ -146,13 +146,13 @@ type SettlementList struct {
SlotRevenue []SlotRevenue `json:"slot_revenue"` SlotRevenue []SlotRevenue `json:"slot_revenue"`
} }
//SlotRevenue 产生收入的广告 // SlotRevenue 产生收入的广告
type SlotRevenue struct { type SlotRevenue struct {
SlotID string `json:"slot_id"` SlotID string `json:"slot_id"`
SlotSettledRevenue int `json:"slot_settled_revenue"` SlotSettledRevenue int `json:"slot_settled_revenue"`
} }
//ParamsPublisher 拉取数据参数 // ParamsPublisher 拉取数据参数
type ParamsPublisher struct { type ParamsPublisher struct {
Action string `json:"action"` Action string `json:"action"`
StartDate string `json:"start_date"` StartDate string `json:"start_date"`
@@ -189,7 +189,7 @@ func (cube *DataCube) fetchData(params ParamsPublisher) (response []byte, err er
return return
} }
//GetPublisherAdPosGeneral 获取公众号分广告位数据 // GetPublisherAdPosGeneral 获取公众号分广告位数据
func (cube *DataCube) GetPublisherAdPosGeneral(startDate, endDate string, page, pageSize int, adSlot AdSlot) (resPublisherAdPos ResPublisherAdPos, err error) { func (cube *DataCube) GetPublisherAdPosGeneral(startDate, endDate string, page, pageSize int, adSlot AdSlot) (resPublisherAdPos ResPublisherAdPos, err error) {
params := ParamsPublisher{ params := ParamsPublisher{
Action: actionPublisherAdPosGeneral, Action: actionPublisherAdPosGeneral,
@@ -217,7 +217,7 @@ func (cube *DataCube) GetPublisherAdPosGeneral(startDate, endDate string, page,
return return
} }
//GetPublisherCpsGeneral 获取公众号返佣商品数据 // GetPublisherCpsGeneral 获取公众号返佣商品数据
func (cube *DataCube) GetPublisherCpsGeneral(startDate, endDate string, page, pageSize int) (resPublisherCps ResPublisherCps, err error) { func (cube *DataCube) GetPublisherCpsGeneral(startDate, endDate string, page, pageSize int) (resPublisherCps ResPublisherCps, err error) {
params := ParamsPublisher{ params := ParamsPublisher{
Action: actionPublisherCpsGeneral, Action: actionPublisherCpsGeneral,
@@ -244,7 +244,7 @@ func (cube *DataCube) GetPublisherCpsGeneral(startDate, endDate string, page, pa
return return
} }
//GetPublisherSettlement 获取公众号结算收入数据及结算主体信息 // GetPublisherSettlement 获取公众号结算收入数据及结算主体信息
func (cube *DataCube) GetPublisherSettlement(startDate, endDate string, page, pageSize int) (resPublisherSettlement ResPublisherSettlement, err error) { func (cube *DataCube) GetPublisherSettlement(startDate, endDate string, page, pageSize int) (resPublisherSettlement ResPublisherSettlement, err error) {
params := ParamsPublisher{ params := ParamsPublisher{
Action: actionPublisherSettlement, Action: actionPublisherSettlement,

View File

@@ -11,7 +11,7 @@ const (
getUserAccumulate = "https://api.weixin.qq.com/datacube/getusercumulate" getUserAccumulate = "https://api.weixin.qq.com/datacube/getusercumulate"
) )
//ResUserSummary 获取用户增减数据响应 // ResUserSummary 获取用户增减数据响应
type ResUserSummary struct { type ResUserSummary struct {
util.CommonError util.CommonError
@@ -23,7 +23,7 @@ type ResUserSummary struct {
} `json:"list"` } `json:"list"`
} }
//ResUserAccumulate 获取累计用户数据响应 // ResUserAccumulate 获取累计用户数据响应
type ResUserAccumulate struct { type ResUserAccumulate struct {
util.CommonError util.CommonError
@@ -33,7 +33,7 @@ type ResUserAccumulate struct {
} `json:"list"` } `json:"list"`
} }
//GetUserSummary 获取用户增减数据 // GetUserSummary 获取用户增减数据
func (cube *DataCube) GetUserSummary(s string, e string) (resUserSummary ResUserSummary, err error) { func (cube *DataCube) GetUserSummary(s string, e string) (resUserSummary ResUserSummary, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {
@@ -55,7 +55,7 @@ func (cube *DataCube) GetUserSummary(s string, e string) (resUserSummary ResUser
return return
} }
//GetUserAccumulate 获取累计用户数据 // GetUserAccumulate 获取累计用户数据
func (cube *DataCube) GetUserAccumulate(s string, e string) (resUserAccumulate ResUserAccumulate, err error) { func (cube *DataCube) GetUserAccumulate(s string, e string) (resUserAccumulate ResUserAccumulate, err error) {
accessToken, err := cube.GetAccessToken() accessToken, err := cube.GetAccessToken()
if err != nil { if err != nil {

View File

@@ -1,4 +1,4 @@
//Package device 设备相关接口 // Package device 设备相关接口
package device package device
import ( import (
@@ -23,13 +23,13 @@ type reqDeviceAuthorize struct {
// 请求操作的类型限定取值为0设备授权缺省值为0 1设备更新更新已授权设备的各属性值 // 请求操作的类型限定取值为0设备授权缺省值为0 1设备更新更新已授权设备的各属性值
OpType string `json:"op_type,omitempty"` OpType string `json:"op_type,omitempty"`
// 设备的产品编号(由微信硬件平台分配)。可在公众号设备功能管理页面查询。 // 设备的产品编号(由微信硬件平台分配)。可在公众号设备功能管理页面查询。
//当 op_type 为0product_id 为1不要填写 product_id 字段(会引起不必要错误); // 当 op_type 为0product_id 为1不要填写 product_id 字段(会引起不必要错误);
//当 op_typy 为0product_id 不为1必须填写 product_id 字段; // 当 op_typy 为0product_id 不为1必须填写 product_id 字段;
//当 op_type 为 1 时,不要填写 product_id 字段。 // 当 op_type 为 1 时,不要填写 product_id 字段。
ProductID string `json:"product_id,omitempty"` ProductID string `json:"product_id,omitempty"`
} }
//ReqDevice 设备授权实体 // ReqDevice 设备授权实体
type ReqDevice struct { type ReqDevice struct {
// 设备的 device id // 设备的 device id
ID string `json:"id"` ID string `json:"id"`
@@ -45,13 +45,13 @@ type ReqDevice struct {
// 1表示设备仅支持andiod classic bluetooth 1|2表示设备支持android 和ios 两种classic bluetooth但是客户端优先选择android classic bluetooth 协议如果android classic bluetooth协议连接失败再选择ios classic bluetooth协议进行连接 // 1表示设备仅支持andiod classic bluetooth 1|2表示设备支持android 和ios 两种classic bluetooth但是客户端优先选择android classic bluetooth 协议如果android classic bluetooth协议连接失败再选择ios classic bluetooth协议进行连接
// 安卓平台不同时支持BLE和classic类型 // 安卓平台不同时支持BLE和classic类型
ConnectProtocol string `json:"connect_protocol"` ConnectProtocol string `json:"connect_protocol"`
//auth及通信的加密key第三方需要将key烧制在设备上128bit格式采用16进制串的方式长度为32字节不需要0X前缀 1234567890ABCDEF1234567890ABCDEF // auth及通信的加密key第三方需要将key烧制在设备上128bit格式采用16进制串的方式长度为32字节不需要0X前缀 1234567890ABCDEF1234567890ABCDEF
AuthKey string `json:"auth_key"` AuthKey string `json:"auth_key"`
// 断开策略,目前支持: 1退出公众号页面时即断开连接 2退出公众号之后保持连接不断开 // 断开策略,目前支持: 1退出公众号页面时即断开连接 2退出公众号之后保持连接不断开
CloseStrategy string `json:"close_strategy"` CloseStrategy string `json:"close_strategy"`
//连接策略32位整型按bit位置位目前仅第1bit和第3bit位有效bit置0为无效1为有效第2bit已被废弃且bit位可以按或置位如1|4=5各bit置位含义说明如下 // 连接策略32位整型按bit位置位目前仅第1bit和第3bit位有效bit置0为无效1为有效第2bit已被废弃且bit位可以按或置位如1|4=5各bit置位含义说明如下
//1第1bit置位在公众号对话页面不停的尝试连接设备 // 1第1bit置位在公众号对话页面不停的尝试连接设备
//4第3bit置位处于非公众号页面如主界面等微信自动连接。当用户切换微信到前台时可能尝试去连接设备连上后一定时间会断开 // 4第3bit置位处于非公众号页面如主界面等微信自动连接。当用户切换微信到前台时可能尝试去连接设备连上后一定时间会断开
ConnStrategy string `json:"conn_strategy"` ConnStrategy string `json:"conn_strategy"`
// auth version设备和微信进行auth时会根据该版本号来确认auth buf和auth key的格式各version对应的auth buf及key的具体格式可以参看“客户端蓝牙外设协议”该字段目前支持取值 // auth version设备和微信进行auth时会根据该版本号来确认auth buf和auth key的格式各version对应的auth buf及key的具体格式可以参看“客户端蓝牙外设协议”该字段目前支持取值
// 0不加密的version // 0不加密的version
@@ -69,7 +69,7 @@ type ReqDevice struct {
BleSimpleProtocol string `json:"ble_simple_protocol,omitempty"` BleSimpleProtocol string `json:"ble_simple_protocol,omitempty"`
} }
//ResBaseInfo 授权回调实体 // ResBaseInfo 授权回调实体
type ResBaseInfo struct { type ResBaseInfo struct {
BaseInfo struct { BaseInfo struct {
DeviceType string `json:"device_type"` DeviceType string `json:"device_type"`

View File

@@ -19,12 +19,12 @@ const (
uriState = "https://api.weixin.qq.com/device/get_stat" uriState = "https://api.weixin.qq.com/device/get_stat"
) )
//Device struct // Device struct
type Device struct { type Device struct {
*context.Context *context.Context
} }
//NewDevice 实例 // NewDevice 实例
func NewDevice(context *context.Context) *Device { func NewDevice(context *context.Context) *Device {
device := new(Device) device := new(Device)
device.Context = context device.Context = context

View File

@@ -1,6 +1,6 @@
package device package device
//MsgDevice 设备消息响应 // MsgDevice 设备消息响应
type MsgDevice struct { type MsgDevice struct {
DeviceType string DeviceType string
DeviceID string DeviceID string

View File

@@ -7,7 +7,7 @@ import (
"github.com/silenceper/wechat/v2/util" "github.com/silenceper/wechat/v2/util"
) )
//ResCreateQRCode 获取二维码的返回实体 // ResCreateQRCode 获取二维码的返回实体
type ResCreateQRCode struct { type ResCreateQRCode struct {
util.CommonError util.CommonError
DeviceNum int `json:"device_num"` DeviceNum int `json:"device_num"`
@@ -42,7 +42,7 @@ func (d *Device) CreateQRCode(devices []string) (res ResCreateQRCode, err error)
return return
} }
//ResVerifyQRCode 验证授权结果实体 // ResVerifyQRCode 验证授权结果实体
type ResVerifyQRCode struct { type ResVerifyQRCode struct {
util.CommonError util.CommonError
DeviceType string `json:"device_type"` DeviceType string `json:"device_type"`

View File

@@ -22,7 +22,7 @@ type Config struct {
Signature string `json:"signature"` Signature string `json:"signature"`
} }
//NewJs init // NewJs init
func NewJs(context *context.Context) *Js { func NewJs(context *context.Context) *Js {
js := new(Js) js := new(Js)
js.Context = context js.Context = context
@@ -31,13 +31,13 @@ func NewJs(context *context.Context) *Js {
return js return js
} }
//SetJsTicketHandle 自定义js ticket取值方式 // SetJsTicketHandle 自定义js ticket取值方式
func (js *Js) SetJsTicketHandle(ticketHandle credential.JsTicketHandle) { func (js *Js) SetJsTicketHandle(ticketHandle credential.JsTicketHandle) {
js.JsTicketHandle = ticketHandle js.JsTicketHandle = ticketHandle
} }
//GetConfig 获取jssdk需要的配置参数 // GetConfig 获取jssdk需要的配置参数
//uri 为当前网页地址 // uri 为当前网页地址
func (js *Js) GetConfig(uri string) (config *Config, err error) { func (js *Js) GetConfig(uri string) (config *Config, err error) {
config = new(Config) config = new(Config)
var accessToken string var accessToken string

View File

@@ -19,33 +19,33 @@ const (
batchGetMaterialURL = "https://api.weixin.qq.com/cgi-bin/material/batchget_material" batchGetMaterialURL = "https://api.weixin.qq.com/cgi-bin/material/batchget_material"
) )
//PermanentMaterialType 永久素材类型 // PermanentMaterialType 永久素材类型
type PermanentMaterialType string type PermanentMaterialType string
const ( const (
//PermanentMaterialTypeImage 永久素材图片类型image // PermanentMaterialTypeImage 永久素材图片类型image
PermanentMaterialTypeImage PermanentMaterialType = "image" PermanentMaterialTypeImage PermanentMaterialType = "image"
//PermanentMaterialTypeVideo 永久素材视频类型video // PermanentMaterialTypeVideo 永久素材视频类型video
PermanentMaterialTypeVideo PermanentMaterialType = "video" PermanentMaterialTypeVideo PermanentMaterialType = "video"
//PermanentMaterialTypeVoice 永久素材语音类型 voice // PermanentMaterialTypeVoice 永久素材语音类型 voice
PermanentMaterialTypeVoice PermanentMaterialType = "voice" PermanentMaterialTypeVoice PermanentMaterialType = "voice"
//PermanentMaterialTypeNews 永久素材图文类型news // PermanentMaterialTypeNews 永久素材图文类型news
PermanentMaterialTypeNews PermanentMaterialType = "news" PermanentMaterialTypeNews PermanentMaterialType = "news"
) )
//Material 素材管理 // Material 素材管理
type Material struct { type Material struct {
*context.Context *context.Context
} }
//NewMaterial init // NewMaterial init
func NewMaterial(context *context.Context) *Material { func NewMaterial(context *context.Context) *Material {
material := new(Material) material := new(Material)
material.Context = context material.Context = context
return material return material
} }
//Article 永久图文素材 // Article 永久图文素材
type Article struct { type Article struct {
Title string `json:"title"` Title string `json:"title"`
ThumbMediaID string `json:"thumb_media_id"` ThumbMediaID string `json:"thumb_media_id"`
@@ -87,19 +87,19 @@ func (material *Material) GetNews(id string) ([]*Article, error) {
return res.NewsItem, nil return res.NewsItem, nil
} }
//reqArticles 永久性图文素材请求信息 // reqArticles 永久性图文素材请求信息
type reqArticles struct { type reqArticles struct {
Articles []*Article `json:"articles"` Articles []*Article `json:"articles"`
} }
//resArticles 永久性图文素材返回结果 // resArticles 永久性图文素材返回结果
type resArticles struct { type resArticles struct {
util.CommonError util.CommonError
MediaID string `json:"media_id"` MediaID string `json:"media_id"`
} }
//AddNews 新增永久图文素材 // AddNews 新增永久图文素材
func (material *Material) AddNews(articles []*Article) (mediaID string, err error) { func (material *Material) AddNews(articles []*Article) (mediaID string, err error) {
req := &reqArticles{articles} req := &reqArticles{articles}
@@ -126,7 +126,7 @@ func (material *Material) AddNews(articles []*Article) (mediaID string, err erro
return return
} }
//reqUpdateArticle 更新永久性图文素材请求信息 // reqUpdateArticle 更新永久性图文素材请求信息
type reqUpdateArticle struct { type reqUpdateArticle struct {
MediaID string `json:"media_id"` MediaID string `json:"media_id"`
Index int64 `json:"index"` Index int64 `json:"index"`
@@ -152,7 +152,7 @@ func (material *Material) UpdateNews(article *Article, mediaID string, index int
return util.DecodeWithCommonError(response, "UpdateNews") return util.DecodeWithCommonError(response, "UpdateNews")
} }
//resAddMaterial 永久性素材上传返回的结果 // resAddMaterial 永久性素材上传返回的结果
type resAddMaterial struct { type resAddMaterial struct {
util.CommonError util.CommonError
@@ -160,7 +160,7 @@ type resAddMaterial struct {
URL string `json:"url"` URL string `json:"url"`
} }
//AddMaterial 上传永久性素材(处理视频需要单独上传) // AddMaterial 上传永久性素材(处理视频需要单独上传)
func (material *Material) AddMaterial(mediaType MediaType, filename string) (mediaID string, url string, err error) { func (material *Material) AddMaterial(mediaType MediaType, filename string) (mediaID string, url string, err error) {
if mediaType == MediaTypeVideo { if mediaType == MediaTypeVideo {
err = errors.New("永久视频素材上传使用 AddVideo 方法") err = errors.New("永久视频素材上传使用 AddVideo 方法")
@@ -197,7 +197,7 @@ type reqVideo struct {
Introduction string `json:"introduction"` Introduction string `json:"introduction"`
} }
//AddVideo 永久视频素材文件上传 // AddVideo 永久视频素材文件上传
func (material *Material) AddVideo(filename, title, introduction string) (mediaID string, url string, err error) { func (material *Material) AddVideo(filename, title, introduction string) (mediaID string, url string, err error) {
var accessToken string var accessToken string
accessToken, err = material.GetAccessToken() accessToken, err = material.GetAccessToken()
@@ -254,7 +254,7 @@ type reqDeleteMaterial struct {
MediaID string `json:"media_id"` MediaID string `json:"media_id"`
} }
//DeleteMaterial 删除永久素材 // DeleteMaterial 删除永久素材
func (material *Material) DeleteMaterial(mediaID string) error { func (material *Material) DeleteMaterial(mediaID string) error {
accessToken, err := material.GetAccessToken() accessToken, err := material.GetAccessToken()
if err != nil { if err != nil {
@@ -270,7 +270,7 @@ func (material *Material) DeleteMaterial(mediaID string) error {
return util.DecodeWithCommonError(response, "DeleteMaterial") return util.DecodeWithCommonError(response, "DeleteMaterial")
} }
//ArticleList 永久素材列表 // ArticleList 永久素材列表
type ArticleList struct { type ArticleList struct {
util.CommonError util.CommonError
TotalCount int64 `json:"total_count"` TotalCount int64 `json:"total_count"`
@@ -278,7 +278,7 @@ type ArticleList struct {
Item []ArticleListItem `json:"item"` Item []ArticleListItem `json:"item"`
} }
//ArticleListItem 用于ArticleList的item节点 // ArticleListItem 用于ArticleList的item节点
type ArticleListItem struct { type ArticleListItem struct {
MediaID string `json:"media_id"` MediaID string `json:"media_id"`
Content ArticleListContent `json:"content"` Content ArticleListContent `json:"content"`
@@ -287,14 +287,14 @@ type ArticleListItem struct {
UpdateTime int64 `json:"update_time"` UpdateTime int64 `json:"update_time"`
} }
//ArticleListContent 用于ArticleListItem的content节点 // ArticleListContent 用于ArticleListItem的content节点
type ArticleListContent struct { type ArticleListContent struct {
NewsItem []Article `json:"news_item"` NewsItem []Article `json:"news_item"`
UpdateTime int64 `json:"update_time"` UpdateTime int64 `json:"update_time"`
CreateTime int64 `json:"create_time"` CreateTime int64 `json:"create_time"`
} }
//reqBatchGetMaterial BatchGetMaterial请求参数 // reqBatchGetMaterial BatchGetMaterial请求参数
type reqBatchGetMaterial struct { type reqBatchGetMaterial struct {
Type PermanentMaterialType `json:"type"` Type PermanentMaterialType `json:"type"`
Count int64 `json:"count"` Count int64 `json:"count"`

View File

@@ -7,17 +7,17 @@ import (
"github.com/silenceper/wechat/v2/util" "github.com/silenceper/wechat/v2/util"
) )
//MediaType 媒体文件类型 // MediaType 媒体文件类型
type MediaType string type MediaType string
const ( const (
//MediaTypeImage 媒体文件:图片 // MediaTypeImage 媒体文件:图片
MediaTypeImage MediaType = "image" MediaTypeImage MediaType = "image"
//MediaTypeVoice 媒体文件:声音 // MediaTypeVoice 媒体文件:声音
MediaTypeVoice MediaType = "voice" MediaTypeVoice MediaType = "voice"
//MediaTypeVideo 媒体文件:视频 // MediaTypeVideo 媒体文件:视频
MediaTypeVideo MediaType = "video" MediaTypeVideo MediaType = "video"
//MediaTypeThumb 媒体文件:缩略图 // MediaTypeThumb 媒体文件:缩略图
MediaTypeThumb MediaType = "thumb" MediaTypeThumb MediaType = "thumb"
) )
@@ -27,7 +27,7 @@ const (
mediaGetURL = "https://api.weixin.qq.com/cgi-bin/media/get" mediaGetURL = "https://api.weixin.qq.com/cgi-bin/media/get"
) )
//Media 临时素材上传返回信息 // Media 临时素材上传返回信息
type Media struct { type Media struct {
util.CommonError util.CommonError
@@ -37,7 +37,7 @@ type Media struct {
CreatedAt int64 `json:"created_at"` CreatedAt int64 `json:"created_at"`
} }
//MediaUpload 临时素材上传 // MediaUpload 临时素材上传
func (material *Material) MediaUpload(mediaType MediaType, filename string) (media Media, err error) { func (material *Material) MediaUpload(mediaType MediaType, filename string) (media Media, err error) {
var accessToken string var accessToken string
accessToken, err = material.GetAccessToken() accessToken, err = material.GetAccessToken()
@@ -62,8 +62,8 @@ func (material *Material) MediaUpload(mediaType MediaType, filename string) (med
return return
} }
//GetMediaURL 返回临时素材的下载地址供用户自己处理 // GetMediaURL 返回临时素材的下载地址供用户自己处理
//NOTICE: URL 不可公开因为含access_token 需要立即另存文件 // NOTICE: URL 不可公开因为含access_token 需要立即另存文件
func (material *Material) GetMediaURL(mediaID string) (mediaURL string, err error) { func (material *Material) GetMediaURL(mediaID string) (mediaURL string, err error) {
var accessToken string var accessToken string
accessToken, err = material.GetAccessToken() accessToken, err = material.GetAccessToken()
@@ -74,14 +74,14 @@ func (material *Material) GetMediaURL(mediaID string) (mediaURL string, err erro
return return
} }
//resMediaImage 图片上传返回结果 // resMediaImage 图片上传返回结果
type resMediaImage struct { type resMediaImage struct {
util.CommonError util.CommonError
URL string `json:"url"` URL string `json:"url"`
} }
//ImageUpload 图片上传 // ImageUpload 图片上传
func (material *Material) ImageUpload(filename string) (url string, err error) { func (material *Material) ImageUpload(filename string) (url string, err error) {
var accessToken string var accessToken string
accessToken, err = material.GetAccessToken() accessToken, err = material.GetAccessToken()

View File

@@ -1,6 +1,6 @@
package menu package menu
//Button 菜单按钮 // Button 菜单按钮
type Button struct { type Button struct {
Type string `json:"type,omitempty"` Type string `json:"type,omitempty"`
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
@@ -12,7 +12,7 @@ type Button struct {
SubButtons []*Button `json:"sub_button,omitempty"` SubButtons []*Button `json:"sub_button,omitempty"`
} }
//SetSubButton 设置二级菜单 // SetSubButton 设置二级菜单
func (btn *Button) SetSubButton(name string, subButtons []*Button) *Button { func (btn *Button) SetSubButton(name string, subButtons []*Button) *Button {
btn.Name = name btn.Name = name
btn.SubButtons = subButtons btn.SubButtons = subButtons
@@ -23,7 +23,7 @@ func (btn *Button) SetSubButton(name string, subButtons []*Button) *Button {
return btn return btn
} }
//SetClickButton btn 为click类型 // SetClickButton btn 为click类型
func (btn *Button) SetClickButton(name, key string) *Button { func (btn *Button) SetClickButton(name, key string) *Button {
btn.Type = "click" btn.Type = "click"
btn.Name = name btn.Name = name
@@ -34,7 +34,7 @@ func (btn *Button) SetClickButton(name, key string) *Button {
return btn return btn
} }
//SetViewButton view类型 // SetViewButton view类型
func (btn *Button) SetViewButton(name, url string) *Button { func (btn *Button) SetViewButton(name, url string) *Button {
btn.Type = "view" btn.Type = "view"
btn.Name = name btn.Name = name
@@ -45,7 +45,7 @@ func (btn *Button) SetViewButton(name, url string) *Button {
return btn return btn
} }
//SetScanCodePushButton 扫码推事件 // SetScanCodePushButton 扫码推事件
func (btn *Button) SetScanCodePushButton(name, key string) *Button { func (btn *Button) SetScanCodePushButton(name, key string) *Button {
btn.Type = "scancode_push" btn.Type = "scancode_push"
btn.Name = name btn.Name = name
@@ -56,7 +56,7 @@ func (btn *Button) SetScanCodePushButton(name, key string) *Button {
return btn return btn
} }
//SetScanCodeWaitMsgButton 设置 扫码推事件且弹出"消息接收中"提示框 // SetScanCodeWaitMsgButton 设置 扫码推事件且弹出"消息接收中"提示框
func (btn *Button) SetScanCodeWaitMsgButton(name, key string) *Button { func (btn *Button) SetScanCodeWaitMsgButton(name, key string) *Button {
btn.Type = "scancode_waitmsg" btn.Type = "scancode_waitmsg"
btn.Name = name btn.Name = name
@@ -68,7 +68,7 @@ func (btn *Button) SetScanCodeWaitMsgButton(name, key string) *Button {
return btn return btn
} }
//SetPicSysPhotoButton 设置弹出系统拍照发图按钮 // SetPicSysPhotoButton 设置弹出系统拍照发图按钮
func (btn *Button) SetPicSysPhotoButton(name, key string) *Button { func (btn *Button) SetPicSysPhotoButton(name, key string) *Button {
btn.Type = "pic_sysphoto" btn.Type = "pic_sysphoto"
btn.Name = name btn.Name = name
@@ -80,7 +80,7 @@ func (btn *Button) SetPicSysPhotoButton(name, key string) *Button {
return btn return btn
} }
//SetPicPhotoOrAlbumButton 设置弹出拍照或者相册发图类型按钮 // SetPicPhotoOrAlbumButton 设置弹出拍照或者相册发图类型按钮
func (btn *Button) SetPicPhotoOrAlbumButton(name, key string) *Button { func (btn *Button) SetPicPhotoOrAlbumButton(name, key string) *Button {
btn.Type = "pic_photo_or_album" btn.Type = "pic_photo_or_album"
btn.Name = name btn.Name = name
@@ -92,7 +92,7 @@ func (btn *Button) SetPicPhotoOrAlbumButton(name, key string) *Button {
return btn return btn
} }
//SetPicWeixinButton 设置弹出微信相册发图器类型按钮 // SetPicWeixinButton 设置弹出微信相册发图器类型按钮
func (btn *Button) SetPicWeixinButton(name, key string) *Button { func (btn *Button) SetPicWeixinButton(name, key string) *Button {
btn.Type = "pic_weixin" btn.Type = "pic_weixin"
btn.Name = name btn.Name = name
@@ -104,7 +104,7 @@ func (btn *Button) SetPicWeixinButton(name, key string) *Button {
return btn return btn
} }
//SetLocationSelectButton 设置 弹出地理位置选择器 类型按钮 // SetLocationSelectButton 设置 弹出地理位置选择器 类型按钮
func (btn *Button) SetLocationSelectButton(name, key string) *Button { func (btn *Button) SetLocationSelectButton(name, key string) *Button {
btn.Type = "location_select" btn.Type = "location_select"
btn.Name = name btn.Name = name
@@ -116,7 +116,7 @@ func (btn *Button) SetLocationSelectButton(name, key string) *Button {
return btn return btn
} }
//SetMediaIDButton 设置 下发消息(除文本消息) 类型按钮 // SetMediaIDButton 设置 下发消息(除文本消息) 类型按钮
func (btn *Button) SetMediaIDButton(name, mediaID string) *Button { func (btn *Button) SetMediaIDButton(name, mediaID string) *Button {
btn.Type = "media_id" btn.Type = "media_id"
btn.Name = name btn.Name = name
@@ -128,7 +128,7 @@ func (btn *Button) SetMediaIDButton(name, mediaID string) *Button {
return btn return btn
} }
//SetViewLimitedButton 设置 跳转图文消息URL 类型按钮 // SetViewLimitedButton 设置 跳转图文消息URL 类型按钮
func (btn *Button) SetViewLimitedButton(name, mediaID string) *Button { func (btn *Button) SetViewLimitedButton(name, mediaID string) *Button {
btn.Type = "view_limited" btn.Type = "view_limited"
btn.Name = name btn.Name = name
@@ -140,7 +140,7 @@ func (btn *Button) SetViewLimitedButton(name, mediaID string) *Button {
return btn return btn
} }
//SetMiniprogramButton 设置 跳转小程序 类型按钮 (公众号后台必须已经关联小程序) // SetMiniprogramButton 设置 跳转小程序 类型按钮 (公众号后台必须已经关联小程序)
func (btn *Button) SetMiniprogramButton(name, url, appID, pagePath string) *Button { func (btn *Button) SetMiniprogramButton(name, url, appID, pagePath string) *Button {
btn.Type = "miniprogram" btn.Type = "miniprogram"
btn.Name = name btn.Name = name
@@ -154,62 +154,62 @@ func (btn *Button) SetMiniprogramButton(name, url, appID, pagePath string) *Butt
return btn return btn
} }
//NewSubButton 二级菜单 // NewSubButton 二级菜单
func NewSubButton(name string, subButtons []*Button) *Button { func NewSubButton(name string, subButtons []*Button) *Button {
return (&Button{}).SetSubButton(name, subButtons) return (&Button{}).SetSubButton(name, subButtons)
} }
//NewClickButton btn 为click类型 // NewClickButton btn 为click类型
func NewClickButton(name, key string) *Button { func NewClickButton(name, key string) *Button {
return (&Button{}).SetClickButton(name, key) return (&Button{}).SetClickButton(name, key)
} }
//NewViewButton view类型 // NewViewButton view类型
func NewViewButton(name, url string) *Button { func NewViewButton(name, url string) *Button {
return (&Button{}).SetViewButton(name, url) return (&Button{}).SetViewButton(name, url)
} }
//NewScanCodePushButton 扫码推事件 // NewScanCodePushButton 扫码推事件
func NewScanCodePushButton(name, key string) *Button { func NewScanCodePushButton(name, key string) *Button {
return (&Button{}).SetScanCodePushButton(name, key) return (&Button{}).SetScanCodePushButton(name, key)
} }
//NewScanCodeWaitMsgButton 扫码推事件且弹出"消息接收中"提示框 // NewScanCodeWaitMsgButton 扫码推事件且弹出"消息接收中"提示框
func NewScanCodeWaitMsgButton(name, key string) *Button { func NewScanCodeWaitMsgButton(name, key string) *Button {
return (&Button{}).SetScanCodeWaitMsgButton(name, key) return (&Button{}).SetScanCodeWaitMsgButton(name, key)
} }
//NewPicSysPhotoButton 弹出系统拍照发图按钮 // NewPicSysPhotoButton 弹出系统拍照发图按钮
func NewPicSysPhotoButton(name, key string) *Button { func NewPicSysPhotoButton(name, key string) *Button {
return (&Button{}).SetPicSysPhotoButton(name, key) return (&Button{}).SetPicSysPhotoButton(name, key)
} }
//NewPicPhotoOrAlbumButton 弹出拍照或者相册发图类型按钮 // NewPicPhotoOrAlbumButton 弹出拍照或者相册发图类型按钮
func NewPicPhotoOrAlbumButton(name, key string) *Button { func NewPicPhotoOrAlbumButton(name, key string) *Button {
return (&Button{}).SetPicPhotoOrAlbumButton(name, key) return (&Button{}).SetPicPhotoOrAlbumButton(name, key)
} }
//NewPicWeixinButton 弹出微信相册发图器类型按钮 // NewPicWeixinButton 弹出微信相册发图器类型按钮
func NewPicWeixinButton(name, key string) *Button { func NewPicWeixinButton(name, key string) *Button {
return (&Button{}).SetPicWeixinButton(name, key) return (&Button{}).SetPicWeixinButton(name, key)
} }
//NewLocationSelectButton 弹出地理位置选择器 类型按钮 // NewLocationSelectButton 弹出地理位置选择器 类型按钮
func NewLocationSelectButton(name, key string) *Button { func NewLocationSelectButton(name, key string) *Button {
return (&Button{}).SetLocationSelectButton(name, key) return (&Button{}).SetLocationSelectButton(name, key)
} }
//NewMediaIDButton 下发消息(除文本消息) 类型按钮 // NewMediaIDButton 下发消息(除文本消息) 类型按钮
func NewMediaIDButton(name, mediaID string) *Button { func NewMediaIDButton(name, mediaID string) *Button {
return (&Button{}).SetMediaIDButton(name, mediaID) return (&Button{}).SetMediaIDButton(name, mediaID)
} }
//NewViewLimitedButton 跳转图文消息URL 类型按钮 // NewViewLimitedButton 跳转图文消息URL 类型按钮
func NewViewLimitedButton(name, mediaID string) *Button { func NewViewLimitedButton(name, mediaID string) *Button {
return (&Button{}).SetViewLimitedButton(name, mediaID) return (&Button{}).SetViewLimitedButton(name, mediaID)
} }
//NewMiniprogramButton 跳转小程序 类型按钮 (公众号后台必须已经关联小程序) // NewMiniprogramButton 跳转小程序 类型按钮 (公众号后台必须已经关联小程序)
func NewMiniprogramButton(name, url, appID, pagePath string) *Button { func NewMiniprogramButton(name, url, appID, pagePath string) *Button {
return (&Button{}).SetMiniprogramButton(name, url, appID, pagePath) return (&Button{}).SetMiniprogramButton(name, url, appID, pagePath)
} }

View File

@@ -18,42 +18,42 @@ const (
menuSelfMenuInfoURL = "https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info" menuSelfMenuInfoURL = "https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info"
) )
//Menu struct // Menu struct
type Menu struct { type Menu struct {
*context.Context *context.Context
} }
//reqMenu 设置菜单请求数据 // reqMenu 设置菜单请求数据
type reqMenu struct { type reqMenu struct {
Button []*Button `json:"button,omitempty"` Button []*Button `json:"button,omitempty"`
MatchRule *MatchRule `json:"matchrule,omitempty"` MatchRule *MatchRule `json:"matchrule,omitempty"`
} }
//reqDeleteConditional 删除个性化菜单请求数据 // reqDeleteConditional 删除个性化菜单请求数据
type reqDeleteConditional struct { type reqDeleteConditional struct {
MenuID int64 `json:"menuid"` MenuID int64 `json:"menuid"`
} }
//reqMenuTryMatch 菜单匹配请求 // reqMenuTryMatch 菜单匹配请求
type reqMenuTryMatch struct { type reqMenuTryMatch struct {
UserID string `json:"user_id"` UserID string `json:"user_id"`
} }
//resConditionalMenu 个性化菜单返回结果 // resConditionalMenu 个性化菜单返回结果
type resConditionalMenu struct { type resConditionalMenu struct {
Button []Button `json:"button"` Button []Button `json:"button"`
MatchRule MatchRule `json:"matchrule"` MatchRule MatchRule `json:"matchrule"`
MenuID int64 `json:"menuid"` MenuID int64 `json:"menuid"`
} }
//resMenuTryMatch 菜单匹配请求结果 // resMenuTryMatch 菜单匹配请求结果
type resMenuTryMatch struct { type resMenuTryMatch struct {
util.CommonError util.CommonError
Button []Button `json:"button"` Button []Button `json:"button"`
} }
//ResMenu 查询菜单的返回数据 // ResMenu 查询菜单的返回数据
type ResMenu struct { type ResMenu struct {
util.CommonError util.CommonError
@@ -64,7 +64,7 @@ type ResMenu struct {
Conditionalmenu []resConditionalMenu `json:"conditionalmenu"` Conditionalmenu []resConditionalMenu `json:"conditionalmenu"`
} }
//ResSelfMenuInfo 自定义菜单配置返回结果 // ResSelfMenuInfo 自定义菜单配置返回结果
type ResSelfMenuInfo struct { type ResSelfMenuInfo struct {
util.CommonError util.CommonError
@@ -74,7 +74,7 @@ type ResSelfMenuInfo struct {
} `json:"selfmenu_info"` } `json:"selfmenu_info"`
} }
//SelfMenuButton 自定义菜单配置详情 // SelfMenuButton 自定义菜单配置详情
type SelfMenuButton struct { type SelfMenuButton struct {
Type string `json:"type"` Type string `json:"type"`
Name string `json:"name"` Name string `json:"name"`
@@ -89,7 +89,7 @@ type SelfMenuButton struct {
} `json:"news_info,omitempty"` } `json:"news_info,omitempty"`
} }
//ButtonNew 图文消息菜单 // ButtonNew 图文消息菜单
type ButtonNew struct { type ButtonNew struct {
Title string `json:"title"` Title string `json:"title"`
Author string `json:"author"` Author string `json:"author"`
@@ -100,7 +100,7 @@ type ButtonNew struct {
SourceURL string `json:"source_url"` SourceURL string `json:"source_url"`
} }
//MatchRule 个性化菜单规则 // MatchRule 个性化菜单规则
type MatchRule struct { type MatchRule struct {
GroupID string `json:"group_id,omitempty"` GroupID string `json:"group_id,omitempty"`
Sex string `json:"sex,omitempty"` Sex string `json:"sex,omitempty"`
@@ -111,14 +111,14 @@ type MatchRule struct {
Language string `json:"language,omitempty"` Language string `json:"language,omitempty"`
} }
//NewMenu 实例 // NewMenu 实例
func NewMenu(context *context.Context) *Menu { func NewMenu(context *context.Context) *Menu {
menu := new(Menu) menu := new(Menu)
menu.Context = context menu.Context = context
return menu return menu
} }
//SetMenu 设置按钮 // SetMenu 设置按钮
func (menu *Menu) SetMenu(buttons []*Button) error { func (menu *Menu) SetMenu(buttons []*Button) error {
accessToken, err := menu.GetAccessToken() accessToken, err := menu.GetAccessToken()
if err != nil { if err != nil {
@@ -138,7 +138,7 @@ func (menu *Menu) SetMenu(buttons []*Button) error {
return util.DecodeWithCommonError(response, "SetMenu") return util.DecodeWithCommonError(response, "SetMenu")
} }
//SetMenuByJSON 设置按钮 // SetMenuByJSON 设置按钮
func (menu *Menu) SetMenuByJSON(jsonInfo string) error { func (menu *Menu) SetMenuByJSON(jsonInfo string) error {
accessToken, err := menu.GetAccessToken() accessToken, err := menu.GetAccessToken()
if err != nil { if err != nil {
@@ -155,7 +155,7 @@ func (menu *Menu) SetMenuByJSON(jsonInfo string) error {
return util.DecodeWithCommonError(response, "SetMenuByJSON") return util.DecodeWithCommonError(response, "SetMenuByJSON")
} }
//GetMenu 获取菜单配置 // GetMenu 获取菜单配置
func (menu *Menu) GetMenu() (resMenu ResMenu, err error) { func (menu *Menu) GetMenu() (resMenu ResMenu, err error) {
var accessToken string var accessToken string
accessToken, err = menu.GetAccessToken() accessToken, err = menu.GetAccessToken()
@@ -179,7 +179,7 @@ func (menu *Menu) GetMenu() (resMenu ResMenu, err error) {
return return
} }
//DeleteMenu 删除菜单 // DeleteMenu 删除菜单
func (menu *Menu) DeleteMenu() error { func (menu *Menu) DeleteMenu() error {
accessToken, err := menu.GetAccessToken() accessToken, err := menu.GetAccessToken()
if err != nil { if err != nil {
@@ -194,7 +194,7 @@ func (menu *Menu) DeleteMenu() error {
return util.DecodeWithCommonError(response, "GetMenu") return util.DecodeWithCommonError(response, "GetMenu")
} }
//AddConditional 添加个性化菜单 // AddConditional 添加个性化菜单
func (menu *Menu) AddConditional(buttons []*Button, matchRule *MatchRule) error { func (menu *Menu) AddConditional(buttons []*Button, matchRule *MatchRule) error {
accessToken, err := menu.GetAccessToken() accessToken, err := menu.GetAccessToken()
if err != nil { if err != nil {
@@ -215,7 +215,7 @@ func (menu *Menu) AddConditional(buttons []*Button, matchRule *MatchRule) error
return util.DecodeWithCommonError(response, "AddConditional") return util.DecodeWithCommonError(response, "AddConditional")
} }
//AddConditionalByJSON 添加个性化菜单 // AddConditionalByJSON 添加个性化菜单
func (menu *Menu) AddConditionalByJSON(jsonInfo string) error { func (menu *Menu) AddConditionalByJSON(jsonInfo string) error {
accessToken, err := menu.GetAccessToken() accessToken, err := menu.GetAccessToken()
if err != nil { if err != nil {
@@ -231,7 +231,7 @@ func (menu *Menu) AddConditionalByJSON(jsonInfo string) error {
return util.DecodeWithCommonError(response, "AddConditional") return util.DecodeWithCommonError(response, "AddConditional")
} }
//DeleteConditional 删除个性化菜单 // DeleteConditional 删除个性化菜单
func (menu *Menu) DeleteConditional(menuID int64) error { func (menu *Menu) DeleteConditional(menuID int64) error {
accessToken, err := menu.GetAccessToken() accessToken, err := menu.GetAccessToken()
if err != nil { if err != nil {
@@ -251,7 +251,7 @@ func (menu *Menu) DeleteConditional(menuID int64) error {
return util.DecodeWithCommonError(response, "DeleteConditional") return util.DecodeWithCommonError(response, "DeleteConditional")
} }
//MenuTryMatch 菜单匹配 // MenuTryMatch 菜单匹配
func (menu *Menu) MenuTryMatch(userID string) (buttons []Button, err error) { func (menu *Menu) MenuTryMatch(userID string) (buttons []Button, err error) {
var accessToken string var accessToken string
accessToken, err = menu.GetAccessToken() accessToken, err = menu.GetAccessToken()
@@ -278,7 +278,7 @@ func (menu *Menu) MenuTryMatch(userID string) (buttons []Button, err error) {
return return
} }
//GetCurrentSelfMenuInfo 获取自定义菜单配置接口 // GetCurrentSelfMenuInfo 获取自定义菜单配置接口
func (menu *Menu) GetCurrentSelfMenuInfo() (resSelfMenuInfo ResSelfMenuInfo, err error) { func (menu *Menu) GetCurrentSelfMenuInfo() (resSelfMenuInfo ResSelfMenuInfo, err error) {
var accessToken string var accessToken string
accessToken, err = menu.GetAccessToken() accessToken, err = menu.GetAccessToken()

View File

@@ -12,35 +12,35 @@ const (
customerSendMessage = "https://api.weixin.qq.com/cgi-bin/message/custom/send" customerSendMessage = "https://api.weixin.qq.com/cgi-bin/message/custom/send"
) )
//Manager 消息管理者,可以发送消息 // Manager 消息管理者,可以发送消息
type Manager struct { type Manager struct {
*context.Context *context.Context
} }
//NewMessageManager 实例化消息管理者 // NewMessageManager 实例化消息管理者
func NewMessageManager(context *context.Context) *Manager { func NewMessageManager(context *context.Context) *Manager {
return &Manager{ return &Manager{
context, context,
} }
} }
//CustomerMessage 客服消息 // CustomerMessage 客服消息
type CustomerMessage struct { type CustomerMessage struct {
ToUser string `json:"touser"` //接受者OpenID ToUser string `json:"touser"` // 接受者OpenID
Msgtype MsgType `json:"msgtype"` //客服消息类型 Msgtype MsgType `json:"msgtype"` // 客服消息类型
Text *MediaText `json:"text,omitempty"` //可选 Text *MediaText `json:"text,omitempty"` // 可选
Image *MediaResource `json:"image,omitempty"` //可选 Image *MediaResource `json:"image,omitempty"` // 可选
Voice *MediaResource `json:"voice,omitempty"` //可选 Voice *MediaResource `json:"voice,omitempty"` // 可选
Video *MediaVideo `json:"video,omitempty"` //可选 Video *MediaVideo `json:"video,omitempty"` // 可选
Music *MediaMusic `json:"music,omitempty"` //可选 Music *MediaMusic `json:"music,omitempty"` // 可选
News *MediaNews `json:"news,omitempty"` //可选 News *MediaNews `json:"news,omitempty"` // 可选
Mpnews *MediaResource `json:"mpnews,omitempty"` //可选 Mpnews *MediaResource `json:"mpnews,omitempty"` // 可选
Wxcard *MediaWxcard `json:"wxcard,omitempty"` //可选 Wxcard *MediaWxcard `json:"wxcard,omitempty"` // 可选
Msgmenu *MediaMsgmenu `json:"msgmenu,omitempty"` //可选 Msgmenu *MediaMsgmenu `json:"msgmenu,omitempty"` // 可选
Miniprogrampage *MediaMiniprogrampage `json:"miniprogrampage,omitempty"` //可选 Miniprogrampage *MediaMiniprogrampage `json:"miniprogrampage,omitempty"` // 可选
} }
//NewCustomerTextMessage 文本消息结构体构造方法 // NewCustomerTextMessage 文本消息结构体构造方法
func NewCustomerTextMessage(toUser, text string) *CustomerMessage { func NewCustomerTextMessage(toUser, text string) *CustomerMessage {
return &CustomerMessage{ return &CustomerMessage{
ToUser: toUser, ToUser: toUser,
@@ -51,7 +51,7 @@ func NewCustomerTextMessage(toUser, text string) *CustomerMessage {
} }
} }
//NewCustomerImgMessage 图片消息的构造方法 // NewCustomerImgMessage 图片消息的构造方法
func NewCustomerImgMessage(toUser, mediaID string) *CustomerMessage { func NewCustomerImgMessage(toUser, mediaID string) *CustomerMessage {
return &CustomerMessage{ return &CustomerMessage{
ToUser: toUser, ToUser: toUser,
@@ -62,7 +62,7 @@ func NewCustomerImgMessage(toUser, mediaID string) *CustomerMessage {
} }
} }
//NewCustomerVoiceMessage 语音消息的构造方法 // NewCustomerVoiceMessage 语音消息的构造方法
func NewCustomerVoiceMessage(toUser, mediaID string) *CustomerMessage { func NewCustomerVoiceMessage(toUser, mediaID string) *CustomerMessage {
return &CustomerMessage{ return &CustomerMessage{
ToUser: toUser, ToUser: toUser,
@@ -73,7 +73,7 @@ func NewCustomerVoiceMessage(toUser, mediaID string) *CustomerMessage {
} }
} }
//NewCustomerMiniprogrampageMessage 小程序卡片消息的构造方法 // NewCustomerMiniprogrampageMessage 小程序卡片消息的构造方法
func NewCustomerMiniprogrampageMessage(toUser, title, appID, pagePath, thumbMediaID string) *CustomerMessage { func NewCustomerMiniprogrampageMessage(toUser, title, appID, pagePath, thumbMediaID string) *CustomerMessage {
return &CustomerMessage{ return &CustomerMessage{
ToUser: toUser, ToUser: toUser,
@@ -87,17 +87,17 @@ func NewCustomerMiniprogrampageMessage(toUser, title, appID, pagePath, thumbMedi
} }
} }
//MediaText 文本消息的文字 // MediaText 文本消息的文字
type MediaText struct { type MediaText struct {
Content string `json:"content"` Content string `json:"content"`
} }
//MediaResource 消息使用的永久素材id // MediaResource 消息使用的永久素材id
type MediaResource struct { type MediaResource struct {
MediaID string `json:"media_id"` MediaID string `json:"media_id"`
} }
//MediaVideo 视频消息包含的内容 // MediaVideo 视频消息包含的内容
type MediaVideo struct { type MediaVideo struct {
MediaID string `json:"media_id"` MediaID string `json:"media_id"`
ThumbMediaID string `json:"thumb_media_id"` ThumbMediaID string `json:"thumb_media_id"`
@@ -105,7 +105,7 @@ type MediaVideo struct {
Description string `json:"description"` Description string `json:"description"`
} }
//MediaMusic 音乐消息包括的内容 // MediaMusic 音乐消息包括的内容
type MediaMusic struct { type MediaMusic struct {
Title string `json:"title"` Title string `json:"title"`
Description string `json:"description"` Description string `json:"description"`
@@ -114,12 +114,12 @@ type MediaMusic struct {
ThumbMediaID string `json:"thumb_media_id"` ThumbMediaID string `json:"thumb_media_id"`
} }
//MediaNews 图文消息的内容 // MediaNews 图文消息的内容
type MediaNews struct { type MediaNews struct {
Articles []MediaArticles `json:"articles"` Articles []MediaArticles `json:"articles"`
} }
//MediaArticles 图文消息的内容的文章列表中的单独一条 // MediaArticles 图文消息的内容的文章列表中的单独一条
type MediaArticles struct { type MediaArticles struct {
Title string `json:"title"` Title string `json:"title"`
Description string `json:"description"` Description string `json:"description"`
@@ -127,25 +127,25 @@ type MediaArticles struct {
Picurl string `json:"picurl"` Picurl string `json:"picurl"`
} }
//MediaMsgmenu 菜单消息的内容 // MediaMsgmenu 菜单消息的内容
type MediaMsgmenu struct { type MediaMsgmenu struct {
HeadContent string `json:"head_content"` HeadContent string `json:"head_content"`
List []MsgmenuItem `json:"list"` List []MsgmenuItem `json:"list"`
TailContent string `json:"tail_content"` TailContent string `json:"tail_content"`
} }
//MsgmenuItem 菜单消息的菜单按钮 // MsgmenuItem 菜单消息的菜单按钮
type MsgmenuItem struct { type MsgmenuItem struct {
ID string `json:"id"` ID string `json:"id"`
Content string `json:"content"` Content string `json:"content"`
} }
//MediaWxcard 卡券的id // MediaWxcard 卡券的id
type MediaWxcard struct { type MediaWxcard struct {
CardID string `json:"card_id"` CardID string `json:"card_id"`
} }
//MediaMiniprogrampage 小程序消息 // MediaMiniprogrampage 小程序消息
type MediaMiniprogrampage struct { type MediaMiniprogrampage struct {
Title string `json:"title"` Title string `json:"title"`
AppID string `json:"appid"` AppID string `json:"appid"`
@@ -153,7 +153,7 @@ type MediaMiniprogrampage struct {
ThumbMediaID string `json:"thumb_media_id"` ThumbMediaID string `json:"thumb_media_id"`
} }
//Send 发送客服消息 // Send 发送客服消息
func (manager *Manager) Send(msg *CustomerMessage) error { func (manager *Manager) Send(msg *CustomerMessage) error {
accessToken, err := manager.Context.GetAccessToken() accessToken, err := manager.Context.GetAccessToken()
if err != nil { if err != nil {

View File

@@ -1,6 +1,6 @@
package message package message
//Image 图片消息 // Image 图片消息
type Image struct { type Image struct {
CommonToken CommonToken
@@ -9,7 +9,7 @@ type Image struct {
} `xml:"Image"` } `xml:"Image"`
} }
//NewImage 回复图片消息 // NewImage 回复图片消息
func NewImage(mediaID string) *Image { func NewImage(mediaID string) *Image {
image := new(Image) image := new(Image)
image.Image.MediaID = mediaID image.Image.MediaID = mediaID

View File

@@ -16,67 +16,67 @@ type EventType string
type InfoType string type InfoType string
const ( const (
//MsgTypeText 表示文本消息 // MsgTypeText 表示文本消息
MsgTypeText MsgType = "text" MsgTypeText MsgType = "text"
//MsgTypeImage 表示图片消息 // MsgTypeImage 表示图片消息
MsgTypeImage = "image" MsgTypeImage = "image"
//MsgTypeVoice 表示语音消息 // MsgTypeVoice 表示语音消息
MsgTypeVoice = "voice" MsgTypeVoice = "voice"
//MsgTypeVideo 表示视频消息 // MsgTypeVideo 表示视频消息
MsgTypeVideo = "video" MsgTypeVideo = "video"
//MsgTypeMiniprogrampage 表示小程序卡片消息 // MsgTypeMiniprogrampage 表示小程序卡片消息
MsgTypeMiniprogrampage = "miniprogrampage" MsgTypeMiniprogrampage = "miniprogrampage"
//MsgTypeShortVideo 表示短视频消息[限接收] // MsgTypeShortVideo 表示短视频消息[限接收]
MsgTypeShortVideo = "shortvideo" MsgTypeShortVideo = "shortvideo"
//MsgTypeLocation 表示坐标消息[限接收] // MsgTypeLocation 表示坐标消息[限接收]
MsgTypeLocation = "location" MsgTypeLocation = "location"
//MsgTypeLink 表示链接消息[限接收] // MsgTypeLink 表示链接消息[限接收]
MsgTypeLink = "link" MsgTypeLink = "link"
//MsgTypeMusic 表示音乐消息[限回复] // MsgTypeMusic 表示音乐消息[限回复]
MsgTypeMusic = "music" MsgTypeMusic = "music"
//MsgTypeNews 表示图文消息[限回复] // MsgTypeNews 表示图文消息[限回复]
MsgTypeNews = "news" MsgTypeNews = "news"
//MsgTypeTransfer 表示消息消息转发到客服 // MsgTypeTransfer 表示消息消息转发到客服
MsgTypeTransfer = "transfer_customer_service" MsgTypeTransfer = "transfer_customer_service"
//MsgTypeEvent 表示事件推送消息 // MsgTypeEvent 表示事件推送消息
MsgTypeEvent = "event" MsgTypeEvent = "event"
) )
const ( const (
//EventSubscribe 订阅 // EventSubscribe 订阅
EventSubscribe EventType = "subscribe" EventSubscribe EventType = "subscribe"
//EventUnsubscribe 取消订阅 // EventUnsubscribe 取消订阅
EventUnsubscribe = "unsubscribe" EventUnsubscribe = "unsubscribe"
//EventScan 用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者 // EventScan 用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者
EventScan = "SCAN" EventScan = "SCAN"
//EventLocation 上报地理位置事件 // EventLocation 上报地理位置事件
EventLocation = "LOCATION" EventLocation = "LOCATION"
//EventClick 点击菜单拉取消息时的事件推送 // EventClick 点击菜单拉取消息时的事件推送
EventClick = "CLICK" EventClick = "CLICK"
//EventView 点击菜单跳转链接时的事件推送 // EventView 点击菜单跳转链接时的事件推送
EventView = "VIEW" EventView = "VIEW"
//EventScancodePush 扫码推事件的事件推送 // EventScancodePush 扫码推事件的事件推送
EventScancodePush = "scancode_push" EventScancodePush = "scancode_push"
//EventScancodeWaitmsg 扫码推事件且弹出“消息接收中”提示框的事件推送 // EventScancodeWaitmsg 扫码推事件且弹出“消息接收中”提示框的事件推送
EventScancodeWaitmsg = "scancode_waitmsg" EventScancodeWaitmsg = "scancode_waitmsg"
//EventPicSysphoto 弹出系统拍照发图的事件推送 // EventPicSysphoto 弹出系统拍照发图的事件推送
EventPicSysphoto = "pic_sysphoto" EventPicSysphoto = "pic_sysphoto"
//EventPicPhotoOrAlbum 弹出拍照或者相册发图的事件推送 // EventPicPhotoOrAlbum 弹出拍照或者相册发图的事件推送
EventPicPhotoOrAlbum = "pic_photo_or_album" EventPicPhotoOrAlbum = "pic_photo_or_album"
//EventPicWeixin 弹出微信相册发图器的事件推送 // EventPicWeixin 弹出微信相册发图器的事件推送
EventPicWeixin = "pic_weixin" EventPicWeixin = "pic_weixin"
//EventLocationSelect 弹出地理位置选择器的事件推送 // EventLocationSelect 弹出地理位置选择器的事件推送
EventLocationSelect = "location_select" EventLocationSelect = "location_select"
//EventTemplateSendJobFinish 发送模板消息推送通知 // EventTemplateSendJobFinish 发送模板消息推送通知
EventTemplateSendJobFinish = "TEMPLATESENDJOBFINISH" EventTemplateSendJobFinish = "TEMPLATESENDJOBFINISH"
//EventMassSendJobFinish 群发消息推送通知 // EventMassSendJobFinish 群发消息推送通知
EventMassSendJobFinish = "MASSSENDJOBFINISH" EventMassSendJobFinish = "MASSSENDJOBFINISH"
//EventWxaMediaCheck 异步校验图片/音频是否含有违法违规内容推送事件 // EventWxaMediaCheck 异步校验图片/音频是否含有违法违规内容推送事件
EventWxaMediaCheck = "wxa_media_check" EventWxaMediaCheck = "wxa_media_check"
) )
const ( const (
//微信开放平台需要用到 // 微信开放平台需要用到
// InfoTypeVerifyTicket 返回ticket // InfoTypeVerifyTicket 返回ticket
InfoTypeVerifyTicket InfoType = "component_verify_ticket" InfoTypeVerifyTicket InfoType = "component_verify_ticket"
@@ -88,13 +88,13 @@ const (
InfoTypeUpdateAuthorized = "updateauthorized" InfoTypeUpdateAuthorized = "updateauthorized"
) )
//MixMessage 存放所有微信发送过来的消息和事件 // MixMessage 存放所有微信发送过来的消息和事件
type MixMessage struct { type MixMessage struct {
CommonToken CommonToken
//基本消息 // 基本消息
MsgID int64 `xml:"MsgId"` //其他消息推送过来是MsgId MsgID int64 `xml:"MsgId"` // 其他消息推送过来是MsgId
TemplateMsgID int64 `xml:"MsgID"` //模板消息推送成功的消息是MsgID TemplateMsgID int64 `xml:"MsgID"` // 模板消息推送成功的消息是MsgID
Content string `xml:"Content"` Content string `xml:"Content"`
Recognition string `xml:"Recognition"` Recognition string `xml:"Recognition"`
PicURL string `xml:"PicUrl"` PicURL string `xml:"PicUrl"`
@@ -109,7 +109,7 @@ type MixMessage struct {
Description string `xml:"Description"` Description string `xml:"Description"`
URL string `xml:"Url"` URL string `xml:"Url"`
//事件相关 // 事件相关
Event EventType `xml:"Event"` Event EventType `xml:"Event"`
EventKey string `xml:"EventKey"` EventKey string `xml:"EventKey"`
Ticket string `xml:"Ticket"` Ticket string `xml:"Ticket"`
@@ -168,23 +168,23 @@ type MixMessage struct {
TraceID string `xml:"trace_id"` TraceID string `xml:"trace_id"`
StatusCode int `xml:"status_code"` StatusCode int `xml:"status_code"`
//设备相关 // 设备相关
device.MsgDevice device.MsgDevice
} }
//EventPic 发图事件推送 // EventPic 发图事件推送
type EventPic struct { type EventPic struct {
PicMd5Sum string `xml:"PicMd5Sum"` PicMd5Sum string `xml:"PicMd5Sum"`
} }
//EncryptedXMLMsg 安全模式下的消息体 // EncryptedXMLMsg 安全模式下的消息体
type EncryptedXMLMsg struct { type EncryptedXMLMsg struct {
XMLName struct{} `xml:"xml" json:"-"` XMLName struct{} `xml:"xml" json:"-"`
ToUserName string `xml:"ToUserName" json:"ToUserName"` ToUserName string `xml:"ToUserName" json:"ToUserName"`
EncryptedMsg string `xml:"Encrypt" json:"Encrypt"` EncryptedMsg string `xml:"Encrypt" json:"Encrypt"`
} }
//ResponseEncryptedXMLMsg 需要返回的消息体 // ResponseEncryptedXMLMsg 需要返回的消息体
type ResponseEncryptedXMLMsg struct { type ResponseEncryptedXMLMsg struct {
XMLName struct{} `xml:"xml" json:"-"` XMLName struct{} `xml:"xml" json:"-"`
EncryptedMsg string `xml:"Encrypt" json:"Encrypt"` EncryptedMsg string `xml:"Encrypt" json:"Encrypt"`
@@ -212,27 +212,27 @@ type CommonToken struct {
MsgType MsgType `xml:"MsgType"` MsgType MsgType `xml:"MsgType"`
} }
//SetToUserName set ToUserName // SetToUserName set ToUserName
func (msg *CommonToken) SetToUserName(toUserName CDATA) { func (msg *CommonToken) SetToUserName(toUserName CDATA) {
msg.ToUserName = toUserName msg.ToUserName = toUserName
} }
//SetFromUserName set FromUserName // SetFromUserName set FromUserName
func (msg *CommonToken) SetFromUserName(fromUserName CDATA) { func (msg *CommonToken) SetFromUserName(fromUserName CDATA) {
msg.FromUserName = fromUserName msg.FromUserName = fromUserName
} }
//SetCreateTime set createTime // SetCreateTime set createTime
func (msg *CommonToken) SetCreateTime(createTime int64) { func (msg *CommonToken) SetCreateTime(createTime int64) {
msg.CreateTime = createTime msg.CreateTime = createTime
} }
//SetMsgType set MsgType // SetMsgType set MsgType
func (msg *CommonToken) SetMsgType(msgType MsgType) { func (msg *CommonToken) SetMsgType(msgType MsgType) {
msg.MsgType = msgType msg.MsgType = msgType
} }
//GetOpenID get the FromUserName value // GetOpenID get the FromUserName value
func (msg *CommonToken) GetOpenID() string { func (msg *CommonToken) GetOpenID() string {
return string(msg.FromUserName) return string(msg.FromUserName)
} }

View File

@@ -1,6 +1,6 @@
package message package message
//Music 音乐消息 // Music 音乐消息
type Music struct { type Music struct {
CommonToken CommonToken
@@ -13,7 +13,7 @@ type Music struct {
} `xml:"Music"` } `xml:"Music"`
} }
//NewMusic 回复音乐消息 // NewMusic 回复音乐消息
func NewMusic(title, description, musicURL, hQMusicURL, thumbMediaID string) *Music { func NewMusic(title, description, musicURL, hQMusicURL, thumbMediaID string) *Music {
music := new(Music) music := new(Music)
music.Music.Title = title music.Music.Title = title

View File

@@ -1,6 +1,6 @@
package message package message
//News 图文消息 // News 图文消息
type News struct { type News struct {
CommonToken CommonToken
@@ -8,7 +8,7 @@ type News struct {
Articles []*Article `xml:"Articles>item,omitempty"` Articles []*Article `xml:"Articles>item,omitempty"`
} }
//NewNews 初始化图文消息 // NewNews 初始化图文消息
func NewNews(articles []*Article) *News { func NewNews(articles []*Article) *News {
news := new(News) news := new(News)
news.ArticleCount = len(articles) news.ArticleCount = len(articles)
@@ -16,7 +16,7 @@ func NewNews(articles []*Article) *News {
return news return news
} }
//Article 单篇文章 // Article 单篇文章
type Article struct { type Article struct {
Title string `xml:"Title,omitempty"` Title string `xml:"Title,omitempty"`
Description string `xml:"Description,omitempty"` Description string `xml:"Description,omitempty"`
@@ -24,7 +24,7 @@ type Article struct {
URL string `xml:"Url,omitempty"` URL string `xml:"Url,omitempty"`
} }
//NewArticle 初始化文章 // NewArticle 初始化文章
func NewArticle(title, description, picURL, url string) *Article { func NewArticle(title, description, picURL, url string) *Article {
article := new(Article) article := new(Article)
article.Title = title article.Title = title

View File

@@ -2,13 +2,13 @@ package message
import "errors" import "errors"
//ErrInvalidReply 无效的回复 // ErrInvalidReply 无效的回复
var ErrInvalidReply = errors.New("无效的回复消息") var ErrInvalidReply = errors.New("无效的回复消息")
//ErrUnsupportReply 不支持的回复类型 // ErrUnsupportReply 不支持的回复类型
var ErrUnsupportReply = errors.New("不支持的回复消息") var ErrUnsupportReply = errors.New("不支持的回复消息")
//Reply 消息回复 // Reply 消息回复
type Reply struct { type Reply struct {
MsgType MsgType MsgType MsgType
MsgData interface{} MsgData interface{}

View File

@@ -14,36 +14,36 @@ const (
subscribeTemplateDelURL = "https://api.weixin.qq.com/wxaapi/newtmpl/deltemplate" subscribeTemplateDelURL = "https://api.weixin.qq.com/wxaapi/newtmpl/deltemplate"
) )
//Subscribe 订阅消息 // Subscribe 订阅消息
type Subscribe struct { type Subscribe struct {
*context.Context *context.Context
} }
//NewSubscribe 实例化 // NewSubscribe 实例化
func NewSubscribe(context *context.Context) *Subscribe { func NewSubscribe(context *context.Context) *Subscribe {
tpl := new(Subscribe) tpl := new(Subscribe)
tpl.Context = context tpl.Context = context
return tpl return tpl
} }
//SubscribeMessage 发送的订阅消息内容 // SubscribeMessage 发送的订阅消息内容
type SubscribeMessage struct { type SubscribeMessage struct {
ToUser string `json:"touser"` // 必须, 接受者OpenID ToUser string `json:"touser"` // 必须, 接受者OpenID
TemplateID string `json:"template_id"` // 必须, 模版ID TemplateID string `json:"template_id"` // 必须, 模版ID
Page string `json:"page,omitempty"` // 可选, 跳转网页时填写 Page string `json:"page,omitempty"` // 可选, 跳转网页时填写
Data map[string]*SubscribeDataItem `json:"data"` // 必须, 模板数据 Data map[string]*SubscribeDataItem `json:"data"` // 必须, 模板数据
MiniProgram struct { MiniProgram struct {
AppID string `json:"appid"` //所需跳转到的小程序appid该小程序appid必须与发模板消息的公众号是绑定关联关系 AppID string `json:"appid"` // 所需跳转到的小程序appid该小程序appid必须与发模板消息的公众号是绑定关联关系
PagePath string `json:"pagepath"` //所需跳转到小程序的具体页面路径,支持带参数,示例index?foo=bar PagePath string `json:"pagepath"` // 所需跳转到小程序的具体页面路径,支持带参数,示例index?foo=bar
} `json:"miniprogram"` //可选,跳转至小程序地址 } `json:"miniprogram"` // 可选,跳转至小程序地址
} }
//SubscribeDataItem 模版内某个 .DATA 的值 // SubscribeDataItem 模版内某个 .DATA 的值
type SubscribeDataItem struct { type SubscribeDataItem struct {
Value string `json:"value"` Value string `json:"value"`
} }
//Send 发送订阅消息 // Send 发送订阅消息
func (tpl *Subscribe) Send(msg *SubscribeMessage) (err error) { func (tpl *Subscribe) Send(msg *SubscribeMessage) (err error) {
var accessToken string var accessToken string
accessToken, err = tpl.GetAccessToken() accessToken, err = tpl.GetAccessToken()
@@ -61,10 +61,10 @@ func (tpl *Subscribe) Send(msg *SubscribeMessage) (err error) {
// PrivateSubscribeItem 私有订阅消息模板 // PrivateSubscribeItem 私有订阅消息模板
type PrivateSubscribeItem struct { type PrivateSubscribeItem struct {
PriTmplID string `json:"priTmplId"` // 添加至帐号下的模板 id发送订阅通知时所需 PriTmplID string `json:"priTmplId"` // 添加至帐号下的模板 id发送订阅通知时所需
Title string `json:"title"` //模版标题 Title string `json:"title"` // 模版标题
Content string `json:"content"` //模版内容 Content string `json:"content"` // 模版内容
Example string `json:"example"` //模板内容示例 Example string `json:"example"` // 模板内容示例
SubType int `json:"type"` //模版类型2 为一次性订阅3 为长期订阅 SubType int `json:"type"` // 模版类型2 为一次性订阅3 为长期订阅
} }
type resPrivateSubscribeList struct { type resPrivateSubscribeList struct {
@@ -72,7 +72,7 @@ type resPrivateSubscribeList struct {
SubscriptionList []*PrivateSubscribeItem `json:"data"` SubscriptionList []*PrivateSubscribeItem `json:"data"`
} }
//List 获取私有订阅消息模板列表 // List 获取私有订阅消息模板列表
func (tpl *Subscribe) List() (templateList []*PrivateSubscribeItem, err error) { func (tpl *Subscribe) List() (templateList []*PrivateSubscribeItem, err error) {
var accessToken string var accessToken string
accessToken, err = tpl.GetAccessToken() accessToken, err = tpl.GetAccessToken()

View File

@@ -15,19 +15,19 @@ const (
templateDelURL = "https://api.weixin.qq.com/cgi-bin/template/del_private_template" templateDelURL = "https://api.weixin.qq.com/cgi-bin/template/del_private_template"
) )
//Template 模板消息 // Template 模板消息
type Template struct { type Template struct {
*context.Context *context.Context
} }
//NewTemplate 实例化 // NewTemplate 实例化
func NewTemplate(context *context.Context) *Template { func NewTemplate(context *context.Context) *Template {
tpl := new(Template) tpl := new(Template)
tpl.Context = context tpl.Context = context
return tpl return tpl
} }
//TemplateMessage 发送的模板消息内容 // TemplateMessage 发送的模板消息内容
type TemplateMessage struct { type TemplateMessage struct {
ToUser string `json:"touser"` // 必须, 接受者OpenID ToUser string `json:"touser"` // 必须, 接受者OpenID
TemplateID string `json:"template_id"` // 必须, 模版ID TemplateID string `json:"template_id"` // 必须, 模版ID
@@ -36,12 +36,12 @@ type TemplateMessage struct {
Data map[string]*TemplateDataItem `json:"data"` // 必须, 模板数据 Data map[string]*TemplateDataItem `json:"data"` // 必须, 模板数据
MiniProgram struct { MiniProgram struct {
AppID string `json:"appid"` //所需跳转到的小程序appid该小程序appid必须与发模板消息的公众号是绑定关联关系 AppID string `json:"appid"` // 所需跳转到的小程序appid该小程序appid必须与发模板消息的公众号是绑定关联关系
PagePath string `json:"pagepath"` //所需跳转到小程序的具体页面路径,支持带参数,示例index?foo=bar PagePath string `json:"pagepath"` // 所需跳转到小程序的具体页面路径,支持带参数,示例index?foo=bar
} `json:"miniprogram"` //可选,跳转至小程序地址 } `json:"miniprogram"` // 可选,跳转至小程序地址
} }
//TemplateDataItem 模版内某个 .DATA 的值 // TemplateDataItem 模版内某个 .DATA 的值
type TemplateDataItem struct { type TemplateDataItem struct {
Value string `json:"value"` Value string `json:"value"`
Color string `json:"color,omitempty"` Color string `json:"color,omitempty"`
@@ -53,7 +53,7 @@ type resTemplateSend struct {
MsgID int64 `json:"msgid"` MsgID int64 `json:"msgid"`
} }
//Send 发送模板消息 // Send 发送模板消息
func (tpl *Template) Send(msg *TemplateMessage) (msgID int64, err error) { func (tpl *Template) Send(msg *TemplateMessage) (msgID int64, err error) {
var accessToken string var accessToken string
accessToken, err = tpl.GetAccessToken() accessToken, err = tpl.GetAccessToken()
@@ -95,7 +95,7 @@ type resTemplateList struct {
TemplateList []*TemplateItem `json:"template_list"` TemplateList []*TemplateItem `json:"template_list"`
} }
//List 获取模板列表 // List 获取模板列表
func (tpl *Template) List() (templateList []*TemplateItem, err error) { func (tpl *Template) List() (templateList []*TemplateItem, err error) {
var accessToken string var accessToken string
accessToken, err = tpl.GetAccessToken() accessToken, err = tpl.GetAccessToken()

View File

@@ -1,12 +1,12 @@
package message package message
//Text 文本消息 // Text 文本消息
type Text struct { type Text struct {
CommonToken CommonToken
Content CDATA `xml:"Content"` Content CDATA `xml:"Content"`
} }
//NewText 初始化文本消息 // NewText 初始化文本消息
func NewText(content string) *Text { func NewText(content string) *Text {
text := new(Text) text := new(Text)
text.Content = CDATA(content) text.Content = CDATA(content)

View File

@@ -1,18 +1,18 @@
package message package message
//TransferCustomer 转发客服消息 // TransferCustomer 转发客服消息
type TransferCustomer struct { type TransferCustomer struct {
CommonToken CommonToken
TransInfo *TransInfo `xml:"TransInfo,omitempty"` TransInfo *TransInfo `xml:"TransInfo,omitempty"`
} }
//TransInfo 转发到指定客服 // TransInfo 转发到指定客服
type TransInfo struct { type TransInfo struct {
KfAccount string `xml:"KfAccount"` KfAccount string `xml:"KfAccount"`
} }
//NewTransferCustomer 实例化 // NewTransferCustomer 实例化
func NewTransferCustomer(kfAccount string) *TransferCustomer { func NewTransferCustomer(kfAccount string) *TransferCustomer {
tc := new(TransferCustomer) tc := new(TransferCustomer)
if kfAccount != "" { if kfAccount != "" {

View File

@@ -1,6 +1,6 @@
package message package message
//Video 视频消息 // Video 视频消息
type Video struct { type Video struct {
CommonToken CommonToken
@@ -11,7 +11,7 @@ type Video struct {
} `xml:"Video"` } `xml:"Video"`
} }
//NewVideo 回复图片消息 // NewVideo 回复图片消息
func NewVideo(mediaID, title, description string) *Video { func NewVideo(mediaID, title, description string) *Video {
video := new(Video) video := new(Video)
video.Video.MediaID = mediaID video.Video.MediaID = mediaID

View File

@@ -1,6 +1,6 @@
package message package message
//Voice 语音消息 // Voice 语音消息
type Voice struct { type Voice struct {
CommonToken CommonToken
@@ -9,7 +9,7 @@ type Voice struct {
} `xml:"Voice"` } `xml:"Voice"`
} }
//NewVoice 回复语音消息 // NewVoice 回复语音消息
func NewVoice(mediaID string) *Voice { func NewVoice(mediaID string) *Voice {
voice := new(Voice) voice := new(Voice)
voice.Voice.MediaID = mediaID voice.Voice.MediaID = mediaID

View File

@@ -19,32 +19,32 @@ const (
checkAccessTokenURL = "https://api.weixin.qq.com/sns/auth?access_token=%s&openid=%s" checkAccessTokenURL = "https://api.weixin.qq.com/sns/auth?access_token=%s&openid=%s"
) )
//Oauth 保存用户授权信息 // Oauth 保存用户授权信息
type Oauth struct { type Oauth struct {
*context.Context *context.Context
} }
//NewOauth 实例化授权信息 // NewOauth 实例化授权信息
func NewOauth(context *context.Context) *Oauth { func NewOauth(context *context.Context) *Oauth {
auth := new(Oauth) auth := new(Oauth)
auth.Context = context auth.Context = context
return auth return auth
} }
//GetRedirectURL 获取跳转的url地址 // GetRedirectURL 获取跳转的url地址
func (oauth *Oauth) GetRedirectURL(redirectURI, scope, state string) (string, error) { func (oauth *Oauth) GetRedirectURL(redirectURI, scope, state string) (string, error) {
//url encode // url encode
urlStr := url.QueryEscape(redirectURI) urlStr := url.QueryEscape(redirectURI)
return fmt.Sprintf(redirectOauthURL, oauth.AppID, urlStr, scope, state), nil return fmt.Sprintf(redirectOauthURL, oauth.AppID, urlStr, scope, state), nil
} }
//GetWebAppRedirectURL 获取网页应用跳转的url地址 // GetWebAppRedirectURL 获取网页应用跳转的url地址
func (oauth *Oauth) GetWebAppRedirectURL(redirectURI, scope, state string) (string, error) { func (oauth *Oauth) GetWebAppRedirectURL(redirectURI, scope, state string) (string, error) {
urlStr := url.QueryEscape(redirectURI) urlStr := url.QueryEscape(redirectURI)
return fmt.Sprintf(webAppRedirectOauthURL, oauth.AppID, urlStr, scope, state), nil return fmt.Sprintf(webAppRedirectOauthURL, oauth.AppID, urlStr, scope, state), nil
} }
//Redirect 跳转到网页授权 // Redirect 跳转到网页授权
func (oauth *Oauth) Redirect(writer http.ResponseWriter, req *http.Request, redirectURI, scope, state string) error { func (oauth *Oauth) Redirect(writer http.ResponseWriter, req *http.Request, redirectURI, scope, state string) error {
location, err := oauth.GetRedirectURL(redirectURI, scope, state) location, err := oauth.GetRedirectURL(redirectURI, scope, state)
if err != nil { if err != nil {
@@ -88,7 +88,7 @@ func (oauth *Oauth) GetUserAccessToken(code string) (result ResAccessToken, err
return return
} }
//RefreshAccessToken 刷新access_token // RefreshAccessToken 刷新access_token
func (oauth *Oauth) RefreshAccessToken(refreshToken string) (result ResAccessToken, err error) { func (oauth *Oauth) RefreshAccessToken(refreshToken string) (result ResAccessToken, err error) {
urlStr := fmt.Sprintf(refreshAccessTokenURL, oauth.AppID, refreshToken) urlStr := fmt.Sprintf(refreshAccessTokenURL, oauth.AppID, refreshToken)
var response []byte var response []byte
@@ -107,7 +107,7 @@ func (oauth *Oauth) RefreshAccessToken(refreshToken string) (result ResAccessTok
return return
} }
//CheckAccessToken 检验access_token是否有效 // CheckAccessToken 检验access_token是否有效
func (oauth *Oauth) CheckAccessToken(accessToken, openID string) (b bool, err error) { func (oauth *Oauth) CheckAccessToken(accessToken, openID string) (b bool, err error) {
urlStr := fmt.Sprintf(checkAccessTokenURL, accessToken, openID) urlStr := fmt.Sprintf(checkAccessTokenURL, accessToken, openID)
var response []byte var response []byte
@@ -128,7 +128,7 @@ func (oauth *Oauth) CheckAccessToken(accessToken, openID string) (b bool, err er
return return
} }
//UserInfo 用户授权获取到用户信息 // UserInfo 用户授权获取到用户信息
type UserInfo struct { type UserInfo struct {
util.CommonError util.CommonError
@@ -143,7 +143,7 @@ type UserInfo struct {
Unionid string `json:"unionid"` Unionid string `json:"unionid"`
} }
//GetUserInfo 如果scope为 snsapi_userinfo 则可以通过此方法获取到用户基本信息 // GetUserInfo 如果scope为 snsapi_userinfo 则可以通过此方法获取到用户基本信息
func (oauth *Oauth) GetUserInfo(accessToken, openID, lang string) (result UserInfo, err error) { func (oauth *Oauth) GetUserInfo(accessToken, openID, lang string) (result UserInfo, err error) {
if lang == "" { if lang == "" {
lang = "zh_CN" lang = "zh_CN"

View File

@@ -18,18 +18,18 @@ const (
ocrPlateNumberURL = "https://api.weixin.qq.com/cv/ocr/platenum" ocrPlateNumberURL = "https://api.weixin.qq.com/cv/ocr/platenum"
) )
//OCR struct // OCR struct
type OCR struct { type OCR struct {
*context.Context *context.Context
} }
//coordinate 坐标 // coordinate 坐标
type coordinate struct { type coordinate struct {
X int64 `json:"x,omitempty"` X int64 `json:"x,omitempty"`
Y int64 `json:"y,omitempty"` Y int64 `json:"y,omitempty"`
} }
//position 位置 // position 位置
type position struct { type position struct {
LeftTop coordinate `json:"left_top"` LeftTop coordinate `json:"left_top"`
RightTop coordinate `json:"right_top"` RightTop coordinate `json:"right_top"`
@@ -37,13 +37,13 @@ type position struct {
LeftBottom coordinate `json:"left_bottom"` LeftBottom coordinate `json:"left_bottom"`
} }
//imageSize 图片尺寸 // imageSize 图片尺寸
type imageSize struct { type imageSize struct {
Width int64 `json:"w,omitempty"` Width int64 `json:"w,omitempty"`
Height int64 `json:"h,omitempty"` Height int64 `json:"h,omitempty"`
} }
//ResDriving 行驶证返回结果 // ResDriving 行驶证返回结果
type ResDriving struct { type ResDriving struct {
util.CommonError util.CommonError
@@ -68,7 +68,7 @@ type ResDriving struct {
ImageSize imageSize `json:"img_size,omitempty"` ImageSize imageSize `json:"img_size,omitempty"`
} }
//ResIDCard 身份证返回结果 // ResIDCard 身份证返回结果
type ResIDCard struct { type ResIDCard struct {
util.CommonError util.CommonError
@@ -81,14 +81,14 @@ type ResIDCard struct {
ValidDate string `json:"valid_date,omitempty"` ValidDate string `json:"valid_date,omitempty"`
} }
//ResBankCard 银行卡返回结果 // ResBankCard 银行卡返回结果
type ResBankCard struct { type ResBankCard struct {
util.CommonError util.CommonError
Number string `json:"number,omitempty"` Number string `json:"number,omitempty"`
} }
//ResDrivingLicense 驾驶证返回结果 // ResDrivingLicense 驾驶证返回结果
type ResDrivingLicense struct { type ResDrivingLicense struct {
util.CommonError util.CommonError
@@ -105,7 +105,7 @@ type ResDrivingLicense struct {
OfficialSeal string `json:"official_seal,omitempty"` OfficialSeal string `json:"official_seal,omitempty"`
} }
//ResBizLicense 营业执照返回结果 // ResBizLicense 营业执照返回结果
type ResBizLicense struct { type ResBizLicense struct {
util.CommonError util.CommonError
@@ -125,7 +125,7 @@ type ResBizLicense struct {
ImageSize imageSize `json:"img_size,omitempty"` ImageSize imageSize `json:"img_size,omitempty"`
} }
//ResCommon 公共印刷品返回结果 // ResCommon 公共印刷品返回结果
type ResCommon struct { type ResCommon struct {
util.CommonError util.CommonError
@@ -133,27 +133,27 @@ type ResCommon struct {
ImageSize imageSize `json:"img_size,omitempty"` ImageSize imageSize `json:"img_size,omitempty"`
} }
//commonItem 公共元素 // commonItem 公共元素
type commonItem struct { type commonItem struct {
Position position `json:"pos"` Position position `json:"pos"`
Text string `json:"text"` Text string `json:"text"`
} }
//ResPlateNumber 车牌号返回结果 // ResPlateNumber 车牌号返回结果
type ResPlateNumber struct { type ResPlateNumber struct {
util.CommonError util.CommonError
Number string `json:"number"` Number string `json:"number"`
} }
//NewOCR 实例 // NewOCR 实例
func NewOCR(c *context.Context) *OCR { func NewOCR(c *context.Context) *OCR {
ocr := new(OCR) ocr := new(OCR)
ocr.Context = c ocr.Context = c
return ocr return ocr
} }
//IDCard 身份证OCR识别接口 // IDCard 身份证OCR识别接口
func (ocr *OCR) IDCard(path string) (ResIDCard ResIDCard, err error) { func (ocr *OCR) IDCard(path string) (ResIDCard ResIDCard, err error) {
accessToken, err := ocr.GetAccessToken() accessToken, err := ocr.GetAccessToken()
if err != nil { if err != nil {
@@ -172,7 +172,7 @@ func (ocr *OCR) IDCard(path string) (ResIDCard ResIDCard, err error) {
return return
} }
//BankCard 银行卡OCR识别接口 // BankCard 银行卡OCR识别接口
func (ocr *OCR) BankCard(path string) (ResBankCard ResBankCard, err error) { func (ocr *OCR) BankCard(path string) (ResBankCard ResBankCard, err error) {
accessToken, err := ocr.GetAccessToken() accessToken, err := ocr.GetAccessToken()
if err != nil { if err != nil {
@@ -191,7 +191,7 @@ func (ocr *OCR) BankCard(path string) (ResBankCard ResBankCard, err error) {
return return
} }
//Driving 行驶证OCR识别接口 // Driving 行驶证OCR识别接口
func (ocr *OCR) Driving(path string) (ResDriving ResDriving, err error) { func (ocr *OCR) Driving(path string) (ResDriving ResDriving, err error) {
accessToken, err := ocr.GetAccessToken() accessToken, err := ocr.GetAccessToken()
if err != nil { if err != nil {
@@ -210,7 +210,7 @@ func (ocr *OCR) Driving(path string) (ResDriving ResDriving, err error) {
return return
} }
//DrivingLicense 驾驶证OCR识别接口 // DrivingLicense 驾驶证OCR识别接口
func (ocr *OCR) DrivingLicense(path string) (ResDrivingLicense ResDrivingLicense, err error) { func (ocr *OCR) DrivingLicense(path string) (ResDrivingLicense ResDrivingLicense, err error) {
accessToken, err := ocr.GetAccessToken() accessToken, err := ocr.GetAccessToken()
if err != nil { if err != nil {
@@ -229,7 +229,7 @@ func (ocr *OCR) DrivingLicense(path string) (ResDrivingLicense ResDrivingLicense
return return
} }
//BizLicense 营业执照OCR识别接口 // BizLicense 营业执照OCR识别接口
func (ocr *OCR) BizLicense(path string) (ResBizLicense ResBizLicense, err error) { func (ocr *OCR) BizLicense(path string) (ResBizLicense ResBizLicense, err error) {
accessToken, err := ocr.GetAccessToken() accessToken, err := ocr.GetAccessToken()
if err != nil { if err != nil {
@@ -248,7 +248,7 @@ func (ocr *OCR) BizLicense(path string) (ResBizLicense ResBizLicense, err error)
return return
} }
//Common 通用印刷体OCR识别接口 // Common 通用印刷体OCR识别接口
func (ocr *OCR) Common(path string) (ResCommon ResCommon, err error) { func (ocr *OCR) Common(path string) (ResCommon ResCommon, err error) {
accessToken, err := ocr.GetAccessToken() accessToken, err := ocr.GetAccessToken()
if err != nil { if err != nil {
@@ -267,7 +267,7 @@ func (ocr *OCR) Common(path string) (ResCommon ResCommon, err error) {
return return
} }
//PlateNumber 车牌OCR识别接口 // PlateNumber 车牌OCR识别接口
func (ocr *OCR) PlateNumber(path string) (ResPlateNumber ResPlateNumber, err error) { func (ocr *OCR) PlateNumber(path string) (ResPlateNumber ResPlateNumber, err error) {
accessToken, err := ocr.GetAccessToken() accessToken, err := ocr.GetAccessToken()
if err != nil { if err != nil {

View File

@@ -22,12 +22,12 @@ import (
"github.com/silenceper/wechat/v2/officialaccount/user" "github.com/silenceper/wechat/v2/officialaccount/user"
) )
//OfficialAccount 微信公众号相关API // OfficialAccount 微信公众号相关API
type OfficialAccount struct { type OfficialAccount struct {
ctx *context.Context ctx *context.Context
} }
//NewOfficialAccount 实例化公众号API // NewOfficialAccount 实例化公众号API
func NewOfficialAccount(cfg *config.Config) *OfficialAccount { func NewOfficialAccount(cfg *config.Config) *OfficialAccount {
defaultAkHandle := credential.NewDefaultAccessToken(cfg.AppID, cfg.AppSecret, credential.CacheKeyOfficialAccountPrefix, cfg.Cache) defaultAkHandle := credential.NewDefaultAccessToken(cfg.AppID, cfg.AppSecret, credential.CacheKeyOfficialAccountPrefix, cfg.Cache)
ctx := &context.Context{ ctx := &context.Context{
@@ -37,7 +37,7 @@ func NewOfficialAccount(cfg *config.Config) *OfficialAccount {
return &OfficialAccount{ctx: ctx} return &OfficialAccount{ctx: ctx}
} }
//SetAccessTokenHandle 自定义access_token获取方式 // SetAccessTokenHandle 自定义access_token获取方式
func (officialAccount *OfficialAccount) SetAccessTokenHandle(accessTokenHandle credential.AccessTokenHandle) { func (officialAccount *OfficialAccount) SetAccessTokenHandle(accessTokenHandle credential.AccessTokenHandle) {
officialAccount.ctx.AccessTokenHandle = accessTokenHandle officialAccount.ctx.AccessTokenHandle = accessTokenHandle
} }
@@ -65,7 +65,7 @@ func (officialAccount *OfficialAccount) GetServer(req *http.Request, writer http
return srv return srv
} }
//GetAccessToken 获取access_token // GetAccessToken 获取access_token
func (officialAccount *OfficialAccount) GetAccessToken() (string, error) { func (officialAccount *OfficialAccount) GetAccessToken() (string, error) {
return officialAccount.ctx.GetAccessToken() return officialAccount.ctx.GetAccessToken()
} }
@@ -105,23 +105,23 @@ func (officialAccount *OfficialAccount) GetDevice() *device.Device {
return device.NewDevice(officialAccount.ctx) return device.NewDevice(officialAccount.ctx)
} }
//GetBroadcast 群发消息 // GetBroadcast 群发消息
//TODO 待完善 // TODO 待完善
func (officialAccount *OfficialAccount) GetBroadcast() *broadcast.Broadcast { func (officialAccount *OfficialAccount) GetBroadcast() *broadcast.Broadcast {
return broadcast.NewBroadcast(officialAccount.ctx) return broadcast.NewBroadcast(officialAccount.ctx)
} }
//GetDataCube 数据统计 // GetDataCube 数据统计
func (officialAccount *OfficialAccount) GetDataCube() *datacube.DataCube { func (officialAccount *OfficialAccount) GetDataCube() *datacube.DataCube {
return datacube.NewCube(officialAccount.ctx) return datacube.NewCube(officialAccount.ctx)
} }
//GetOCR OCR接口 // GetOCR OCR接口
func (officialAccount *OfficialAccount) GetOCR() *ocr.OCR { func (officialAccount *OfficialAccount) GetOCR() *ocr.OCR {
return ocr.NewOCR(officialAccount.ctx) return ocr.NewOCR(officialAccount.ctx)
} }
//GetSubscribe 公众号订阅消息 // GetSubscribe 公众号订阅消息
func (officialAccount *OfficialAccount) GetSubscribe() *message.Subscribe { func (officialAccount *OfficialAccount) GetSubscribe() *message.Subscribe {
return message.NewSubscribe(officialAccount.ctx) return message.NewSubscribe(officialAccount.ctx)
} }

View File

@@ -17,7 +17,7 @@ import (
"github.com/silenceper/wechat/v2/util" "github.com/silenceper/wechat/v2/util"
) )
//Server struct // Server struct
type Server struct { type Server struct {
*context.Context *context.Context
Writer http.ResponseWriter Writer http.ResponseWriter
@@ -40,7 +40,7 @@ type Server struct {
timestamp int64 timestamp int64
} }
//NewServer init // NewServer init
func NewServer(context *context.Context) *Server { func NewServer(context *context.Context) *Server {
srv := new(Server) srv := new(Server)
srv.Context = context srv.Context = context
@@ -52,7 +52,7 @@ func (srv *Server) SkipValidate(skip bool) {
srv.skipValidate = skip srv.skipValidate = skip
} }
//Serve 处理微信的请求消息 // Serve 处理微信的请求消息
func (srv *Server) Serve() error { func (srv *Server) Serve() error {
if !srv.Validate() { if !srv.Validate() {
log.Error("Validate Signature Failed.") log.Error("Validate Signature Failed.")
@@ -70,13 +70,13 @@ func (srv *Server) Serve() error {
return err return err
} }
//debug print request msg // debug print request msg
log.Debugf("request msg =%s", string(srv.RequestRawXMLMsg)) log.Debugf("request msg =%s", string(srv.RequestRawXMLMsg))
return srv.buildResponse(response) return srv.buildResponse(response)
} }
//Validate 校验请求是否合法 // Validate 校验请求是否合法
func (srv *Server) Validate() bool { func (srv *Server) Validate() bool {
if srv.skipValidate { if srv.skipValidate {
return true return true
@@ -88,16 +88,16 @@ func (srv *Server) Validate() bool {
return signature == util.Signature(srv.Token, timestamp, nonce) return signature == util.Signature(srv.Token, timestamp, nonce)
} }
//HandleRequest 处理微信的请求 // HandleRequest 处理微信的请求
func (srv *Server) handleRequest() (reply *message.Reply, err error) { func (srv *Server) handleRequest() (reply *message.Reply, err error) {
//set isSafeMode // set isSafeMode
srv.isSafeMode = false srv.isSafeMode = false
encryptType := srv.Query("encrypt_type") encryptType := srv.Query("encrypt_type")
if encryptType == "aes" { if encryptType == "aes" {
srv.isSafeMode = true srv.isSafeMode = true
} }
//set openID // set openID
srv.openID = srv.Query("openid") srv.openID = srv.Query("openid")
var msg interface{} var msg interface{}
@@ -114,12 +114,12 @@ func (srv *Server) handleRequest() (reply *message.Reply, err error) {
return return
} }
//GetOpenID return openID // GetOpenID return openID
func (srv *Server) GetOpenID() string { func (srv *Server) GetOpenID() string {
return srv.openID return srv.openID
} }
//getMessage 解析微信返回的消息 // getMessage 解析微信返回的消息
func (srv *Server) getMessage() (interface{}, error) { func (srv *Server) getMessage() (interface{}, error) {
var rawXMLMsgBytes []byte var rawXMLMsgBytes []byte
var err error var err error
@@ -129,7 +129,7 @@ func (srv *Server) getMessage() (interface{}, error) {
return nil, fmt.Errorf("从body中解析xml失败,err=%v", err) return nil, fmt.Errorf("从body中解析xml失败,err=%v", err)
} }
//验证消息签名 // 验证消息签名
timestamp := srv.Query("timestamp") timestamp := srv.Query("timestamp")
srv.timestamp, err = strconv.ParseInt(timestamp, 10, 32) srv.timestamp, err = strconv.ParseInt(timestamp, 10, 32)
if err != nil { if err != nil {
@@ -143,7 +143,7 @@ func (srv *Server) getMessage() (interface{}, error) {
return nil, fmt.Errorf("消息不合法,验证签名失败") return nil, fmt.Errorf("消息不合法,验证签名失败")
} }
//解密 // 解密
srv.random, rawXMLMsgBytes, err = util.DecryptMsg(srv.AppID, encryptedXMLMsg.EncryptedMsg, srv.EncodingAESKey) srv.random, rawXMLMsgBytes, err = util.DecryptMsg(srv.AppID, encryptedXMLMsg.EncryptedMsg, srv.EncodingAESKey)
if err != nil { if err != nil {
return nil, fmt.Errorf("消息解密失败, err=%v", err) return nil, fmt.Errorf("消息解密失败, err=%v", err)
@@ -166,7 +166,7 @@ func (srv *Server) parseRequestMessage(rawXMLMsgBytes []byte) (msg *message.MixM
return return
} }
//SetMessageHandler 设置用户自定义的回调方法 // SetMessageHandler 设置用户自定义的回调方法
func (srv *Server) SetMessageHandler(handler func(*message.MixMessage) *message.Reply) { func (srv *Server) SetMessageHandler(handler func(*message.MixMessage) *message.Reply) {
srv.messageHandler = handler srv.messageHandler = handler
} }
@@ -178,7 +178,7 @@ func (srv *Server) buildResponse(reply *message.Reply) (err error) {
} }
}() }()
if reply == nil { if reply == nil {
//do nothing // do nothing
return nil return nil
} }
msgType := reply.MsgType msgType := reply.MsgType
@@ -197,7 +197,7 @@ func (srv *Server) buildResponse(reply *message.Reply) (err error) {
msgData := reply.MsgData msgData := reply.MsgData
value := reflect.ValueOf(msgData) value := reflect.ValueOf(msgData)
//msgData must be a ptr // msgData must be a ptr
kind := value.Kind().String() kind := value.Kind().String()
if kind != "ptr" { if kind != "ptr" {
return message.ErrUnsupportReply return message.ErrUnsupportReply
@@ -221,18 +221,18 @@ func (srv *Server) buildResponse(reply *message.Reply) (err error) {
return return
} }
//Send 将自定义的消息发送 // Send 将自定义的消息发送
func (srv *Server) Send() (err error) { func (srv *Server) Send() (err error) {
replyMsg := srv.ResponseMsg replyMsg := srv.ResponseMsg
log.Debugf("response msg =%+v", replyMsg) log.Debugf("response msg =%+v", replyMsg)
if srv.isSafeMode { if srv.isSafeMode {
//安全模式下对消息进行加密 // 安全模式下对消息进行加密
var encryptedMsg []byte var encryptedMsg []byte
encryptedMsg, err = util.EncryptMsg(srv.random, srv.ResponseRawXMLMsg, srv.AppID, srv.EncodingAESKey) encryptedMsg, err = util.EncryptMsg(srv.random, srv.ResponseRawXMLMsg, srv.AppID, srv.EncodingAESKey)
if err != nil { if err != nil {
return return
} }
//TODO 如果获取不到timestamp nonce 则自己生成 // TODO 如果获取不到timestamp nonce 则自己生成
timestamp := srv.timestamp timestamp := srv.timestamp
timestampStr := strconv.FormatInt(timestamp, 10) timestampStr := strconv.FormatInt(timestamp, 10)
msgSignature := util.Signature(srv.Token, timestampStr, srv.nonce, string(encryptedMsg)) msgSignature := util.Signature(srv.Token, timestampStr, srv.nonce, string(encryptedMsg))

View File

@@ -15,10 +15,10 @@ func writeContextType(w http.ResponseWriter, value []string) {
} }
} }
//Render render from bytes // Render render from bytes
func (srv *Server) Render(bytes []byte) { func (srv *Server) Render(bytes []byte) {
//debug // debug
//fmt.Println("response msg = ", string(bytes)) // fmt.Println("response msg = ", string(bytes))
srv.Writer.WriteHeader(200) srv.Writer.WriteHeader(200)
_, err := srv.Writer.Write(bytes) _, err := srv.Writer.Write(bytes)
if err != nil { if err != nil {
@@ -26,13 +26,13 @@ func (srv *Server) Render(bytes []byte) {
} }
} }
//String render from string // String render from string
func (srv *Server) String(str string) { func (srv *Server) String(str string) {
writeContextType(srv.Writer, plainContentType) writeContextType(srv.Writer, plainContentType)
srv.Render([]byte(str)) srv.Render([]byte(str))
} }
//XML render to xml // XML render to xml
func (srv *Server) XML(obj interface{}) { func (srv *Server) XML(obj interface{}) {
writeContextType(srv.Writer, xmlContentType) writeContextType(srv.Writer, xmlContentType)
bytes, err := xml.Marshal(obj) bytes, err := xml.Marshal(obj)

View File

@@ -1,5 +1,5 @@
//Package user migrate 用于微信公众号账号迁移获取openID变化 // Package user migrate 用于微信公众号账号迁移获取openID变化
//参考文档https://kf.qq.com/faq/1901177NrqMr190117nqYJze.html // 参考文档https://kf.qq.com/faq/1901177NrqMr190117nqYJze.html
package user package user
import ( import (
@@ -32,7 +32,7 @@ type ChangeOpenIDResultList struct {
// AccessToken 为新账号的AccessToken // AccessToken 为新账号的AccessToken
func (user *User) ListChangeOpenIDs(fromAppID string, openIDs ...string) (list *ChangeOpenIDResultList, err error) { func (user *User) ListChangeOpenIDs(fromAppID string, openIDs ...string) (list *ChangeOpenIDResultList, err error) {
list = &ChangeOpenIDResultList{} list = &ChangeOpenIDResultList{}
//list.List = make([]ChangeOpenIDResult, 0) // list.List = make([]ChangeOpenIDResult, 0)
if len(openIDs) > 100 { if len(openIDs) > 100 {
err = errors.New("openIDs length must be lt 100") err = errors.New("openIDs length must be lt 100")
return return

View File

@@ -18,7 +18,7 @@ const (
tagUserTidListURL = "https://api.weixin.qq.com/cgi-bin/tags/getidlist?access_token=%s" tagUserTidListURL = "https://api.weixin.qq.com/cgi-bin/tags/getidlist?access_token=%s"
) )
//TagInfo 标签信息 // TagInfo 标签信息
type TagInfo struct { type TagInfo struct {
ID int32 `json:"id"` ID int32 `json:"id"`
Name string `json:"name"` Name string `json:"name"`
@@ -34,7 +34,7 @@ type TagOpenIDList struct {
NextOpenID string `json:"next_openid"` NextOpenID string `json:"next_openid"`
} }
//CreateTag 创建标签 // CreateTag 创建标签
func (user *User) CreateTag(tagName string) (tagInfo *TagInfo, err error) { func (user *User) CreateTag(tagName string) (tagInfo *TagInfo, err error) {
var accessToken string var accessToken string
accessToken, err = user.GetAccessToken() accessToken, err = user.GetAccessToken()
@@ -68,7 +68,7 @@ func (user *User) CreateTag(tagName string) (tagInfo *TagInfo, err error) {
return result.Tag, nil return result.Tag, nil
} }
//DeleteTag 删除标签 // DeleteTag 删除标签
func (user *User) DeleteTag(tagID int32) (err error) { func (user *User) DeleteTag(tagID int32) (err error) {
accessToken, err := user.GetAccessToken() accessToken, err := user.GetAccessToken()
if err != nil { if err != nil {
@@ -88,7 +88,7 @@ func (user *User) DeleteTag(tagID int32) (err error) {
return util.DecodeWithCommonError(resp, "DeleteTag") return util.DecodeWithCommonError(resp, "DeleteTag")
} }
//UpdateTag 编辑标签 // UpdateTag 编辑标签
func (user *User) UpdateTag(tagID int32, tagName string) (err error) { func (user *User) UpdateTag(tagID int32, tagName string) (err error) {
accessToken, err := user.GetAccessToken() accessToken, err := user.GetAccessToken()
if err != nil { if err != nil {
@@ -110,7 +110,7 @@ func (user *User) UpdateTag(tagID int32, tagName string) (err error) {
return util.DecodeWithCommonError(resp, "UpdateTag") return util.DecodeWithCommonError(resp, "UpdateTag")
} }
//GetTag 获取公众号已创建的标签 // GetTag 获取公众号已创建的标签
func (user *User) GetTag() (tags []*TagInfo, err error) { func (user *User) GetTag() (tags []*TagInfo, err error) {
accessToken, err := user.GetAccessToken() accessToken, err := user.GetAccessToken()
if err != nil { if err != nil {
@@ -132,7 +132,7 @@ func (user *User) GetTag() (tags []*TagInfo, err error) {
return result.Tags, nil return result.Tags, nil
} }
//OpenIDListByTag 获取标签下粉丝列表 // OpenIDListByTag 获取标签下粉丝列表
func (user *User) OpenIDListByTag(tagID int32, nextOpenID ...string) (userList *TagOpenIDList, err error) { func (user *User) OpenIDListByTag(tagID int32, nextOpenID ...string) (userList *TagOpenIDList, err error) {
accessToken, err := user.GetAccessToken() accessToken, err := user.GetAccessToken()
if err != nil { if err != nil {
@@ -160,7 +160,7 @@ func (user *User) OpenIDListByTag(tagID int32, nextOpenID ...string) (userList *
return return
} }
//BatchTag 批量为用户打标签 // BatchTag 批量为用户打标签
func (user *User) BatchTag(openIDList []string, tagID int32) (err error) { func (user *User) BatchTag(openIDList []string, tagID int32) (err error) {
accessToken, err := user.GetAccessToken() accessToken, err := user.GetAccessToken()
if err != nil { if err != nil {
@@ -184,7 +184,7 @@ func (user *User) BatchTag(openIDList []string, tagID int32) (err error) {
return util.DecodeWithCommonError(resp, "BatchTag") return util.DecodeWithCommonError(resp, "BatchTag")
} }
//BatchUntag 批量为用户取消标签 // BatchUntag 批量为用户取消标签
func (user *User) BatchUntag(openIDList []string, tagID int32) (err error) { func (user *User) BatchUntag(openIDList []string, tagID int32) (err error) {
if len(openIDList) == 0 { if len(openIDList) == 0 {
return return
@@ -208,7 +208,7 @@ func (user *User) BatchUntag(openIDList []string, tagID int32) (err error) {
return util.DecodeWithCommonError(resp, "BatchUntag") return util.DecodeWithCommonError(resp, "BatchUntag")
} }
//UserTidList 获取用户身上的标签列表 // UserTidList 获取用户身上的标签列表
func (user *User) UserTidList(openID string) (tagIDList []int32, err error) { func (user *User) UserTidList(openID string) (tagIDList []int32, err error) {
accessToken, err := user.GetAccessToken() accessToken, err := user.GetAccessToken()
if err != nil { if err != nil {

View File

@@ -15,19 +15,19 @@ const (
userListURL = "https://api.weixin.qq.com/cgi-bin/user/get" userListURL = "https://api.weixin.qq.com/cgi-bin/user/get"
) )
//User 用户管理 // User 用户管理
type User struct { type User struct {
*context.Context *context.Context
} }
//NewUser 实例化 // NewUser 实例化
func NewUser(context *context.Context) *User { func NewUser(context *context.Context) *User {
user := new(User) user := new(User)
user.Context = context user.Context = context
return user return user
} }
//Info 用户基本信息 // Info 用户基本信息
type Info struct { type Info struct {
util.CommonError util.CommonError
@@ -62,7 +62,7 @@ type OpenidList struct {
NextOpenID string `json:"next_openid"` NextOpenID string `json:"next_openid"`
} }
//GetUserInfo 获取用户基本信息 // GetUserInfo 获取用户基本信息
func (user *User) GetUserInfo(openID string) (userInfo *Info, err error) { func (user *User) GetUserInfo(openID string) (userInfo *Info, err error) {
var accessToken string var accessToken string
accessToken, err = user.GetAccessToken() accessToken, err = user.GetAccessToken()

View File

@@ -2,33 +2,33 @@ package account
import "github.com/silenceper/wechat/v2/openplatform/context" import "github.com/silenceper/wechat/v2/openplatform/context"
//Account 开放平台张哈管理 // Account 开放平台张哈管理
//TODO 实现方法 // TODO 实现方法
type Account struct { type Account struct {
*context.Context *context.Context
} }
//NewAccount new // NewAccount new
func NewAccount(ctx *context.Context) *Account { func NewAccount(ctx *context.Context) *Account {
return &Account{ctx} return &Account{ctx}
} }
//Create 创建开放平台帐号并绑定公众号/小程序 // Create 创建开放平台帐号并绑定公众号/小程序
func (account *Account) Create(appID string) (string, error) { func (account *Account) Create(appID string) (string, error) {
return "", nil return "", nil
} }
//Bind 将公众号/小程序绑定到开放平台帐号下 // Bind 将公众号/小程序绑定到开放平台帐号下
func (account *Account) Bind(appID string) error { func (account *Account) Bind(appID string) error {
return nil return nil
} }
//Unbind 将公众号/小程序从开放平台帐号下解绑 // Unbind 将公众号/小程序从开放平台帐号下解绑
func (account *Account) Unbind(appID string, openAppID string) error { func (account *Account) Unbind(appID string, openAppID string) error {
return nil return nil
} }
//Get 获取公众号/小程序所绑定的开放平台帐号 // Get 获取公众号/小程序所绑定的开放平台帐号
func (account *Account) Get(appID string) (string, error) { func (account *Account) Get(appID string) (string, error) {
return "", nil return "", nil
} }

View File

@@ -4,11 +4,11 @@ import (
"github.com/silenceper/wechat/v2/cache" "github.com/silenceper/wechat/v2/cache"
) )
//Config config for 微信开放平台 // Config .config for 微信开放平台
type Config struct { type Config struct {
AppID string `json:"app_id"` //appid AppID string `json:"app_id"` // appid
AppSecret string `json:"app_secret"` //appsecret AppSecret string `json:"app_secret"` // appsecret
Token string `json:"token"` //token Token string `json:"token"` // token
EncodingAESKey string `json:"encoding_aes_key"` //EncodingAESKey EncodingAESKey string `json:"encoding_aes_key"` // EncodingAESKey
Cache cache.Cache Cache cache.Cache
} }

View File

@@ -1,4 +1,4 @@
//Package context 开放平台相关context // Package context 开放平台相关context
package context package context
import ( import (
@@ -18,10 +18,10 @@ const (
getComponentInfoURL = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token=%s" getComponentInfoURL = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token=%s"
componentLoginURL = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=%s&pre_auth_code=%s&redirect_uri=%s&auth_type=%d&biz_appid=%s" componentLoginURL = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=%s&pre_auth_code=%s&redirect_uri=%s&auth_type=%d&biz_appid=%s"
bindComponentURL = "https://mp.weixin.qq.com/safe/bindcomponent?action=bindcomponent&auth_type=%d&no_scan=1&component_appid=%s&pre_auth_code=%s&redirect_uri=%s&biz_appid=%s#wechat_redirect" bindComponentURL = "https://mp.weixin.qq.com/safe/bindcomponent?action=bindcomponent&auth_type=%d&no_scan=1&component_appid=%s&pre_auth_code=%s&redirect_uri=%s&biz_appid=%s#wechat_redirect"
//TODO 获取授权方选项信息 // TODO 获取授权方选项信息
//getComponentConfigURL = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_option?component_access_token=%s" // getComponentConfigURL = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_option?component_access_token=%s"
//TODO 获取已授权的账号信息 // TODO 获取已授权的账号信息
//getuthorizerListURL = "POST https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_list?component_access_token=%s" // getuthorizerListURL = "POST https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_list?component_access_token=%s"
) )
// ComponentAccessToken 第三方平台 // ComponentAccessToken 第三方平台

View File

@@ -11,23 +11,23 @@ const (
getAccountBasicInfoURL = "https://api.weixin.qq.com/cgi-bin/account/getaccountbasicinfo" getAccountBasicInfoURL = "https://api.weixin.qq.com/cgi-bin/account/getaccountbasicinfo"
) )
//Basic 基础信息设置 // Basic 基础信息设置
type Basic struct { type Basic struct {
*openContext.Context *openContext.Context
appID string appID string
} }
//NewBasic new // NewBasic new
func NewBasic(opContext *openContext.Context, appID string) *Basic { func NewBasic(opContext *openContext.Context, appID string) *Basic {
return &Basic{Context: opContext, appID: appID} return &Basic{Context: opContext, appID: appID}
} }
//AccountBasicInfo 基础信息 // AccountBasicInfo 基础信息
type AccountBasicInfo struct { type AccountBasicInfo struct {
util.CommonError util.CommonError
} }
//GetAccountBasicInfo 获取小程序基础信息 // GetAccountBasicInfo 获取小程序基础信息
//reference:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/Mini_Program_Information_Settings.html //reference:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/Mini_Program_Information_Settings.html
func (basic *Basic) GetAccountBasicInfo() (*AccountBasicInfo, error) { func (basic *Basic) GetAccountBasicInfo() (*AccountBasicInfo, error) {
ak, err := basic.GetAuthrAccessToken(basic.AppID) ak, err := basic.GetAuthrAccessToken(basic.AppID)
@@ -46,7 +46,7 @@ func (basic *Basic) GetAccountBasicInfo() (*AccountBasicInfo, error) {
return result, nil return result, nil
} }
//modify_domain设置服务器域名 // modify_domain设置服务器域名
//TODO // TODO
//func (encryptor *Basic) modifyDomain() { // func (encryptor *Basic) modifyDomain() {
//} // }

View File

@@ -11,28 +11,28 @@ const (
fastregisterweappURL = "https://api.weixin.qq.com/cgi-bin/component/fastregisterweapp" fastregisterweappURL = "https://api.weixin.qq.com/cgi-bin/component/fastregisterweapp"
) )
//Component 快速创建小程序 // Component 快速创建小程序
type Component struct { type Component struct {
*openContext.Context *openContext.Context
} }
//NewComponent new // NewComponent new
func NewComponent(opContext *openContext.Context) *Component { func NewComponent(opContext *openContext.Context) *Component {
return &Component{opContext} return &Component{opContext}
} }
//RegisterMiniProgramParam 快速注册小程序参数 // RegisterMiniProgramParam 快速注册小程序参数
type RegisterMiniProgramParam struct { type RegisterMiniProgramParam struct {
Name string `json:"name"` //企业名 Name string `json:"name"` // 企业名
Code string `json:"code"` //企业代码 Code string `json:"code"` // 企业代码
CodeType string `json:"code_type"` //企业代码类型 1统一社会信用代码18 位) 2组织机构代码9 位 xxxxxxxx-x 3营业执照注册号(15 位) CodeType string `json:"code_type"` // 企业代码类型 1统一社会信用代码18 位) 2组织机构代码9 位 xxxxxxxx-x 3营业执照注册号(15 位)
LegalPersonaWechat string `json:"legal_persona_wechat"` //法人微信号 LegalPersonaWechat string `json:"legal_persona_wechat"` // 法人微信号
LegalPersonaName string `json:"legal_persona_name"` //法人姓名(绑定银行卡) LegalPersonaName string `json:"legal_persona_name"` // 法人姓名(绑定银行卡)
ComponentPhone string `json:"component_phone"` //第三方联系电话(方便法人与第三方联系) ComponentPhone string `json:"component_phone"` // 第三方联系电话(方便法人与第三方联系)
} }
//RegisterMiniProgram 快速创建小程 // RegisterMiniProgram 快速创建小程
//reference: https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/Fast_Registration_Interface_document.html // reference: https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Mini_Programs/Fast_Registration_Interface_document.html
func (component *Component) RegisterMiniProgram(param *RegisterMiniProgramParam) error { func (component *Component) RegisterMiniProgram(param *RegisterMiniProgramParam) error {
componentAK, err := component.GetComponentAccessToken() componentAK, err := component.GetComponentAccessToken()
if err != nil { if err != nil {
@@ -46,15 +46,15 @@ func (component *Component) RegisterMiniProgram(param *RegisterMiniProgramParam)
return util.DecodeWithCommonError(data, "component/fastregisterweapp?action=create") return util.DecodeWithCommonError(data, "component/fastregisterweapp?action=create")
} }
//GetRegistrationStatusParam 查询任务创建状态 // GetRegistrationStatusParam 查询任务创建状态
type GetRegistrationStatusParam struct { type GetRegistrationStatusParam struct {
Name string `json:"name"` //企业名 Name string `json:"name"` // 企业名
LegalPersonaWechat string `json:"legal_persona_wechat"` //法人微信号 LegalPersonaWechat string `json:"legal_persona_wechat"` // 法人微信号
LegalPersonaName string `json:"legal_persona_name"` //法人姓名(绑定银行卡) LegalPersonaName string `json:"legal_persona_name"` // 法人姓名(绑定银行卡)
} }
//GetRegistrationStatus 查询创建任务状态. // GetRegistrationStatus 查询创建任务状态.
func (component *Component) GetRegistrationStatus(param *GetRegistrationStatusParam) error { func (component *Component) GetRegistrationStatus(param *GetRegistrationStatusParam) error {
componentAK, err := component.GetComponentAccessToken() componentAK, err := component.GetComponentAccessToken()
if err != nil { if err != nil {

View File

@@ -6,13 +6,13 @@ import (
"github.com/silenceper/wechat/v2/openplatform/miniprogram/component" "github.com/silenceper/wechat/v2/openplatform/miniprogram/component"
) )
//MiniProgram 代小程序实现业务 // MiniProgram 代小程序实现业务
type MiniProgram struct { type MiniProgram struct {
AppID string AppID string
openContext *openContext.Context openContext *openContext.Context
} }
//NewMiniProgram 实例化 // NewMiniProgram 实例化
func NewMiniProgram(opCtx *openContext.Context, appID string) *MiniProgram { func NewMiniProgram(opCtx *openContext.Context, appID string) *MiniProgram {
return &MiniProgram{ return &MiniProgram{
openContext: opCtx, openContext: opCtx,
@@ -20,13 +20,13 @@ func NewMiniProgram(opCtx *openContext.Context, appID string) *MiniProgram {
} }
} }
//GetComponent get component // GetComponent get component
//快速注册小程序相关 // 快速注册小程序相关
func (miniProgram *MiniProgram) GetComponent() *component.Component { func (miniProgram *MiniProgram) GetComponent() *component.Component {
return component.NewComponent(miniProgram.openContext) return component.NewComponent(miniProgram.openContext)
} }
//GetBasic 基础信息设置 // GetBasic 基础信息设置
func (miniProgram *MiniProgram) GetBasic() *basic.Basic { func (miniProgram *MiniProgram) GetBasic() *basic.Basic {
return basic.NewBasic(miniProgram.openContext, miniProgram.AppID) return basic.NewBasic(miniProgram.openContext, miniProgram.AppID)
} }

View File

@@ -15,7 +15,7 @@ type Js struct {
credential.JsTicketHandle credential.JsTicketHandle
} }
//NewJs init // NewJs init
func NewJs(context *context.Context, appID string) *Js { func NewJs(context *context.Context, appID string) *Js {
js := new(Js) js := new(Js)
js.Context = context js.Context = context
@@ -24,13 +24,13 @@ func NewJs(context *context.Context, appID string) *Js {
return js return js
} }
//SetJsTicketHandle 自定义js ticket取值方式 // SetJsTicketHandle 自定义js ticket取值方式
func (js *Js) SetJsTicketHandle(ticketHandle credential.JsTicketHandle) { func (js *Js) SetJsTicketHandle(ticketHandle credential.JsTicketHandle) {
js.JsTicketHandle = ticketHandle js.JsTicketHandle = ticketHandle
} }
//GetConfig 第三方平台 - 获取jssdk需要的配置参数 // GetConfig 第三方平台 - 获取jssdk需要的配置参数
//uri 为当前网页地址 // uri 为当前网页地址
func (js *Js) GetConfig(uri, appid string) (config *officialJs.Config, err error) { func (js *Js) GetConfig(uri, appid string) (config *officialJs.Config, err error) {
config = new(officialJs.Config) config = new(officialJs.Config)
var accessToken string var accessToken string

View File

@@ -28,14 +28,14 @@ func NewOauth(context *context.Context) *Oauth {
return auth return auth
} }
//GetRedirectURL 第三方平台 - 获取跳转的url地址 // GetRedirectURL 第三方平台 - 获取跳转的url地址
func (oauth *Oauth) GetRedirectURL(redirectURI, scope, state, appID string) (string, error) { func (oauth *Oauth) GetRedirectURL(redirectURI, scope, state, appID string) (string, error) {
//url encode // url encode
urlStr := url.QueryEscape(redirectURI) urlStr := url.QueryEscape(redirectURI)
return fmt.Sprintf(platformRedirectOauthURL, appID, urlStr, scope, state, oauth.AppID), nil return fmt.Sprintf(platformRedirectOauthURL, appID, urlStr, scope, state, oauth.AppID), nil
} }
//Redirect 第三方平台 - 跳转到网页授权 // Redirect 第三方平台 - 跳转到网页授权
func (oauth *Oauth) Redirect(writer http.ResponseWriter, req *http.Request, redirectURI, scope, state, appID string) error { func (oauth *Oauth) Redirect(writer http.ResponseWriter, req *http.Request, redirectURI, scope, state, appID string) error {
location, err := oauth.GetRedirectURL(redirectURI, scope, state, appID) location, err := oauth.GetRedirectURL(redirectURI, scope, state, appID)
if err != nil { if err != nil {

View File

@@ -9,15 +9,15 @@ import (
"github.com/silenceper/wechat/v2/openplatform/officialaccount/oauth" "github.com/silenceper/wechat/v2/openplatform/officialaccount/oauth"
) )
//OfficialAccount 代公众号实现业务 // OfficialAccount 代公众号实现业务
type OfficialAccount struct { type OfficialAccount struct {
//授权的公众号的appID // 授权的公众号的appID
appID string appID string
*officialaccount.OfficialAccount *officialaccount.OfficialAccount
} }
//NewOfficialAccount 实例化 // NewOfficialAccount 实例化
//appID :为授权方公众号 APPID非开放平台第三方平台 APPID // appID :为授权方公众号 APPID非开放平台第三方平台 APPID
func NewOfficialAccount(opCtx *opContext.Context, appID string) *OfficialAccount { func NewOfficialAccount(opCtx *opContext.Context, appID string) *OfficialAccount {
officialAccount := officialaccount.NewOfficialAccount(&offConfig.Config{ officialAccount := officialaccount.NewOfficialAccount(&offConfig.Config{
AppID: opCtx.AppID, AppID: opCtx.AppID,
@@ -25,7 +25,7 @@ func NewOfficialAccount(opCtx *opContext.Context, appID string) *OfficialAccount
Token: opCtx.Token, Token: opCtx.Token,
Cache: opCtx.Cache, Cache: opCtx.Cache,
}) })
//设置获取access_token的函数 // 设置获取access_token的函数
officialAccount.SetAccessTokenHandle(NewDefaultAuthrAccessToken(opCtx, appID)) officialAccount.SetAccessTokenHandle(NewDefaultAuthrAccessToken(opCtx, appID))
return &OfficialAccount{appID: appID, OfficialAccount: officialAccount} return &OfficialAccount{appID: appID, OfficialAccount: officialAccount}
} }
@@ -40,13 +40,13 @@ func (officialAccount *OfficialAccount) PlatformJs() *js.Js {
return js.NewJs(officialAccount.GetContext(), officialAccount.appID) return js.NewJs(officialAccount.GetContext(), officialAccount.appID)
} }
//DefaultAuthrAccessToken 默认获取授权ak的方法 // DefaultAuthrAccessToken 默认获取授权ak的方法
type DefaultAuthrAccessToken struct { type DefaultAuthrAccessToken struct {
opCtx *opContext.Context opCtx *opContext.Context
appID string appID string
} }
//NewDefaultAuthrAccessToken New // NewDefaultAuthrAccessToken New
func NewDefaultAuthrAccessToken(opCtx *opContext.Context, appID string) credential.AccessTokenHandle { func NewDefaultAuthrAccessToken(opCtx *opContext.Context, appID string) credential.AccessTokenHandle {
return &DefaultAuthrAccessToken{ return &DefaultAuthrAccessToken{
opCtx: opCtx, opCtx: opCtx,
@@ -54,7 +54,7 @@ func NewDefaultAuthrAccessToken(opCtx *opContext.Context, appID string) credenti
} }
} }
//GetAccessToken 获取ak // GetAccessToken 获取ak
func (ak *DefaultAuthrAccessToken) GetAccessToken() (string, error) { func (ak *DefaultAuthrAccessToken) GetAccessToken() (string, error) {
return ak.opCtx.GetAuthrAccessToken(ak.appID) return ak.opCtx.GetAuthrAccessToken(ak.appID)
} }

View File

@@ -11,12 +11,12 @@ import (
"github.com/silenceper/wechat/v2/openplatform/officialaccount" "github.com/silenceper/wechat/v2/openplatform/officialaccount"
) )
//OpenPlatform 微信开放平台相关api // OpenPlatform 微信开放平台相关api
type OpenPlatform struct { type OpenPlatform struct {
*context.Context *context.Context
} }
//NewOpenPlatform new openplatform // NewOpenPlatform new openplatform
func NewOpenPlatform(cfg *config.Config) *OpenPlatform { func NewOpenPlatform(cfg *config.Config) *OpenPlatform {
if cfg.Cache == nil { if cfg.Cache == nil {
panic("cache 未设置") panic("cache 未设置")
@@ -27,24 +27,24 @@ func NewOpenPlatform(cfg *config.Config) *OpenPlatform {
return &OpenPlatform{ctx} return &OpenPlatform{ctx}
} }
//GetServer get server // GetServer get server
func (openPlatform *OpenPlatform) GetServer(req *http.Request, writer http.ResponseWriter) *server.Server { func (openPlatform *OpenPlatform) GetServer(req *http.Request, writer http.ResponseWriter) *server.Server {
off := officialaccount.NewOfficialAccount(openPlatform.Context, "") off := officialaccount.NewOfficialAccount(openPlatform.Context, "")
return off.GetServer(req, writer) return off.GetServer(req, writer)
} }
//GetOfficialAccount 公众号代处理 // GetOfficialAccount 公众号代处理
func (openPlatform *OpenPlatform) GetOfficialAccount(appID string) *officialaccount.OfficialAccount { func (openPlatform *OpenPlatform) GetOfficialAccount(appID string) *officialaccount.OfficialAccount {
return officialaccount.NewOfficialAccount(openPlatform.Context, appID) return officialaccount.NewOfficialAccount(openPlatform.Context, appID)
} }
//GetMiniProgram 小程序代理 // GetMiniProgram 小程序代理
func (openPlatform *OpenPlatform) GetMiniProgram(appID string) *miniprogram.MiniProgram { func (openPlatform *OpenPlatform) GetMiniProgram(appID string) *miniprogram.MiniProgram {
return miniprogram.NewMiniProgram(openPlatform.Context, appID) return miniprogram.NewMiniProgram(openPlatform.Context, appID)
} }
//GetAccountManager 账号管理 // GetAccountManager 账号管理
//TODO // TODO
func (openPlatform *OpenPlatform) GetAccountManager() *account.Account { func (openPlatform *OpenPlatform) GetAccountManager() *account.Account {
return account.NewAccount(openPlatform.Context) return account.NewAccount(openPlatform.Context)
} }

View File

@@ -1,6 +1,6 @@
package config package config
// Config config for pay // Config .config for pay
type Config struct { type Config struct {
AppID string `json:"app_id"` AppID string `json:"app_id"`
MchID string `json:"mch_id"` MchID string `json:"mch_id"`

View File

@@ -4,12 +4,12 @@ import (
"github.com/silenceper/wechat/v2/pay/config" "github.com/silenceper/wechat/v2/pay/config"
) )
//Notify 回调 // Notify 回调
type Notify struct { type Notify struct {
*config.Config *config.Config
} }
//NewNotify new // NewNotify new
func NewNotify(cfg *config.Config) *Notify { func NewNotify(cfg *config.Config) *Notify {
return &Notify{cfg} return &Notify{cfg}
} }

View File

@@ -172,9 +172,9 @@ func (o *Order) BridgeConfig(p *Params) (cfg Config, err error) {
// BridgeAppConfig get app bridge config // BridgeAppConfig get app bridge config
func (o *Order) BridgeAppConfig(p *Params) (cfg ConfigForApp, err error) { func (o *Order) BridgeAppConfig(p *Params) (cfg ConfigForApp, err error) {
var ( var (
timestamp string = strconv.FormatInt(time.Now().Unix(), 10) timestamp = strconv.FormatInt(time.Now().Unix(), 10)
noncestr string = util.RandomStr(32) noncestr = util.RandomStr(32)
_package string = "Sign=WXPay" _package = "Sign=WXPay"
) )
order, err := o.PrePayOrder(p) order, err := o.PrePayOrder(p)
if err != nil { if err != nil {

View File

@@ -8,12 +8,12 @@ import (
"github.com/silenceper/wechat/v2/pay/transfer" "github.com/silenceper/wechat/v2/pay/transfer"
) )
//Pay 微信支付相关API // Pay 微信支付相关API
type Pay struct { type Pay struct {
cfg *config.Config cfg *config.Config
} }
//NewPay 实例化微信支付相关API // NewPay 实例化微信支付相关API
func NewPay(cfg *config.Config) *Pay { func NewPay(cfg *config.Config) *Pay {
return &Pay{cfg} return &Pay{cfg}
} }

View File

@@ -24,7 +24,7 @@ func NewTransfer(cfg *config.Config) *Transfer {
return &transfer return &transfer
} }
//Params 调用参数 // Params 调用参数
type Params struct { type Params struct {
DeviceInfo string DeviceInfo string
PartnerTradeNo string PartnerTradeNo string
@@ -34,10 +34,10 @@ type Params struct {
Amount int Amount int
Desc string Desc string
SpbillCreateIP string SpbillCreateIP string
RootCa string //ca证书 RootCa string // ca证书
} }
//request 接口请求参数 // request 接口请求参数
type request struct { type request struct {
AppID string `xml:"mch_appid"` AppID string `xml:"mch_appid"`
MchID string `xml:"mchid"` MchID string `xml:"mchid"`
@@ -53,7 +53,7 @@ type request struct {
SpbillCreateIP string `xml:"spbill_create_ip,omitempty"` SpbillCreateIP string `xml:"spbill_create_ip,omitempty"`
} }
//Response 接口返回 // Response 接口返回
type Response struct { type Response struct {
ReturnCode string `xml:"return_code"` ReturnCode string `xml:"return_code"`
ReturnMsg string `xml:"return_msg"` ReturnMsg string `xml:"return_msg"`
@@ -69,7 +69,7 @@ type Response struct {
PaymentTime string `xml:"payment_time"` PaymentTime string `xml:"payment_time"`
} }
//WalletTransfer 付款到零钱 // WalletTransfer 付款到零钱
func (transfer *Transfer) WalletTransfer(p *Params) (rsp Response, err error) { func (transfer *Transfer) WalletTransfer(p *Params) (rsp Response, err error) {
nonceStr := util.RandomStr(32) nonceStr := util.RandomStr(32)
param := make(map[string]string) param := make(map[string]string)

View File

@@ -40,7 +40,7 @@ func EncryptMsg(random, rawXMLMsg []byte, appID, aesKey string) (encrtptMsg []by
} }
// AESEncryptMsg ciphertext = AES_Encrypt[random(16B) + msg_len(4B) + rawXMLMsg + appId] // AESEncryptMsg ciphertext = AES_Encrypt[random(16B) + msg_len(4B) + rawXMLMsg + appId]
//参考github.com/chanxuehong/wechat.v2 // 参考github.com/chanxuehong/wechat.v2
func AESEncryptMsg(random, rawXMLMsg []byte, appID string, aesKey []byte) (ciphertext []byte) { func AESEncryptMsg(random, rawXMLMsg []byte, appID string, aesKey []byte) (ciphertext []byte) {
const ( const (
BlockSize = 32 // PKCS#7 BlockSize = 32 // PKCS#7
@@ -123,7 +123,7 @@ func aesKeyDecode(encodedAESKey string) (key []byte, err error) {
} }
// AESDecryptMsg ciphertext = AES_Encrypt[random(16B) + msg_len(4B) + rawXMLMsg + appId] // AESDecryptMsg ciphertext = AES_Encrypt[random(16B) + msg_len(4B) + rawXMLMsg + appId]
//参考github.com/chanxuehong/wechat.v2 // 参考github.com/chanxuehong/wechat.v2
func AESDecryptMsg(ciphertext []byte, aesKey []byte) (random, rawXMLMsg, appID []byte, err error) { func AESDecryptMsg(ciphertext []byte, aesKey []byte) (random, rawXMLMsg, appID []byte, err error) {
const ( const (
BlockSize = 32 // PKCS#7 BlockSize = 32 // PKCS#7

View File

@@ -17,7 +17,7 @@ import (
"golang.org/x/crypto/pkcs12" "golang.org/x/crypto/pkcs12"
) )
//HTTPGet get 请求 // HTTPGet get 请求
func HTTPGet(uri string) ([]byte, error) { func HTTPGet(uri string) ([]byte, error) {
response, err := http.Get(uri) response, err := http.Get(uri)
if err != nil { if err != nil {
@@ -31,7 +31,7 @@ func HTTPGet(uri string) ([]byte, error) {
return ioutil.ReadAll(response.Body) return ioutil.ReadAll(response.Body)
} }
//HTTPPost post 请求 // HTTPPost post 请求
func HTTPPost(uri string, data string) ([]byte, error) { func HTTPPost(uri string, data string) ([]byte, error) {
body := bytes.NewBuffer([]byte(data)) body := bytes.NewBuffer([]byte(data))
response, err := http.Post(uri, "", body) response, err := http.Post(uri, "", body)
@@ -46,7 +46,7 @@ func HTTPPost(uri string, data string) ([]byte, error) {
return ioutil.ReadAll(response.Body) return ioutil.ReadAll(response.Body)
} }
//PostJSON post json 数据请求 // PostJSON post json 数据请求
func PostJSON(uri string, obj interface{}) ([]byte, error) { func PostJSON(uri string, obj interface{}) ([]byte, error) {
jsonBuf := new(bytes.Buffer) jsonBuf := new(bytes.Buffer)
enc := json.NewEncoder(jsonBuf) enc := json.NewEncoder(jsonBuf)
@@ -91,7 +91,7 @@ func PostJSONWithRespContentType(uri string, obj interface{}) ([]byte, string, e
return responseData, contentType, err return responseData, contentType, err
} }
//PostFile 上传文件 // PostFile 上传文件
func PostFile(fieldname, filename, uri string) ([]byte, error) { func PostFile(fieldname, filename, uri string) ([]byte, error) {
fields := []MultipartFormField{ fields := []MultipartFormField{
{ {
@@ -103,7 +103,7 @@ func PostFile(fieldname, filename, uri string) ([]byte, error) {
return PostMultipartForm(fields, uri) return PostMultipartForm(fields, uri)
} }
//MultipartFormField 保存文件或其他字段信息 // MultipartFormField 保存文件或其他字段信息
type MultipartFormField struct { type MultipartFormField struct {
IsFile bool IsFile bool
Fieldname string Fieldname string
@@ -111,7 +111,7 @@ type MultipartFormField struct {
Filename string Filename string
} }
//PostMultipartForm 上传文件或其他多个字段 // PostMultipartForm 上传文件或其他多个字段
func PostMultipartForm(fields []MultipartFormField, uri string) (respBody []byte, err error) { func PostMultipartForm(fields []MultipartFormField, uri string) (respBody []byte, err error) {
bodyBuf := &bytes.Buffer{} bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf) bodyWriter := multipart.NewWriter(bodyBuf)
@@ -163,7 +163,7 @@ func PostMultipartForm(fields []MultipartFormField, uri string) (respBody []byte
return return
} }
//PostXML perform a HTTP/POST request with XML body // PostXML perform a HTTP/POST request with XML body
func PostXML(uri string, obj interface{}) ([]byte, error) { func PostXML(uri string, obj interface{}) ([]byte, error) {
xmlData, err := xml.Marshal(obj) xmlData, err := xml.Marshal(obj)
if err != nil { if err != nil {
@@ -183,7 +183,7 @@ func PostXML(uri string, obj interface{}) ([]byte, error) {
return ioutil.ReadAll(response.Body) return ioutil.ReadAll(response.Body)
} }
//httpWithTLS CA证书 // httpWithTLS CA证书
func httpWithTLS(rootCa, key string) (*http.Client, error) { func httpWithTLS(rootCa, key string) (*http.Client, error) {
var client *http.Client var client *http.Client
certData, err := ioutil.ReadFile(rootCa) certData, err := ioutil.ReadFile(rootCa)
@@ -202,7 +202,7 @@ func httpWithTLS(rootCa, key string) (*http.Client, error) {
return client, nil return client, nil
} }
//pkcs12ToPem 将Pkcs12转成Pem // pkcs12ToPem 将Pkcs12转成Pem
func pkcs12ToPem(p12 []byte, password string) tls.Certificate { func pkcs12ToPem(p12 []byte, password string) tls.Certificate {
blocks, err := pkcs12.ToPEM(p12, password) blocks, err := pkcs12.ToPEM(p12, password)
defer func() { defer func() {
@@ -224,7 +224,7 @@ func pkcs12ToPem(p12 []byte, password string) tls.Certificate {
return cert return cert
} }
//PostXMLWithTLS perform a HTTP/POST request with XML body and TLS // PostXMLWithTLS perform a HTTP/POST request with XML body and TLS
func PostXMLWithTLS(uri string, obj interface{}, ca, key string) ([]byte, error) { func PostXMLWithTLS(uri string, obj interface{}, ca, key string) ([]byte, error) {
xmlData, err := xml.Marshal(obj) xmlData, err := xml.Marshal(obj)
if err != nil { if err != nil {

View File

@@ -7,7 +7,7 @@ import (
"sort" "sort"
) )
//Signature sha1签名 // Signature sha1签名
func Signature(params ...string) string { func Signature(params ...string) string {
sort.Strings(params) sort.Strings(params)
h := sha1.New() h := sha1.New()

View File

@@ -3,7 +3,7 @@ package util
import "testing" import "testing"
func TestSignature(t *testing.T) { func TestSignature(t *testing.T) {
//abc sig // abc sig
abc := "a9993e364706816aba3e25717850c26c9cd0d89d" abc := "a9993e364706816aba3e25717850c26c9cd0d89d"
if abc != Signature("a", "b", "c") { if abc != Signature("a", "b", "c") {
t.Error("test Signature Error") t.Error("test Signature Error")

View File

@@ -5,7 +5,7 @@ import (
"time" "time"
) )
//RandomStr 随机生成字符串 // RandomStr 随机生成字符串
func RandomStr(length int) string { func RandomStr(length int) string {
str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
bytes := []byte(str) bytes := []byte(str)

View File

@@ -2,7 +2,7 @@ package util
import "time" import "time"
//GetCurrTS return current timestamps // GetCurrTS return current timestamps
func GetCurrTS() int64 { func GetCurrTS() int64 {
return time.Now().Unix() return time.Now().Unix()
} }

View File

@@ -1,6 +1,6 @@
package util package util
//SliceChunk 用于将字符串切片分块 // SliceChunk 用于将字符串切片分块
func SliceChunk(src []string, chunkSize int) (chunks [][]string) { func SliceChunk(src []string, chunkSize int) (chunks [][]string) {
total := len(src) total := len(src)
chunks = make([][]string, 0) chunks = make([][]string, 0)

View File

@@ -39,12 +39,12 @@ func NewWechat() *Wechat {
return &Wechat{} return &Wechat{}
} }
//SetCache 设置cache // SetCache 设置cache
func (wc *Wechat) SetCache(cahce cache.Cache) { func (wc *Wechat) SetCache(cahce cache.Cache) {
wc.cache = cahce wc.cache = cahce
} }
//GetOfficialAccount 获取微信公众号实例 // GetOfficialAccount 获取微信公众号实例
func (wc *Wechat) GetOfficialAccount(cfg *offConfig.Config) *officialaccount.OfficialAccount { func (wc *Wechat) GetOfficialAccount(cfg *offConfig.Config) *officialaccount.OfficialAccount {
if cfg.Cache == nil { if cfg.Cache == nil {
cfg.Cache = wc.cache cfg.Cache = wc.cache

View File

@@ -8,7 +8,7 @@ import (
) )
const ( const (
//获取会话状态 // 获取会话状态
serviceStateGetAddr = "https://qyapi.weixin.qq.com/cgi-bin/kf/service_state/get?access_token=%s" serviceStateGetAddr = "https://qyapi.weixin.qq.com/cgi-bin/kf/service_state/get?access_token=%s"
// 变更会话状态 // 变更会话状态
serviceStateTransAddr = "https://qyapi.weixin.qq.com/cgi-bin/kf/service_state/trans?access_token=%s" serviceStateTransAddr = "https://qyapi.weixin.qq.com/cgi-bin/kf/service_state/trans?access_token=%s"
@@ -28,11 +28,11 @@ type ServiceStateGetSchema struct {
} }
// ServiceStateGet 获取会话状态 // ServiceStateGet 获取会话状态
//0 未处理 新会话接入。可选择1.直接用API自动回复消息。2.放进待接入池等待接待人员接待。3.指定接待人员进行接待 // 0 未处理 新会话接入。可选择1.直接用API自动回复消息。2.放进待接入池等待接待人员接待。3.指定接待人员进行接待
//1 由智能助手接待 可使用API回复消息。可选择转入待接入池或者指定接待人员处理。 // 1 由智能助手接待 可使用API回复消息。可选择转入待接入池或者指定接待人员处理。
//2 待接入池排队中 在待接入池中排队等待接待人员接入。可选择转为指定人员接待 // 2 待接入池排队中 在待接入池中排队等待接待人员接入。可选择转为指定人员接待
//3 由人工接待 人工接待中。可选择结束会话 // 3 由人工接待 人工接待中。可选择结束会话
//4 已结束 会话已经结束或未开始。不允许变更会话状态,等待用户发起咨询 // 4 已结束 会话已经结束或未开始。不允许变更会话状态,等待用户发起咨询
// 注一个微信用户向一个客服帐号发起咨询后在48h内或主动结束会话前包括接待人员手动结束或企业通过API结束会话都算是一次会话 // 注一个微信用户向一个客服帐号发起咨询后在48h内或主动结束会话前包括接待人员手动结束或企业通过API结束会话都算是一次会话
func (r *Client) ServiceStateGet(options ServiceStateGetOptions) (info ServiceStateGetSchema, err error) { func (r *Client) ServiceStateGet(options ServiceStateGetOptions) (info ServiceStateGetSchema, err error) {
var ( var (

View File

@@ -1,6 +1,7 @@
//go:build linux && cgo && msgaudit
// +build linux,cgo,msgaudit // +build linux,cgo,msgaudit
//Package msgaudit only for linux // Package msgaudit only for linux
package msgaudit package msgaudit
// #cgo LDFLAGS: -L${SRCDIR}/lib -lWeWorkFinanceSdk_C // #cgo LDFLAGS: -L${SRCDIR}/lib -lWeWorkFinanceSdk_C

View File

@@ -1,6 +1,7 @@
//go:build !linux || !cgo || !msgaudit
// +build !linux !cgo !msgaudit // +build !linux !cgo !msgaudit
//Package msgaudit for unsupport platform // Package msgaudit for unsupport platform
package msgaudit package msgaudit
import ( import (

View File

@@ -9,30 +9,30 @@ import (
"github.com/silenceper/wechat/v2/work/context" "github.com/silenceper/wechat/v2/work/context"
) )
//Oauth auth // Oauth auth
type Oauth struct { type Oauth struct {
*context.Context *context.Context
} }
var ( var (
//oauthTargetURL 企业微信内跳转地址 // oauthTargetURL 企业微信内跳转地址
oauthTargetURL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect" oauthTargetURL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect"
//oauthUserInfoURL 获取用户信息地址 // oauthUserInfoURL 获取用户信息地址
oauthUserInfoURL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=%s&code=%s" oauthUserInfoURL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=%s&code=%s"
//oauthQrContentTargetURL 构造独立窗口登录二维码 // oauthQrContentTargetURL 构造独立窗口登录二维码
oauthQrContentTargetURL = "https://open.work.weixin.qq.com/wwopen/sso/qrConnect?appid=%s&agentid=%s&redirect_uri=%s&state=%s" oauthQrContentTargetURL = "https://open.work.weixin.qq.com/wwopen/sso/qrConnect?appid=%s&agentid=%s&redirect_uri=%s&state=%s"
) )
//NewOauth new init oauth // NewOauth new init oauth
func NewOauth(ctx *context.Context) *Oauth { func NewOauth(ctx *context.Context) *Oauth {
return &Oauth{ return &Oauth{
ctx, ctx,
} }
} }
//GetTargetURL 获取授权地址 // GetTargetURL 获取授权地址
func (ctr *Oauth) GetTargetURL(callbackURL string) string { func (ctr *Oauth) GetTargetURL(callbackURL string) string {
//url encode // url encode
urlStr := url.QueryEscape(callbackURL) urlStr := url.QueryEscape(callbackURL)
return fmt.Sprintf( return fmt.Sprintf(
oauthTargetURL, oauthTargetURL,
@@ -41,9 +41,9 @@ func (ctr *Oauth) GetTargetURL(callbackURL string) string {
) )
} }
//GetQrContentTargetURL 构造独立窗口登录二维码 // GetQrContentTargetURL 构造独立窗口登录二维码
func (ctr *Oauth) GetQrContentTargetURL(callbackURL string) string { func (ctr *Oauth) GetQrContentTargetURL(callbackURL string) string {
//url encode // url encode
urlStr := url.QueryEscape(callbackURL) urlStr := url.QueryEscape(callbackURL)
return fmt.Sprintf( return fmt.Sprintf(
oauthQrContentTargetURL, oauthQrContentTargetURL,
@@ -54,17 +54,17 @@ func (ctr *Oauth) GetQrContentTargetURL(callbackURL string) string {
) )
} }
//ResUserInfo 返回得用户信息 // ResUserInfo 返回得用户信息
type ResUserInfo struct { type ResUserInfo struct {
util.CommonError util.CommonError
//当用户为企业成员时返回 // 当用户为企业成员时返回
UserID string `json:"UserId"` UserID string `json:"UserId"`
DeviceID string `json:"DeviceId"` DeviceID string `json:"DeviceId"`
//非企业成员授权时返回 // 非企业成员授权时返回
OpenID string `json:"OpenId"` OpenID string `json:"OpenId"`
} }
//UserFromCode 根据code获取用户信息 // UserFromCode 根据code获取用户信息
func (ctr *Oauth) UserFromCode(code string) (result ResUserInfo, err error) { func (ctr *Oauth) UserFromCode(code string) (result ResUserInfo, err error) {
var accessToken string var accessToken string
accessToken, err = ctr.GetAccessToken() accessToken, err = ctr.GetAccessToken()

View File

@@ -14,7 +14,7 @@ type Work struct {
ctx *context.Context ctx *context.Context
} }
//NewWork init work // NewWork init work
func NewWork(cfg *config.Config) *Work { func NewWork(cfg *config.Config) *Work {
defaultAkHandle := credential.NewWorkAccessToken(cfg.CorpID, cfg.CorpSecret, credential.CacheKeyWorkPrefix, cfg.Cache) defaultAkHandle := credential.NewWorkAccessToken(cfg.CorpID, cfg.CorpSecret, credential.CacheKeyWorkPrefix, cfg.Cache)
ctx := &context.Context{ ctx := &context.Context{
@@ -24,12 +24,12 @@ func NewWork(cfg *config.Config) *Work {
return &Work{ctx: ctx} return &Work{ctx: ctx}
} }
//GetContext get Context // GetContext get Context
func (wk *Work) GetContext() *context.Context { func (wk *Work) GetContext() *context.Context {
return wk.ctx return wk.ctx
} }
//GetOauth get oauth // GetOauth get oauth
func (wk *Work) GetOauth() *oauth.Oauth { func (wk *Work) GetOauth() *oauth.Oauth {
return oauth.NewOauth(wk.ctx) return oauth.NewOauth(wk.ctx)
} }