template.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package message
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/silenceper/wechat/v2/officialaccount/context"
  6. "github.com/silenceper/wechat/v2/util"
  7. )
  8. const (
  9. templateSendURL = "https://api.weixin.qq.com/cgi-bin/message/template/send"
  10. )
  11. //Template 模板消息
  12. type Template struct {
  13. *context.Context
  14. }
  15. //NewTemplate 实例化
  16. func NewTemplate(context *context.Context) *Template {
  17. tpl := new(Template)
  18. tpl.Context = context
  19. return tpl
  20. }
  21. //TemplateMessage 发送的模板消息内容
  22. type TemplateMessage struct {
  23. ToUser string `json:"touser"` // 必须, 接受者OpenID
  24. TemplateID string `json:"template_id"` // 必须, 模版ID
  25. URL string `json:"url,omitempty"` // 可选, 用户点击后跳转的URL, 该URL必须处于开发者在公众平台网站中设置的域中
  26. Color string `json:"color,omitempty"` // 可选, 整个消息的颜色, 可以不设置
  27. Data map[string]*TemplateDataItem `json:"data"` // 必须, 模板数据
  28. MiniProgram struct {
  29. AppID string `json:"appid"` //所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系)
  30. PagePath string `json:"pagepath"` //所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar)
  31. } `json:"miniprogram"` //可选,跳转至小程序地址
  32. }
  33. //TemplateDataItem 模版内某个 .DATA 的值
  34. type TemplateDataItem struct {
  35. Value string `json:"value"`
  36. Color string `json:"color,omitempty"`
  37. }
  38. type resTemplateSend struct {
  39. util.CommonError
  40. MsgID int64 `json:"msgid"`
  41. }
  42. //Send 发送模板消息
  43. func (tpl *Template) Send(msg *TemplateMessage) (msgID int64, err error) {
  44. var accessToken string
  45. accessToken, err = tpl.GetAccessToken()
  46. if err != nil {
  47. return
  48. }
  49. uri := fmt.Sprintf("%s?access_token=%s", templateSendURL, accessToken)
  50. response, err := util.PostJSON(uri, msg)
  51. if err != nil {
  52. return
  53. }
  54. var result resTemplateSend
  55. err = json.Unmarshal(response, &result)
  56. if err != nil {
  57. return
  58. }
  59. if result.ErrCode != 0 {
  60. err = fmt.Errorf("template msg send error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
  61. return
  62. }
  63. msgID = result.MsgID
  64. return
  65. }