|
@@ -2,10 +2,13 @@ package wechat
|
|
|
|
|
|
import (
|
|
|
"net/url"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "encoding/json"
|
|
|
)
|
|
|
|
|
|
func keyMini(appid string) string {
|
|
|
- return "wechat:mini:" + appid
|
|
|
+ return "wechat:mini:client:" + appid
|
|
|
}
|
|
|
|
|
|
// NewMiniClient new mini client
|
|
@@ -20,13 +23,13 @@ func NewMiniClient(appID, appSecret string) *MiniClient {
|
|
|
}
|
|
|
|
|
|
// GetMiniOpenID get openid by code
|
|
|
-func (wc *MiniClient) GetMiniOpenID(frm FormCode) (openid string, err error) {
|
|
|
+func (mc *MiniClient) GetMiniOpenID(frm FormCode) (openid string, err error) {
|
|
|
uri := BaseURL + "/sns/jscode2session?"
|
|
|
|
|
|
args := url.Values{}
|
|
|
args.Add("grant_type", "authorization_code")
|
|
|
- args.Add("appid", wc.AppID)
|
|
|
- args.Add("secret", wc.AppSecret)
|
|
|
+ args.Add("appid", mc.AppID)
|
|
|
+ args.Add("secret", mc.AppSecret)
|
|
|
args.Add("js_code", frm.Code)
|
|
|
|
|
|
uri += args.Encode()
|
|
@@ -36,3 +39,95 @@ func (wc *MiniClient) GetMiniOpenID(frm FormCode) (openid string, err error) {
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+// getToken get token
|
|
|
+func (mc *MiniClient) getToken() (token string, err error) {
|
|
|
+ now := time.Now().Unix()
|
|
|
+ if mc.LastTokenTime > 0 {
|
|
|
+ if now-mc.LastTokenTime < TokenExpires {
|
|
|
+ token = mc.AccessToken
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ uri := BaseURL + "/cgi-bin/token?"
|
|
|
+
|
|
|
+ args := url.Values{}
|
|
|
+ args.Add("grant_type", "client_credential")
|
|
|
+ args.Add("appid", mc.AppID)
|
|
|
+ args.Add("secret", mc.AppSecret)
|
|
|
+
|
|
|
+ uri += args.Encode()
|
|
|
+ var res Response
|
|
|
+ if res, err = getJSON(uri); err == nil {
|
|
|
+ mc.LastTokenTime = now
|
|
|
+ mc.AccessToken = res.AccessToken
|
|
|
+ token = mc.AccessToken
|
|
|
+ key := keyMini(mc.AppID)
|
|
|
+ cache.Store(key, mc)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// TemplateList /cgi-bin/wxopen/template/list
|
|
|
+func (mc *MiniClient) TemplateList(offset, count int) (res Response, err error) {
|
|
|
+ uri := BaseURL + "/cgi-bin/wxopen/template/list?"
|
|
|
+
|
|
|
+ if mc.AccessToken, err = mc.getToken(); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ args := url.Values{}
|
|
|
+ args.Add("access_token", mc.AccessToken)
|
|
|
+
|
|
|
+ uri += args.Encode()
|
|
|
+
|
|
|
+ params := make(map[string]interface{})
|
|
|
+ params["offset"] = offset
|
|
|
+ params["count"] = count
|
|
|
+ data, err := json.Marshal(params)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ res, err = postJSON(uri, data)
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// TemplateSend /cgi-bin/message/wxopen/template/send
|
|
|
+func (mc *MiniClient) TemplateSend(template MiniTemplateMessage) (res Response, err error) {
|
|
|
+ uri := BaseURL + "/cgi-bin/message/wxopen/template/send?"
|
|
|
+
|
|
|
+ if mc.AccessToken, err = mc.getToken(); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ args := url.Values{}
|
|
|
+ args.Add("access_token", mc.AccessToken)
|
|
|
+
|
|
|
+ uri += args.Encode()
|
|
|
+ data, err := json.Marshal(template)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ res, err = postJSON(uri, data)
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// UniformSend /cgi-bin/message/wxopen/template/uniform_send
|
|
|
+func (mc *MiniClient) UniformSend(template MiniUniformMessage) (res Response, err error) {
|
|
|
+ uri := BaseURL + "/cgi-bin/message/wxopen/template/send?"
|
|
|
+
|
|
|
+ if mc.AccessToken, err = mc.getToken(); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ args := url.Values{}
|
|
|
+ args.Add("access_token", mc.AccessToken)
|
|
|
+
|
|
|
+ uri += args.Encode()
|
|
|
+ data, err := json.Marshal(template)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ res, err = postJSON(uri, data)
|
|
|
+
|
|
|
+ return
|
|
|
+}
|