Procházet zdrojové kódy

feat: 微信小程序-动态消息及订阅消息 (#835)

* feat: 微信小程序-动态消息及订阅消息

* feat: 微信小程序-动态消息及订阅消息

* feat: 微信小程序-动态消息及订阅消息
markwang před 1 rokem
rodič
revize
8a810837a4
2 změnil soubory, kde provedl 272 přidání a 15 odebrání
  1. 51 6
      miniprogram/message/updatable_msg.go
  2. 221 9
      miniprogram/subscribe/subscribe.go

+ 51 - 6
miniprogram/message/updatable_msg.go

@@ -8,10 +8,12 @@ import (
 )
 )
 
 
 const (
 const (
-	// createActivityURL 创建activity_id
-	createActivityURL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/activityid/create?access_token=%s"
+	// createActivityIDURL 创建activity_id
+	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
 	}
 	}
-
-	uri := fmt.Sprintf(createActivityURL, accessToken)
-	response, err := util.HTTPGet(uri)
+	url := fmt.Sprintf(createActivityIDURL, accessToken, req.UnionID, req.OpenID)
+	response, err := util.HTTPGet(url)
 	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")
+}

+ 221 - 9
miniprogram/subscribe/subscribe.go

@@ -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"`
-	Title     string `json:"title"`
-	Content   string `json:"content"`
-	Example   string `json:"example"`
-	Type      int64  `json:"type"`
+	PriTmplID            string             `json:"priTmplId"`
+	Title                string             `json:"title"`
+	Content              string             `json:"content"`
+	Example              string             `json:"example"`
+	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
+}