| 
					
				 | 
			
			
				@@ -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 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |