1
0
mirror of https://github.com/silenceper/wechat.git synced 2026-02-06 21:52:27 +08:00

与origin代码同步

This commit is contained in:
wind
2023-01-09 17:43:54 +08:00
parent b4402678b3
commit 1cd6133420
4 changed files with 12 additions and 283 deletions

View File

@@ -17,7 +17,7 @@ const (
ChatTypeGroup ChatType = "group"
)
//ReqMessage 企业群发参数
// ReqMessage 企业群发参数
type ReqMessage struct {
ChatType ChatType `json:"chat_type"` //群发任务的类型默认为single表示发送给客户group表示发送给客户群
ExternalUserid []string `json:"external_userid"` // 客户的外部联系人id列表仅在chat_type为single时有效不可与sender同时为空最多可传入1万个客户
@@ -63,10 +63,10 @@ type resTemplateSend struct {
MsgID int64 `json:"msgid"`
}
//Send 发送应用消息
func (tpl *Client) Send(msg *ReqMessage) (msgID int64, err error) {
// Send 发送应用消息
func (r *Client) Send(msg *ReqMessage) (msgID int64, err error) {
var accessToken string
accessToken, err = tpl.ctx.GetAccessToken()
accessToken, err = r.GetAccessToken()
if err != nil {
return
}

View File

@@ -1,44 +1,17 @@
package externalcontact
import (
"errors"
"github.com/silenceper/wechat/v2/cache"
"github.com/silenceper/wechat/v2/credential"
"github.com/silenceper/wechat/v2/work/config"
"github.com/silenceper/wechat/v2/work/context"
)
// Client 企业微信客户联系实例
// Client 外部联系接口实例
type Client struct {
corpID string // 企业ID企业开通的每个微信客服都对应唯一的企业ID企业可在微信客服管理后台的企业信息处查看
secret string // Secret是微信客服用于校验开发者身份的访问密钥企业成功注册微信客服后可在「微信客服管理后台-开发配置」处获取
token string // 用于生成签名校验回调请求的合法性
encodingAESKey string // 回调消息加解密参数是AES密钥的Base64编码用于解密回调消息内容对应的密文
cache cache.Cache
ctx *context.Context
*context.Context
}
// NewClient 初始化企业微信客户联系实例
func NewClient(cfg *config.Config) (client *Client, err error) {
if cfg.Cache == nil {
return nil, errors.New("SDK初始化失败")
// NewClient 初始化实例
func NewClient(ctx *context.Context) *Client {
return &Client{
ctx,
}
//初始化 AccessToken Handle
defaultAkHandle := credential.NewWorkAccessToken(cfg.CorpID, cfg.CorpSecret, credential.CacheKeyWorkPrefix, cfg.Cache)
ctx := &context.Context{
Config: cfg,
AccessTokenHandle: defaultAkHandle,
}
client = &Client{
corpID: cfg.CorpID,
secret: cfg.CorpSecret,
token: cfg.Token,
encodingAESKey: cfg.EncodingAESKey,
cache: cfg.Cache,
ctx: ctx,
}
return client, nil
}

View File

@@ -1,244 +0,0 @@
package externalcontact
import (
"encoding/json"
"fmt"
"github.com/silenceper/wechat/v2/util"
)
const (
listUrl = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/list"
getUrl = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get"
getByUserBatchUrl = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/batch/get_by_user"
markTag = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/mark_tag"
)
type ReqGetByUser struct {
UseridList []string `json:"userid_list"`
Cursor string `json:"cursor"`
Limit int `json:"limit"`
}
type OneUser struct {
util.CommonError
ExternalContact ExternalContact `json:"external_contact"`
FollowUser []FollowInfo `json:"follow_user"` //注意,仅获取单个客户详情的时候这里返回的是跟进人列表
NextCursor string `json:"next_cursor"`
}
type resUserList struct {
util.CommonError
ExternalContactList []UserInfo `json:"external_contact_list"`
NextCursor string `json:"next_cursor"`
}
type resUserids struct {
util.CommonError
ExternalUserid []string `json:"external_userid"`
}
type UserInfo struct {
ExternalContact ExternalContact `json:"external_contact"`
FollowInfo FollowInfo `json:"follow_info"` //企业成员客户跟进人信息可以参考获取客户详情但标签信息只会返回企业标签和规则组标签的tag_id个人标签将不再返回
}
type ExternalContact struct {
ExternalUserid string `json:"external_userid"`
Name string `json:"name"`
Position string `json:"position"`
Avatar string `json:"avatar"`
CorpName string `json:"corp_name"`
CorpFullName string `json:"corp_full_name"`
Type int `json:"type"`
Gender int `json:"gender"`
Unionid string `json:"unionid"`
ExternalProfile struct {
ExternalAttr []struct {
Type int `json:"type"`
Name string `json:"name"`
Text struct {
Value string `json:"value"`
} `json:"text,omitempty"`
Web struct {
Url string `json:"url"`
Title string `json:"title"`
} `json:"web,omitempty"`
Miniprogram struct {
Appid string `json:"appid"`
Pagepath string `json:"pagepath"`
Title string `json:"title"`
} `json:"miniprogram,omitempty"`
} `json:"external_attr"`
} `json:"external_profile,omitempty"`
}
type FollowInfo struct {
Userid string `json:"userid"`
Remark string `json:"remark"`
Description string `json:"description"`
Createtime int `json:"createtime"`
TagId []string `json:"tag_id"` //批量获取时才有
Tags []struct {
GroupName string `json:"group_name"`
TagName string `json:"tag_name"`
TagId string `json:"tag_id,omitempty"`
Type int `json:"type"`
} `json:"tags,omitempty"` //单独获取时才有
RemarkCorpName string `json:"remark_corp_name,omitempty"`
RemarkMobiles []string `json:"remark_mobiles,omitempty"`
OperUserid string `json:"oper_userid"`
AddWay int `json:"add_way"`
State string `json:"state,omitempty"`
}
type MarkTag struct {
Userid string `json:"userid"`
ExternalUserid string `json:"external_userid"`
AddTag []string `json:"add_tag"`
RemoveTag []string `json:"remove_tag"`
}
// GetUseridList 获取我的客户列表
func (tpl *Client) GetUseridList(myUserid string) (externalUserid []string, err error) {
var accessToken string
accessToken, err = tpl.ctx.GetAccessToken()
if err != nil {
return
}
uri := fmt.Sprintf("%s?access_token=%s&userid=%s", listUrl, accessToken, myUserid)
var response []byte
response, err = util.HTTPGet(uri)
if err != nil {
return
}
var result resUserids
err = json.Unmarshal(response, &result)
if err != nil {
return
}
if result.ErrCode != 0 {
err = fmt.Errorf("template msg send error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
return
}
externalUserid = result.ExternalUserid
return
}
// GetQyUserInfoList 获取我的全部客户列表及详情
func (tpl *Client) GetQyUserInfoList(qyUserid []string) ([]UserInfo, error) {
var userInfoList []UserInfo
var req ReqGetByUser
req.UseridList = qyUserid
req.Limit = 100
for {
userInfoPage, resCursor, err := tpl.GetUserInfoListByUserIds(req)
if err != nil {
return userInfoList, err
}
userInfoList = append(userInfoList, userInfoPage...)
if resCursor != "" {
req.Cursor = resCursor
} else {
break
}
}
return userInfoList, nil
}
// GetUserInfoAndAllFollow 获取客户详情以及全部跟进人
func (tpl *Client) GetUserInfoAndAllFollow(userid string) (OneUser, error) {
var result, res OneUser
var err error
var cursor string
for {
res, err = tpl.GetUserInfo(userid, cursor)
if err != nil {
return result, err
}
result.FollowUser = append(result.FollowUser, res.FollowUser...)
result.ExternalContact = res.ExternalContact
if res.NextCursor != "" {
cursor = res.NextCursor
} else {
break
}
}
return result, nil
}
// GetUserInfo 获取客户详情
func (tpl *Client) GetUserInfo(externalUserid string, cursor ...string) (result OneUser, err error) {
var accessToken string
accessToken, err = tpl.ctx.GetAccessToken()
if err != nil {
return
}
var page = ""
if len(cursor) > 0 {
page = cursor[0]
}
uri := fmt.Sprintf("%s?access_token=%s&external_userid=%s&cursor=%s", getUrl, accessToken, externalUserid, page)
var response []byte
response, err = util.HTTPGet(uri)
if err != nil {
return
}
err = json.Unmarshal(response, &result)
if err != nil {
return
}
if result.ErrCode != 0 {
err = fmt.Errorf("template msg send error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
return
}
return
}
// GetUserInfoListByUserIds 批量获取客户详情
func (tpl *Client) GetUserInfoListByUserIds(req ReqGetByUser) (userList []UserInfo, nextCursor string, err error) {
var accessToken string
accessToken, err = tpl.ctx.GetAccessToken()
if err != nil {
return
}
uri := fmt.Sprintf("%s?access_token=%s", getByUserBatchUrl, accessToken)
var response []byte
response, err = util.PostJSON(uri, req)
if err != nil {
return
}
var result resUserList
err = json.Unmarshal(response, &result)
if err != nil {
return
}
if result.ErrCode != 0 {
err = fmt.Errorf("template msg send error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
return
}
userList = result.ExternalContactList
nextCursor = result.NextCursor
return
}
// EditUserTags 编辑客户企业标签
func (tpl *Client) EditUserTags(req *MarkTag) (result util.CommonError, err error) {
var accessToken string
accessToken, err = tpl.ctx.GetAccessToken()
if err != nil {
return
}
uri := fmt.Sprintf("%s?access_token=%s", markTag, accessToken)
var response []byte
response, err = util.PostJSON(uri, req)
if err != nil {
return
}
err = json.Unmarshal(response, &result)
if err != nil {
return
}
if result.ErrCode != 0 {
err = fmt.Errorf("template msg send error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
return
}
return
}

View File

@@ -78,8 +78,8 @@ func (wk *Work) GetCalendar() *tools.Calendar {
}
// GetExternalContact 客户联系
func (wk *Work) GetExternalContact() (*externalcontact.Client, error) {
return externalcontact.NewClient(wk.ctx.Config)
func (wk *Work) GetExternalContact() *externalcontact.Client {
return externalcontact.NewClient(wk.ctx)
}
// GetMessageApp 发送应用消息