|
|
@@ -0,0 +1,127 @@
|
|
|
+package openapi
|
|
|
+
|
|
|
+import (
|
|
|
+ "errors"
|
|
|
+ "fmt"
|
|
|
+
|
|
|
+ "github.com/silenceper/wechat/v2/domain/openapi"
|
|
|
+ mpContext "github.com/silenceper/wechat/v2/miniprogram/context"
|
|
|
+ ocContext "github.com/silenceper/wechat/v2/officialaccount/context"
|
|
|
+ "github.com/silenceper/wechat/v2/util"
|
|
|
+)
|
|
|
+
|
|
|
+const (
|
|
|
+ clearQuotaURL = "https://api.weixin.qq.com/cgi-bin/clear_quota" // 重置API调用次数
|
|
|
+ getAPIQuotaURL = "https://api.weixin.qq.com/cgi-bin/openapi/quota/get" // 查询API调用额度
|
|
|
+ getRidInfoURL = "https://api.weixin.qq.com/cgi-bin/openapi/rid/get" // 查询rid信息
|
|
|
+ clearQuotaByAppSecretURL = "https://api.weixin.qq.com/cgi-bin/clear_quota/v2" // 使用AppSecret重置 API 调用次数
|
|
|
+)
|
|
|
+
|
|
|
+// OpenAPI openApi管理
|
|
|
+type OpenAPI struct {
|
|
|
+ ctx interface{}
|
|
|
+}
|
|
|
+
|
|
|
+// NewOpenAPI 实例化
|
|
|
+func NewOpenAPI(ctx interface{}) *OpenAPI {
|
|
|
+ return &OpenAPI{ctx: ctx}
|
|
|
+}
|
|
|
+
|
|
|
+// ClearQuota 重置API调用次数
|
|
|
+// https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/openApi-mgnt/clearQuota.html
|
|
|
+func (o *OpenAPI) ClearQuota() error {
|
|
|
+ appID, _, err := o.getAppIDAndSecret()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ var payload = struct {
|
|
|
+ AppID string `json:"appid"`
|
|
|
+ }{
|
|
|
+ AppID: appID,
|
|
|
+ }
|
|
|
+ res, err := o.doPostRequest(clearQuotaURL, payload)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ return util.DecodeWithCommonError(res, "ClearQuota")
|
|
|
+}
|
|
|
+
|
|
|
+// GetAPIQuota 查询API调用额度
|
|
|
+// https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/openApi-mgnt/getApiQuota.html
|
|
|
+func (o *OpenAPI) GetAPIQuota(params openapi.GetAPIQuotaParams) (quota openapi.APIQuota, err error) {
|
|
|
+ res, err := o.doPostRequest(getAPIQuotaURL, params)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ err = util.DecodeWithError(res, "a, "GetAPIQuota")
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// GetRidInfo 查询rid信息
|
|
|
+// https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/openApi-mgnt/getRidInfo.html
|
|
|
+func (o *OpenAPI) GetRidInfo(params openapi.GetRidInfoParams) (r openapi.RidInfo, err error) {
|
|
|
+ res, err := o.doPostRequest(getRidInfoURL, params)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ err = util.DecodeWithError(res, &r, "GetRidInfo")
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// ClearQuotaByAppSecret 使用AppSecret重置 API 调用次数
|
|
|
+// https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/openApi-mgnt/clearQuotaByAppSecret.html
|
|
|
+func (o *OpenAPI) ClearQuotaByAppSecret() error {
|
|
|
+ id, secret, err := o.getAppIDAndSecret()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ uri := fmt.Sprintf("%s?appid=%s&appsecret=%s", clearQuotaByAppSecretURL, id, secret)
|
|
|
+ res, err := util.HTTPPost(uri, "")
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ return util.DecodeWithCommonError(res, "ClearQuotaByAppSecret")
|
|
|
+}
|
|
|
+
|
|
|
+// 获取 AppID 和 AppSecret
|
|
|
+func (o *OpenAPI) getAppIDAndSecret() (string, string, error) {
|
|
|
+ switch o.ctx.(type) {
|
|
|
+ case *mpContext.Context:
|
|
|
+ c := o.ctx.(*mpContext.Context)
|
|
|
+ return c.AppID, c.AppSecret, nil
|
|
|
+ case *ocContext.Context:
|
|
|
+ c := o.ctx.(*ocContext.Context)
|
|
|
+ return c.AppID, c.AppSecret, nil
|
|
|
+ default:
|
|
|
+ return "", "", errors.New("invalid context type")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 获取 AccessToken
|
|
|
+func (o *OpenAPI) getAccessToken() (string, error) {
|
|
|
+ switch o.ctx.(type) {
|
|
|
+ case *mpContext.Context:
|
|
|
+ return o.ctx.(*mpContext.Context).GetAccessToken()
|
|
|
+ case *ocContext.Context:
|
|
|
+ return o.ctx.(*ocContext.Context).GetAccessToken()
|
|
|
+ default:
|
|
|
+ return "", errors.New("invalid context type")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 创建 POST 请求
|
|
|
+func (o *OpenAPI) doPostRequest(uri string, payload interface{}) ([]byte, error) {
|
|
|
+ ak, err := o.getAccessToken()
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ uri = fmt.Sprintf("%s?access_token=%s", uri, ak)
|
|
|
+ return util.PostJSON(uri, payload)
|
|
|
+}
|