Skip to content

Commit 49de231

Browse files
authored
Merge pull request #547 from ArtisanCloud/develop
Develop
2 parents 7a635c0 + 912121f commit 49de231

File tree

18 files changed

+314
-40
lines changed

18 files changed

+314
-40
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ require (
3030
go.uber.org/atomic v1.7.0 // indirect
3131
go.uber.org/multierr v1.6.0 // indirect
3232
go.uber.org/zap v1.21.0 // indirect
33-
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect
34-
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect
33+
golang.org/x/crypto v0.27.0 // indirect
34+
golang.org/x/sys v0.25.0 // indirect
3535
gopkg.in/yaml.v3 v3.0.1 // indirect
3636
)

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,13 @@ go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
6363
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
6464
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
6565
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
66-
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
67-
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
66+
golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
67+
golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
6868
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
6969
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
7070
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
7171
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
7272
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
73-
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
7473
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
7574
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
7675
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -79,8 +78,9 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
7978
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
8079
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
8180
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
82-
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE=
8381
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
82+
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
83+
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
8484
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
8585
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
8686
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=

src/openWork/provider/provider.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ package provider
22

33
import "github.com/ArtisanCloud/PowerWeChat/v3/src/kernel"
44

5-
func RegisterProvider(app kernel.ApplicationInterface) (*Client, *AccessToken, error) {
6-
client, err := NewClient(app)
7-
if err != nil {
8-
return nil, nil, err
9-
}
5+
func RegisterProvider(app kernel.ApplicationInterface) (*AccessToken, error) {
6+
//client, err := NewClient(app)
7+
//if err != nil {
8+
// return nil, nil, err
9+
//}
1010
accessToken, err := NewAccessToken(&app)
1111
if err != nil {
12-
return nil, nil, err
12+
return nil, err
1313
}
14-
return client, accessToken, nil
14+
return accessToken, nil
1515
}

src/openWork/providerApplication.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ func NewOpenWorkProvider(config *UserConfig) (*OpenWorkProvider, error) {
5757
if err != nil {
5858
return nil, err
5959
}
60-
app.Client, app.AccessToken, err = provider.RegisterProvider(app)
60+
app.AccessToken, err = provider.RegisterProvider(app)
61+
if err != nil {
62+
return nil, err
63+
}
64+
app.Client, err = provider.NewClient(app)
6165
if err != nil {
6266
return nil, err
6367
}

src/openWork/server/guard.go

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,9 +338,14 @@ func (guard *Guard) toCallbackEvent(callbackHeader contract.EventInterface, buf
338338
switch callbackHeader.GetEvent() {
339339

340340
// event is change contact
341-
case workModels.CALLBACK_EVENT_CHANGE_CONTACT:
341+
case workModels.CALLBACK_EVENT_CUSTOMER_ACQUISITION,
342+
workModels.CALLBACK_EVENT_CHANGE_EXTERNAL_CONTACT,
343+
workModels.CALLBACK_EVENT_CHANGE_CONTACT:
342344
decryptMessage, err = guard.toCallbackEventChangeType(callbackHeader, buf)
343345
break
346+
case workModels.CALLBACK_EVENT_CHANGE_EXTERNAL_CHAT:
347+
decryptMessage, err = guard.toCallbackChatEventChangeType(callbackHeader, buf)
348+
break
344349

345350
// events
346351
case workModels.CALLBACK_EVENT_SUBSCRIBE:
@@ -457,6 +462,36 @@ func (guard *Guard) toCallbackEventChangeType(callbackHeader contract.EventInter
457462

458463
switch callbackHeader.GetChangeType() {
459464

465+
case workModels.CALLBACK_EVENT_CHANGE_TYPE_OPEN_PROFILE:
466+
decryptMsg := &workModels.EventCustomerAcquisitionOpenProfile{}
467+
err = xml.Unmarshal(buf, decryptMsg)
468+
decryptMessage = decryptMsg
469+
break
470+
471+
case workModels.CALLBACK_EVENT_CHANGE_TYPE_FRIEND_REQUEST:
472+
decryptMsg := &workModels.EventCustomerAcquisitionFriendRequest{}
473+
err = xml.Unmarshal(buf, decryptMsg)
474+
decryptMessage = decryptMsg
475+
break
476+
477+
case workModels.CALLBACK_EVENT_CHANGE_TYPE_ADD_EXTERNAL_CONTACT:
478+
decryptMsg := &workModels.EventExternalUserAdd{}
479+
err = xml.Unmarshal(buf, decryptMsg)
480+
decryptMessage = decryptMsg
481+
break
482+
483+
case workModels.CALLBACK_EVENT_CHANGE_TYPE_ADD_HALF_EXTERNAL_CONTACT:
484+
decryptMsg := &workModels.EventExternalUserAddHalf{}
485+
err = xml.Unmarshal(buf, decryptMsg)
486+
decryptMessage = decryptMsg
487+
break
488+
489+
case workModels.CALLBACK_EVENT_CHANGE_TYPE_DEL_EXTERNAL_CONTACT:
490+
decryptMsg := &workModels.EventExternalUserEdit{}
491+
err = xml.Unmarshal(buf, decryptMsg)
492+
decryptMessage = decryptMsg
493+
break
494+
460495
// change type is for user event
461496
case workModels.CALLBACK_EVENT_CHANGE_TYPE_CREATE_USER:
462497
decryptMsg := &workModels.EventUserCreate{}
@@ -508,3 +543,29 @@ func (guard *Guard) toCallbackEventChangeType(callbackHeader contract.EventInter
508543

509544
return decryptMessage, err
510545
}
546+
547+
// switch chat event change type
548+
func (guard *Guard) toCallbackChatEventChangeType(callbackHeader contract.EventInterface, buf []byte) (decryptMessage interface{}, err error) {
549+
550+
switch callbackHeader.GetChangeType() {
551+
case workModels.CALLBACK_EVENT_CHANGE_TYPE_CREATE:
552+
decryptMsg := &workModels.EventExternalChatCreate{}
553+
err = xml.Unmarshal(buf, decryptMsg)
554+
decryptMessage = decryptMsg
555+
break
556+
case workModels.CALLBACK_EVENT_CHANGE_TYPE_UPDATE:
557+
decryptMsg := &workModels.EventExternalChatUpdate{}
558+
err = xml.Unmarshal(buf, decryptMsg)
559+
decryptMessage = decryptMsg
560+
break
561+
case workModels.CALLBACK_EVENT_CHANGE_TYPE_DISMISS:
562+
decryptMsg := &workModels.EventExternalChatDismiss{}
563+
err = xml.Unmarshal(buf, decryptMsg)
564+
decryptMessage = decryptMsg
565+
break
566+
default:
567+
return nil, errors.New("not found wechat event")
568+
}
569+
570+
return decryptMessage, err
571+
}

src/openWork/suitAuth/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func (comp *Client) GetAuthInfo(ctx context.Context, authCorpID string, permanen
6161

6262
var result response.GetPermanentCodeResponse
6363
req := object.HashMap{
64-
"auth_corp_id": authCorpID,
64+
"auth_corpid": authCorpID,
6565
"permanent_code": permanentCode,
6666
}
6767
_, err := comp.BaseClient.HttpPostJson(ctx, "cgi-bin/service/get_auth_info", &req, nil, nil, &result)

src/openWork/suitAuth/response/get_permanent_code.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ type Agent struct {
6767
// AppID 旧的多应用套件中的对应应用id,新开发者请忽略
6868
AppID uint64 `json:"appid,omitempty"`
6969
// Privilege 应用对应的权限
70+
Privilege Privilege `json:"privilege,omitempty"`
7071
}
7172

7273
// Privilege 应用对应的权限

src/work/application.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/ArtisanCloud/PowerWeChat/v3/src/work/department"
2323
"github.com/ArtisanCloud/PowerWeChat/v3/src/work/externalContact"
2424
"github.com/ArtisanCloud/PowerWeChat/v3/src/work/externalContact/contactWay"
25+
"github.com/ArtisanCloud/PowerWeChat/v3/src/work/externalContact/customerAcquisition"
2526
"github.com/ArtisanCloud/PowerWeChat/v3/src/work/externalContact/customerStrategy"
2627
"github.com/ArtisanCloud/PowerWeChat/v3/src/work/externalContact/groupChat"
2728
"github.com/ArtisanCloud/PowerWeChat/v3/src/work/externalContact/groupWelcomeTemplate"
@@ -97,6 +98,7 @@ type Work struct {
9798

9899
ExternalContact *externalContact.Client
99100
ExternalContactContactWay *contactWay.Client
101+
ExternalContactCustomerAcquisition *customerAcquisition.Client
100102
ExternalContactCustomerStrategy *customerStrategy.Client
101103
ExternalContactStatistics *statistics.Client
102104
ExternalContactGroupWelcomeTemplate *groupWelcomeTemplate.Client
@@ -291,6 +293,7 @@ func NewWork(config *UserConfig) (*Work, error) {
291293
//-------------- register external contact --------------
292294
app.ExternalContact,
293295
app.ExternalContactContactWay,
296+
app.ExternalContactCustomerAcquisition,
294297
app.ExternalContactCustomerStrategy,
295298
app.ExternalContactGroupChat,
296299
app.ExternalContactGroupWelcomeTemplate,
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package customerAcquisition
2+
3+
import (
4+
"context"
5+
"github.com/ArtisanCloud/PowerLibs/v3/object"
6+
"github.com/ArtisanCloud/PowerWeChat/v3/src/kernel"
7+
response2 "github.com/ArtisanCloud/PowerWeChat/v3/src/kernel/response"
8+
request2 "github.com/ArtisanCloud/PowerWeChat/v3/src/work/externalContact/customerAcquisition/request"
9+
response3 "github.com/ArtisanCloud/PowerWeChat/v3/src/work/externalContact/customerAcquisition/response"
10+
)
11+
12+
type Client struct {
13+
BaseClient *kernel.BaseClient
14+
}
15+
16+
func NewClient(app kernel.ApplicationInterface) (*Client, error) {
17+
baseClient, err := kernel.NewBaseClient(&app, nil)
18+
if err != nil {
19+
return nil, err
20+
}
21+
return &Client{
22+
baseClient,
23+
}, nil
24+
}
25+
26+
// 获取获客链接列表
27+
// https://developer.work.weixin.qq.com/document/path/97398#%E8%8E%B7%E5%8F%96%E8%8E%B7%E5%AE%A2%E9%93%BE%E6%8E%A5%E5%88%97%E8%A1%A8
28+
func (comp *Client) ListLink(ctx context.Context, options *request2.RequestListLink) (*response3.ResponseListLink, error) {
29+
30+
result := &response3.ResponseListLink{}
31+
32+
_, err := comp.BaseClient.HttpPostJson(ctx, "cgi-bin/externalcontact/customer_acquisition/list_link", options, nil, nil, result)
33+
34+
return result, err
35+
}
36+
37+
// 获取获客链接详情
38+
// https://developer.work.weixin.qq.com/document/path/97398#%E8%8E%B7%E5%8F%96%E8%8E%B7%E5%AE%A2%E9%93%BE%E6%8E%A5%E8%AF%A6%E6%83%85
39+
func (comp *Client) Get(ctx context.Context, linkId string) (*response3.ResponseGetLink, error) {
40+
41+
result := &response3.ResponseGetLink{}
42+
43+
_, err := comp.BaseClient.HttpPostJson(ctx, "cgi-bin/externalcontact/customer_acquisition/get", &object.StringMap{
44+
"link_id": linkId,
45+
}, nil, nil, result)
46+
47+
return result, err
48+
}
49+
50+
// 创建获客链接
51+
// https://developer.work.weixin.qq.com/document/path/97398#%E5%88%9B%E5%BB%BA%E8%8E%B7%E5%AE%A2%E9%93%BE%E6%8E%A5
52+
func (comp *Client) CreateLink(ctx context.Context, options *request2.RequestCreateLink) (*response3.ResponseCreateLink, error) {
53+
54+
result := &response3.ResponseCreateLink{}
55+
56+
_, err := comp.BaseClient.HttpPostJson(ctx, "cgi-bin/externalcontact/customer_acquisition/create_link", options, nil, nil, result)
57+
58+
return result, err
59+
}
60+
61+
// 编辑获客链接
62+
// https://developer.work.weixin.qq.com/document/path/97398#%E7%BC%96%E8%BE%91%E8%8E%B7%E5%AE%A2%E9%93%BE%E6%8E%A5
63+
func (comp *Client) UpdateLink(ctx context.Context, config *request2.RequestUpdateLink) (*response2.ResponseWork, error) {
64+
65+
result := &response2.ResponseWork{}
66+
67+
_, err := comp.BaseClient.HttpPostJson(ctx, "cgi-bin/externalcontact/customer_acquisition/update_link", config, nil, nil, result)
68+
69+
return result, err
70+
}
71+
72+
// 删除获客链接
73+
// https://developer.work.weixin.qq.com/document/path/97398#%E5%88%A0%E9%99%A4%E8%8E%B7%E5%AE%A2%E9%93%BE%E6%8E%A5
74+
func (comp *Client) DeleteLink(ctx context.Context, linkId string) (*response2.ResponseWork, error) {
75+
76+
result := &response2.ResponseWork{}
77+
78+
_, err := comp.BaseClient.HttpPostJson(ctx, "cgi-bin/externalcontact/customer_acquisition/delete_link", &object.StringMap{
79+
"link_id": linkId,
80+
}, nil, nil, result)
81+
82+
return result, err
83+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package request
2+
3+
type Range struct {
4+
UserList []string `json:"user_list"`
5+
DepartmentList []string `json:"department_list"`
6+
}
7+
8+
type PriorityOption struct {
9+
PriorityType int `json:"priority_type"`
10+
PriorityUseridList []string `json:"priority_userid_list"`
11+
}
12+
13+
type RequestCreateLink struct {
14+
LinkName string `json:"link_name"` // 链接名称
15+
Range *Range `json:"range"` // 1,
16+
SkipVerify bool `json:"skip_verify"` // true,
17+
PriorityOption *PriorityOption `json:"priority_option"`
18+
}
19+
20+
type RequestUpdateLink struct {
21+
LinkId string `json:"link_id"` // 链接ID
22+
LinkName string `json:"link_name"` // 链接名称
23+
Range *Range `json:"range"` // 1,
24+
SkipVerify bool `json:"skip_verify"` // true,
25+
PriorityOption *PriorityOption `json:"priority_option"`
26+
}
27+
28+
type RequestDeleteLink struct {
29+
LinkId string `json:"link_id"`
30+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package request
2+
3+
type RequestGetLink struct {
4+
LinkId string `json:"link_id"`
5+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package request
2+
3+
type RequestListLink struct {
4+
Cursor string `json:"cursor"`
5+
Limit int `json:"limit"`
6+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package response
2+
3+
import "github.com/ArtisanCloud/PowerWeChat/v3/src/kernel/response"
4+
5+
type Link struct {
6+
LinkId string `json:"link_id"` // 链接ID
7+
LinkName string `json:"link_name"` // 链接名称
8+
Url string `json:"url"`
9+
SkipVerify bool `json:"skip_verify"`
10+
CreateTime int64 `json:"create_time"`
11+
}
12+
13+
type ResponseCreateLink struct {
14+
response.ResponseWork
15+
16+
Link Link `json:"link"`
17+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package response
2+
3+
import "github.com/ArtisanCloud/PowerWeChat/v3/src/kernel/response"
4+
5+
type Range struct {
6+
UserList []string `json:"user_list"`
7+
DepartmentList []string `json:"department_list"`
8+
}
9+
10+
type PriorityOption struct {
11+
PriorityType int `json:"priority_type"`
12+
PriorityUseridList []string `json:"priority_userid_list"`
13+
}
14+
15+
type ResponseGetLink struct {
16+
response.ResponseWork
17+
18+
Link *Link `json:"link"`
19+
Range *Range `json:"range"`
20+
PriorityOption *PriorityOption `json:"priority_option"`
21+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package response
2+
3+
import (
4+
"github.com/ArtisanCloud/PowerWeChat/v3/src/kernel/response"
5+
)
6+
7+
type ResponseListLink struct {
8+
response.ResponseWork
9+
10+
LinkIdList []string `json:"link_id_list"`
11+
NextCursor string `json:"next_cursor"`
12+
}

src/work/externalContact/groupChat/response/responseGroupChatGet.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,14 @@ type Admin struct {
2525
}
2626

2727
type GroupChat struct {
28-
ChatID string `json:"chat_id"`
29-
Name string `json:"name"`
30-
Owner string `json:"owner"`
31-
CreateTime int `json:"create_time"`
32-
Notice string `json:"notice"`
33-
MemberList []*Member `json:"member_list"`
34-
AdminList []*Admin `json:"admin_list"`
28+
ChatID string `json:"chat_id"`
29+
Name string `json:"name"`
30+
Owner string `json:"owner"`
31+
CreateTime int `json:"create_time"`
32+
Notice string `json:"notice"`
33+
MemberList []*Member `json:"member_list"`
34+
AdminList []*Admin `json:"admin_list"`
35+
MemberVersion string `json:"member_version"`
3536
}
3637

3738
type ResponseGroupChatGet struct {

0 commit comments

Comments
 (0)