From ded5a10f9f38366948d7e2f8da93f0b34f8fbf9d Mon Sep 17 00:00:00 2001 From: theodore <34123141+yueyue1zhe@users.noreply.github.com> Date: Wed, 29 Jun 2022 00:12:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=95=86=20-=20=E8=8E=B7=E5=8F=96=20URL=20Link=20=E5=8F=8A=20?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=B0=8F=E7=A8=8B=E5=BA=8F=20url=5Flink=20?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=20(#576)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 小程序服务商 - 获取 URL Link 及 查询小程序 url_link 配置 * 格式化代码 * 规范调整 --- miniprogram/urllink/query.go | 52 +++++++++++++++++++++++++ openplatform/miniprogram/miniprogram.go | 35 +++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 miniprogram/urllink/query.go diff --git a/miniprogram/urllink/query.go b/miniprogram/urllink/query.go new file mode 100644 index 0000000..72fc57a --- /dev/null +++ b/miniprogram/urllink/query.go @@ -0,0 +1,52 @@ +package urllink + +import ( + "fmt" + + "github.com/silenceper/wechat/v2/util" +) + +const queryURL = "https://api.weixin.qq.com/wxa/query_urllink" + +// ULQueryResult 返回的结果 +// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-link/urllink.query.html 返回值 +type ULQueryResult struct { + util.CommonError + + URLLinkInfo struct { + Appid string `json:"appid"` + Path string `json:"path"` + Query string `json:"query"` + CreateTime int64 `json:"create_time"` + ExpireTime int64 `json:"expire_time"` + EnvVersion string `json:"env_version"` + CloudBase struct { + Env string `json:"env"` + Domain string `json:"domain"` + Path string `json:"path"` + Query string `json:"query"` + ResourceAppid string `json:"resource_appid"` + } `json:"cloud_base"` + } `json:"url_link_info"` + VisitOpenid string `json:"visit_openid"` +} + +// Query 查询小程序 url_link 配置。 +func (u *URLLink) Query(urlLink string) (*ULQueryResult, error) { + accessToken, err := u.GetAccessToken() + if err != nil { + return nil, err + } + + uri := fmt.Sprintf("%s?access_token=%s", queryURL, accessToken) + response, err := util.PostJSON(uri, map[string]string{"url_link": urlLink}) + if err != nil { + return nil, err + } + var resp ULQueryResult + err = util.DecodeWithError(response, &resp, "URLLink.Query") + if err != nil { + return nil, err + } + return &resp, nil +} diff --git a/openplatform/miniprogram/miniprogram.go b/openplatform/miniprogram/miniprogram.go index 2b2d738..2aaaf07 100644 --- a/openplatform/miniprogram/miniprogram.go +++ b/openplatform/miniprogram/miniprogram.go @@ -1,6 +1,10 @@ package miniprogram import ( + "fmt" + + miniContext "github.com/silenceper/wechat/v2/miniprogram/context" + "github.com/silenceper/wechat/v2/miniprogram/urllink" openContext "github.com/silenceper/wechat/v2/openplatform/context" "github.com/silenceper/wechat/v2/openplatform/miniprogram/basic" "github.com/silenceper/wechat/v2/openplatform/miniprogram/component" @@ -10,6 +14,30 @@ import ( type MiniProgram struct { AppID string openContext *openContext.Context + + authorizerRefreshToken string +} + +// GetAccessToken 获取ak +func (miniProgram *MiniProgram) GetAccessToken() (string, error) { + ak, akErr := miniProgram.openContext.GetAuthrAccessToken(miniProgram.AppID) + if akErr == nil { + return ak, nil + } + if miniProgram.authorizerRefreshToken == "" { + return "", fmt.Errorf("please set the authorizer_refresh_token first") + } + akRes, akResErr := miniProgram.GetComponent().RefreshAuthrToken(miniProgram.AppID, miniProgram.authorizerRefreshToken) + if akResErr != nil { + return "", akResErr + } + return akRes.AccessToken, nil +} + +// SetAuthorizerRefreshToken 设置代执操作业务授权账号authorizer_refresh_token +func (miniProgram *MiniProgram) SetAuthorizerRefreshToken(authorizerRefreshToken string) *MiniProgram { + miniProgram.authorizerRefreshToken = authorizerRefreshToken + return miniProgram } // NewMiniProgram 实例化 @@ -30,3 +58,10 @@ func (miniProgram *MiniProgram) GetComponent() *component.Component { func (miniProgram *MiniProgram) GetBasic() *basic.Basic { return basic.NewBasic(miniProgram.openContext, miniProgram.AppID) } + +// GetURLLink 小程序URL Link接口 调用前需确认已调用 SetAuthorizerRefreshToken 避免由于缓存中 authorizer_access_token 过期执行中断 +func (miniProgram *MiniProgram) GetURLLink() *urllink.URLLink { + return urllink.NewURLLink(&miniContext.Context{ + AccessTokenHandle: miniProgram, + }) +}