media.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package material
  2. import (
  3. "dashoo.cn/opms_libary/plugin/wechat/context"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/gogf/gf/frame/g"
  7. )
  8. //MediaType 媒体文件类型
  9. type MediaType string
  10. const (
  11. //MediaTypeImage 媒体文件:图片
  12. MediaTypeImage MediaType = "image"
  13. //MediaTypeVoice 媒体文件:声音
  14. MediaTypeVoice = "voice"
  15. //MediaTypeVideo 媒体文件:视频
  16. MediaTypeVideo = "video"
  17. //MediaTypeThumb 媒体文件:缩略图
  18. MediaTypeThumb = "thumb"
  19. )
  20. const (
  21. mediaUploadURL = "https://api.weixin.qq.com/cgi-bin/media/upload"
  22. mediaUploadImageURL = "https://api.weixin.qq.com/cgi-bin/media/uploadimg"
  23. mediaGetURL = "https://api.weixin.qq.com/cgi-bin/media/get"
  24. )
  25. //Media 临时素材上传返回信息
  26. type Media struct {
  27. context.WxError
  28. Type MediaType `json:"type"`
  29. MediaID string `json:"media_id"`
  30. ThumbMediaID string `json:"thumb_media_id"`
  31. CreatedAt int64 `json:"created_at"`
  32. }
  33. //MediaUpload 临时素材上传
  34. func (material *Material) MediaUpload(mediaType MediaType, filepath string) (media Media, err error) {
  35. var accessToken string
  36. accessToken, err = material.GetAccessToken()
  37. if err != nil {
  38. return
  39. }
  40. uri := fmt.Sprintf("%s?access_token=%s&type=%s", mediaUploadURL, accessToken, mediaType)
  41. result, err := g.Client().Post(uri, "media=@file:"+filepath)
  42. if err != nil {
  43. return
  44. }
  45. defer result.Close()
  46. err = json.Unmarshal(result.ReadAll(), &media)
  47. if err != nil {
  48. return
  49. }
  50. if media.Code != 0 {
  51. err = fmt.Errorf("MediaUpload error : errcode=%v , errmsg=%v", media.Code, media.Msg)
  52. return
  53. }
  54. return
  55. }
  56. //GetMediaURL 返回临时素材的下载地址供用户自己处理
  57. //NOTICE: URL 不可公开,因为含access_token 需要立即另存文件
  58. func (material *Material) GetMediaURL(mediaID string) (mediaURL string, err error) {
  59. var accessToken string
  60. accessToken, err = material.GetAccessToken()
  61. if err != nil {
  62. return
  63. }
  64. mediaURL = fmt.Sprintf("%s?access_token=%s&media_id=%s", mediaGetURL, accessToken, mediaID)
  65. return
  66. }
  67. //resMediaImage 图片上传返回结果
  68. type resMediaImage struct {
  69. context.WxError
  70. URL string `json:"url"`
  71. }
  72. //ImageUpload 图片上传
  73. func (material *Material) ImageUpload(filepath string) (url string, err error) {
  74. var accessToken string
  75. accessToken, err = material.GetAccessToken()
  76. if err != nil {
  77. return
  78. }
  79. uri := fmt.Sprintf("%s?access_token=%s", mediaUploadImageURL, accessToken)
  80. result, err := g.Client().Post(uri, "media=@file:"+filepath)
  81. if err != nil {
  82. return
  83. }
  84. var image resMediaImage
  85. defer result.Close()
  86. err = json.Unmarshal(result.ReadAll(), &image)
  87. if err != nil {
  88. return
  89. }
  90. if image.Code != 0 {
  91. err = fmt.Errorf("UploadImage error : errcode=%v , errmsg=%v", image.Code, image.Msg)
  92. return
  93. }
  94. url = image.URL
  95. return
  96. }