package wechat import ( "net/url" "time" "encoding/json" ) func keyMini(appid string) string { return "wechat:mini:client:" + appid } // NewMiniClient new mini client func NewMiniClient(appID, appSecret string) *MiniClient { key := keyMini(appID) if v, ok := cache.Load(key); ok { return v.(*MiniClient) } c := &MiniClient{AppID: appID, AppSecret: appSecret} cache.Store(key, c) return c } // GetMiniOpenID get openid by code 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", mc.AppID) args.Add("secret", mc.AppSecret) args.Add("js_code", frm.Code) uri += args.Encode() var res Response if res, err = getJSON(uri); err == nil { openid = res.OpenID } 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) (body []byte, 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 } body, err = postJSONBody(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/uniform_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 }