196 lines
6.4 KiB
Go
196 lines
6.4 KiB
Go
|
package subscribe
|
|||
|
|
|||
|
import (
|
|||
|
"fmt"
|
|||
|
|
|||
|
"github.com/silenceper/wechat/v2/miniprogram/context"
|
|||
|
"github.com/silenceper/wechat/v2/util"
|
|||
|
)
|
|||
|
|
|||
|
const (
|
|||
|
// 发送订阅消息
|
|||
|
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
|
|||
|
subscribeSendURL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send"
|
|||
|
|
|||
|
// 获取当前帐号下的个人模板列表
|
|||
|
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.getTemplateList.html
|
|||
|
getTemplateURL = "https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate"
|
|||
|
|
|||
|
// 添加订阅模板
|
|||
|
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.addTemplate.html
|
|||
|
addTemplateURL = "https://api.weixin.qq.com/wxaapi/newtmpl/addtemplate"
|
|||
|
|
|||
|
// 删除私有模板
|
|||
|
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.deleteTemplate.html
|
|||
|
delTemplateURL = "https://api.weixin.qq.com/wxaapi/newtmpl/deltemplate"
|
|||
|
|
|||
|
// 统一服务消息
|
|||
|
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/uniform-message/uniformMessage.send.html
|
|||
|
uniformMessageSend = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send"
|
|||
|
)
|
|||
|
|
|||
|
// Subscribe 订阅消息
|
|||
|
type Subscribe struct {
|
|||
|
*context.Context
|
|||
|
}
|
|||
|
|
|||
|
// NewSubscribe 实例化
|
|||
|
func NewSubscribe(ctx *context.Context) *Subscribe {
|
|||
|
return &Subscribe{Context: ctx}
|
|||
|
}
|
|||
|
|
|||
|
// Message 订阅消息请求参数
|
|||
|
type Message struct {
|
|||
|
ToUser string `json:"touser"` // 必选,接收者(用户)的 openid
|
|||
|
TemplateID string `json:"template_id"` // 必选,所需下发的订阅模板id
|
|||
|
Page string `json:"page"` // 可选,点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
|
|||
|
Data map[string]*DataItem `json:"data"` // 必选, 模板内容
|
|||
|
MiniprogramState string `json:"miniprogram_state"` // 可选,跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
|
|||
|
Lang string `json:"lang"` // 入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
|
|||
|
}
|
|||
|
|
|||
|
// DataItem 模版内某个 .DATA 的值
|
|||
|
type DataItem struct {
|
|||
|
Value interface{} `json:"value"`
|
|||
|
Color string `json:"color"`
|
|||
|
}
|
|||
|
|
|||
|
// TemplateItem template item
|
|||
|
type TemplateItem struct {
|
|||
|
PriTmplID string `json:"priTmplId"`
|
|||
|
Title string `json:"title"`
|
|||
|
Content string `json:"content"`
|
|||
|
Example string `json:"example"`
|
|||
|
Type int64 `json:"type"`
|
|||
|
}
|
|||
|
|
|||
|
// TemplateList template list
|
|||
|
type TemplateList struct {
|
|||
|
util.CommonError
|
|||
|
Data []TemplateItem `json:"data"`
|
|||
|
}
|
|||
|
|
|||
|
// Send 发送订阅消息
|
|||
|
func (s *Subscribe) Send(msg *Message) (err error) {
|
|||
|
var accessToken string
|
|||
|
accessToken, err = s.GetAccessToken()
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
uri := fmt.Sprintf("%s?access_token=%s", subscribeSendURL, accessToken)
|
|||
|
response, err := util.PostJSON(uri, msg)
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
return util.DecodeWithCommonError(response, "Send")
|
|||
|
}
|
|||
|
|
|||
|
// ListTemplates 获取当前帐号下的个人模板列表
|
|||
|
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.getTemplateList.html
|
|||
|
func (s *Subscribe) ListTemplates() (*TemplateList, error) {
|
|||
|
accessToken, err := s.GetAccessToken()
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
uri := fmt.Sprintf("%s?access_token=%s", getTemplateURL, accessToken)
|
|||
|
response, err := util.HTTPGet(uri)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
templateList := TemplateList{}
|
|||
|
err = util.DecodeWithError(response, &templateList, "ListTemplates")
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
return &templateList, nil
|
|||
|
}
|
|||
|
|
|||
|
// UniformMessage 统一服务消息
|
|||
|
type UniformMessage struct {
|
|||
|
ToUser string `json:"touser"`
|
|||
|
WeappTemplateMsg struct {
|
|||
|
TemplateID string `json:"template_id"`
|
|||
|
Page string `json:"page"`
|
|||
|
FormID string `json:"form_id"`
|
|||
|
Data map[string]*DataItem `json:"data"`
|
|||
|
EmphasisKeyword string `json:"emphasis_keyword"`
|
|||
|
} `json:"weapp_template_msg"`
|
|||
|
MpTemplateMsg struct {
|
|||
|
Appid string `json:"appid"`
|
|||
|
TemplateID string `json:"template_id"`
|
|||
|
URL string `json:"url"`
|
|||
|
Miniprogram struct {
|
|||
|
Appid string `json:"appid"`
|
|||
|
Pagepath string `json:"pagepath"`
|
|||
|
} `json:"miniprogram"`
|
|||
|
Data map[string]*DataItem `json:"data"`
|
|||
|
} `json:"mp_template_msg"`
|
|||
|
}
|
|||
|
|
|||
|
// UniformSend 发送统一服务消息
|
|||
|
func (s *Subscribe) UniformSend(msg *UniformMessage) (err error) {
|
|||
|
var accessToken string
|
|||
|
accessToken, err = s.GetAccessToken()
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
uri := fmt.Sprintf("%s?access_token=%s", uniformMessageSend, accessToken)
|
|||
|
response, err := util.PostJSON(uri, msg)
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
return util.DecodeWithCommonError(response, "UniformSend")
|
|||
|
}
|
|||
|
|
|||
|
type resSubscribeAdd struct {
|
|||
|
util.CommonError
|
|||
|
|
|||
|
TemplateID string `json:"priTmplId"`
|
|||
|
}
|
|||
|
|
|||
|
// Add 添加订阅消息模板
|
|||
|
func (s *Subscribe) Add(ShortID string, kidList []int, sceneDesc string) (templateID string, err error) {
|
|||
|
var accessToken string
|
|||
|
accessToken, err = s.GetAccessToken()
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
var msg = struct {
|
|||
|
TemplateIDShort string `json:"tid"`
|
|||
|
SceneDesc string `json:"sceneDesc"`
|
|||
|
KidList []int `json:"kidList"`
|
|||
|
}{TemplateIDShort: ShortID, SceneDesc: sceneDesc, KidList: kidList}
|
|||
|
uri := fmt.Sprintf("%s?access_token=%s", addTemplateURL, accessToken)
|
|||
|
var response []byte
|
|||
|
response, err = util.PostJSON(uri, msg)
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
var result resSubscribeAdd
|
|||
|
err = util.DecodeWithError(response, &result, "AddSubscribe")
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
templateID = result.TemplateID
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// Delete 删除私有模板
|
|||
|
func (s *Subscribe) Delete(templateID string) (err error) {
|
|||
|
var accessToken string
|
|||
|
accessToken, err = s.GetAccessToken()
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
var msg = struct {
|
|||
|
TemplateID string `json:"priTmplId"`
|
|||
|
}{TemplateID: templateID}
|
|||
|
uri := fmt.Sprintf("%s?access_token=%s", delTemplateURL, accessToken)
|
|||
|
var response []byte
|
|||
|
response, err = util.PostJSON(uri, msg)
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
return util.DecodeWithCommonError(response, "DeleteSubscribe")
|
|||
|
}
|