Bläddra i källkod

[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>
houseme 4 år sedan
förälder
incheckning
96c1f98944
90 ändrade filer med 789 tillägg och 762 borttagningar
  1. 5 5
      cache/memory.go
  2. 10 10
      cache/redis.go
  3. 1 1
      credential/access_token.go
  4. 17 17
      credential/default_access_token.go
  5. 1 0
      credential/default_access_token_test.go
  6. 7 7
      credential/default_js_ticket.go
  7. 2 2
      credential/js_ticket.go
  8. 1 1
      go.mod
  9. 2 2
      go.sum
  10. 2 2
      miniprogram/analysis/analysis.go
  11. 35 10
      miniprogram/auth/auth.go
  12. 1 1
      miniprogram/config/config.go
  13. 7 7
      miniprogram/content/content.go
  14. 2 2
      miniprogram/encryptor/encryptor.go
  15. 4 4
      miniprogram/message/consts.go
  16. 17 17
      miniprogram/message/customer_message.go
  17. 8 8
      miniprogram/miniprogram.go
  18. 2 2
      miniprogram/qrcode/qrcode.go
  19. 12 12
      miniprogram/subscribe/subscribe.go
  20. 4 4
      miniprogram/tcb/cloudfunction.go
  21. 99 99
      miniprogram/tcb/database.go
  22. 24 24
      miniprogram/tcb/file.go
  23. 2 2
      miniprogram/tcb/tcb.go
  24. 0 1
      miniprogram/urllink/urllink.go
  25. 9 9
      officialaccount/basic/basic.go
  26. 31 31
      officialaccount/broadcast/broadcast.go
  27. 5 5
      officialaccount/config/config.go
  28. 13 13
      officialaccount/datacube/broadcast.go
  29. 2 2
      officialaccount/datacube/datacube.go
  30. 4 4
      officialaccount/datacube/interface.go
  31. 14 14
      officialaccount/datacube/message.go
  32. 26 26
      officialaccount/datacube/publisher.go
  33. 4 4
      officialaccount/datacube/user.go
  34. 10 10
      officialaccount/device/authorize.go
  35. 2 2
      officialaccount/device/device.go
  36. 1 1
      officialaccount/device/message.go
  37. 2 2
      officialaccount/device/qrcode.go
  38. 4 4
      officialaccount/js/js.go
  39. 20 20
      officialaccount/material/material.go
  40. 11 11
      officialaccount/material/media.go
  41. 25 25
      officialaccount/menu/button.go
  42. 21 21
      officialaccount/menu/menu.go
  43. 32 32
      officialaccount/message/customer_message.go
  44. 2 2
      officialaccount/message/image.go
  45. 42 42
      officialaccount/message/message.go
  46. 2 2
      officialaccount/message/music.go
  47. 4 4
      officialaccount/message/news.go
  48. 3 3
      officialaccount/message/reply.go
  49. 13 13
      officialaccount/message/subscribe.go
  50. 9 9
      officialaccount/message/template.go
  51. 2 2
      officialaccount/message/text.go
  52. 3 3
      officialaccount/message/transfer_customer.go
  53. 2 2
      officialaccount/message/video.go
  54. 2 2
      officialaccount/message/voice.go
  55. 10 10
      officialaccount/oauth/oauth.go
  56. 20 20
      officialaccount/ocr/ocr.go
  57. 9 9
      officialaccount/officialaccount.go
  58. 18 18
      officialaccount/server/server.go
  59. 5 5
      officialaccount/server/util.go
  60. 3 3
      officialaccount/user/migrate.go
  61. 9 9
      officialaccount/user/tag.go
  62. 4 4
      officialaccount/user/user.go
  63. 7 7
      openplatform/account/account.go
  64. 5 5
      openplatform/config/config.go
  65. 5 5
      openplatform/context/accessToken.go
  66. 8 8
      openplatform/miniprogram/basic/basic.go
  67. 16 16
      openplatform/miniprogram/component/component.go
  68. 5 5
      openplatform/miniprogram/miniprogram.go
  69. 4 4
      openplatform/officialaccount/js/js.go
  70. 3 3
      openplatform/officialaccount/oauth/oauth.go
  71. 8 8
      openplatform/officialaccount/officialaccount.go
  72. 7 7
      openplatform/openplatform.go
  73. 1 1
      pay/config/config.go
  74. 2 2
      pay/notify/notify.go
  75. 3 3
      pay/order/pay.go
  76. 2 2
      pay/pay.go
  77. 5 5
      pay/transfer/transfer_wallet.go
  78. 2 2
      util/crypto.go
  79. 10 10
      util/http.go
  80. 1 1
      util/signature.go
  81. 1 1
      util/signature_test.go
  82. 1 1
      util/string.go
  83. 1 1
      util/time.go
  84. 1 1
      util/util.go
  85. 2 2
      wechat.go
  86. 6 6
      work/kf/servicestate.go
  87. 2 1
      work/msgaudit/client_linux.go
  88. 2 1
      work/msgaudit/client_unsupport.go
  89. 13 13
      work/oauth/oauth.go
  90. 3 3
      work/work.go

+ 5 - 5
cache/memory.go

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

+ 10 - 10
cache/redis.go

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

+ 1 - 1
credential/access_token.go

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

+ 17 - 17
credential/default_access_token.go

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

+ 1 - 0
credential/default_access_token_test.go

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

+ 7 - 7
credential/default_js_ticket.go

@@ -10,19 +10,19 @@ import (
 	"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"
 
-//DefaultJsTicket 默认获取js ticket方法
+// DefaultJsTicket 默认获取js ticket方法
 type DefaultJsTicket struct {
 	appID          string
 	cacheKeyPrefix string
 	cache          cache.Cache
-	//jsAPITicket 读写锁 同一个AppID一个
+	// jsAPITicket 读写锁 同一个AppID一个
 	jsAPITicketLock *sync.Mutex
 }
 
-//NewDefaultJsTicket new
+// NewDefaultJsTicket new
 func NewDefaultJsTicket(appID string, cacheKeyPrefix string, cache cache.Cache) JsTicketHandle {
 	return &DefaultJsTicket{
 		appID:           appID,
@@ -40,9 +40,9 @@ type ResTicket struct {
 	ExpiresIn int64  `json:"expires_in"`
 }
 
-//GetTicket 获取jsapi_ticket
+// GetTicket 获取jsapi_ticket
 func (js *DefaultJsTicket) GetTicket(accessToken string) (ticketStr string, err error) {
-	//先从cache中取
+	// 先从cache中取
 	jsAPITicketCacheKey := fmt.Sprintf("%s_jsapi_ticket_%s", js.cacheKeyPrefix, js.appID)
 	if val := js.cache.Get(jsAPITicketCacheKey); val != nil {
 		return val.(string), nil
@@ -67,7 +67,7 @@ func (js *DefaultJsTicket) GetTicket(accessToken string) (ticketStr string, err
 	return
 }
 
-//GetTicketFromServer 从服务器中获取ticket
+// GetTicketFromServer 从服务器中获取ticket
 func GetTicketFromServer(accessToken string) (ticket ResTicket, err error) {
 	var response []byte
 	url := fmt.Sprintf(getTicketURL, accessToken)

+ 2 - 2
credential/js_ticket.go

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

+ 1 - 1
go.mod

@@ -5,7 +5,7 @@ go 1.14
 require (
 	github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b
 	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/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
 	github.com/sirupsen/logrus v1.8.1

+ 2 - 2
go.sum

@@ -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/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
 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.4/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
+github.com/gomodule/redigo v1.8.5 h1:nRAxCa+SVsyjSBrtZmG/cqb6VbTmuRzpg/PoTFlpumc=
+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/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=

+ 2 - 2
miniprogram/analysis/analysis.go

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

+ 35 - 10
miniprogram/auth/auth.go

@@ -10,14 +10,16 @@ import (
 
 const (
 	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 {
 	*context.Context
 }
 
-//NewAuth new auth
+// NewAuth new auth
 func NewAuth(ctx *context.Context) *Auth {
 	return &Auth{ctx}
 }
@@ -31,16 +33,21 @@ type ResCode2Session struct {
 	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) {
-	urlStr := fmt.Sprintf(code2SessionURL, auth.AppID, auth.AppSecret, jsCode)
 	var response []byte
-	response, err = util.HTTPGet(urlStr)
-	if err != nil {
+	if response, err = util.HTTPGet(fmt.Sprintf(code2SessionURL, auth.AppID, auth.AppSecret, jsCode)); err != nil {
 		return
 	}
-	err = json.Unmarshal(response, &result)
-	if err != nil {
+	if err = json.Unmarshal(response, &result); err != nil {
 		return
 	}
 	if result.ErrCode != 0 {
@@ -50,7 +57,25 @@ func (auth *Auth) Code2Session(jsCode string) (result ResCode2Session, err error
 	return
 }
 
-//GetPaidUnionID 用户支付完成后,获取该用户的 UnionId,无需用户授权
+// GetPaidUnionID 用户支付完成后,获取该用户的 UnionId,无需用户授权
 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
 }

+ 1 - 1
miniprogram/config/config.go

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

+ 7 - 7
miniprogram/content/content.go

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

+ 2 - 2
miniprogram/encryptor/encryptor.go

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

+ 4 - 4
miniprogram/message/consts.go

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

+ 17 - 17
miniprogram/message/customer_message.go

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

+ 8 - 8
miniprogram/miniprogram.go

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

+ 2 - 2
miniprogram/qrcode/qrcode.go

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

+ 12 - 12
miniprogram/subscribe/subscribe.go

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

+ 4 - 4
miniprogram/tcb/cloudfunction.go

@@ -7,17 +7,17 @@ import (
 )
 
 const (
-	//触发云函数
+	// 触发云函数
 	invokeCloudFunctionURL = "https://api.weixin.qq.com/tcb/invokecloudfunction"
 )
 
-//InvokeCloudFunctionRes 云函数调用返回结果
+// InvokeCloudFunctionRes 云函数调用返回结果
 type InvokeCloudFunctionRes struct {
 	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
 func (tcb *Tcb) InvokeCloudFunction(env, name, args string) (*InvokeCloudFunctionRes, error) {
 	accessToken, err := tcb.GetAccessToken()

+ 99 - 99
miniprogram/tcb/database.go

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

+ 24 - 24
miniprogram/tcb/file.go

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

+ 2 - 2
miniprogram/tcb/tcb.go

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

+ 0 - 1
miniprogram/urllink/urllink.go

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

+ 9 - 9
officialaccount/basic/basic.go

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

+ 31 - 31
officialaccount/broadcast/broadcast.go

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

+ 5 - 5
officialaccount/config/config.go

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

+ 13 - 13
officialaccount/datacube/broadcast.go

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

+ 2 - 2
officialaccount/datacube/datacube.go

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

+ 4 - 4
officialaccount/datacube/interface.go

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

+ 14 - 14
officialaccount/datacube/message.go

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

+ 26 - 26
officialaccount/datacube/publisher.go

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

+ 4 - 4
officialaccount/datacube/user.go

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

+ 10 - 10
officialaccount/device/authorize.go

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

+ 2 - 2
officialaccount/device/device.go

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

+ 1 - 1
officialaccount/device/message.go

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

+ 2 - 2
officialaccount/device/qrcode.go

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

+ 4 - 4
officialaccount/js/js.go

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

+ 20 - 20
officialaccount/material/material.go

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

+ 11 - 11
officialaccount/material/media.go

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

+ 25 - 25
officialaccount/menu/button.go

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

+ 21 - 21
officialaccount/menu/menu.go

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

+ 32 - 32
officialaccount/message/customer_message.go

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

+ 2 - 2
officialaccount/message/image.go

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

+ 42 - 42
officialaccount/message/message.go

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

+ 2 - 2
officialaccount/message/music.go

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

+ 4 - 4
officialaccount/message/news.go

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

+ 3 - 3
officialaccount/message/reply.go

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

+ 13 - 13
officialaccount/message/subscribe.go

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

+ 9 - 9
officialaccount/message/template.go

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

+ 2 - 2
officialaccount/message/text.go

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

+ 3 - 3
officialaccount/message/transfer_customer.go

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

+ 2 - 2
officialaccount/message/video.go

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

+ 2 - 2
officialaccount/message/voice.go

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

+ 10 - 10
officialaccount/oauth/oauth.go

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

+ 20 - 20
officialaccount/ocr/ocr.go

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

+ 9 - 9
officialaccount/officialaccount.go

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

+ 18 - 18
officialaccount/server/server.go

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

+ 5 - 5
officialaccount/server/util.go

@@ -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) {
-	//debug
-	//fmt.Println("response msg = ", string(bytes))
+	// debug
+	// fmt.Println("response msg = ", string(bytes))
 	srv.Writer.WriteHeader(200)
 	_, err := srv.Writer.Write(bytes)
 	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) {
 	writeContextType(srv.Writer, plainContentType)
 	srv.Render([]byte(str))
 }
 
-//XML render to xml
+// XML render to xml
 func (srv *Server) XML(obj interface{}) {
 	writeContextType(srv.Writer, xmlContentType)
 	bytes, err := xml.Marshal(obj)

+ 3 - 3
officialaccount/user/migrate.go

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

+ 9 - 9
officialaccount/user/tag.go

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

+ 4 - 4
officialaccount/user/user.go

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

+ 7 - 7
openplatform/account/account.go

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

+ 5 - 5
openplatform/config/config.go

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

+ 5 - 5
openplatform/context/accessToken.go

@@ -1,4 +1,4 @@
-//Package context 开放平台相关context
+// Package context 开放平台相关context
 package context
 
 import (
@@ -18,10 +18,10 @@ const (
 	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"
 	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 获取授权方选项信息
-	//getComponentConfigURL = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_option?component_access_token=%s"
-	//TODO 获取已授权的账号信息
-	//getuthorizerListURL = "POST https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_list?component_access_token=%s"
+	// TODO 获取授权方选项信息
+	// getComponentConfigURL = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_option?component_access_token=%s"
+	// TODO 获取已授权的账号信息
+	// getuthorizerListURL = "POST https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_list?component_access_token=%s"
 )
 
 // ComponentAccessToken 第三方平台

+ 8 - 8
openplatform/miniprogram/basic/basic.go

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

+ 16 - 16
openplatform/miniprogram/component/component.go

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

+ 5 - 5
openplatform/miniprogram/miniprogram.go

@@ -6,13 +6,13 @@ import (
 	"github.com/silenceper/wechat/v2/openplatform/miniprogram/component"
 )
 
-//MiniProgram 代小程序实现业务
+// MiniProgram 代小程序实现业务
 type MiniProgram struct {
 	AppID       string
 	openContext *openContext.Context
 }
 
-//NewMiniProgram 实例化
+// NewMiniProgram 实例化
 func NewMiniProgram(opCtx *openContext.Context, appID string) *MiniProgram {
 	return &MiniProgram{
 		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 {
 	return component.NewComponent(miniProgram.openContext)
 }
 
-//GetBasic 基础信息设置
+// GetBasic 基础信息设置
 func (miniProgram *MiniProgram) GetBasic() *basic.Basic {
 	return basic.NewBasic(miniProgram.openContext, miniProgram.AppID)
 }

+ 4 - 4
openplatform/officialaccount/js/js.go

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

+ 3 - 3
openplatform/officialaccount/oauth/oauth.go

@@ -28,14 +28,14 @@ func NewOauth(context *context.Context) *Oauth {
 	return auth
 }
 
-//GetRedirectURL 第三方平台 - 获取跳转的url地址
+// GetRedirectURL 第三方平台 - 获取跳转的url地址
 func (oauth *Oauth) GetRedirectURL(redirectURI, scope, state, appID string) (string, error) {
-	//url encode
+	// url encode
 	urlStr := url.QueryEscape(redirectURI)
 	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 {
 	location, err := oauth.GetRedirectURL(redirectURI, scope, state, appID)
 	if err != nil {

+ 8 - 8
openplatform/officialaccount/officialaccount.go

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

+ 7 - 7
openplatform/openplatform.go

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

+ 1 - 1
pay/config/config.go

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

+ 2 - 2
pay/notify/notify.go

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

+ 3 - 3
pay/order/pay.go

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

+ 2 - 2
pay/pay.go

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

+ 5 - 5
pay/transfer/transfer_wallet.go

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

+ 2 - 2
util/crypto.go

@@ -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]
-//参考:github.com/chanxuehong/wechat.v2
+// 参考:github.com/chanxuehong/wechat.v2
 func AESEncryptMsg(random, rawXMLMsg []byte, appID string, aesKey []byte) (ciphertext []byte) {
 	const (
 		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]
-//参考:github.com/chanxuehong/wechat.v2
+// 参考:github.com/chanxuehong/wechat.v2
 func AESDecryptMsg(ciphertext []byte, aesKey []byte) (random, rawXMLMsg, appID []byte, err error) {
 	const (
 		BlockSize = 32            // PKCS#7

+ 10 - 10
util/http.go

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

+ 1 - 1
util/signature.go

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

+ 1 - 1
util/signature_test.go

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

+ 1 - 1
util/string.go

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

+ 1 - 1
util/time.go

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

+ 1 - 1
util/util.go

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

+ 2 - 2
wechat.go

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

+ 6 - 6
work/kf/servicestate.go

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

+ 2 - 1
work/msgaudit/client_linux.go

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

+ 2 - 1
work/msgaudit/client_unsupport.go

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

+ 13 - 13
work/oauth/oauth.go

@@ -9,30 +9,30 @@ import (
 	"github.com/silenceper/wechat/v2/work/context"
 )
 
-//Oauth auth
+// Oauth auth
 type Oauth struct {
 	*context.Context
 }
 
 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"
-	//oauthUserInfoURL 获取用户信息地址
+	// oauthUserInfoURL 获取用户信息地址
 	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"
 )
 
-//NewOauth new init oauth
+// NewOauth new init oauth
 func NewOauth(ctx *context.Context) *Oauth {
 	return &Oauth{
 		ctx,
 	}
 }
 
-//GetTargetURL 获取授权地址
+// GetTargetURL 获取授权地址
 func (ctr *Oauth) GetTargetURL(callbackURL string) string {
-	//url encode
+	// url encode
 	urlStr := url.QueryEscape(callbackURL)
 	return fmt.Sprintf(
 		oauthTargetURL,
@@ -41,9 +41,9 @@ func (ctr *Oauth) GetTargetURL(callbackURL string) string {
 	)
 }
 
-//GetQrContentTargetURL 构造独立窗口登录二维码
+// GetQrContentTargetURL 构造独立窗口登录二维码
 func (ctr *Oauth) GetQrContentTargetURL(callbackURL string) string {
-	//url encode
+	// url encode
 	urlStr := url.QueryEscape(callbackURL)
 	return fmt.Sprintf(
 		oauthQrContentTargetURL,
@@ -54,17 +54,17 @@ func (ctr *Oauth) GetQrContentTargetURL(callbackURL string) string {
 	)
 }
 
-//ResUserInfo 返回得用户信息
+// ResUserInfo 返回得用户信息
 type ResUserInfo struct {
 	util.CommonError
-	//当用户为企业成员时返回
+	// 当用户为企业成员时返回
 	UserID   string `json:"UserId"`
 	DeviceID string `json:"DeviceId"`
-	//非企业成员授权时返回
+	// 非企业成员授权时返回
 	OpenID string `json:"OpenId"`
 }
 
-//UserFromCode 根据code获取用户信息
+// UserFromCode 根据code获取用户信息
 func (ctr *Oauth) UserFromCode(code string) (result ResUserInfo, err error) {
 	var accessToken string
 	accessToken, err = ctr.GetAccessToken()

+ 3 - 3
work/work.go

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