mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-04 12:52:27 +08:00
[feature] Format the code and improve Mini Program authorization to o… (#473)
* [feature] Format the code and improve Mini Program authorization to obtain openid(miniprogram/auth/auth.go Code2Session) * [feature] CheckEncryptedData (https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/user-info/auth.checkEncryptedData.html) * upgrade json error * upgrade json error Co-authored-by: houseme <houseme@outlook.com>
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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"`
|
||||
|
||||
@@ -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,6 +1,6 @@
|
||||
package device
|
||||
|
||||
//MsgDevice 设备消息响应
|
||||
// MsgDevice 设备消息响应
|
||||
type MsgDevice struct {
|
||||
DeviceType string
|
||||
DeviceID string
|
||||
|
||||
@@ -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"`
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"`
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"` //可选
|
||||
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 文本消息结构体构造方法
|
||||
// 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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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{}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 != "" {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user