mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-07 22:22:28 +08:00
企业微信内部开发API:新增jssdk支持
This commit is contained in:
@@ -20,7 +20,7 @@ type ReqGetByUser struct {
|
||||
type OneUser struct {
|
||||
util.CommonError
|
||||
ExternalContact ExternalContact `json:"external_contact"`
|
||||
FollowUser []FollowInfo `json:"follow_user"` //注意,仅获取单个客户详情的时候这里返回的是跟进记录列表
|
||||
FollowUser []FollowInfo `json:"follow_user"` //注意,仅获取单个客户详情的时候这里返回的是跟进人列表
|
||||
NextCursor string `json:"next_cursor"`
|
||||
}
|
||||
type resUserList struct {
|
||||
@@ -35,7 +35,7 @@ type resUserids struct {
|
||||
|
||||
type UserInfo struct {
|
||||
ExternalContact ExternalContact `json:"external_contact"`
|
||||
FollowInfo FollowInfo `json:"follow_info"` //企业成员客户跟进信息,可以参考获取客户详情,但标签信息只会返回企业标签和规则组标签的tag_id,个人标签将不再返回
|
||||
FollowInfo FollowInfo `json:"follow_info"` //企业成员客户跟进人信息,可以参考获取客户详情,但标签信息只会返回企业标签和规则组标签的tag_id,个人标签将不再返回
|
||||
}
|
||||
|
||||
type ExternalContact struct {
|
||||
@@ -134,7 +134,7 @@ func (tpl *Client) GetQyUserInfoList(qyUserid []string) ([]UserInfo, error) {
|
||||
return userInfoList, nil
|
||||
}
|
||||
|
||||
//GetUserInfoAndAllFollow 获取客户详情以及全部跟进记录
|
||||
//GetUserInfoAndAllFollow 获取客户详情以及全部跟进人
|
||||
func (tpl *Client) GetUserInfoAndAllFollow(userid string) (OneUser, error) {
|
||||
var result, res OneUser
|
||||
var err error
|
||||
|
||||
93
work/js/js.go
Normal file
93
work/js/js.go
Normal file
@@ -0,0 +1,93 @@
|
||||
package js
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/silenceper/wechat/v2/credential"
|
||||
"github.com/silenceper/wechat/v2/util"
|
||||
"github.com/silenceper/wechat/v2/work/context"
|
||||
)
|
||||
|
||||
// Js struct
|
||||
type Js struct {
|
||||
*context.Context
|
||||
credential.JsTicketHandle
|
||||
}
|
||||
|
||||
// Config 返回给用户jssdk配置信息
|
||||
type Config struct {
|
||||
CorpID string `json:"corp_id"`
|
||||
Agentid string `json:"agentid"`
|
||||
Timestamp int64 `json:"timestamp"`
|
||||
NonceStr string `json:"nonce_str"`
|
||||
Signature string `json:"signature"`
|
||||
}
|
||||
|
||||
//NewJs init
|
||||
func NewJs(context *context.Context) *Js {
|
||||
js := new(Js)
|
||||
js.Context = context
|
||||
jsTicketHandle := credential.NewWorkJsTicket(context.CorpID, context.AgentID, credential.CacheKeyWorkPrefix, context.Cache)
|
||||
js.SetJsTicketHandle(jsTicketHandle)
|
||||
return js
|
||||
}
|
||||
|
||||
//SetJsTicketHandle 自定义js ticket取值方式
|
||||
func (js *Js) SetJsTicketHandle(ticketHandle credential.JsTicketHandle) {
|
||||
js.JsTicketHandle = ticketHandle
|
||||
}
|
||||
|
||||
//GetConfig 获取jssdk需要的配置参数
|
||||
//uri 为当前网页地址
|
||||
func (js *Js) GetConfig(uri string) (config *Config, err error) {
|
||||
config = new(Config)
|
||||
var accessToken string
|
||||
accessToken, err = js.GetAccessToken()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var ticketStr string
|
||||
ticketStr, err = js.GetTicket(accessToken)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
nonceStr := util.RandomStr(16)
|
||||
timestamp := util.GetCurrTS()
|
||||
str := fmt.Sprintf("jsapi_ticket=%s&noncestr=%s×tamp=%d&url=%s", ticketStr, nonceStr, timestamp, uri)
|
||||
sigStr := util.Signature(str)
|
||||
|
||||
config.CorpID = js.CorpID
|
||||
config.Agentid = js.AgentID
|
||||
config.NonceStr = nonceStr
|
||||
config.Timestamp = timestamp
|
||||
config.Signature = sigStr
|
||||
return
|
||||
}
|
||||
|
||||
//GetAgentConfig 获取jssdk需要的配置参数
|
||||
//uri 为当前网页地址
|
||||
func (js *Js) GetAgentConfig(uri string) (config *Config, err error) {
|
||||
config = new(Config)
|
||||
var accessToken string
|
||||
accessToken, err = js.GetAccessToken()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var ticketStr string
|
||||
ticketStr, err = js.GetTicket(accessToken)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
nonceStr := util.RandomStr(16)
|
||||
timestamp := util.GetCurrTS()
|
||||
str := fmt.Sprintf("jsapi_ticket=%s&noncestr=%s×tamp=%d&url=%s", ticketStr, nonceStr, timestamp, uri)
|
||||
sigStr := util.Signature(str)
|
||||
|
||||
config.CorpID = js.CorpID
|
||||
config.NonceStr = nonceStr
|
||||
config.Timestamp = timestamp
|
||||
config.Signature = sigStr
|
||||
return
|
||||
}
|
||||
@@ -13,7 +13,7 @@ const (
|
||||
userInfoURL = "https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s"
|
||||
updateURL = "https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=%s&department_id=%s&fetch_child=1"
|
||||
userListURL = "https://qyapi.weixin.qq.com/cgi-bin/user/get"
|
||||
launchCode = "https://qyapi.weixin.qq.com/cgi-bin/get_launch_code"
|
||||
launchCode = "https://qyapi.weixin.qq.com/cgi-bin/get_launch_code?access_token=%s"
|
||||
)
|
||||
|
||||
//User 用户管理
|
||||
@@ -207,7 +207,7 @@ func (user *User) GetLaunchCode(userID, other string) (userInfo *RespLaunchCode,
|
||||
return
|
||||
}
|
||||
|
||||
uri := fmt.Sprintf(launchCode, accessToken, userID)
|
||||
uri := fmt.Sprintf(launchCode, accessToken)
|
||||
var response []byte
|
||||
response, err = util.PostJSON(uri, map[string]interface{}{"operator_userid": userID, "single_chat": map[string]string{"userid": other}})
|
||||
if err != nil {
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
"github.com/silenceper/wechat/v2/work/config"
|
||||
"github.com/silenceper/wechat/v2/work/context"
|
||||
"github.com/silenceper/wechat/v2/work/externalcontact"
|
||||
"github.com/silenceper/wechat/v2/work/js"
|
||||
"github.com/silenceper/wechat/v2/work/kf"
|
||||
"github.com/silenceper/wechat/v2/work/msgaudit"
|
||||
"github.com/silenceper/wechat/v2/work/oauth"
|
||||
@@ -47,6 +48,11 @@ func (wk *Work) GetOauth() *oauth.Oauth {
|
||||
return oauth.NewOauth(wk.ctx)
|
||||
}
|
||||
|
||||
// GetJs js-sdk配置
|
||||
func (wk *Work) GetJs() *js.Js {
|
||||
return js.NewJs(wk.ctx)
|
||||
}
|
||||
|
||||
// GetMsgAudit get msgAudit
|
||||
func (wk *Work) GetMsgAudit() (*msgaudit.Client, error) {
|
||||
return msgaudit.NewClient(wk.ctx.Config)
|
||||
|
||||
Reference in New Issue
Block a user