mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-07 14:12:27 +08:00
Compare commits
4 Commits
v2.1.5
...
revert-685
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
42b0966049 | ||
|
|
31f8e24994 | ||
|
|
ae1b056515 | ||
|
|
8bae546b77 |
@@ -2,6 +2,7 @@ package user
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
@@ -10,9 +11,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
userInfoURL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN"
|
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"
|
userInfoBatchURL = "https://api.weixin.qq.com/cgi-bin/user/info/batchget"
|
||||||
userListURL = "https://api.weixin.qq.com/cgi-bin/user/get"
|
updateRemarkURL = "https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token=%s"
|
||||||
|
userListURL = "https://api.weixin.qq.com/cgi-bin/user/get"
|
||||||
)
|
)
|
||||||
|
|
||||||
// User 用户管理
|
// User 用户管理
|
||||||
@@ -30,7 +32,11 @@ func NewUser(context *context.Context) *User {
|
|||||||
// Info 用户基本信息
|
// Info 用户基本信息
|
||||||
type Info struct {
|
type Info struct {
|
||||||
util.CommonError
|
util.CommonError
|
||||||
|
userInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
// 用户基本信息
|
||||||
|
type userInfo struct {
|
||||||
Subscribe int32 `json:"subscribe"`
|
Subscribe int32 `json:"subscribe"`
|
||||||
OpenID string `json:"openid"`
|
OpenID string `json:"openid"`
|
||||||
Nickname string `json:"nickname"`
|
Nickname string `json:"nickname"`
|
||||||
@@ -88,6 +94,48 @@ func (user *User) GetUserInfo(openID string) (userInfo *Info, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BatchGetUserInfoParams 批量获取用户基本信息参数
|
||||||
|
type BatchGetUserInfoParams struct {
|
||||||
|
UserList []BatchGetUserListItem `json:"user_list"` // 需要批量获取基本信息的用户列表
|
||||||
|
}
|
||||||
|
|
||||||
|
// BatchGetUserListItem 需要获取基本信息的用户
|
||||||
|
type BatchGetUserListItem struct {
|
||||||
|
OpenID string `json:"openid"` // 用户的标识,对当前公众号唯一
|
||||||
|
Lang string `json:"lang"` // 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN
|
||||||
|
}
|
||||||
|
|
||||||
|
// InfoList 用户基本信息列表
|
||||||
|
type InfoList struct {
|
||||||
|
util.CommonError
|
||||||
|
UserInfoList []userInfo `json:"user_info_list"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// BatchGetUserInfo 批量获取用户基本信息
|
||||||
|
func (user *User) BatchGetUserInfo(params BatchGetUserInfoParams) (*InfoList, error) {
|
||||||
|
if len(params.UserList) > 100 {
|
||||||
|
return nil, errors.New("params length must be less than or equal to 100")
|
||||||
|
}
|
||||||
|
|
||||||
|
ak, err := user.GetAccessToken()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := fmt.Sprintf("%s?access_token=%s", userInfoBatchURL, ak)
|
||||||
|
res, err := util.PostJSON(uri, params)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var data InfoList
|
||||||
|
err = util.DecodeWithError(res, &data, "BatchGetUserInfo")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &data, nil
|
||||||
|
}
|
||||||
|
|
||||||
// UpdateRemark 设置用户备注名
|
// UpdateRemark 设置用户备注名
|
||||||
func (user *User) UpdateRemark(openID, remark string) (err error) {
|
func (user *User) UpdateRemark(openID, remark string) (err error) {
|
||||||
var accessToken string
|
var accessToken string
|
||||||
|
|||||||
24
util/query.go
Normal file
24
util/query.go
Normal file
@@ -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, "&")
|
||||||
|
}
|
||||||
19
util/query_test.go
Normal file
19
util/query_test.go
Normal file
@@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
24
util/template.go
Normal file
24
util/template.go
Normal file
@@ -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
|
||||||
|
}
|
||||||
20
util/template_test.go
Normal file
20
util/template_test.go
Normal file
@@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,22 +1,22 @@
|
|||||||
package addresslist
|
package addresslist
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"strings"
|
||||||
|
|
||||||
"github.com/silenceper/wechat/v2/util"
|
"github.com/silenceper/wechat/v2/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// userSimpleListURL 获取部门成员
|
// 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 读取成员
|
||||||
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 获取成员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 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 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 (
|
type (
|
||||||
@@ -45,7 +45,13 @@ func (r *Client) UserSimpleList(departmentID int) ([]*UserList, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var response []byte
|
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
|
return nil, err
|
||||||
}
|
}
|
||||||
result := &UserSimpleListResponse{}
|
result := &UserSimpleListResponse{}
|
||||||
@@ -129,7 +135,15 @@ func (r *Client) UserGet(UserID string) (*UserGetResponse, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var response []byte
|
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
|
return nil, err
|
||||||
}
|
}
|
||||||
result := &UserGetResponse{}
|
result := &UserGetResponse{}
|
||||||
@@ -170,7 +184,12 @@ func (r *Client) UserListID(req *UserListIDRequest) (*UserListIDResponse, error)
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var response []byte
|
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
|
return nil, err
|
||||||
}
|
}
|
||||||
result := &UserListIDResponse{}
|
result := &UserListIDResponse{}
|
||||||
@@ -204,7 +223,13 @@ func (r *Client) ConvertToOpenID(userID string) (string, error) {
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
var response []byte
|
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,
|
UserID: userID,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
@@ -240,7 +265,13 @@ func (r *Client) ConvertToUserID(openID string) (string, error) {
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
var response []byte
|
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,
|
OpenID: openID,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
|
|||||||
Reference in New Issue
Block a user