mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-04 12:52:27 +08:00
feat: 微信小程序-动态消息及订阅消息 (#835)
* feat: 微信小程序-动态消息及订阅消息 * feat: 微信小程序-动态消息及订阅消息 * feat: 微信小程序-动态消息及订阅消息
This commit is contained in:
@@ -8,10 +8,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// createActivityURL 创建activity_id
|
// createActivityIDURL 创建activity_id
|
||||||
createActivityURL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/activityid/create?access_token=%s"
|
createActivityIDURL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/activityid/create?access_token=%s&unionid=%s&openid=%s"
|
||||||
// SendUpdatableMsgURL 修改动态消息
|
// SendUpdatableMsgURL 修改动态消息
|
||||||
setUpdatableMsgURL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/updatablemsg/send?access_token=%s"
|
setUpdatableMsgURL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/updatablemsg/send?access_token=%s"
|
||||||
|
// setChatToolMsgURL 修改小程序聊天工具的动态卡片消息
|
||||||
|
setChatToolMsgURL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/chattoolmsg/send?access_token=%s"
|
||||||
)
|
)
|
||||||
|
|
||||||
// UpdatableTargetState 动态消息状态
|
// UpdatableTargetState 动态消息状态
|
||||||
@@ -38,15 +40,26 @@ func NewUpdatableMessage(ctx *context.Context) *UpdatableMessage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreateActivityIDRequest 创建activity_id请求
|
||||||
|
type CreateActivityIDRequest struct {
|
||||||
|
UnionID string
|
||||||
|
OpenID string
|
||||||
|
}
|
||||||
|
|
||||||
// CreateActivityID 创建activity_id
|
// CreateActivityID 创建activity_id
|
||||||
func (updatableMessage *UpdatableMessage) CreateActivityID() (res CreateActivityIDResponse, err error) {
|
func (updatableMessage *UpdatableMessage) CreateActivityID() (CreateActivityIDResponse, error) {
|
||||||
|
return updatableMessage.CreateActivityIDWithReq(&CreateActivityIDRequest{})
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateActivityIDWithReq 创建activity_id
|
||||||
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/updatable-message/createActivityId.html
|
||||||
|
func (updatableMessage *UpdatableMessage) CreateActivityIDWithReq(req *CreateActivityIDRequest) (res CreateActivityIDResponse, err error) {
|
||||||
accessToken, err := updatableMessage.GetAccessToken()
|
accessToken, err := updatableMessage.GetAccessToken()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
url := fmt.Sprintf(createActivityIDURL, accessToken, req.UnionID, req.OpenID)
|
||||||
uri := fmt.Sprintf(createActivityURL, accessToken)
|
response, err := util.HTTPGet(url)
|
||||||
response, err := util.HTTPGet(uri)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -100,3 +113,35 @@ type SendUpdatableMsgReq struct {
|
|||||||
TemplateInfo UpdatableMsgTemplate `json:"template_info"`
|
TemplateInfo UpdatableMsgTemplate `json:"template_info"`
|
||||||
TargetState UpdatableTargetState `json:"target_state"`
|
TargetState UpdatableTargetState `json:"target_state"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetChatToolMsgRequest 修改小程序聊天工具的动态卡片消息请求
|
||||||
|
type SetChatToolMsgRequest struct {
|
||||||
|
VersionType int64 `json:"version_type"`
|
||||||
|
TargetState UpdatableTargetState `json:"target_state"`
|
||||||
|
ActivityID string `json:"activity_id"`
|
||||||
|
TemplateID string `json:"template_id"`
|
||||||
|
ParticipatorInfoList []ParticipatorInfo `json:"participator_info_list,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParticipatorInfo 更新后的聊天室成员状态
|
||||||
|
type ParticipatorInfo struct {
|
||||||
|
State int `json:"state"`
|
||||||
|
GroupOpenID string `json:"group_openid"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetChatToolMsg 修改小程序聊天工具的动态卡片消息
|
||||||
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/updatable-message/setChatToolMsg.html
|
||||||
|
func (updatableMessage *UpdatableMessage) SetChatToolMsg(req *SetChatToolMsgRequest) error {
|
||||||
|
var (
|
||||||
|
accessToken string
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if accessToken, err = updatableMessage.GetAccessToken(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var response []byte
|
||||||
|
if response, err = util.PostJSON(fmt.Sprintf(setChatToolMsgURL, accessToken), req); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return util.DecodeWithCommonError(response, "SetChatToolMsg")
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,22 +12,30 @@ const (
|
|||||||
// 发送订阅消息
|
// 发送订阅消息
|
||||||
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
|
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
|
||||||
subscribeSendURL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send"
|
subscribeSendURL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send"
|
||||||
|
|
||||||
// 获取当前帐号下的个人模板列表
|
// 获取当前帐号下的个人模板列表
|
||||||
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.getTemplateList.html
|
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.getTemplateList.html
|
||||||
getTemplateURL = "https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate"
|
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
|
// 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"
|
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
|
// 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"
|
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
|
// 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"
|
uniformMessageSend = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send"
|
||||||
|
// getCategoryURL 获取类目
|
||||||
|
getCategoryURL = "https://api.weixin.qq.com/wxaapi/newtmpl/getcategory?access_token=%s"
|
||||||
|
// getPubTemplateKeyWordsByIDURL 获取关键词列表
|
||||||
|
getPubTemplateKeyWordsByIDURL = "https://api.weixin.qq.com/wxaapi/newtmpl/getpubtemplatekeywords?access_token=%s&tid=%s"
|
||||||
|
// getPubTemplateTitleListURL 获取所属类目下的公共模板
|
||||||
|
getPubTemplateTitleListURL = "https://api.weixin.qq.com/wxaapi/newtmpl/getpubtemplatetitles?access_token=%s&ids=%s&start=%d&limit=%d"
|
||||||
|
// setUserNotifyURL 激活与更新服务卡片
|
||||||
|
setUserNotifyURL = "https://api.weixin.qq.com/wxa/set_user_notify?access_token=%s"
|
||||||
|
// setUserNotifyExtURL 更新服务卡片扩展信息
|
||||||
|
setUserNotifyExtURL = "https://api.weixin.qq.com/wxa/set_user_notifyext?access_token=%s"
|
||||||
|
// getUserNotifyURL 查询服务卡片状态
|
||||||
|
getUserNotifyURL = "https://api.weixin.qq.com/wxa/get_user_notify?access_token=%s"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Subscribe 订阅消息
|
// Subscribe 订阅消息
|
||||||
@@ -58,11 +66,18 @@ type DataItem struct {
|
|||||||
|
|
||||||
// TemplateItem template item
|
// TemplateItem template item
|
||||||
type TemplateItem struct {
|
type TemplateItem struct {
|
||||||
PriTmplID string `json:"priTmplId"`
|
PriTmplID string `json:"priTmplId"`
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
Content string `json:"content"`
|
Content string `json:"content"`
|
||||||
Example string `json:"example"`
|
Example string `json:"example"`
|
||||||
Type int64 `json:"type"`
|
Type int64 `json:"type"`
|
||||||
|
KeywordEnumValueList []KeywordEnumValue `json:"keywordEnumValueList"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// KeywordEnumValue 枚举参数值范围
|
||||||
|
type KeywordEnumValue struct {
|
||||||
|
EnumValueList []string `json:"enumValueList"`
|
||||||
|
KeywordCode string `json:"keywordCode"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// TemplateList template list
|
// TemplateList template list
|
||||||
@@ -224,3 +239,200 @@ func (s *Subscribe) Delete(templateID string) (err error) {
|
|||||||
}
|
}
|
||||||
return util.DecodeWithCommonError(response, "DeleteSubscribe")
|
return util.DecodeWithCommonError(response, "DeleteSubscribe")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetCategoryResponse 获取类目响应
|
||||||
|
type GetCategoryResponse struct {
|
||||||
|
util.CommonError
|
||||||
|
Data []Category `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Category 类目
|
||||||
|
type Category struct {
|
||||||
|
ID int64 `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCategory 获取类目
|
||||||
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/subscribe-message/getCategory.html
|
||||||
|
func (s *Subscribe) GetCategory() ([]Category, error) {
|
||||||
|
var (
|
||||||
|
accessToken string
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if accessToken, err = s.GetAccessToken(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var response []byte
|
||||||
|
if response, err = util.HTTPGet(fmt.Sprintf(getCategoryURL, accessToken)); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
result := &GetCategoryResponse{}
|
||||||
|
err = util.DecodeWithError(response, result, "GetCategory")
|
||||||
|
return result.Data, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPubTemplateKeywordsByIDResponse 获取关键词列表响应
|
||||||
|
type GetPubTemplateKeywordsByIDResponse struct {
|
||||||
|
util.CommonError
|
||||||
|
Count int64 `json:"count"`
|
||||||
|
Data []PubTemplateKeywords `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// PubTemplateKeywords 关键词
|
||||||
|
type PubTemplateKeywords struct {
|
||||||
|
KID int64 `json:"kid"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Example string `json:"example"`
|
||||||
|
Rule string `json:"rule"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPubTemplateKeywordsByID 获取关键词列表
|
||||||
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/subscribe-message/getPubTemplateKeyWordsById.html
|
||||||
|
func (s *Subscribe) GetPubTemplateKeywordsByID(tid string) (*GetPubTemplateKeywordsByIDResponse, error) {
|
||||||
|
var (
|
||||||
|
accessToken string
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if accessToken, err = s.GetAccessToken(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var response []byte
|
||||||
|
if response, err = util.HTTPGet(fmt.Sprintf(getPubTemplateKeyWordsByIDURL, accessToken, tid)); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
result := &GetPubTemplateKeywordsByIDResponse{}
|
||||||
|
err = util.DecodeWithError(response, result, "GetPubTemplateKeywordsByID")
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPubTemplateTitleListRequest 获取所属类目下的公共模板请求
|
||||||
|
type GetPubTemplateTitleListRequest struct {
|
||||||
|
Start int64
|
||||||
|
Limit int64
|
||||||
|
IDs string
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPubTemplateTitleListResponse 获取所属类目下的公共模板响应
|
||||||
|
type GetPubTemplateTitleListResponse struct {
|
||||||
|
util.CommonError
|
||||||
|
Count int64 `json:"count"`
|
||||||
|
Data []PubTemplateTitle `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// PubTemplateTitle 模板标题
|
||||||
|
type PubTemplateTitle struct {
|
||||||
|
Type int64 `json:"type"`
|
||||||
|
TID string `json:"tid"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
CategoryID string `json:"categoryId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPubTemplateTitleList 获取所属类目下的公共模板
|
||||||
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/subscribe-message/getPubTemplateTitleList.html
|
||||||
|
func (s *Subscribe) GetPubTemplateTitleList(req *GetPubTemplateTitleListRequest) (*GetPubTemplateTitleListResponse, error) {
|
||||||
|
var (
|
||||||
|
accessToken string
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if accessToken, err = s.GetAccessToken(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var response []byte
|
||||||
|
if response, err = util.HTTPGet(fmt.Sprintf(getPubTemplateTitleListURL, accessToken, req.IDs, req.Start, req.Limit)); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
result := &GetPubTemplateTitleListResponse{}
|
||||||
|
err = util.DecodeWithError(response, result, "GetPubTemplateTitleList")
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetUserNotifyRequest 激活与更新服务卡片请求
|
||||||
|
type SetUserNotifyRequest struct {
|
||||||
|
OpenID string `json:"openid"`
|
||||||
|
NotifyType int64 `json:"notify_type"`
|
||||||
|
NotifyCode string `json:"notify_code"`
|
||||||
|
ContentJSON string `json:"content_json"`
|
||||||
|
CheckJSON string `json:"check_json,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetUserNotify 激活与更新服务卡片
|
||||||
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/subscribe-message/setUserNotify.html
|
||||||
|
func (s *Subscribe) SetUserNotify(req *SetUserNotifyRequest) error {
|
||||||
|
var (
|
||||||
|
accessToken string
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if accessToken, err = s.GetAccessToken(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var response []byte
|
||||||
|
if response, err = util.PostJSON(fmt.Sprintf(setUserNotifyURL, accessToken), req); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return util.DecodeWithCommonError(response, "SetUserNotify")
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetUserNotifyExtRequest 更新服务卡片扩展信息请求
|
||||||
|
type SetUserNotifyExtRequest struct {
|
||||||
|
OpenID string `json:"openid"`
|
||||||
|
NotifyType int64 `json:"notify_type"`
|
||||||
|
NotifyCode string `json:"notify_code"`
|
||||||
|
ExtJSON string `json:"ext_json"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetUserNotifyExt 更新服务卡片扩展信息
|
||||||
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/subscribe-message/setUserNotifyExt.html
|
||||||
|
func (s *Subscribe) SetUserNotifyExt(req *SetUserNotifyExtRequest) error {
|
||||||
|
var (
|
||||||
|
accessToken string
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if accessToken, err = s.GetAccessToken(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var response []byte
|
||||||
|
if response, err = util.PostJSON(fmt.Sprintf(setUserNotifyExtURL, accessToken), req); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return util.DecodeWithCommonError(response, "SetUserNotifyExt")
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUserNotifyRequest 查询服务卡片状态请求
|
||||||
|
type GetUserNotifyRequest struct {
|
||||||
|
OpenID string `json:"openid"`
|
||||||
|
NotifyType int64 `json:"notify_type"`
|
||||||
|
NotifyCode string `json:"notify_code"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUserNotifyResponse 查询服务卡片状态响应
|
||||||
|
type GetUserNotifyResponse struct {
|
||||||
|
util.CommonError
|
||||||
|
NotifyInfo NotifyInfo `json:"notify_info"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// NotifyInfo 卡片状态
|
||||||
|
type NotifyInfo struct {
|
||||||
|
NotifyType int64 `json:"notify_type"`
|
||||||
|
ContentJSON string `json:"content_json"`
|
||||||
|
CodeState int64 `json:"code_state"`
|
||||||
|
CodeExpireTime int64 `json:"code_expire_time"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUserNotify 查询服务卡片状态
|
||||||
|
// see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/subscribe-message/getUserNotify.html
|
||||||
|
func (s *Subscribe) GetUserNotify(req *GetUserNotifyRequest) (*GetUserNotifyResponse, error) {
|
||||||
|
var (
|
||||||
|
accessToken string
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if accessToken, err = s.GetAccessToken(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var response []byte
|
||||||
|
if response, err = util.PostJSON(fmt.Sprintf(getUserNotifyURL, accessToken), req); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
result := &GetUserNotifyResponse{}
|
||||||
|
err = util.DecodeWithError(response, result, "GetUserNotify")
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user