diff --git a/util/query.go b/util/query.go new file mode 100644 index 0000000..008c0cf --- /dev/null +++ b/util/query.go @@ -0,0 +1,24 @@ +package util + +import ( + "fmt" + "strings" +) + +// Query 将Map序列化为Query参数 +func Query(params map[string]interface{}) string { + finalString := make([]string, 0) + for key, value := range params { + valueString := "" + switch v := value.(type) { + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + valueString = fmt.Sprintf("%d", v) + case bool: + valueString = fmt.Sprintf("%v", v) + default: + valueString = fmt.Sprintf("%s", v) + } + finalString = append(finalString, strings.Join([]string{key, valueString}, "=")) + } + return strings.Join(finalString, "&") +} diff --git a/util/query_test.go b/util/query_test.go new file mode 100644 index 0000000..8d4841a --- /dev/null +++ b/util/query_test.go @@ -0,0 +1,19 @@ +package util + +import ( + "testing" +) + +// TestQuery query method test case +func TestQuery(t *testing.T) { + result := Query(map[string]interface{}{ + "age": 12, + "name": "Alan", + "cat": "Peter", + }) + if result == "" { + // 由于hash是乱序 所以没法很好的预测输出的字符串 + // 将会输出符合Query规则的字符串 "age=12&name=Alan&cat=Peter" + t.Error("NOT PASS") + } +} diff --git a/util/template.go b/util/template.go new file mode 100644 index 0000000..6d43dee --- /dev/null +++ b/util/template.go @@ -0,0 +1,24 @@ +package util + +import ( + "fmt" + "strings" +) + +// Template 对字符串中的和map的key相同的字符串进行模板替换 仅支持 形如: {name} +func Template(source string, data map[string]interface{}) string { + sourceCopy := &source + for k, val := range data { + valStr := "" + switch v := val.(type) { + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + valStr = fmt.Sprintf("%d", v) + case bool: + valStr = fmt.Sprintf("%v", v) + default: + valStr = fmt.Sprintf("%s", v) + } + *sourceCopy = strings.Replace(*sourceCopy, strings.Join([]string{"{", k, "}"}, ""), valStr, 1) + } + return *sourceCopy +} diff --git a/util/template_test.go b/util/template_test.go new file mode 100644 index 0000000..5a59b3e --- /dev/null +++ b/util/template_test.go @@ -0,0 +1,20 @@ +package util + +import ( + "testing" +) + +// TestTemplate testing case about Template method +func TestTemplate(t *testing.T) { + result := Template("{name}={age};{with}={another};any={any};boolean={boolean}", map[string]interface{}{ + "name": "Helan", + "age": "33", + "with": "Pep", + "another": "C", + "any": 33, + "boolean": false, + }) + if result != "Helan=33;Pep=C;any=33;boolean=false" { + t.Error("NOT PSS testing") + } +} diff --git a/work/addresslist/user.go b/work/addresslist/user.go index d5b2a63..a60e726 100644 --- a/work/addresslist/user.go +++ b/work/addresslist/user.go @@ -1,22 +1,22 @@ package addresslist import ( - "fmt" + "strings" "github.com/silenceper/wechat/v2/util" ) const ( // userSimpleListURL 获取部门成员 - userSimpleListURL = "https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=%s&department_id=%d" + userSimpleListURL = "https://qyapi.weixin.qq.com/cgi-bin/user/simplelist" // userGetURL 读取成员 - userGetURL = "https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s" + userGetURL = "https://qyapi.weixin.qq.com/cgi-bin/user/get" // userListIDURL 获取成员ID列表 - userListIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/list_id?access_token=%s" + userListIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/list_id" // convertToOpenIDURL userID转openID - convertToOpenIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_openid?access_token=%s" + convertToOpenIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_openid" // convertToUserIDURL openID转userID - convertToUserIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_userid?access_token=%s" + convertToUserIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_userid" ) type ( @@ -45,7 +45,13 @@ func (r *Client) UserSimpleList(departmentID int) ([]*UserList, error) { return nil, err } var response []byte - if response, err = util.HTTPGet(fmt.Sprintf(userSimpleListURL, accessToken, departmentID)); err != nil { + if response, err = util.HTTPGet(strings.Join([]string{ + userSimpleListURL, + util.Query(map[string]interface{}{ + "access_token": accessToken, + "department_id": departmentID, + }), + }, "?")); err != nil { return nil, err } result := &UserSimpleListResponse{} @@ -129,7 +135,15 @@ func (r *Client) UserGet(UserID string) (*UserGetResponse, error) { return nil, err } var response []byte - if response, err = util.HTTPGet(fmt.Sprintf(userGetURL, accessToken, UserID)); err != nil { + + if response, err = util.HTTPGet( + strings.Join([]string{ + userGetURL, + util.Query(map[string]interface{}{ + "access_token": accessToken, + "department_id": UserID, + }), + }, "?")); err != nil { return nil, err } result := &UserGetResponse{} @@ -170,7 +184,12 @@ func (r *Client) UserListID(req *UserListIDRequest) (*UserListIDResponse, error) return nil, err } var response []byte - if response, err = util.PostJSON(fmt.Sprintf(userListIDURL, accessToken), req); err != nil { + if response, err = util.PostJSON(strings.Join([]string{ + userListIDURL, + util.Query(map[string]interface{}{ + "access_token": accessToken, + }), + }, "?"), req); err != nil { return nil, err } result := &UserListIDResponse{} @@ -204,7 +223,13 @@ func (r *Client) ConvertToOpenID(userID string) (string, error) { return "", err } var response []byte - if response, err = util.PostJSON(fmt.Sprintf(convertToOpenIDURL, accessToken), &convertToOpenIDRequest{ + + if response, err = util.PostJSON(strings.Join([]string{ + convertToOpenIDURL, + util.Query(map[string]interface{}{ + "access_token": accessToken, + }), + }, "?"), &convertToOpenIDRequest{ UserID: userID, }); err != nil { return "", err @@ -240,7 +265,13 @@ func (r *Client) ConvertToUserID(openID string) (string, error) { return "", err } var response []byte - if response, err = util.PostJSON(fmt.Sprintf(convertToUserIDURL, accessToken), &convertToUserIDRequest{ + + if response, err = util.PostJSON(strings.Join([]string{ + convertToUserIDURL, + util.Query(map[string]interface{}{ + "access_token": accessToken, + }), + }, "?"), &convertToUserIDRequest{ OpenID: openID, }); err != nil { return "", err