我在使用官方的库 go sdk github.com/alibabacloud-go/dingtalk 对接 钉钉接口。
我开通了一个应用,也开通了权限。通过官方的sdk调用还是报错了。说的是我没有权限,我的应用是开通了权限的。
报错信息,
code: 403, 没有调用该接口的权限,接口权限申请参考:https://open.dingtalk.com/document/orgapp-server/add-api-permission request id: B4DB99DC-706A-767D-BBDA-EF61D94C89E6
{"accessdenieddetail":{"requiredScopes":["Contact.User.Read"]},"code":"Forbidden.AccessDenied.AccessTokenPermissionDenied","message":"没有调用该接口的权限,接口权限申请参考:https://open.dingtalk.com/document/orgapp-server/add-api-permission","requestid":"B4DB99DC-706A-767D-BBDA-EF61D94C89E6","statusCode":403}
我的应用:
权限是开了的,也发布了。
代码:
import (
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
dingtalkcontact_1_0 "github.com/alibabacloud-go/dingtalk/contact_1_0"
dingtalkoauth2_1_0 "github.com/alibabacloud-go/dingtalk/oauth2_1_0"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
)
const (
CLIENT_ID = "dingd"
CLIENT_SECRET = "_4hRhSzdL"
)
func CreateClient() (_result *dingtalkcontact_1_0.Client, _err error) {
config := &openapi.Config{}
config.Protocol = tea.String("https")
config.RegionId = tea.String("central")
_result = &dingtalkcontact_1_0.Client{}
_result, _err = dingtalkcontact_1_0.NewClient(config)
return _result, _err
}
func CreateClientV2() (_result *dingtalkoauth2_1_0.Client, _err error) {
config := &openapi.Config{}
config.Protocol = tea.String("https")
config.RegionId = tea.String("central")
_result = &dingtalkoauth2_1_0.Client{}
_result, _err = dingtalkoauth2_1_0.NewClient(config)
return _result, _err
}
// GetUserByCode 使用 Token 初始化账号Client
func GetUserByCode(client *dingtalkoauth2_1_0.Client, code string) (re *dingtalkoauth2_1_0.GetUserTokenResponse, _err error) {
getUserTokenRequest := &dingtalkoauth2_1_0.GetUserTokenRequest{
ClientId: tea.String(CLIENT_ID),
ClientSecret: tea.String(CLIENT_SECRET),
Code: tea.String(code),
GrantType: tea.String("authorization_code"),
}
tryErr := func() (_e error) {
defer func() {
if r := tea.Recover(recover()); r != nil {
_e = r
}
}()
re, _err = client.GetUserToken(getUserTokenRequest)
if _err != nil {
return _err
}
return nil
}()
if tryErr != nil {
var err = &tea.SDKError{}
if _t, ok := tryErr.(*tea.SDKError); ok {
err = _t
} else {
err.Message = tea.String(tryErr.Error())
}
if !tea.BoolValue(util.Empty(err.Code)) && !tea.BoolValue(util.Empty(err.Message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题
}
} else if re != nil {
logger.Info("get user token success: %+v", *re)
}
return re, _err
}
func GetUserInfoByAccessToken(client *dingtalkcontact_1_0.Client, accessToken, unionId string) (re *dingtalkcontact_1_0.GetUserResponse, _err error) {
getUserHeaders := &dingtalkcontact_1_0.GetUserHeaders{}
getUserHeaders.XAcsDingtalkAccessToken = tea.String(accessToken)
tryErr := func() (_e error) {
defer func() {
if r := tea.Recover(recover()); r != nil {
_e = r
}
}()
re, _err = client.GetUserWithOptions(tea.String(unionId), getUserHeaders, &util.RuntimeOptions{})
if _err != nil {
return _err
}
return nil
}()
if tryErr != nil {
var err = &tea.SDKError{}
if _t, ok := tryErr.(*tea.SDKError); ok {
err = _t
} else {
err.Message = tea.String(tryErr.Error())
}
if !tea.BoolValue(util.Empty(err.Code)) && !tea.BoolValue(util.Empty(err.Message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题
}
}
return re, _err
}
// TestUserLoginGetInfo 扫码验证code获取 access token,再通过 access token 获取用户信息
func TestUserLoginGetInfo(t *testing.T) {
var code = "827269eec875339db1f75c227f5caa86"
client2, err := CreateClientV2()
if err != nil {
t.Errorf("CreateClientV2() error = %v", err)
}
if re, err := GetUserByCode(client2, code); err != nil {
t.Errorf("GetUserByCode() error = %v ", err)
} else if re != nil {
t.Logf("GetUserByCode() re = %+v", *re)
client, err := CreateClient()
if err != nil {
t.Errorf("CreateClient() error = %v", err)
return
}
gotRe, err := GetUserInfoByAccessToken(client, *re.Body.AccessToken, "me")
if err != nil {
t.Errorf("GetUserInfoByAccessToken() error = %v", err)
return
} else if gotRe != nil {
t.Logf("GetUserInfoByAccessToken() gotRe = %+v", *gotRe)
}
}
}
所以,问题在哪呢?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云NoSQL数据库提供了一种灵活的数据存储方式,可以支持各种数据模型,包括文档型、图型、列型和键值型。此外,它还提供了一种分布式的数据处理方式,可以支持高可用性和容灾备份。包含Redis社区版和Tair、多模数据库 Lindorm、MongoDB 版。