diff --git a/miniprogram/message/consts.go b/miniprogram/message/consts.go new file mode 100644 index 0000000..1a1f936 --- /dev/null +++ b/miniprogram/message/consts.go @@ -0,0 +1,21 @@ +package message + +// MsgType 基本消息类型 +type MsgType string + +// EventType 事件类型 +type EventType string + +// InfoType 第三方平台授权事件类型 +type InfoType string + +const ( + //MsgTypeText 文本消息 + MsgTypeText MsgType = "text" + //MsgTypeImage 图片消息 + MsgTypeImage = "image" + //MsgTypeLink 图文链接 + MsgTypeLink = "link" + //MsgTypeMiniProgramPage 小程序卡片 + MsgTypeMiniProgramPage = "miniprogrampage" +) diff --git a/miniprogram/message/customer_message.go b/miniprogram/message/customer_message.go new file mode 100644 index 0000000..fe650d0 --- /dev/null +++ b/miniprogram/message/customer_message.go @@ -0,0 +1,124 @@ +package message + +import ( + "fmt" + + "github.com/silenceper/wechat/v2/miniprogram/context" + "github.com/silenceper/wechat/v2/util" +) + +const ( + customerSendMessage = "https://api.weixin.qq.com/cgi-bin/message/custom/send" +) + +//Manager 消息管理者,可以发送消息 +type Manager struct { + *context.Context +} + +//NewCustomerMessageManager 实例化消息管理者 +func NewCustomerMessageManager(context *context.Context) *Manager { + return &Manager{ + context, + } +} + +//MediaText 文本消息的文字 +type MediaText struct { + Content string `json:"content"` +} + +//MediaResource 消息使用的临时素材id +type MediaResource struct { + MediaID string `json:"media_id"` +} + +//MediaMiniprogrampage 小程序卡片 +type MediaMiniprogrampage struct { + Title string `json:"title"` + Appid string `json:"appid"` + Pagepath string `json:"pagepath"` + ThumbMediaID string `json:"thumb_media_id"` +} + +// MediaLink 发送图文链接 +type MediaLink struct { + Title string `json:"title"` + Description string `json:"description"` + URL string `json:"url"` + ThumbURL string `json:"thumb_url"` +} + +//CustomerMessage 客服消息 +type CustomerMessage struct { + ToUser string `json:"touser"` //接受者OpenID + Msgtype MsgType `json:"msgtype"` //客服消息类型 + Text *MediaText `json:"text,omitempty"` //可选 + Image *MediaResource `json:"image,omitempty"` //可选 + Link *MediaLink `json:"link,omitempty"` //可选 + Miniprogrampage *MediaMiniprogrampage `json:"miniprogrampage,omitempty"` //可选 +} + +//NewCustomerTextMessage 文本消息结构体构造方法 +func NewCustomerTextMessage(toUser, text string) *CustomerMessage { + return &CustomerMessage{ + ToUser: toUser, + Msgtype: MsgTypeText, + Text: &MediaText{ + Content: text, + }, + } +} + +//NewCustomerImgMessage 图片消息的构造方法 +func NewCustomerImgMessage(toUser, mediaID string) *CustomerMessage { + return &CustomerMessage{ + ToUser: toUser, + Msgtype: MsgTypeImage, + Image: &MediaResource{ + MediaID: mediaID, + }, + } +} + +//NewCustomerLinkMessage 图文链接消息的构造方法 +func NewCustomerLinkMessage(toUser, title, description, url, thumbURL string) *CustomerMessage { + return &CustomerMessage{ + ToUser: toUser, + Msgtype: MsgTypeLink, + Link: &MediaLink{ + Title: title, + Description: description, + URL: url, + ThumbURL: thumbURL, + }, + } +} + +//NewCustomerMiniprogrampageMessage 小程序卡片消息的构造方法 +func NewCustomerMiniprogrampageMessage(toUser, title, pagepath, thumbMediaID string) *CustomerMessage { + return &CustomerMessage{ + ToUser: toUser, + Msgtype: MsgTypeMiniProgramPage, + Miniprogrampage: &MediaMiniprogrampage{ + Title: title, + Pagepath: pagepath, + ThumbMediaID: thumbMediaID, + }, + } +} + +//Send 发送客服消息 +func (manager *Manager) Send(msg *CustomerMessage) error { + accessToken, err := manager.Context.GetAccessToken() + if err != nil { + return err + } + uri := fmt.Sprintf("%s?access_token=%s", customerSendMessage, accessToken) + response, err := util.PostJSON(uri, msg) + if err != nil { + return err + } + + return util.DecodeWithCommonError(response, "SendCustomerMessage") +} diff --git a/miniprogram/miniprogram.go b/miniprogram/miniprogram.go index 9cfd35d..686d5c4 100644 --- a/miniprogram/miniprogram.go +++ b/miniprogram/miniprogram.go @@ -7,6 +7,7 @@ import ( "github.com/silenceper/wechat/v2/miniprogram/config" "github.com/silenceper/wechat/v2/miniprogram/context" "github.com/silenceper/wechat/v2/miniprogram/encryptor" + "github.com/silenceper/wechat/v2/miniprogram/message" "github.com/silenceper/wechat/v2/miniprogram/qrcode" "github.com/silenceper/wechat/v2/miniprogram/subscribe" "github.com/silenceper/wechat/v2/miniprogram/tcb" @@ -66,3 +67,8 @@ func (miniProgram *MiniProgram) GetTcb() *tcb.Tcb { func (miniProgram *MiniProgram) GetSubscribe() *subscribe.Subscribe { return subscribe.NewSubscribe(miniProgram.ctx) } + +// GetCustomerMessage 客服消息接口 +func (miniProgram *MiniProgram) GetCustomerMessage() *message.Manager { + return message.NewCustomerMessageManager(miniProgram.ctx) +}