updatable_msg.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package message
  2. import (
  3. "fmt"
  4. "github.com/silenceper/wechat/v2/miniprogram/context"
  5. "github.com/silenceper/wechat/v2/util"
  6. )
  7. const (
  8. // createActivityIDURL 创建activity_id
  9. createActivityIDURL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/activityid/create?access_token=%s&unionid=%s&openid=%s"
  10. // SendUpdatableMsgURL 修改动态消息
  11. setUpdatableMsgURL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/updatablemsg/send?access_token=%s"
  12. // setChatToolMsgURL 修改小程序聊天工具的动态卡片消息
  13. setChatToolMsgURL = "https://api.weixin.qq.com/cgi-bin/message/wxopen/chattoolmsg/send?access_token=%s"
  14. )
  15. // UpdatableTargetState 动态消息状态
  16. type UpdatableTargetState int
  17. const (
  18. // TargetStateNotStarted 未开始
  19. TargetStateNotStarted UpdatableTargetState = 0
  20. // TargetStateStarted 已开始
  21. TargetStateStarted UpdatableTargetState = 1
  22. // TargetStateFinished 已结束
  23. TargetStateFinished UpdatableTargetState = 2
  24. )
  25. // UpdatableMessage 动态消息
  26. type UpdatableMessage struct {
  27. *context.Context
  28. }
  29. // NewUpdatableMessage 实例化
  30. func NewUpdatableMessage(ctx *context.Context) *UpdatableMessage {
  31. return &UpdatableMessage{
  32. Context: ctx,
  33. }
  34. }
  35. // CreateActivityIDRequest 创建activity_id请求
  36. type CreateActivityIDRequest struct {
  37. UnionID string
  38. OpenID string
  39. }
  40. // CreateActivityID 创建activity_id
  41. func (updatableMessage *UpdatableMessage) CreateActivityID() (CreateActivityIDResponse, error) {
  42. return updatableMessage.CreateActivityIDWithReq(&CreateActivityIDRequest{})
  43. }
  44. // CreateActivityIDWithReq 创建activity_id
  45. // see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/updatable-message/createActivityId.html
  46. func (updatableMessage *UpdatableMessage) CreateActivityIDWithReq(req *CreateActivityIDRequest) (res CreateActivityIDResponse, err error) {
  47. accessToken, err := updatableMessage.GetAccessToken()
  48. if err != nil {
  49. return
  50. }
  51. url := fmt.Sprintf(createActivityIDURL, accessToken, req.UnionID, req.OpenID)
  52. response, err := util.HTTPGet(url)
  53. if err != nil {
  54. return
  55. }
  56. err = util.DecodeWithError(response, &res, "CreateActivityID")
  57. return
  58. }
  59. // SetUpdatableMsg 修改动态消息
  60. func (updatableMessage *UpdatableMessage) SetUpdatableMsg(activityID string, targetState UpdatableTargetState, template UpdatableMsgTemplate) (err error) {
  61. accessToken, err := updatableMessage.GetAccessToken()
  62. if err != nil {
  63. return
  64. }
  65. uri := fmt.Sprintf(setUpdatableMsgURL, accessToken)
  66. data := SendUpdatableMsgReq{
  67. ActivityID: activityID,
  68. TargetState: targetState,
  69. TemplateInfo: template,
  70. }
  71. response, err := util.PostJSON(uri, data)
  72. if err != nil {
  73. return
  74. }
  75. return util.DecodeWithCommonError(response, "SendUpdatableMsg")
  76. }
  77. // CreateActivityIDResponse 创建activity_id 返回
  78. type CreateActivityIDResponse struct {
  79. util.CommonError
  80. ActivityID string `json:"activity_id"`
  81. ExpirationTime int64 `json:"expiration_time"`
  82. }
  83. // UpdatableMsgTemplate 动态消息模板
  84. type UpdatableMsgTemplate struct {
  85. ParameterList []UpdatableMsgParameter `json:"parameter_list"`
  86. }
  87. // UpdatableMsgParameter 动态消息参数
  88. type UpdatableMsgParameter struct {
  89. Name string `json:"name"`
  90. Value string `json:"value"`
  91. }
  92. // SendUpdatableMsgReq 修改动态消息参数
  93. type SendUpdatableMsgReq struct {
  94. ActivityID string `json:"activity_id"`
  95. TemplateInfo UpdatableMsgTemplate `json:"template_info"`
  96. TargetState UpdatableTargetState `json:"target_state"`
  97. }
  98. // SetChatToolMsgRequest 修改小程序聊天工具的动态卡片消息请求
  99. type SetChatToolMsgRequest struct {
  100. VersionType int64 `json:"version_type"`
  101. TargetState UpdatableTargetState `json:"target_state"`
  102. ActivityID string `json:"activity_id"`
  103. TemplateID string `json:"template_id"`
  104. ParticipatorInfoList []ParticipatorInfo `json:"participator_info_list,omitempty"`
  105. }
  106. // ParticipatorInfo 更新后的聊天室成员状态
  107. type ParticipatorInfo struct {
  108. State int `json:"state"`
  109. GroupOpenID string `json:"group_openid"`
  110. }
  111. // SetChatToolMsg 修改小程序聊天工具的动态卡片消息
  112. // see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/updatable-message/setChatToolMsg.html
  113. func (updatableMessage *UpdatableMessage) SetChatToolMsg(req *SetChatToolMsgRequest) error {
  114. var (
  115. accessToken string
  116. err error
  117. )
  118. if accessToken, err = updatableMessage.GetAccessToken(); err != nil {
  119. return err
  120. }
  121. var response []byte
  122. if response, err = util.PostJSON(fmt.Sprintf(setChatToolMsgURL, accessToken), req); err != nil {
  123. return err
  124. }
  125. return util.DecodeWithCommonError(response, "SetChatToolMsg")
  126. }