From 615a8cd66409831b25347185f468427e6d50c406 Mon Sep 17 00:00:00 2001 From: ripple_k Date: Mon, 9 Apr 2018 12:00:41 +0800 Subject: [PATCH 01/13] menu add miniprogram --- menu/button.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/menu/button.go b/menu/button.go index f7c293f..f544a5d 100644 --- a/menu/button.go +++ b/menu/button.go @@ -7,6 +7,8 @@ type Button struct { Key string `json:"key,omitempty"` URL string `json:"url,omitempty"` MediaID string `json:"media_id,omitempty"` + AppID string `json:"appid,omitempty"` + PagePath string `json:"pagepath,omitempty"` SubButtons []*Button `json:"sub_button,omitempty"` } @@ -126,3 +128,16 @@ func (btn *Button) SetViewLimitedButton(name, mediaID string) { btn.URL = "" btn.SubButtons = nil } + +//SetViewLimitedButton 设置 跳转小程序 类型按钮 (公众号后台必须已经关联小程序) +func (btn *Button) SetMiniprogramButton(name, url, appID, pagePath string) { + btn.Type = "miniprogram" + btn.Name = name + btn.URL = url + btn.AppID = appID + btn.PagePath = pagePath + + btn.Key = "" + btn.MediaID = "" + btn.SubButtons = nil +} From a57ad46b7ae6eb1235498437b6dbd3d7082a43c1 Mon Sep 17 00:00:00 2001 From: ripple_k Date: Mon, 9 Apr 2018 15:06:39 +0800 Subject: [PATCH 02/13] ci build --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 0738b0f..a4d1bc6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ language: go go: + - 1.10.x - 1.9.x - 1.8.x - 1.7.x From d926e384c2f4a3bbb80955eda89ca70a5d86b476 Mon Sep 17 00:00:00 2001 From: ripple_k Date: Mon, 9 Apr 2018 15:42:51 +0800 Subject: [PATCH 03/13] comments change --- menu/button.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/button.go b/menu/button.go index f544a5d..ec67b35 100644 --- a/menu/button.go +++ b/menu/button.go @@ -129,7 +129,7 @@ func (btn *Button) SetViewLimitedButton(name, mediaID string) { btn.SubButtons = nil } -//SetViewLimitedButton 设置 跳转小程序 类型按钮 (公众号后台必须已经关联小程序) +//SetMiniprogramButton 设置 跳转小程序 类型按钮 (公众号后台必须已经关联小程序) func (btn *Button) SetMiniprogramButton(name, url, appID, pagePath string) { btn.Type = "miniprogram" btn.Name = name From 4470d51ac3740b724b75465f00065cb4a72a0708 Mon Sep 17 00:00:00 2001 From: silenceper Date: Tue, 24 Apr 2018 17:12:38 +0800 Subject: [PATCH 04/13] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 656a0d4..030926c 100644 --- a/README.md +++ b/README.md @@ -272,7 +272,7 @@ type Reply struct { } ``` -注意:`retrun nil`表示什么也不做 +注意:`return nil`表示什么也不做 #### 回复文本消息 ```go From a241ec4c146f2c27b72630cbdfa2fc04dad14dcb Mon Sep 17 00:00:00 2001 From: Xian Zhao Date: Wed, 9 May 2018 15:48:11 +0800 Subject: [PATCH 05/13] =?UTF-8?q?cache.Redis=E5=A2=9E=E5=8A=A0SetConn?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=8C=E4=BF=AE=E6=94=B9redis=E5=8C=85?= =?UTF-8?q?=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cache/redis.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cache/redis.go b/cache/redis.go index 9d102b0..b4039a5 100644 --- a/cache/redis.go +++ b/cache/redis.go @@ -4,7 +4,7 @@ import ( "encoding/json" "time" - "github.com/garyburd/redigo/redis" + "github.com/gomodule/redigo/redis" ) //Redis redis cache @@ -45,6 +45,11 @@ func NewRedis(opts *RedisOpts) *Redis { return &Redis{pool} } +//SetConn 设置conn +func (r *Redis) SetConn(conn *redis.Pool) { + r.conn = conn +} + //Get 获取一个值 func (r *Redis) Get(key string) interface{} { conn := r.conn.Get() From 64c61036149da0e4f147a11757141a851595fd5e Mon Sep 17 00:00:00 2001 From: kanyways Date: Mon, 21 May 2018 18:41:00 +0800 Subject: [PATCH 06/13] =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E8=AF=86=E5=88=AB=E5=AD=97=E6=AE=B5Recogniti?= =?UTF-8?q?on=EF=BC=8C=E5=9C=A8=E5=BE=AE=E4=BF=A1=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E5=BC=80=E5=90=AF=E8=AF=AD=E9=9F=B3=E8=AF=86=E5=88=AB=E5=90=8E?= =?UTF-8?q?=E5=8F=AF=E7=94=A8=E6=94=B9=E5=AD=97=E6=AE=B5=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E8=AF=86=E5=88=AB=E6=96=87=E5=AD=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- message/message.go | 1 + 1 file changed, 1 insertion(+) diff --git a/message/message.go b/message/message.go index b426a7f..e8cf5a4 100644 --- a/message/message.go +++ b/message/message.go @@ -69,6 +69,7 @@ type MixMessage struct { //基本消息 MsgID int64 `xml:"MsgId"` Content string `xml:"Content"` + Recognition string `xml:"Recognition"` PicURL string `xml:"PicUrl"` MediaID string `xml:"MediaId"` Format string `xml:"Format"` From 837d264b7eb917656f6ac458c3d097d9cdc63661 Mon Sep 17 00:00:00 2001 From: silenceper Date: Mon, 21 May 2018 20:26:31 +0800 Subject: [PATCH 07/13] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0738b0f..41e0f9c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,10 @@ language: go go: + - 1.10.x - 1.9.x - 1.8.x - 1.7.x - - 1.6.x services: - memcached From 6ac7e1142f6b8d19df4782760b52de3d8472b1dc Mon Sep 17 00:00:00 2001 From: wenzl Date: Tue, 10 Jul 2018 14:24:38 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E7=BD=91=E9=A1=B5=E6=8E=88=E6=9D=83=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- context/qy_access_token.go | 76 ++++++++++++++++++++++++++++++ menu/menu.go | 1 - oauth/qy_oauth.go | 95 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 context/qy_access_token.go create mode 100644 oauth/qy_oauth.go diff --git a/context/qy_access_token.go b/context/qy_access_token.go new file mode 100644 index 0000000..c76d35a --- /dev/null +++ b/context/qy_access_token.go @@ -0,0 +1,76 @@ +package context + +import ( + "encoding/json" + "fmt" + "log" + "sync" + "time" + + "github.com/silenceper/wechat/util" +) + +const ( + //qyAccessTokenURL 获取access_token的接口 + qyAccessTokenURL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s" +) + +//ResQyAccessToken struct +type ResQyAccessToken struct { + util.CommonError + + AccessToken string `json:"access_token"` + ExpiresIn int64 `json:"expires_in"` +} + +//SetQyAccessTokenLock 设置读写锁(一个appID一个读写锁) +func (ctx *Context) SetQyAccessTokenLock(l *sync.RWMutex) { + ctx.accessTokenLock = l +} + +//GetQyAccessToken 获取access_token +func (ctx *Context) GetQyAccessToken() (accessToken string, err error) { + ctx.accessTokenLock.Lock() + defer ctx.accessTokenLock.Unlock() + + accessTokenCacheKey := fmt.Sprintf("qy_access_token_%s", ctx.AppID) + val := ctx.Cache.Get(accessTokenCacheKey) + if val != nil { + accessToken = val.(string) + return + } + + //从微信服务器获取 + var resQyAccessToken ResQyAccessToken + resQyAccessToken, err = ctx.GetQyAccessTokenFromServer() + if err != nil { + return + } + + accessToken = resQyAccessToken.AccessToken + return +} + +//GetQyAccessTokenFromServer 强制从微信服务器获取token +func (ctx *Context) GetQyAccessTokenFromServer() (resQyAccessToken ResQyAccessToken, err error) { + log.Printf("GetQyAccessTokenFromServer") + url := fmt.Sprintf(qyAccessTokenURL, ctx.AppID, ctx.AppSecret) + var body []byte + body, err = util.HTTPGet(url) + if err != nil { + return + } + err = json.Unmarshal(body, &resQyAccessToken) + if err != nil { + return + } + if resQyAccessToken.ErrCode != 0 { + err = fmt.Errorf("get qy_access_token error : errcode=%v , errormsg=%v", resQyAccessToken.ErrCode, resQyAccessToken.ErrMsg) + return + } + + qyAccessTokenCacheKey := fmt.Sprintf("qy_access_token_%s", ctx.AppID) + expires := resQyAccessToken.ExpiresIn - 1500 + err = ctx.Cache.Set(qyAccessTokenCacheKey, resQyAccessToken.AccessToken, time.Duration(expires)*time.Second) + return +} diff --git a/menu/menu.go b/menu/menu.go index f4aeb6d..67fe015 100644 --- a/menu/menu.go +++ b/menu/menu.go @@ -286,7 +286,6 @@ func (menu *Menu) GetCurrentSelfMenuInfo() (resSelfMenuInfo ResSelfMenuInfo, err if err != nil { return } - fmt.Println(string(response)) err = json.Unmarshal(response, &resSelfMenuInfo) if err != nil { return diff --git a/oauth/qy_oauth.go b/oauth/qy_oauth.go new file mode 100644 index 0000000..3f6916d --- /dev/null +++ b/oauth/qy_oauth.go @@ -0,0 +1,95 @@ +package oauth + +import ( + "encoding/json" + "fmt" + "net/url" + + "github.com/silenceper/wechat/util" +) + +var ( + qyRedirectOauthURL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&agentid=%s&state=%s#wechat_redirect" + qyUserInfoURL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=%s&code=%s" + qyUserDetailURL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserdetail" +) + +//GetQyRedirectURL 获取企业微信跳转的url地址 +func (oauth *Oauth) GetQyRedirectURL(redirectURI, agentid, scope, state string) (string, error) { + //url encode + urlStr := url.QueryEscape(redirectURI) + return fmt.Sprintf(qyRedirectOauthURL, oauth.AppID, urlStr, scope, agentid, state), nil +} + +//QyUserInfo 用户授权获取到用户信息 +type QyUserInfo struct { + util.CommonError + + UserID string `json:"UserId"` + DeviceID string `json:"DeviceId"` + UserTicket string `json:"user_ticket"` + ExpiresIn int64 `json:"expires_in"` +} + +//GetQyUserInfoByCode 根据code获取企业user_info +func (oauth *Oauth) GetQyUserInfoByCode(code string) (result QyUserInfo, err error) { + qyAccessToken, e := oauth.GetQyAccessToken() + if e != nil { + err = e + return + } + urlStr := fmt.Sprintf(qyUserInfoURL, qyAccessToken, code) + var response []byte + response, err = util.HTTPGet(urlStr) + if err != nil { + return + } + err = json.Unmarshal(response, &result) + if err != nil { + return + } + if result.ErrCode != 0 { + err = fmt.Errorf("GetQyUserInfoByCode error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg) + return + } + return +} + +//QyUserDetail 到用户详情 +type QyUserDetail struct { + util.CommonError + + UserID string `json:"UserId"` + Name string `json:"name"` + Mobile string `json:"mobile"` + Gender string `json:"gender"` + Email string `json:"email"` + Avatar string `json:"avatar"` + QrCode string `json:"qr_code"` +} + +//GetQyUserDetailUserTicket 根据user_ticket获取到用户详情 +func (oauth *Oauth) GetQyUserDetailUserTicket(userTicket string) (result QyUserDetail, err error) { + var qyAccessToken string + qyAccessToken, err = oauth.GetQyAccessToken() + if err != nil { + return + } + uri := fmt.Sprintf("%s?access_token=%s", qyUserDetailURL, qyAccessToken) + var response []byte + response, err = util.PostJSON(uri, map[string]string{ + "user_ticket": userTicket, + }) + if err != nil { + return + } + err = json.Unmarshal(response, &result) + if err != nil { + return + } + if result.ErrCode != 0 { + err = fmt.Errorf("GetQyUserDetailUserTicket Error , errcode=%d , errmsg=%s", result.ErrCode, result.ErrMsg) + return + } + return +} From 22bfe7209d5dad39ba6993ee34574667419d130a Mon Sep 17 00:00:00 2001 From: silenceper Date: Wed, 12 Sep 2018 00:13:23 +0800 Subject: [PATCH 09/13] Update .travis.yml add go 1.11.x --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 41e0f9c..33a3db7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ language: go go: + - 1.11.x - 1.10.x - 1.9.x - 1.8.x From 2c7c3f26c5eb1631331435e4894c7179c383a7be Mon Sep 17 00:00:00 2001 From: Chyroc Date: Wed, 12 Sep 2018 01:45:51 +0800 Subject: [PATCH 10/13] skip-valid-when-debug-mode(fix #82) --- .gitignore | 1 + material/media.go | 8 ++++---- message/message.go | 18 +++++++++--------- server/server.go | 10 ++++++++++ wechat.go | 10 +++++----- 5 files changed, 29 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 36eec47..0c874bc 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ _testmain.go .DS_Store .vscode/ vendor/*/ +.idea/ diff --git a/material/media.go b/material/media.go index 4465605..70ff09e 100644 --- a/material/media.go +++ b/material/media.go @@ -31,10 +31,10 @@ const ( type Media struct { util.CommonError - Type MediaType `json:"type"` - MediaID string `json:"media_id"` - ThumbMediaID string `json:"thumb_media_id"` - CreatedAt int64 `json:"created_at"` + Type MediaType `json:"type"` + MediaID string `json:"media_id"` + ThumbMediaID string `json:"thumb_media_id"` + CreatedAt int64 `json:"created_at"` } //MediaUpload 临时素材上传 diff --git a/message/message.go b/message/message.go index e8cf5a4..00809be 100644 --- a/message/message.go +++ b/message/message.go @@ -83,15 +83,15 @@ type MixMessage struct { URL string `xml:"Url"` //事件相关 - Event EventType `xml:"Event"` - EventKey string `xml:"EventKey"` - Ticket string `xml:"Ticket"` - Latitude string `xml:"Latitude"` - Longitude string `xml:"Longitude"` - Precision string `xml:"Precision"` - MenuID string `xml:"MenuId"` - Status string `xml:"Status"` - SessionFrom string `xml:"SessionFrom"` + Event EventType `xml:"Event"` + EventKey string `xml:"EventKey"` + Ticket string `xml:"Ticket"` + Latitude string `xml:"Latitude"` + Longitude string `xml:"Longitude"` + Precision string `xml:"Precision"` + MenuID string `xml:"MenuId"` + Status string `xml:"Status"` + SessionFrom string `xml:"SessionFrom"` ScanCodeInfo struct { ScanType string `xml:"ScanType"` diff --git a/server/server.go b/server/server.go index 5a40c25..ad3c8ca 100644 --- a/server/server.go +++ b/server/server.go @@ -18,6 +18,8 @@ import ( type Server struct { *context.Context + debug bool + openID string messageHandler func(message.MixMessage) *message.Reply @@ -40,6 +42,11 @@ func NewServer(context *context.Context) *Server { return srv } +// SetDebug set debug field +func (srv *Server) SetDebug(debug bool) { + srv.debug = debug +} + //Serve 处理微信的请求消息 func (srv *Server) Serve() error { if !srv.Validate() { @@ -65,6 +72,9 @@ func (srv *Server) Serve() error { //Validate 校验请求是否合法 func (srv *Server) Validate() bool { + if srv.debug { + return true + } timestamp := srv.Query("timestamp") nonce := srv.Query("nonce") signature := srv.Query("signature") diff --git a/wechat.go b/wechat.go index 02e3a34..19856b8 100644 --- a/wechat.go +++ b/wechat.go @@ -10,10 +10,10 @@ import ( "github.com/silenceper/wechat/material" "github.com/silenceper/wechat/menu" "github.com/silenceper/wechat/oauth" + "github.com/silenceper/wechat/pay" "github.com/silenceper/wechat/server" "github.com/silenceper/wechat/template" "github.com/silenceper/wechat/user" - "github.com/silenceper/wechat/pay" ) // Wechat struct @@ -27,9 +27,9 @@ type Config struct { AppSecret string Token string EncodingAESKey string - PayMchID string //支付 - 商户 ID - PayNotifyURL string //支付 - 接受微信支付结果通知的接口地址 - PayKey string //支付 - 商户后台设置的支付 key + PayMchID string //支付 - 商户 ID + PayNotifyURL string //支付 - 接受微信支付结果通知的接口地址 + PayKey string //支付 - 商户后台设置的支付 key Cache cache.Cache } @@ -98,4 +98,4 @@ func (wc *Wechat) GetTemplate() *template.Template { // GetPay 返回支付消息的实例 func (wc *Wechat) GetPay() *pay.Pay { return pay.NewPay(wc.Context) -} \ No newline at end of file +} From 7d2e9e6bd5b86ec818246478cb43a8dbc982c3fe Mon Sep 17 00:00:00 2001 From: silenceper Date: Wed, 12 Sep 2018 14:05:31 +0800 Subject: [PATCH 11/13] remove 1.7.x --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 33a3db7..065893a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,6 @@ go: - 1.10.x - 1.9.x - 1.8.x - - 1.7.x services: - memcached From 188703be231c2b2c6ec2d1b929c1d6094953f938 Mon Sep 17 00:00:00 2001 From: Chyroc Date: Fri, 14 Sep 2018 09:22:36 +0800 Subject: [PATCH 12/13] add: user update-remark api * add DecodeWithCommonError function * add UpdateRemark method --- cache/redis.go | 2 +- material/material.go | 11 ++--------- menu/menu.go | 44 ++++++++------------------------------------ user/user.go | 23 +++++++++++++++++++++-- util/error.go | 18 ++++++++++++++++++ 5 files changed, 50 insertions(+), 48 deletions(-) diff --git a/cache/redis.go b/cache/redis.go index b4039a5..7440b9e 100644 --- a/cache/redis.go +++ b/cache/redis.go @@ -47,7 +47,7 @@ func NewRedis(opts *RedisOpts) *Redis { //SetConn 设置conn func (r *Redis) SetConn(conn *redis.Pool) { - r.conn = conn + r.conn = conn } //Get 获取一个值 diff --git a/material/material.go b/material/material.go index a9c512e..62a5215 100644 --- a/material/material.go +++ b/material/material.go @@ -184,13 +184,6 @@ func (material *Material) DeleteMaterial(mediaID string) error { if err != nil { return err } - var resDeleteMaterial util.CommonError - err = json.Unmarshal(response, &resDeleteMaterial) - if err != nil { - return err - } - if resDeleteMaterial.ErrCode != 0 { - return fmt.Errorf("DeleteMaterial error : errcode=%v , errmsg=%v", resDeleteMaterial.ErrCode, resDeleteMaterial.ErrMsg) - } - return nil + + return util.DecodeWithCommonError(response, "DeleteMaterial") } diff --git a/menu/menu.go b/menu/menu.go index 67fe015..aff335c 100644 --- a/menu/menu.go +++ b/menu/menu.go @@ -134,15 +134,8 @@ func (menu *Menu) SetMenu(buttons []*Button) error { if err != nil { return err } - var commError util.CommonError - err = json.Unmarshal(response, &commError) - if err != nil { - return err - } - if commError.ErrCode != 0 { - return fmt.Errorf("SetMenu Error , errcode=%d , errmsg=%s", commError.ErrCode, commError.ErrMsg) - } - return nil + + return util.DecodeWithCommonError(response, "SetMenu") } //GetMenu 获取菜单配置 @@ -180,15 +173,8 @@ func (menu *Menu) DeleteMenu() error { if err != nil { return err } - var commError util.CommonError - err = json.Unmarshal(response, &commError) - if err != nil { - return err - } - if commError.ErrCode != 0 { - return fmt.Errorf("GetMenu Error , errcode=%d , errmsg=%s", commError.ErrCode, commError.ErrMsg) - } - return nil + + return util.DecodeWithCommonError(response, "GetMenu") } //AddConditional 添加个性化菜单 @@ -208,15 +194,8 @@ func (menu *Menu) AddConditional(buttons []*Button, matchRule *MatchRule) error if err != nil { return err } - var commError util.CommonError - err = json.Unmarshal(response, &commError) - if err != nil { - return err - } - if commError.ErrCode != 0 { - return fmt.Errorf("AddConditional Error , errcode=%d , errmsg=%s", commError.ErrCode, commError.ErrMsg) - } - return nil + + return util.DecodeWithCommonError(response, "AddConditional") } //DeleteConditional 删除个性化菜单 @@ -235,15 +214,8 @@ func (menu *Menu) DeleteConditional(menuID int64) error { if err != nil { return err } - var commError util.CommonError - err = json.Unmarshal(response, &commError) - if err != nil { - return err - } - if commError.ErrCode != 0 { - return fmt.Errorf("DeleteConditional Error , errcode=%d , errmsg=%s", commError.ErrCode, commError.ErrMsg) - } - return nil + + return util.DecodeWithCommonError(response, "DeleteConditional") } //MenuTryMatch 菜单匹配 diff --git a/user/user.go b/user/user.go index 73f127c..f2c5ef9 100644 --- a/user/user.go +++ b/user/user.go @@ -9,7 +9,8 @@ import ( ) const ( - userInfoURL = "https://api.weixin.qq.com/cgi-bin/user/info" + userInfoURL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN" + updateRemarkURL = "https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token=%s" ) //User 用户管理 @@ -52,7 +53,7 @@ func (user *User) GetUserInfo(openID string) (userInfo *Info, err error) { return } - uri := fmt.Sprintf("%s?access_token=%s&openid=%s&lang=zh_CN", userInfoURL, accessToken, openID) + uri := fmt.Sprintf(userInfoURL, accessToken, openID) var response []byte response, err = util.HTTPGet(uri) if err != nil { @@ -69,3 +70,21 @@ func (user *User) GetUserInfo(openID string) (userInfo *Info, err error) { } return } + +// UpdateRemark 设置用户备注名 +func (user *User) UpdateRemark(openID, remark string) (err error) { + var accessToken string + accessToken, err = user.GetAccessToken() + if err != nil { + return + } + + uri := fmt.Sprintf(updateRemarkURL, accessToken) + var response []byte + response, err = util.PostJSON(uri, map[string]string{"openid": openID, "remark": remark}) + if err != nil { + return + } + + return util.DecodeWithCommonError(response, "UpdateRemark") +} diff --git a/util/error.go b/util/error.go index 4a9ab64..79ad14d 100644 --- a/util/error.go +++ b/util/error.go @@ -1,7 +1,25 @@ package util +import ( + "encoding/json" + "fmt" +) + // CommonError 微信返回的通用错误json type CommonError struct { ErrCode int64 `json:"errcode"` ErrMsg string `json:"errmsg"` } + +// DecodeWithCommonError 将返回值按照CommonError解析 +func DecodeWithCommonError(response []byte, apiName string) (err error) { + var commError CommonError + err = json.Unmarshal(response, &commError) + if err != nil { + return + } + if commError.ErrCode != 0 { + return fmt.Errorf("%s Error , errcode=%d , errmsg=%s", apiName, commError.ErrCode, commError.ErrMsg) + } + return nil +} From 723adb14e20709e674349471643da4b8fc09ee4d Mon Sep 17 00:00:00 2001 From: abotoo wang Date: Fri, 21 Sep 2018 22:58:29 +0800 Subject: [PATCH 13/13] fix TagidList type error --- user/user.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/user/user.go b/user/user.go index f2c5ef9..a792aae 100644 --- a/user/user.go +++ b/user/user.go @@ -29,20 +29,20 @@ func NewUser(context *context.Context) *User { type Info struct { util.CommonError - Subscribe int32 `json:"subscribe"` - OpenID string `json:"openid"` - Nickname string `json:"nickname"` - Sex int32 `json:"sex"` - City string `json:"city"` - Country string `json:"country"` - Province string `json:"province"` - Language string `json:"language"` - Headimgurl string `json:"headimgurl"` - SubscribeTime int32 `json:"subscribe_time"` - UnionID string `json:"unionid"` - Remark string `json:"remark"` - GroupID int32 `json:"groupid"` - TagidList []string `json:"tagid_list"` + Subscribe int32 `json:"subscribe"` + OpenID string `json:"openid"` + Nickname string `json:"nickname"` + Sex int32 `json:"sex"` + City string `json:"city"` + Country string `json:"country"` + Province string `json:"province"` + Language string `json:"language"` + Headimgurl string `json:"headimgurl"` + SubscribeTime int32 `json:"subscribe_time"` + UnionID string `json:"unionid"` + Remark string `json:"remark"` + GroupID int32 `json:"groupid"` + TagidList []int32 `json:"tagid_list"` } //GetUserInfo 获取用户基本信息