mini.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package wechat
  2. import (
  3. "net/url"
  4. "time"
  5. "encoding/json"
  6. "git.chuangxin1.com/cx/myth"
  7. )
  8. func keyMini(appid string) string {
  9. return "wechat:mini:client:" + appid
  10. }
  11. // NewMiniClient new mini client
  12. func NewMiniClient(appID, appSecret string) *MiniClient {
  13. key := keyMini(appID)
  14. if v, ok := cache.Load(key); ok {
  15. return v.(*MiniClient)
  16. }
  17. c := &MiniClient{AppID: appID, AppSecret: appSecret}
  18. cache.Store(key, c)
  19. return c
  20. }
  21. // GetMiniOpenID get openid by code
  22. func (mc *MiniClient) GetMiniOpenID(frm FormCode) (openid string, err error) {
  23. uri := BaseURL + "/sns/jscode2session?"
  24. args := url.Values{}
  25. args.Add("grant_type", "authorization_code")
  26. args.Add("appid", mc.AppID)
  27. args.Add("secret", mc.AppSecret)
  28. args.Add("js_code", frm.Code)
  29. uri += args.Encode()
  30. var jq *myth.JSONQuery
  31. if jq, err = getJSON(uri); err == nil {
  32. openid, err = jq.String(`openid`)
  33. }
  34. return
  35. }
  36. // getToken get token
  37. func (mc *MiniClient) getToken() (token string, err error) {
  38. now := time.Now().Unix()
  39. if mc.LastTokenTime > 0 {
  40. if now-mc.LastTokenTime < TokenExpires {
  41. token = mc.AccessToken
  42. return
  43. }
  44. }
  45. uri := BaseURL + "/cgi-bin/token?"
  46. args := url.Values{}
  47. args.Add("grant_type", "client_credential")
  48. args.Add("appid", mc.AppID)
  49. args.Add("secret", mc.AppSecret)
  50. uri += args.Encode()
  51. var jq *myth.JSONQuery
  52. if jq, err = getJSON(uri); err == nil {
  53. mc.LastTokenTime = now
  54. mc.AccessToken, err = jq.String(`access_token`)
  55. token = mc.AccessToken
  56. key := keyMini(mc.AppID)
  57. cache.Store(key, mc)
  58. }
  59. return
  60. }
  61. // TemplateList /cgi-bin/wxopen/template/list
  62. func (mc *MiniClient) TemplateList(offset, count int) (body []byte, err error) {
  63. uri := BaseURL + "/cgi-bin/wxopen/template/list?"
  64. if mc.AccessToken, err = mc.getToken(); err != nil {
  65. return
  66. }
  67. args := url.Values{}
  68. args.Add("access_token", mc.AccessToken)
  69. uri += args.Encode()
  70. params := make(map[string]interface{})
  71. params["offset"] = offset
  72. params["count"] = count
  73. data, err := json.Marshal(params)
  74. if err != nil {
  75. return
  76. }
  77. body, err = postJSONBody(uri, data)
  78. return
  79. }
  80. // TemplateSend /cgi-bin/message/wxopen/template/send
  81. func (mc *MiniClient) TemplateSend(template MiniTemplateMessage) (jq *myth.JSONQuery, err error) {
  82. uri := BaseURL + "/cgi-bin/message/wxopen/template/send?"
  83. if mc.AccessToken, err = mc.getToken(); err != nil {
  84. return
  85. }
  86. args := url.Values{}
  87. args.Add("access_token", mc.AccessToken)
  88. uri += args.Encode()
  89. data, err := json.Marshal(template)
  90. if err != nil {
  91. return
  92. }
  93. jq, err = postJSON(uri, data)
  94. return
  95. }
  96. // UniformSend /cgi-bin/message/wxopen/template/uniform_send
  97. func (mc *MiniClient) UniformSend(template MiniUniformMessage) (jq *myth.JSONQuery, err error) {
  98. uri := BaseURL + "/cgi-bin/message/wxopen/template/uniform_send?"
  99. if mc.AccessToken, err = mc.getToken(); err != nil {
  100. return
  101. }
  102. args := url.Values{}
  103. args.Add("access_token", mc.AccessToken)
  104. uri += args.Encode()
  105. data, err := json.Marshal(template)
  106. if err != nil {
  107. return
  108. }
  109. jq, err = postJSON(uri, data)
  110. return
  111. }