mini.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package wechat
  2. import (
  3. "fmt"
  4. "net/url"
  5. "time"
  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. var msg myth.HTTPMessage
  74. msg, err = postJSON(uri, params)
  75. if err == nil {
  76. body = msg.Body
  77. }
  78. /*
  79. data, err := json.Marshal(params)
  80. if err != nil {
  81. return
  82. }
  83. body, err = postJSONBody(uri, data)
  84. // */
  85. return
  86. }
  87. // TemplateSend /cgi-bin/message/wxopen/template/send
  88. func (mc *MiniClient) TemplateSend(template MiniTemplateMessage) (jq *myth.JSONQuery, err error) {
  89. uri := BaseURL + "/cgi-bin/message/wxopen/template/send?"
  90. if mc.AccessToken, err = mc.getToken(); err != nil {
  91. return
  92. }
  93. args := url.Values{}
  94. args.Add("access_token", mc.AccessToken)
  95. uri += args.Encode()
  96. var msg myth.HTTPMessage
  97. msg, err = postJSON(uri, template)
  98. if err == nil {
  99. jq, err = msg.JSONQuery()
  100. }
  101. return
  102. }
  103. // UniformSend /cgi-bin/message/wxopen/template/uniform_send
  104. func (mc *MiniClient) UniformSend(template MiniUniformMessage) (jq *myth.JSONQuery, err error) {
  105. uri := BaseURL + "/cgi-bin/message/wxopen/template/uniform_send?"
  106. if mc.AccessToken, err = mc.getToken(); err != nil {
  107. return
  108. }
  109. args := url.Values{}
  110. args.Add("access_token", mc.AccessToken)
  111. uri += args.Encode()
  112. var msg myth.HTTPMessage
  113. msg, err = postJSON(uri, template)
  114. fmt.Println("UniformSend", err, msg.StatusCode, string(msg.Body))
  115. if err == nil {
  116. jq, err = msg.JSONQuery()
  117. fmt.Println(err, jq)
  118. }
  119. return
  120. }