material.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package material
  2. import (
  3. "dashoo.cn/opms_libary/plugin/wechat/context"
  4. "dashoo.cn/opms_libary/plugin/wechat/mp/base"
  5. "encoding/json"
  6. )
  7. const (
  8. addNewsURL = "https://api.weixin.qq.com/cgi-bin/material/add_news"
  9. addMaterialURL = "https://api.weixin.qq.com/cgi-bin/material/add_material"
  10. delMaterialURL = "https://api.weixin.qq.com/cgi-bin/material/del_material"
  11. )
  12. //Material 素材管理
  13. type Material struct {
  14. base.MpBase
  15. }
  16. //NewMaterial init
  17. func NewMaterial(context *context.Context) *Material {
  18. material := new(Material)
  19. material.Context = context
  20. return material
  21. }
  22. //Article 永久图文素材
  23. type Article struct {
  24. Title string `json:"title"`
  25. ThumbMediaID string `json:"thumb_media_id"`
  26. Author string `json:"author"`
  27. Digest string `json:"digest"`
  28. ShowCoverPic int `json:"show_cover_pic"`
  29. Content string `json:"content"`
  30. ContentSourceURL string `json:"content_source_url"`
  31. }
  32. //reqArticles 永久性图文素材请求信息
  33. type reqArticles struct {
  34. Articles []*Article `json:"articles"`
  35. }
  36. //resArticles 永久性图文素材返回结果
  37. type resArticles struct {
  38. context.WxError
  39. MediaID string `json:"media_id"`
  40. }
  41. //AddNews 新增永久图文素材
  42. func (material *Material) AddNews(articles []*Article) (mediaID string, err error) {
  43. req := &reqArticles{articles}
  44. responseBytes, err := material.HTTPPostJSONWithAccessToken(addNewsURL, req)
  45. if err != nil {
  46. return
  47. }
  48. var res resArticles
  49. err = json.Unmarshal(responseBytes, res)
  50. if err != nil {
  51. return
  52. }
  53. mediaID = res.MediaID
  54. return
  55. }
  56. //resAddMaterial 永久性素材上传返回的结果
  57. type resAddMaterial struct {
  58. context.WxError
  59. MediaID string `json:"media_id"`
  60. URL string `json:"url"`
  61. }
  62. //AddMaterial 上传永久性素材(处理视频需要单独上传)
  63. func (material *Material) AddMaterial(mediaType MediaType, filename string) (mediaID string, url string, err error) {
  64. //if mediaType == MediaTypeVideo {
  65. // err = errors.New("永久视频素材上传使用 AddVideo 方法")
  66. //}
  67. //var accessToken string
  68. //accessToken, err = material.GetAccessToken()
  69. //if err != nil {
  70. // return
  71. //}
  72. //
  73. //uri := fmt.Sprintf("%s?access_token=%s&type=%s", addMaterialURL, accessToken, mediaType)
  74. //var response []byte
  75. //response, err = util.PostFile("media", filename, uri)
  76. //if err != nil {
  77. // return
  78. //}
  79. //var resMaterial resAddMaterial
  80. //err = json.Unmarshal(response, &resMaterial)
  81. //if err != nil {
  82. // return
  83. //}
  84. //if resMaterial.Code != 0 {
  85. // err = fmt.Errorf("AddMaterial error : errcode=%v , errmsg=%v", resMaterial.Code, resMaterial.Msg)
  86. // return
  87. //}
  88. //mediaID = resMaterial.MediaID
  89. //url = resMaterial.URL
  90. return
  91. }
  92. type reqVideo struct {
  93. Title string `json:"title"`
  94. Introduction string `json:"introduction"`
  95. }
  96. //AddVideo 永久视频素材文件上传
  97. func (material *Material) AddVideo(filename, title, introduction string) (mediaID string, url string, err error) {
  98. //var accessToken string
  99. //accessToken, err = material.GetAccessToken()
  100. //if err != nil {
  101. // return
  102. //}
  103. //
  104. //uri := fmt.Sprintf("%s?access_token=%s&type=video", addMaterialURL, accessToken)
  105. //
  106. //videoDesc := &reqVideo{
  107. // Title: title,
  108. // Introduction: introduction,
  109. //}
  110. //var fieldValue []byte
  111. //fieldValue, err = json.Marshal(videoDesc)
  112. //if err != nil {
  113. // return
  114. //}
  115. //
  116. //fields := []util.MultipartFormField{
  117. // {
  118. // IsFile: true,
  119. // Fieldname: "video",
  120. // Filename: filename,
  121. // },
  122. // {
  123. // IsFile: true,
  124. // Fieldname: "description",
  125. // Value: fieldValue,
  126. // },
  127. //}
  128. //
  129. //var response []byte
  130. //response, err = util.PostMultipartForm(fields, uri)
  131. //
  132. //
  133. //if err != nil {
  134. // return
  135. //}
  136. //
  137. //var resMaterial resAddMaterial
  138. //err = json.Unmarshal(response, &resMaterial)
  139. //if err != nil {
  140. // return
  141. //}
  142. //if resMaterial.Code != 0 {
  143. // err = fmt.Errorf("AddMaterial error : errcode=%v , errmsg=%v", resMaterial.Code, resMaterial.Msg)
  144. // return
  145. //}
  146. //mediaID = resMaterial.MediaID
  147. //url = resMaterial.URL
  148. return
  149. }
  150. type reqDeleteMaterial struct {
  151. MediaID string `json:"media_id"`
  152. }
  153. //DeleteMaterial 删除永久素材
  154. func (material *Material) DeleteMaterial(mediaID string) error {
  155. _, err := material.HTTPPostJSONWithAccessToken(delMaterialURL, reqDeleteMaterial{mediaID})
  156. if err != nil {
  157. return err
  158. }
  159. return nil
  160. }