Compare commits

...

50 Commits

Author SHA1 Message Date
李光春 f646934937 - update
1 year ago
李光春 3b3e91bb17 - update
1 year ago
李光春 72e2014313 - update
1 year ago
李光春 82ea709f82 - update redis
2 years ago
李光春 486fe027e0 - update
2 years ago
李光春 0f2b443f26 - update
2 years ago
李光春 07fd234a98 - update
2 years ago
李光春 acda52aee9 - update
2 years ago
李光春 04c6685b75 - update
2 years ago
李光春 d1cda7f385 - update fun
2 years ago
李光春 734bb80833 - update vendor
2 years ago
李光春 85c983e6ab - add CgiBinMaterialGetMaterial
2 years ago
李光春 b84e516018 - update vendor
2 years ago
李光春 a527ea8800 - update get
2 years ago
李光春 99a5eeb96c - update
2 years ago
李光春 6247c136f5 - repair WxaBusinessGetUserPhoneNumber
2 years ago
李光春 ac4496c7e8 - repair WxaAddToTemplate
2 years ago
李光春 ab0ff7b934 - add request UserAgent
2 years ago
李光春 7eb51ea505 - update log
2 years ago
李光春 f48879bea6 - update WxaModifyDomainDirectly
2 years ago
李光春 b34320ffa3 - update WxaGetWxaCodeUnLimit
2 years ago
李光春 b1dd60284d - update sign.decrypt
2 years ago
李光春 2401d39ae2 - add service_http.gin
2 years ago
李光春 11cb134490 - add sign.decrypt
2 years ago
李光春 bcdc0ba95c - update
2 years ago
李光春 1dd03cefc0 - update WxaGetQrcode
2 years ago
李光春 1564015f98 - update
2 years ago
李光春 f6113e7c99 - update api mongo
2 years ago
李光春 d88cb69527 - update log
2 years ago
李光春 3bd29edc4b - update error
2 years ago
李光春 758f9ff5c0 - update redis
2 years ago
李光春 ecabbba061 - update log
2 years ago
李光春 147fbbac4a - update log
2 years ago
李光春 6486410d35 - update log
2 years ago
李光春 4714174013 - update log
2 years ago
李光春 8fde8e6191 - update log
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2 years ago
李光春 ca0fe58783 - update log
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2 years ago
李光春 0f9a19f832 - update log
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build was killed Details
2 years ago
李光春 2150d671be - update
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2 years ago
李光春 ab5bb603c9 - update request
2 years ago
李光春 2bffadd116 - update request
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2 years ago
李光春 1defa20a76 - update request
continuous-integration/drone/tag Build is failing Details
continuous-integration/drone/push Build is failing Details
2 years ago
李光春 bb4857963d - update request
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2 years ago
李光春 61aa7fbac9 - update
continuous-integration/drone/tag Build is failing Details
continuous-integration/drone/push Build is passing Details
2 years ago
李光春 ff1e4f9b8f - update
continuous-integration/drone/tag Build is failing Details
continuous-integration/drone/push Build is failing Details
2 years ago
李光春 321a6d5b00 - update
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2 years ago
李光春 a3664d42b0 - update vendor
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2 years ago
李光春 503a1ab383 - update
2 years ago
李光春 e2df81c3a4 - update
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details
2 years ago
李光春 f75570d0c8 - update
continuous-integration/drone/push Build is passing Details
2 years ago

5
.gitignore vendored

@ -4,7 +4,6 @@
.idea
.vscode
*.log
goinit.sh
gomod.sh
/vendor/
*_test.go
*_test.go
/vendor/

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2018 李光春
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -1,5 +1,5 @@
<h1>
<a href="https://www.dtapp.net/">Golang WeChatOpen</a>
<a href="https://www.dtapp.net/">Golang</a>
</h1>
📦 Golang WeChatOpen
@ -8,18 +8,10 @@
[![godoc](https://pkg.go.dev/badge/go.dtapp.net/wechatopen?status.svg)](https://pkg.go.dev/go.dtapp.net/wechatopen)
[![goproxy.cn](https://goproxy.cn/stats/go.dtapp.net/wechatopen/badges/download-count.svg)](https://goproxy.cn/stats/go.dtapp.net/wechatopen)
[![goreportcard.com](https://goreportcard.com/badge/go.dtapp.net/wechatopen)](https://goreportcard.com/report/go.dtapp.net/wechatopen)
[![deps.dev](https://img.shields.io/badge/deps-go-red.svg)](https://deps.dev/go/go.dtapp.net/wechatopen)
[![deps.dev](https://img.shields.io/badge/deps-go-red.svg)](https://deps.dev/go/go.dtapp.net%2Fwechatopen)
#### 安装使用
#### 安装
```go
go get -v -u go.dtapp.net/wechatopen
```
#### 导入
```go
import (
"go.dtapp.net/wechatopen"
)
```

@ -1,88 +0,0 @@
package wechatopen
import (
"go.dtapp.net/golog"
"go.dtapp.net/goredis"
"go.dtapp.net/gorequest"
"gorm.io/gorm"
)
// App 微信公众号服务
type App struct {
componentAccessToken string // 第三方平台 access_token
componentVerifyTicket string // 微信后台推送的 ticket
preAuthCode string // 预授权码
authorizerAccessToken string // 接口调用令牌
authorizerRefreshToken string // 刷新令牌
authorizerAppid string // 授权方 appid
componentAppId string // 第三方平台 appid
componentAppSecret string // 第三方平台 app_secret
messageToken string
messageKey string
redis *goredis.Client // 缓存数据库
pgsql *gorm.DB // pgsql数据库
client *gorequest.App // 请求客户端
log *golog.Api // 日志服务
logTableName string // 日志表名
logStatus bool // 日志状态
}
// NewApp 实例化
func NewApp(componentAppId string, componentAppSecret string, messageToken string, messageKey string, redis *goredis.Client, pgsql *gorm.DB) *App {
app := &App{componentAppId: componentAppId, componentAppSecret: componentAppSecret, messageToken: messageToken, messageKey: messageKey, redis: redis}
app.client = gorequest.NewHttp()
if pgsql != nil {
app.pgsql = pgsql
app.logStatus = true
app.logTableName = "wechatopen"
app.log = golog.NewApi(&golog.ApiConfig{
Db: pgsql,
TableName: app.logTableName,
})
}
return app
}
// Config 配置
func (app *App) Config(componentAppId, componentAppSecret string) *App {
app.componentAppId = componentAppId
app.componentAppSecret = componentAppSecret
return app
}
// ConfigAuthorizer 配置第三方
func (app *App) ConfigAuthorizer(authorizerAppid string) *App {
app.authorizerAppid = authorizerAppid
return app
}
func (app *App) request(url string, params map[string]interface{}, method string) (resp gorequest.Response, err error) {
// 创建请求
client := app.client
// 设置请求地址
client.SetUri(url)
// 设置方式
client.SetMethod(method)
// 设置格式
client.SetContentTypeJson()
// 设置参数
client.SetParams(params)
// 发起请求
request, err := client.Request()
if err != nil {
return gorequest.Response{}, err
}
// 日志
if app.logStatus == true {
go app.postgresqlLog(request)
}
return request, err
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -46,20 +47,36 @@ type CgiBinAccountGetAccountBasicInfoResult struct {
Result CgiBinAccountGetAccountBasicInfoResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewCgiBinAccountGetAccountBasicInfoResult(result CgiBinAccountGetAccountBasicInfoResponse, body []byte, http gorequest.Response, err error) *CgiBinAccountGetAccountBasicInfoResult {
return &CgiBinAccountGetAccountBasicInfoResult{Result: result, Body: body, Http: http, Err: err}
func newCgiBinAccountGetAccountBasicInfoResult(result CgiBinAccountGetAccountBasicInfoResponse, body []byte, http gorequest.Response) *CgiBinAccountGetAccountBasicInfoResult {
return &CgiBinAccountGetAccountBasicInfoResult{Result: result, Body: body, Http: http}
}
// CgiBinAccountGetAccountBasicInfo 获取基本信息
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/Mini_Program_Basic_Info/Mini_Program_Information_Settings.html
func (app *App) CgiBinAccountGetAccountBasicInfo() *CgiBinAccountGetAccountBasicInfoResult {
func (c *Client) CgiBinAccountGetAccountBasicInfo(ctx context.Context) (*CgiBinAccountGetAccountBasicInfoResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParams()
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/account/getaccountbasicinfo?access_token=%v", app.GetAuthorizerAccessToken()), map[string]interface{}{}, http.MethodGet)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/account/getaccountbasicinfo?access_token=%v", c.GetAuthorizerAccessToken(ctx)), params, http.MethodGet)
if err != nil {
return nil, err
}
// 定义
var response CgiBinAccountGetAccountBasicInfoResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewCgiBinAccountGetAccountBasicInfoResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newCgiBinAccountGetAccountBasicInfoResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -17,27 +18,41 @@ type CgiBinComponentApiAuthorizerTokenResult struct {
Result CgiBinComponentApiAuthorizerTokenResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
authorizerAppid string // 授权方 appid
}
func NewCgiBinComponentApiAuthorizerTokenResult(result CgiBinComponentApiAuthorizerTokenResponse, body []byte, http gorequest.Response, err error, authorizerAppid string) *CgiBinComponentApiAuthorizerTokenResult {
return &CgiBinComponentApiAuthorizerTokenResult{Result: result, Body: body, Http: http, Err: err, authorizerAppid: authorizerAppid}
func newCgiBinComponentApiAuthorizerTokenResult(result CgiBinComponentApiAuthorizerTokenResponse, body []byte, http gorequest.Response, authorizerAppid string) *CgiBinComponentApiAuthorizerTokenResult {
return &CgiBinComponentApiAuthorizerTokenResult{Result: result, Body: body, Http: http, authorizerAppid: authorizerAppid}
}
// CgiBinComponentApiAuthorizerToken 获取/刷新接口调用令牌
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/token/api_authorizer_token.html
func (app *App) CgiBinComponentApiAuthorizerToken(authorizerRefreshToken string) *CgiBinComponentApiAuthorizerTokenResult {
func (c *Client) CgiBinComponentApiAuthorizerToken(ctx context.Context, authorizerRefreshToken string) (*CgiBinComponentApiAuthorizerTokenResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
param := NewParams()
param["component_appid"] = app.componentAppId // 第三方平台 appid
param["authorizer_appid"] = app.authorizerAppid // 授权方 appid
param := gorequest.NewParams()
param["component_appid"] = c.GetComponentAppId() // 第三方平台 appid
param["authorizer_appid"] = c.GetAuthorizerAppid() // 授权方 appid
param["authorizer_refresh_token"] = authorizerRefreshToken // 授权码, 会在授权成功时返回给第三方平台
params := app.NewParamsWith(param)
params := gorequest.NewParamsWith(param)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/component/api_authorizer_token?component_access_token=%v", app.GetComponentAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/component/api_authorizer_token?component_access_token=%v", c.GetComponentAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinComponentApiAuthorizerTokenResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewCgiBinComponentApiAuthorizerTokenResult(response, request.ResponseBody, request, err, app.authorizerAppid)
if err != nil {
return nil, err
}
return newCgiBinComponentApiAuthorizerTokenResult(response, request.ResponseBody, request, param["authorizer_appid"].(string)), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"go.dtapp.net/gorequest"
"net/http"
@ -15,26 +16,36 @@ type CgiBinComponentApiComponentTokenResult struct {
Result CgiBinComponentApiComponentTokenResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewCgiBinComponentApiComponentTokenResult(result CgiBinComponentApiComponentTokenResponse, body []byte, http gorequest.Response, err error) *CgiBinComponentApiComponentTokenResult {
return &CgiBinComponentApiComponentTokenResult{Result: result, Body: body, Http: http, Err: err}
func newCgiBinComponentApiComponentTokenResult(result CgiBinComponentApiComponentTokenResponse, body []byte, http gorequest.Response) *CgiBinComponentApiComponentTokenResult {
return &CgiBinComponentApiComponentTokenResult{Result: result, Body: body, Http: http}
}
// CgiBinComponentApiComponentToken 令牌
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/token/component_access_token.html
func (app *App) CgiBinComponentApiComponentToken() *CgiBinComponentApiComponentTokenResult {
func (c *Client) CgiBinComponentApiComponentToken(ctx context.Context) (*CgiBinComponentApiComponentTokenResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
param := NewParams()
param["component_appid"] = app.componentAppId // 第三方平台 appid
param["component_appsecret"] = app.componentAppSecret // 第三方平台 appsecret
param["component_verify_ticket"] = app.GetComponentVerifyTicket() // 微信后台推送的 ticket
params := app.NewParamsWith(param)
param := gorequest.NewParams()
param["component_appid"] = c.GetComponentAppId() // 第三方平台 appid
param["component_appsecret"] = c.GetComponentAppSecret() // 第三方平台 appsecret
param["component_verify_ticket"] = c.GetComponentVerifyTicket(ctx) // 微信后台推送的 ticket
params := gorequest.NewParamsWith(param)
// 请求
request, err := app.request("https://api.weixin.qq.com/cgi-bin/component/api_component_token", params, http.MethodPost)
request, err := c.request(ctx, apiUrl+"/cgi-bin/component/api_component_token", params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinComponentApiComponentTokenResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewCgiBinComponentApiComponentTokenResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newCgiBinComponentApiComponentTokenResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -16,24 +17,35 @@ type CgiBinComponentApiCreatePreAuthCodenResult struct {
Result CgiBinComponentApiCreatePreAuthCodenResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewCgiBinComponentApiCreatePreAuthCodenResult(result CgiBinComponentApiCreatePreAuthCodenResponse, body []byte, http gorequest.Response, err error) *CgiBinComponentApiCreatePreAuthCodenResult {
return &CgiBinComponentApiCreatePreAuthCodenResult{Result: result, Body: body, Http: http, Err: err}
func newCgiBinComponentApiCreatePreAuthCodenResult(result CgiBinComponentApiCreatePreAuthCodenResponse, body []byte, http gorequest.Response) *CgiBinComponentApiCreatePreAuthCodenResult {
return &CgiBinComponentApiCreatePreAuthCodenResult{Result: result, Body: body, Http: http}
}
// CgiBinComponentApiCreatePreAuthCoden 预授权码
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/token/pre_auth_code.html
func (app *App) CgiBinComponentApiCreatePreAuthCoden() *CgiBinComponentApiCreatePreAuthCodenResult {
func (c *Client) CgiBinComponentApiCreatePreAuthCoden(ctx context.Context) (*CgiBinComponentApiCreatePreAuthCodenResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
param := NewParams()
param["component_appid"] = app.componentAppId // 第三方平台 appid
params := app.NewParamsWith(param)
param := gorequest.NewParams()
param["component_appid"] = c.GetComponentAppId() // 第三方平台 appid
params := gorequest.NewParamsWith(param)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=%v", app.GetComponentAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/component/api_create_preauthcode?component_access_token=%v", c.GetComponentAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinComponentApiCreatePreAuthCodenResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewCgiBinComponentApiCreatePreAuthCodenResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newCgiBinComponentApiCreatePreAuthCodenResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -74,25 +75,39 @@ type CgiBinComponentApiGetAuthorizerInfoResult struct {
Result CgiBinComponentApiGetAuthorizerInfoResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewCgiBinComponentApiGetAuthorizerInfoResult(result CgiBinComponentApiGetAuthorizerInfoResponse, body []byte, http gorequest.Response, err error) *CgiBinComponentApiGetAuthorizerInfoResult {
return &CgiBinComponentApiGetAuthorizerInfoResult{Result: result, Body: body, Http: http, Err: err}
func newCgiBinComponentApiGetAuthorizerInfoResult(result CgiBinComponentApiGetAuthorizerInfoResponse, body []byte, http gorequest.Response) *CgiBinComponentApiGetAuthorizerInfoResult {
return &CgiBinComponentApiGetAuthorizerInfoResult{Result: result, Body: body, Http: http}
}
// CgiBinComponentApiGetAuthorizerInfo 获取授权帐号详情
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/token/api_get_authorizer_info.html
func (app *App) CgiBinComponentApiGetAuthorizerInfo() *CgiBinComponentApiGetAuthorizerInfoResult {
func (c *Client) CgiBinComponentApiGetAuthorizerInfo(ctx context.Context) (*CgiBinComponentApiGetAuthorizerInfoResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
param := NewParams()
param["component_appid"] = app.componentAppId // 第三方平台 appid
param["authorizer_appid"] = app.authorizerAppid // 授权方 appid
params := app.NewParamsWith(param)
param := gorequest.NewParams()
param["component_appid"] = c.GetComponentAppId() // 第三方平台 appid
param["authorizer_appid"] = c.GetAuthorizerAppid() // 授权方 appid
params := gorequest.NewParamsWith(param)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token=%v", app.GetComponentAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/component/api_get_authorizer_info?component_access_token=%v", c.GetComponentAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinComponentApiGetAuthorizerInfoResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewCgiBinComponentApiGetAuthorizerInfoResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newCgiBinComponentApiGetAuthorizerInfoResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -30,25 +31,35 @@ type CgiBinComponentApiQueryAuthResult struct {
Result CgiBinComponentApiQueryAuthResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewCgiBinComponentApiQueryAuthResult(result CgiBinComponentApiQueryAuthResponse, body []byte, http gorequest.Response, err error) *CgiBinComponentApiQueryAuthResult {
return &CgiBinComponentApiQueryAuthResult{Result: result, Body: body, Http: http, Err: err}
func newCgiBinComponentApiQueryAuthResult(result CgiBinComponentApiQueryAuthResponse, body []byte, http gorequest.Response) *CgiBinComponentApiQueryAuthResult {
return &CgiBinComponentApiQueryAuthResult{Result: result, Body: body, Http: http}
}
// CgiBinComponentApiQueryAuth 使用授权码获取授权信息
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/token/authorization_info.html
func (app *App) CgiBinComponentApiQueryAuth(authorizationCode string) *CgiBinComponentApiQueryAuthResult {
func (c *Client) CgiBinComponentApiQueryAuth(ctx context.Context, authorizationCode string) (*CgiBinComponentApiQueryAuthResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
param := NewParams()
param["component_appid"] = app.componentAppId // 第三方平台 appid
param["authorization_code"] = authorizationCode // 授权码, 会在授权成功时返回给第三方平台
params := app.NewParamsWith(param)
param := gorequest.NewParams()
param["component_appid"] = c.GetComponentAppId() // 第三方平台 appid
param["authorization_code"] = authorizationCode // 授权码, 会在授权成功时返回给第三方平台
params := gorequest.NewParamsWith(param)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=%v", app.GetComponentAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/component/api_query_auth?component_access_token=%v", c.GetComponentAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinComponentApiQueryAuthResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewCgiBinComponentApiQueryAuthResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newCgiBinComponentApiQueryAuthResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"go.dtapp.net/gorequest"
"net/http"
@ -17,25 +18,35 @@ type CgiBinComponentApiStartPushTicketResult struct {
Result CgiBinComponentApiStartPushTicketResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewCgiBinComponentApiStartPushTicketResult(result CgiBinComponentApiStartPushTicketResponse, body []byte, http gorequest.Response, err error) *CgiBinComponentApiStartPushTicketResult {
return &CgiBinComponentApiStartPushTicketResult{Result: result, Body: body, Http: http, Err: err}
func newCgiBinComponentApiStartPushTicketResult(result CgiBinComponentApiStartPushTicketResponse, body []byte, http gorequest.Response) *CgiBinComponentApiStartPushTicketResult {
return &CgiBinComponentApiStartPushTicketResult{Result: result, Body: body, Http: http}
}
// CgiBinComponentApiStartPushTicket 启动ticket推送服务
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/token/component_verify_ticket_service.html
func (app *App) CgiBinComponentApiStartPushTicket() *CgiBinComponentApiStartPushTicketResult {
func (c *Client) CgiBinComponentApiStartPushTicket(ctx context.Context) (*CgiBinComponentApiStartPushTicketResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
param := NewParams()
param["component_appid"] = app.componentAppId // 平台型第三方平台的appid
param["component_secret"] = app.componentAppSecret // 平台型第三方平台的APPSECRET
params := app.NewParamsWith(param)
param := gorequest.NewParams()
param["component_appid"] = c.GetComponentAppId() // 平台型第三方平台的appid
param["component_secret"] = c.GetComponentAppSecret() // 平台型第三方平台的APPSECRET
params := gorequest.NewParamsWith(param)
// 请求
request, err := app.request("https://api.weixin.qq.com/cgi-bin/component/api_start_push_ticket", params, http.MethodPost)
request, err := c.request(ctx, apiUrl+"/cgi-bin/component/api_start_push_ticket", params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinComponentApiStartPushTicketResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewCgiBinComponentApiStartPushTicketResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newCgiBinComponentApiStartPushTicketResult(response, request.ResponseBody, request), nil
}

@ -0,0 +1,120 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
"net/http"
)
type CgiBinComponentFastRegisterWeAppCreateResponse struct {
Errcode int `json:"errcode"` // 错误码
Errmsg string `json:"errmsg"` // 错误信息
}
type CgiBinComponentFastRegisterWeAppCreateResult struct {
Result CgiBinComponentFastRegisterWeAppCreateResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
}
func newCgiBinComponentFastRegisterWeAppCreateResult(result CgiBinComponentFastRegisterWeAppCreateResponse, body []byte, http gorequest.Response) *CgiBinComponentFastRegisterWeAppCreateResult {
return &CgiBinComponentFastRegisterWeAppCreateResult{Result: result, Body: body, Http: http}
}
// CgiBinComponentFastRegisterWeAppCreate 快速注册企业小程序
// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/register-management/fast-registration-ent/registerMiniprogram.html
func (c *Client) CgiBinComponentFastRegisterWeAppCreate(ctx context.Context, notMustParams ...gorequest.Params) (*CgiBinComponentFastRegisterWeAppCreateResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := c.request(ctx, apiUrl+"/cgi-bin/component/fastregisterweapp?action=create&component_access_token="+c.GetComponentAccessToken(ctx), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinComponentFastRegisterWeAppCreateResponse
err = json.Unmarshal(request.ResponseBody, &response)
if err != nil {
return nil, err
}
return newCgiBinComponentFastRegisterWeAppCreateResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述
func (resp *CgiBinComponentFastRegisterWeAppCreateResult) ErrcodeInfo() string {
switch resp.Result.Errcode {
case 89249:
return "该 appid 已有转正任务执行中,距上次任务 24h 后再试"
case 89247:
return "系统内部错误"
case 86004:
return "无效微信号"
case 61070:
return "法人姓名与微信号不一致"
case 89248:
return "企业代码类型无效,请选择正确类型填写"
case 89250:
return "未找到该任务"
case 89251:
return "模板消息已下发,待法人人脸核身校验"
case 89252:
return "法人&企业信息一致性校验中"
case 89253:
return "缺少参数"
case 89254:
return "第三方权限集不全,请补充权限集后重试"
case 89255:
return "code参数无效请检查 code 长度以及内容是否正确注意code_type的值不同需要传的 code 长度不一样"
}
return "系统繁忙"
}
// StatusInfo 状态描述
func (resp *CgiBinComponentFastRegisterWeAppCreateResult) StatusInfo(status int) string {
switch status {
case 100001:
return "已下发的模板消息法人并未确认且已超时24h未进行身份证校验"
case 100002:
return "已下发的模板消息法人并未确认且已超时24h未进行人脸识别校验"
case 100003:
return "已下发的模板消息法人并未确认且已超时24h"
case 101:
return "工商数据返回:“企业已注销”"
case 102:
return "工商数据返回:“企业不存在或企业信息未更新”"
case 103:
return "工商数据返回:“企业法定代表人姓名不一致”"
case 104:
return "工商数据返回:“企业法定代表人身份证号码不一致”"
case 105:
return "法定代表人身份证号码,工商数据未更新,请 5-15 个工作日之后尝试"
case 1000:
return "工商数据返回:“企业信息或法定代表人信息不一致”"
case 1001:
return "主体创建小程序数量达到上限"
case 1002:
return "主体违规命中黑名单"
case 1003:
return "管理员绑定账号数量达到上限"
case 1004:
return "管理员违规命中黑名单"
case 1005:
return "管理员手机绑定账号数量达到上限"
case 1006:
return "管理员手机号违规命中黑名单"
case 1007:
return "管理员身份证创建账号数量达到上限"
case 1008:
return "管理员身份证违规命中黑名单"
case -1:
return "企业与法人姓名不一致"
}
return fmt.Sprintf("%v", status)
}

@ -0,0 +1,120 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
"net/http"
)
type CgiBinComponentFastRegisterWeAppSearchResponse struct {
Errcode int `json:"errcode"` // 错误码
Errmsg string `json:"errmsg"` // 错误信息
}
type CgiBinComponentFastRegisterWeAppSearchResult struct {
Result CgiBinComponentFastRegisterWeAppSearchResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
}
func newCgiBinComponentFastRegisterWeAppSearchResult(result CgiBinComponentFastRegisterWeAppSearchResponse, body []byte, http gorequest.Response) *CgiBinComponentFastRegisterWeAppSearchResult {
return &CgiBinComponentFastRegisterWeAppSearchResult{Result: result, Body: body, Http: http}
}
// CgiBinComponentFastRegisterWeAppSearch 快速注册企业小程序
// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/register-management/fast-registration-ent/registerMiniprogram.html#%E4%BA%8C%E3%80%81%E6%9F%A5%E8%AF%A2%E5%88%9B%E5%BB%BA%E4%BB%BB%E5%8A%A1%E7%8A%B6%E6%80%81
func (c *Client) CgiBinComponentFastRegisterWeAppSearch(ctx context.Context, notMustParams ...gorequest.Params) (*CgiBinComponentFastRegisterWeAppSearchResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := c.request(ctx, apiUrl+"/cgi-bin/component/fastregisterweapp?action=search&component_access_token="+c.GetComponentAccessToken(ctx), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinComponentFastRegisterWeAppSearchResponse
err = json.Unmarshal(request.ResponseBody, &response)
if err != nil {
return nil, err
}
return newCgiBinComponentFastRegisterWeAppSearchResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述
func (resp *CgiBinComponentFastRegisterWeAppSearchResult) ErrcodeInfo() string {
switch resp.Result.Errcode {
case 89249:
return "该 appid 已有转正任务执行中,距上次任务 24h 后再试"
case 89247:
return "系统内部错误"
case 86004:
return "无效微信号"
case 61070:
return "法人姓名与微信号不一致"
case 89248:
return "企业代码类型无效,请选择正确类型填写"
case 89250:
return "未找到该任务"
case 89251:
return "模板消息已下发,待法人人脸核身校验"
case 89252:
return "法人&企业信息一致性校验中"
case 89253:
return "缺少参数"
case 89254:
return "第三方权限集不全,请补充权限集后重试"
case 89255:
return "code参数无效请检查 code 长度以及内容是否正确注意code_type的值不同需要传的 code 长度不一样"
}
return "系统繁忙"
}
// StatusInfo 状态描述
func (resp *CgiBinComponentFastRegisterWeAppSearchResult) StatusInfo(status int) string {
switch status {
case 100001:
return "已下发的模板消息法人并未确认且已超时24h未进行身份证校验"
case 100002:
return "已下发的模板消息法人并未确认且已超时24h未进行人脸识别校验"
case 100003:
return "已下发的模板消息法人并未确认且已超时24h"
case 101:
return "工商数据返回:“企业已注销”"
case 102:
return "工商数据返回:“企业不存在或企业信息未更新”"
case 103:
return "工商数据返回:“企业法定代表人姓名不一致”"
case 104:
return "工商数据返回:“企业法定代表人身份证号码不一致”"
case 105:
return "法定代表人身份证号码,工商数据未更新,请 5-15 个工作日之后尝试"
case 1000:
return "工商数据返回:“企业信息或法定代表人信息不一致”"
case 1001:
return "主体创建小程序数量达到上限"
case 1002:
return "主体违规命中黑名单"
case 1003:
return "管理员绑定账号数量达到上限"
case 1004:
return "管理员违规命中黑名单"
case 1005:
return "管理员手机绑定账号数量达到上限"
case 1006:
return "管理员手机号违规命中黑名单"
case 1007:
return "管理员身份证创建账号数量达到上限"
case 1008:
return "管理员身份证违规命中黑名单"
case -1:
return "企业与法人姓名不一致"
}
return fmt.Sprintf("%v", status)
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -48,24 +49,38 @@ type CgiBinComponentGetPrivacySettingResult struct {
Result CgiBinComponentGetPrivacySettingResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewCgiBinComponentGetPrivacySettingResult(result CgiBinComponentGetPrivacySettingResponse, body []byte, http gorequest.Response, err error) *CgiBinComponentGetPrivacySettingResult {
return &CgiBinComponentGetPrivacySettingResult{Result: result, Body: body, Http: http, Err: err}
func newCgiBinComponentGetPrivacySettingResult(result CgiBinComponentGetPrivacySettingResponse, body []byte, http gorequest.Response) *CgiBinComponentGetPrivacySettingResult {
return &CgiBinComponentGetPrivacySettingResult{Result: result, Body: body, Http: http}
}
// CgiBinComponentGetPrivacySetting 查询小程序用户隐私保护指引
// @privacyVer 1表示现网版本传1则该接口返回的内容是现网版本的2表示开发版传2则该接口返回的内容是开发版本的。默认是2。
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/privacy_config/get_privacy_setting.html
func (app *App) CgiBinComponentGetPrivacySetting(privacyVer int) *CgiBinComponentGetPrivacySettingResult {
func (c *Client) CgiBinComponentGetPrivacySetting(ctx context.Context, privacyVer int) (*CgiBinComponentGetPrivacySettingResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := NewParams()
params := gorequest.NewParams()
params["privacy_ver"] = privacyVer
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/component/getprivacysetting?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/component/getprivacysetting?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinComponentGetPrivacySettingResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewCgiBinComponentGetPrivacySettingResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newCgiBinComponentGetPrivacySettingResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -16,24 +17,38 @@ type CgiBinComponentSetPrivacySettingResult struct {
Result CgiBinComponentSetPrivacySettingResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewCgiBinComponentSetPrivacySettingResult(result CgiBinComponentSetPrivacySettingResponse, body []byte, http gorequest.Response, err error) *CgiBinComponentSetPrivacySettingResult {
return &CgiBinComponentSetPrivacySettingResult{Result: result, Body: body, Http: http, Err: err}
func newCgiBinComponentSetPrivacySettingResult(result CgiBinComponentSetPrivacySettingResponse, body []byte, http gorequest.Response) *CgiBinComponentSetPrivacySettingResult {
return &CgiBinComponentSetPrivacySettingResult{Result: result, Body: body, Http: http}
}
// CgiBinComponentSetPrivacySetting 配置小程序用户隐私保护指引
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/privacy_config/set_privacy_setting.html
func (app *App) CgiBinComponentSetPrivacySetting(notMustParams ...Params) *CgiBinComponentSetPrivacySettingResult {
func (c *Client) CgiBinComponentSetPrivacySetting(ctx context.Context, notMustParams ...gorequest.Params) (*CgiBinComponentSetPrivacySettingResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := app.NewParamsWith(notMustParams...)
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/component/setprivacysetting?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/component/setprivacysetting?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinComponentSetPrivacySettingResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewCgiBinComponentSetPrivacySettingResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newCgiBinComponentSetPrivacySettingResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -15,20 +16,27 @@ type GetCallBackIpResult struct {
Result GetCallBackIpResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewGetCallBackIpResult(result GetCallBackIpResponse, body []byte, http gorequest.Response, err error) *GetCallBackIpResult {
return &GetCallBackIpResult{Result: result, Body: body, Http: http, Err: err}
func NewGetCallBackIpResult(result GetCallBackIpResponse, body []byte, http gorequest.Response) *GetCallBackIpResult {
return &GetCallBackIpResult{Result: result, Body: body, Http: http}
}
// CgiBinGetApiDomainIp 获取微信服务器IP地址
// https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html
func (app *App) CgiBinGetApiDomainIp(componentAccessToken string) *GetCallBackIpResult {
func (c *Client) CgiBinGetApiDomainIp(ctx context.Context, componentAccessToken string) (*GetCallBackIpResult, error) {
// 参数
params := gorequest.NewParams()
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/get_api_domain_ip?access_token=%s", componentAccessToken), map[string]interface{}{}, http.MethodGet)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/get_api_domain_ip?access_token=%s", componentAccessToken), params, http.MethodGet)
if err != nil {
return nil, err
}
// 定义
var response GetCallBackIpResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewGetCallBackIpResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return NewGetCallBackIpResult(response, request.ResponseBody, request), nil
}

@ -0,0 +1,70 @@
package wechatopen
import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
"go.dtapp.net/gorequest"
"go.dtapp.net/gostorage"
"net/http"
)
type CgiBinMaterialGetMaterialResponse struct {
Errcode int `json:"errcode"`
Errmsg string `json:"errmsg"`
}
type CgiBinMaterialGetMaterialResult struct {
Result CgiBinMaterialGetMaterialResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
}
func newCgiBinMaterialGetMaterialResult(result CgiBinMaterialGetMaterialResponse, body []byte, http gorequest.Response) *CgiBinMaterialGetMaterialResult {
return &CgiBinMaterialGetMaterialResult{Result: result, Body: body, Http: http}
}
// CgiBinMaterialGetMaterial 获取永久素材
// https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Getting_Permanent_Assets.html
func (c *Client) CgiBinMaterialGetMaterial(ctx context.Context, mediaId string) (*CgiBinMaterialGetMaterialResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParams()
params["media_id"] = mediaId // 要获取的素材的media_id
// 请求
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/material/get_material?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinMaterialGetMaterialResponse
// 判断内容是否为图片
err = json.Unmarshal(request.ResponseBody, &response)
if err != nil {
// 可能是图片
return newCgiBinMaterialGetMaterialResult(CgiBinMaterialGetMaterialResponse{}, request.ResponseBody, request), nil
}
return newCgiBinMaterialGetMaterialResult(response, request.ResponseBody, request), err
}
func (cr *CgiBinMaterialGetMaterialResult) SaveImg(db *gostorage.AliYun, fileName, filePath string) error {
if cr.Result.Errcode != 0 {
return errors.New(cr.Result.Errmsg)
}
// 上传
_, err := db.PutObject(bytes.NewReader(cr.Body), filePath, fileName)
if err != nil {
return err
}
return nil
}

@ -0,0 +1,48 @@
package wechatopen
import (
"context"
"encoding/json"
"go.dtapp.net/gorequest"
"net/http"
)
type CgiBinOpenSameEnTityResponse struct {
Errcode int `json:"errcode"`
Errmsg string `json:"errmsg"`
SameEntity bool `json:"same_entity"` // 是否同主体true表示同主体false表示不同主体
}
type CgiBinOpenSameEnTityResult struct {
Result CgiBinOpenSameEnTityResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
}
func newCgiBinOpenSameEnTityResult(result CgiBinOpenSameEnTityResponse, body []byte, http gorequest.Response) *CgiBinOpenSameEnTityResult {
return &CgiBinOpenSameEnTityResult{Result: result, Body: body, Http: http}
}
// CgiBinOpenSameEnTity 获取授权绑定的商户号列表
// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/cloudbase-common/wechatpay/getWechatPayList.html
func (c *Client) CgiBinOpenSameEnTity(ctx context.Context) (*CgiBinOpenSameEnTityResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParams()
// 请求
request, err := c.request(ctx, apiUrl+"/cgi-bin/open/sameentity?access_token="+c.GetComponentAccessToken(ctx), params, http.MethodGet)
if err != nil {
return nil, err
}
// 定义
var response CgiBinOpenSameEnTityResponse
err = json.Unmarshal(request.ResponseBody, &response)
if err != nil {
return nil, err
}
return newCgiBinOpenSameEnTityResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -17,24 +18,35 @@ type CgiBinShortUrlResult struct {
Result CgiBinShortUrlResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewCgiBinShortUrlResult(result CgiBinShortUrlResponse, body []byte, http gorequest.Response, err error) *CgiBinShortUrlResult {
return &CgiBinShortUrlResult{Result: result, Body: body, Http: http, Err: err}
func newCgiBinShortUrlResult(result CgiBinShortUrlResponse, body []byte, http gorequest.Response) *CgiBinShortUrlResult {
return &CgiBinShortUrlResult{Result: result, Body: body, Http: http}
}
// CgiBinShortUrl 将二维码长链接转成短链接
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/qrcode/shorturl.html
func (app *App) CgiBinShortUrl(longUrl string) *CgiBinShortUrlResult {
func (c *Client) CgiBinShortUrl(ctx context.Context, longUrl string) (*CgiBinShortUrlResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := NewParams()
params := gorequest.NewParams()
params["action"] = "long2short" // 此处填long2short代表长链接转短链接
params["long_url"] = longUrl // 需要转换的长链接支持http://、https://、weixin://wxpay 格式的url
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/shorturl?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/shorturl?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
// 定义
var response CgiBinShortUrlResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewCgiBinShortUrlResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newCgiBinShortUrlResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -16,24 +17,38 @@ type CgiBinWxOpenQrCodeJumpAddResult struct {
Result CgiBinWxOpenQrCodeJumpAddResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewCgiBinWxOpenQrCodeJumpAddResult(result CgiBinWxOpenQrCodeJumpAddResponse, body []byte, http gorequest.Response, err error) *CgiBinWxOpenQrCodeJumpAddResult {
return &CgiBinWxOpenQrCodeJumpAddResult{Result: result, Body: body, Http: http, Err: err}
func newCgiBinWxOpenQrCodeJumpAddResult(result CgiBinWxOpenQrCodeJumpAddResponse, body []byte, http gorequest.Response) *CgiBinWxOpenQrCodeJumpAddResult {
return &CgiBinWxOpenQrCodeJumpAddResult{Result: result, Body: body, Http: http}
}
// CgiBinWxOpenQrCodeJumpAdd 增加或修改二维码规则
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/qrcode/qrcodejumpadd.html
func (app *App) CgiBinWxOpenQrCodeJumpAdd(notMustParams ...Params) *CgiBinWxOpenQrCodeJumpAddResult {
func (c *Client) CgiBinWxOpenQrCodeJumpAdd(ctx context.Context, notMustParams ...gorequest.Params) (*CgiBinWxOpenQrCodeJumpAddResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := app.NewParamsWith(notMustParams...)
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpadd?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/wxopen/qrcodejumpadd?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinWxOpenQrCodeJumpAddResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewCgiBinWxOpenQrCodeJumpAddResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newCgiBinWxOpenQrCodeJumpAddResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -16,23 +17,37 @@ type CgiBinWxOpenQrCodeJumpDeleteResult struct {
Result CgiBinWxOpenQrCodeJumpDeleteResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewCgiBinWxOpenQrCodeJumpDeleteResult(result CgiBinWxOpenQrCodeJumpDeleteResponse, body []byte, http gorequest.Response, err error) *CgiBinWxOpenQrCodeJumpDeleteResult {
return &CgiBinWxOpenQrCodeJumpDeleteResult{Result: result, Body: body, Http: http, Err: err}
func newCgiBinWxOpenQrCodeJumpDeleteResult(result CgiBinWxOpenQrCodeJumpDeleteResponse, body []byte, http gorequest.Response) *CgiBinWxOpenQrCodeJumpDeleteResult {
return &CgiBinWxOpenQrCodeJumpDeleteResult{Result: result, Body: body, Http: http}
}
// CgiBinWxOpenQrCodeJumpDelete 删除已设置的二维码规则
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/qrcode/qrcodejumpdelete.html
func (app *App) CgiBinWxOpenQrCodeJumpDelete(prefix string) *CgiBinWxOpenQrCodeJumpDeleteResult {
func (c *Client) CgiBinWxOpenQrCodeJumpDelete(ctx context.Context, prefix string) (*CgiBinWxOpenQrCodeJumpDeleteResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := NewParams()
params := gorequest.NewParams()
params["prefix"] = prefix
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpdelete?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/wxopen/qrcodejumpdelete?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinWxOpenQrCodeJumpDeleteResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewCgiBinWxOpenQrCodeJumpDeleteResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newCgiBinWxOpenQrCodeJumpDeleteResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -18,22 +19,36 @@ type CgiBinWxOpenQrCodeJumpDownloadResult struct {
Result CgiBinWxOpenQrCodeJumpDownloadResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewCgiBinWxOpenQrCodeJumpDownloadResult(result CgiBinWxOpenQrCodeJumpDownloadResponse, body []byte, http gorequest.Response, err error) *CgiBinWxOpenQrCodeJumpDownloadResult {
return &CgiBinWxOpenQrCodeJumpDownloadResult{Result: result, Body: body, Http: http, Err: err}
func newCgiBinWxOpenQrCodeJumpDownloadResult(result CgiBinWxOpenQrCodeJumpDownloadResponse, body []byte, http gorequest.Response) *CgiBinWxOpenQrCodeJumpDownloadResult {
return &CgiBinWxOpenQrCodeJumpDownloadResult{Result: result, Body: body, Http: http}
}
// CgiBinWxOpenQrCodeJumpDownload 获取校验文件名称及内容
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/qrcode/qrcodejumpdownload.html
func (app *App) CgiBinWxOpenQrCodeJumpDownload() *CgiBinWxOpenQrCodeJumpDownloadResult {
func (c *Client) CgiBinWxOpenQrCodeJumpDownload(ctx context.Context) (*CgiBinWxOpenQrCodeJumpDownloadResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := NewParams()
params := gorequest.NewParams()
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpdownload?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/wxopen/qrcodejumpdownload?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinWxOpenQrCodeJumpDownloadResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewCgiBinWxOpenQrCodeJumpDownloadResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newCgiBinWxOpenQrCodeJumpDownloadResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -27,22 +28,36 @@ type CgiBinWxOpenQrCodeJumpGetResult struct {
Result CgiBinWxOpenQrCodeJumpGetResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewCgiBinWxOpenQrCodeJumpGetResult(result CgiBinWxOpenQrCodeJumpGetResponse, body []byte, http gorequest.Response, err error) *CgiBinWxOpenQrCodeJumpGetResult {
return &CgiBinWxOpenQrCodeJumpGetResult{Result: result, Body: body, Http: http, Err: err}
func newCgiBinWxOpenQrCodeJumpGetResult(result CgiBinWxOpenQrCodeJumpGetResponse, body []byte, http gorequest.Response) *CgiBinWxOpenQrCodeJumpGetResult {
return &CgiBinWxOpenQrCodeJumpGetResult{Result: result, Body: body, Http: http}
}
// CgiBinWxOpenQrCodeJumpGet 获取已设置的二维码规则
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/qrcode/qrcodejumpadd.html
func (app *App) CgiBinWxOpenQrCodeJumpGet() *CgiBinWxOpenQrCodeJumpGetResult {
func (c *Client) CgiBinWxOpenQrCodeJumpGet(ctx context.Context) (*CgiBinWxOpenQrCodeJumpGetResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := NewParams()
params := gorequest.NewParams()
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpget?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/wxopen/qrcodejumpget?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinWxOpenQrCodeJumpGetResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewCgiBinWxOpenQrCodeJumpGetResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newCgiBinWxOpenQrCodeJumpGetResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -16,25 +17,39 @@ type CgiBinWxOpenQrCodeJumpPublishResult struct {
Result CgiBinWxOpenQrCodeJumpPublishResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewCgiBinWxOpenQrCodeJumpPublishResult(result CgiBinWxOpenQrCodeJumpPublishResponse, body []byte, http gorequest.Response, err error) *CgiBinWxOpenQrCodeJumpPublishResult {
return &CgiBinWxOpenQrCodeJumpPublishResult{Result: result, Body: body, Http: http, Err: err}
func newCgiBinWxOpenQrCodeJumpPublishResult(result CgiBinWxOpenQrCodeJumpPublishResponse, body []byte, http gorequest.Response) *CgiBinWxOpenQrCodeJumpPublishResult {
return &CgiBinWxOpenQrCodeJumpPublishResult{Result: result, Body: body, Http: http}
}
// CgiBinWxOpenQrCodeJumpPublish 发布已设置的二维码规则
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/qrcode/qrcodejumppublish.html
func (app *App) CgiBinWxOpenQrCodeJumpPublish(prefix string) *CgiBinWxOpenQrCodeJumpPublishResult {
func (c *Client) CgiBinWxOpenQrCodeJumpPublish(ctx context.Context, prefix string) (*CgiBinWxOpenQrCodeJumpPublishResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := NewParams()
params := gorequest.NewParams()
params["prefix"] = prefix
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumppublish?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/wxopen/qrcodejumppublish?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response CgiBinWxOpenQrCodeJumpPublishResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewCgiBinWxOpenQrCodeJumpPublishResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newCgiBinWxOpenQrCodeJumpPublishResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -0,0 +1,21 @@
package wechatopen
func (c *Client) checkComponentIsConfig() error {
componentAppId := c.GetComponentAppId()
if componentAppId == "" {
return componentAppIdNoConfig
}
componentAppSecret := c.GetComponentAppSecret()
if componentAppSecret == "" {
return componentAppSecretNoConfig
}
return nil
}
func (c *Client) checkAuthorizerIsConfig() error {
authorizerAppid := c.GetAuthorizerAppid()
if authorizerAppid == "" {
return authorizerAppidNoConfig
}
return nil
}

@ -0,0 +1,75 @@
package wechatopen
import (
"go.dtapp.net/dorm"
"go.dtapp.net/golog"
"go.dtapp.net/gorequest"
)
// 缓存前缀
// wechat_open:component_verify_ticket:
// wechat_open:component_access_token:
// wechat_open:authorizer_access_token:
// wechat_open:pre_auth_code:
type redisCachePrefixFun func() (componentVerifyTicket, componentAccessToken, authorizerAccessToken, preAuthCode string)
// ClientConfig 实例配置
type ClientConfig struct {
AuthorizerAppid string // 授权方 appid
ComponentAppId string // 第三方平台 appid
ComponentAppSecret string // 第三方平台 app_secret
MessageToken string
MessageKey string
RedisClient *dorm.RedisClient // 缓存数据库
RedisCachePrefixFun redisCachePrefixFun // 缓存前缀
}
// Client 实例
type Client struct {
requestClient *gorequest.App // 请求服务
config struct {
componentAccessToken string // 第三方平台 access_token
componentVerifyTicket string // 微信后台推送的 ticket
preAuthCode string // 预授权码
authorizerAccessToken string // 接口调用令牌
authorizerRefreshToken string // 刷新令牌
authorizerAppid string // 授权方 appid
componentAppId string // 第三方平台appid
componentAppSecret string // 第三方平台app_secret
messageToken string
messageKey string
}
cache struct {
redisClient *dorm.RedisClient // 缓存数据库
componentVerifyTicketPrefix string
componentAccessTokenPrefix string
authorizerAccessTokenPrefix string
preAuthCodePrefix string
}
log struct {
status bool // 状态
client *golog.ApiClient // 日志服务
}
}
// NewClient 创建实例化
func NewClient(config *ClientConfig) (*Client, error) {
c := &Client{}
c.config.componentAppId = config.ComponentAppId
c.config.componentAppSecret = config.ComponentAppSecret
c.config.messageToken = config.MessageToken
c.config.messageKey = config.MessageKey
c.requestClient = gorequest.NewHttp()
c.cache.redisClient = config.RedisClient
c.cache.componentVerifyTicketPrefix, c.cache.componentAccessTokenPrefix, c.cache.authorizerAccessTokenPrefix, c.cache.preAuthCodePrefix = config.RedisCachePrefixFun()
if c.cache.componentVerifyTicketPrefix == "" || c.cache.componentAccessTokenPrefix == "" || c.cache.authorizerAccessTokenPrefix == "" || c.cache.preAuthCodePrefix == "" {
return nil, redisCachePrefixNoConfig
}
return c, nil
}

@ -0,0 +1,25 @@
package wechatopen
import "go.dtapp.net/golog"
// ConfigComponent 配置
func (c *Client) ConfigComponent(componentAppId, componentAppSecret string) *Client {
c.config.componentAppId = componentAppId
c.config.componentAppSecret = componentAppSecret
return c
}
// ConfigAuthorizer 配置第三方
func (c *Client) ConfigAuthorizer(authorizerAppid string) *Client {
c.config.authorizerAppid = authorizerAppid
return c
}
// ConfigApiClientFun 日志配置
func (c *Client) ConfigApiClientFun(apiClientFun golog.ApiClientFun) {
apiClient := apiClientFun()
if apiClient != nil {
c.log.client = apiClient
c.log.status = true
}
}

@ -0,0 +1,10 @@
package wechatopen
const (
apiUrl = "https://api.weixin.qq.com"
)
const (
LogTable = "wechatopen"
Version = "1.0.44"
)

@ -0,0 +1,16 @@
package wechatopen
import "errors"
var (
redisCachePrefixNoConfig = errors.New("请配置 RedisCachePrefix")
)
var (
componentAppIdNoConfig = errors.New("请配置 ComponentAppId")
componentAppSecretNoConfig = errors.New("请配置 ComponentAppSecret")
)
var (
authorizerAppidNoConfig = errors.New("请配置 AuthorizerAppid 或 ConfigAuthorizer")
)

@ -1,5 +1,47 @@
package wechatopen
func (app *App) GetComponentAppId() string {
return app.componentAppId
import "go.dtapp.net/golog"
//func (c *Client) GetComponentAccessToken() string {
// return c.config.componentAccessToken
//}
//func (c *Client) GetComponentVerifyTicket() string {
// return c.config.componentVerifyTicket
//}
//func (c *Client) GetPreAuthCode() string {
// return c.config.preAuthCode
//}
//func (c *Client) GetAuthorizerAccessToken() string {
// return c.config.authorizerAccessToken
//}
func (c *Client) GetAuthorizerRefreshToken() string {
return c.config.authorizerRefreshToken
}
func (c *Client) GetAuthorizerAppid() string {
return c.config.authorizerAppid
}
func (c *Client) GetComponentAppId() string {
return c.config.componentAppId
}
func (c *Client) GetComponentAppSecret() string {
return c.config.componentAppSecret
}
func (c *Client) GetMessageToken() string {
return c.config.messageToken
}
func (c *Client) GetMessageKey() string {
return c.config.messageKey
}
func (c *Client) GetLog() *golog.ApiClient {
return c.log.client
}

134
go.mod

@ -1,35 +1,129 @@
module go.dtapp.net/wechatopen
go 1.18
go 1.19
require (
github.com/gin-gonic/gin v1.8.1
github.com/mitchellh/mapstructure v1.5.0
go.dtapp.net/gojson v1.0.0
go.dtapp.net/golog v1.0.13
go.dtapp.net/goredis v1.0.1
go.dtapp.net/gorequest v1.0.19
gorm.io/datatypes v1.0.6
gorm.io/gorm v1.23.6
go.dtapp.net/dorm v1.0.54
go.dtapp.net/golog v1.0.102
go.dtapp.net/gorequest v1.0.38
go.dtapp.net/gostorage v1.0.13
)
require (
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/aliyun/aliyun-oss-go-sdk v2.2.6+incompatible // indirect
github.com/aws/aws-sdk-go v1.44.153 // indirect
github.com/aws/aws-sdk-go-v2 v1.17.2 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 // indirect
github.com/aws/aws-sdk-go-v2/config v1.18.4 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.13.4 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.20 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.26 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.20 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.27 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.17 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.21 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.20 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.20 // indirect
github.com/aws/aws-sdk-go-v2/service/s3 v1.29.5 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.11.26 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.9 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.17.6 // indirect
github.com/aws/smithy-go v1.13.5 // indirect
github.com/baidubce/bce-sdk-go v0.9.138 // indirect
github.com/basgys/goxml2json v1.1.0 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/clbanning/mxj v1.8.4 // indirect
github.com/deckarep/golang-set v1.8.0 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/go-redis/redis/v8 v8.11.5 // indirect
github.com/go-sql-driver/mysql v1.6.0 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-playground/locales v0.14.0 // indirect
github.com/go-playground/universal-translator v0.18.0 // indirect
github.com/go-playground/validator/v10 v10.11.1 // indirect
github.com/go-redis/redis/v9 v9.0.0-rc.2 // indirect
github.com/go-sql-driver/mysql v1.7.0 // indirect
github.com/goccy/go-json v0.10.0 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/huaweicloud/huaweicloud-sdk-go-obs v3.22.11+incompatible // indirect
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
github.com/jackc/pgconn v1.13.0 // indirect
github.com/jackc/pgio v1.0.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgproto3/v2 v2.3.1 // indirect
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect
github.com/jackc/pgtype v1.13.0 // indirect
github.com/jackc/pgx/v4 v4.17.2 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.15.12 // indirect
github.com/ks3sdklib/aws-sdk-go v1.1.8 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/lib/pq v1.10.7 // indirect
github.com/mattn/go-isatty v0.0.16 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/montanaflynn/stats v0.6.6 // indirect
github.com/mozillazg/go-httpheader v0.3.1 // indirect
github.com/natefinch/lumberjack v2.0.0+incompatible // indirect
github.com/oschwald/geoip2-golang v1.8.0 // indirect
github.com/oschwald/maxminddb-golang v1.10.0 // indirect
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/qiniu/go-sdk/v7 v7.14.0 // indirect
github.com/saracen/go7z v0.0.0-20191010121135-9c09b6bd7fda // indirect
github.com/saracen/solidblock v0.0.0-20190426153529-45df20abab6f // indirect
github.com/segmentio/fasthash v1.0.3 // indirect
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
github.com/sirupsen/logrus v1.9.0 // indirect
github.com/syndtr/goleveldb v1.0.0 // indirect
github.com/tencentyun/cos-go-sdk-v5 v0.7.40 // indirect
github.com/tklauser/go-sysconf v0.3.11 // indirect
github.com/tklauser/numcpus v0.6.0 // indirect
github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect
github.com/ugorji/go/codec v1.2.7 // indirect
github.com/ulikunitz/xz v0.5.10 // indirect
go.dtapp.net/goip v1.0.17 // indirect
go.dtapp.net/gostring v1.0.3 // indirect
go.dtapp.net/gotime v1.0.2 // indirect
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect
golang.org/x/net v0.0.0-20220607020251-c690dde0001d // indirect
golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/tools v0.1.5 // indirect
gorm.io/driver/mysql v1.3.4 // indirect
gorm.io/driver/postgres v1.3.7 // indirect
github.com/upper/db/v4 v4.6.0 // indirect
github.com/uptrace/bun v1.1.9 // indirect
github.com/uptrace/bun/dialect/mysqldialect v1.1.9 // indirect
github.com/uptrace/bun/dialect/pgdialect v1.1.9 // indirect
github.com/uptrace/bun/driver/pgdriver v1.1.9 // indirect
github.com/upyun/go-sdk/v3 v3.0.3 // indirect
github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.1.1 // indirect
github.com/xdg-go/stringprep v1.0.3 // indirect
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect
github.com/yusufpapurcu/wmi v1.2.2 // indirect
go.dtapp.net/goip v1.0.40 // indirect
go.dtapp.net/gorandom v1.0.1 // indirect
go.dtapp.net/gostring v1.0.10 // indirect
go.dtapp.net/gotime v1.0.5 // indirect
go.dtapp.net/gotrace_id v1.0.6 // indirect
go.dtapp.net/gourl v1.0.0 // indirect
go.mongodb.org/mongo-driver v1.11.0 // indirect
go.uber.org/atomic v1.10.0 // indirect
go.uber.org/multierr v1.8.0 // indirect
go.uber.org/zap v1.24.0 // indirect
golang.org/x/crypto v0.3.0 // indirect
golang.org/x/mod v0.7.0 // indirect
golang.org/x/net v0.3.0 // indirect
golang.org/x/sync v0.1.0 // indirect
golang.org/x/sys v0.3.0 // indirect
golang.org/x/text v0.5.0 // indirect
golang.org/x/time v0.3.0 // indirect
google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gorm.io/driver/mysql v1.4.4 // indirect
gorm.io/driver/postgres v1.4.5 // indirect
gorm.io/gorm v1.24.2 // indirect
mellium.im/sasl v0.3.0 // indirect
xorm.io/builder v0.3.12 // indirect
xorm.io/xorm v1.3.2 // indirect
)

870
go.sum

File diff suppressed because it is too large Load Diff

@ -1,27 +0,0 @@
package wechatopen
// Params 请求参数
type Params map[string]interface{}
func NewParams() Params {
p := make(Params)
return p
}
func (app *App) NewParamsWith(params ...Params) Params {
p := make(Params)
for _, v := range params {
p.SetParams(v)
}
return p
}
func (p Params) Set(key string, value interface{}) {
p[key] = value
}
func (p Params) SetParams(params Params) {
for key, value := range params {
p[key] = value
}
}

@ -1,26 +0,0 @@
package wechatopen
import (
"go.dtapp.net/gojson"
"go.dtapp.net/golog"
"go.dtapp.net/gorequest"
"gorm.io/datatypes"
)
// 记录日志
func (app *App) postgresqlLog(request gorequest.Response) {
app.log.Record(golog.ApiPostgresqlLog{
RequestTime: golog.TimeString{Time: request.RequestTime}, //【请求】时间
RequestUri: request.RequestUri, //【请求】链接
RequestUrl: gorequest.UriParse(request.RequestUri).Url, //【请求】链接
RequestApi: gorequest.UriParse(request.RequestUri).Path, //【请求】接口
RequestMethod: request.RequestMethod, //【请求】方式
RequestParams: datatypes.JSON(gojson.JsonEncodeNoError(request.RequestParams)), //【请求】参数
RequestHeader: datatypes.JSON(gojson.JsonEncodeNoError(request.RequestHeader)), //【返回】头部
ResponseHeader: datatypes.JSON(gojson.JsonEncodeNoError(request.ResponseHeader)), //【返回】头部
ResponseStatusCode: request.ResponseStatusCode, //【返回】状态码
ResponseBody: request.ResponseBody, //【返回】内容
ResponseContentLength: request.ResponseContentLength, //【返回】大小
ResponseTime: golog.TimeString{Time: request.ResponseTime}, //【返回】时间
})
}

@ -2,140 +2,145 @@ package wechatopen
import (
"context"
"fmt"
"time"
)
// 微信后台推送的ticke
func (app *App) getComponentVerifyTicketCacheKeyName() string {
return fmt.Sprintf("wechat_open:component_verify_ticket:%v", app.componentAppId)
func (c *Client) getComponentVerifyTicketCacheKeyName() string {
return c.cache.componentVerifyTicketPrefix + c.GetComponentAppId()
}
// SetComponentVerifyTicket 设置微信后台推送的ticke
func (app *App) SetComponentVerifyTicket(componentVerifyTicket string) string {
func (c *Client) SetComponentVerifyTicket(ctx context.Context, componentVerifyTicket string) string {
if componentVerifyTicket == "" {
return ""
}
app.redis.Db.Set(context.Background(), app.getComponentVerifyTicketCacheKeyName(), componentVerifyTicket, time.Hour*12)
return app.GetComponentVerifyTicket()
c.cache.redisClient.Set(ctx, c.getComponentVerifyTicketCacheKeyName(), componentVerifyTicket, time.Hour*12)
return c.GetComponentVerifyTicket(ctx)
}
// GetComponentVerifyTicket 获取微信后台推送的ticke
func (app *App) GetComponentVerifyTicket() string {
if app.redis.Db == nil {
return app.componentVerifyTicket
func (c *Client) GetComponentVerifyTicket(ctx context.Context) string {
if c.cache.redisClient.Db == nil {
return c.config.componentVerifyTicket
}
result, _ := app.redis.Db.Get(context.Background(), app.getComponentVerifyTicketCacheKeyName()).Result()
result, _ := c.cache.redisClient.Get(ctx, c.getComponentVerifyTicketCacheKeyName()).Result()
return result
}
// 令牌
func (app *App) getComponentAccessTokenCacheKeyName() string {
return fmt.Sprintf("wechat_open:component_access_token:%v", app.componentAppId)
func (c *Client) getComponentAccessTokenCacheKeyName() string {
return c.cache.componentAccessTokenPrefix + c.GetComponentAppId()
}
// SetComponentAccessToken 设置令牌
func (app *App) SetComponentAccessToken(componentAccessToken string) string {
func (c *Client) SetComponentAccessToken(ctx context.Context, componentAccessToken string) string {
if componentAccessToken == "" {
return ""
}
app.redis.Db.Set(context.Background(), app.getComponentAccessTokenCacheKeyName(), componentAccessToken, time.Second*7200)
return app.GetComponentAccessToken()
c.cache.redisClient.Set(ctx, c.getComponentAccessTokenCacheKeyName(), componentAccessToken, time.Second*7200)
return c.GetComponentAccessToken(ctx)
}
// GetComponentAccessToken 获取令牌
func (app *App) GetComponentAccessToken() string {
if app.redis.Db == nil {
return app.componentAccessToken
func (c *Client) GetComponentAccessToken(ctx context.Context) string {
if c.cache.redisClient.Db == nil {
return c.config.componentAccessToken
}
result, _ := app.redis.Db.Get(context.Background(), app.getComponentAccessTokenCacheKeyName()).Result()
result, _ := c.cache.redisClient.Db.Get(ctx, c.getComponentAccessTokenCacheKeyName()).Result()
return result
}
// MonitorComponentAccessToken 监控令牌
func (app *App) MonitorComponentAccessToken() string {
func (c *Client) MonitorComponentAccessToken(ctx context.Context) (string, error) {
// 查询
componentAccessToken := app.GetComponentAccessToken()
componentAccessToken := c.GetComponentAccessToken(ctx)
// 判断
result := app.CgiBinGetApiDomainIp(componentAccessToken)
result, err := c.CgiBinGetApiDomainIp(ctx, componentAccessToken)
if err != nil {
return "", err
}
if len(result.Result.IpList) > 0 {
return componentAccessToken
return componentAccessToken, err
}
// 重新获取
return app.SetComponentAccessToken(app.CgiBinComponentApiComponentToken().Result.ComponentAccessToken)
resp, err := c.CgiBinComponentApiComponentToken(ctx)
return c.SetComponentAccessToken(ctx, resp.Result.ComponentAccessToken), err
}
// 授权方令牌
func (app *App) getAuthorizerAccessTokenCacheKeyName() string {
return fmt.Sprintf("wechat_open:authorizer_access_token:%v:%v", app.componentAppId, app.authorizerAppid)
func (c *Client) getAuthorizerAccessTokenCacheKeyName() string {
return c.cache.authorizerAccessTokenPrefix + c.GetComponentAppId() + ":" + c.GetAuthorizerAppid()
}
// SetAuthorizerAccessToken 设置授权方令牌
func (app *App) SetAuthorizerAccessToken(authorizerAccessToken string) string {
func (c *Client) SetAuthorizerAccessToken(ctx context.Context, authorizerAccessToken string) string {
if authorizerAccessToken == "" {
return ""
}
app.redis.Db.Set(context.Background(), app.getAuthorizerAccessTokenCacheKeyName(), authorizerAccessToken, time.Hour*2)
return app.GetComponentAccessToken()
c.cache.redisClient.Set(ctx, c.getAuthorizerAccessTokenCacheKeyName(), authorizerAccessToken, time.Hour*2)
return c.GetComponentAccessToken(ctx)
}
// GetAuthorizerAccessToken 获取授权方令牌
func (app *App) GetAuthorizerAccessToken() string {
if app.redis.Db == nil {
return app.authorizerAccessToken
func (c *Client) GetAuthorizerAccessToken(ctx context.Context) string {
if c.cache.redisClient.Db == nil {
return c.config.authorizerAccessToken
}
result, _ := app.redis.Db.Get(context.Background(), app.getAuthorizerAccessTokenCacheKeyName()).Result()
result, _ := c.cache.redisClient.Get(ctx, c.getAuthorizerAccessTokenCacheKeyName()).Result()
return result
}
// MonitorAuthorizerAccessToken 监控授权方令牌
func (app *App) MonitorAuthorizerAccessToken(authorizerRefreshToken string) string {
func (c *Client) MonitorAuthorizerAccessToken(ctx context.Context, authorizerRefreshToken string) (string, error) {
// 查询
authorizerAccessToken := app.GetAuthorizerAccessToken()
authorizerAccessToken := c.GetAuthorizerAccessToken(ctx)
// 判断
if authorizerAccessToken != "" {
return authorizerAccessToken
return authorizerAccessToken, nil
}
// 重新获取
return app.SetAuthorizerAccessToken(app.CgiBinComponentApiAuthorizerToken(authorizerRefreshToken).Result.AuthorizerAccessToken)
resp, err := c.CgiBinComponentApiAuthorizerToken(ctx, authorizerRefreshToken)
return c.SetAuthorizerAccessToken(ctx, resp.Result.AuthorizerAccessToken), err
}
// 预授权码
func (app *App) getPreAuthCodeCacheKeyName() string {
return fmt.Sprintf("wechat_open:pre_auth_code:%v", app.componentAppId)
func (c *Client) getPreAuthCodeCacheKeyName() string {
return c.cache.preAuthCodePrefix + c.GetComponentAppId()
}
// SetPreAuthCode 设置预授权码
func (app *App) SetPreAuthCode(preAuthCode string) string {
func (c *Client) SetPreAuthCode(ctx context.Context, preAuthCode string) string {
if preAuthCode == "" {
return ""
}
app.redis.Db.Set(context.Background(), app.getPreAuthCodeCacheKeyName(), preAuthCode, time.Second*1700)
return app.GetComponentAccessToken()
c.cache.redisClient.Set(ctx, c.getPreAuthCodeCacheKeyName(), preAuthCode, time.Second*1700)
return c.GetComponentAccessToken(ctx)
}
// GetPreAuthCode 获取预授权码
func (app *App) GetPreAuthCode() string {
if app.redis.Db == nil {
return app.authorizerAccessToken
func (c *Client) GetPreAuthCode(ctx context.Context) string {
if c.cache.redisClient.Db == nil {
return c.config.authorizerAccessToken
}
result, _ := app.redis.Db.Get(context.Background(), app.getPreAuthCodeCacheKeyName()).Result()
result, _ := c.cache.redisClient.Get(ctx, c.getPreAuthCodeCacheKeyName()).Result()
return result
}
// DelPreAuthCode 删除预授权码
func (app *App) DelPreAuthCode() error {
return app.redis.Db.Del(context.Background(), app.getPreAuthCodeCacheKeyName()).Err()
func (c *Client) DelPreAuthCode(ctx context.Context) error {
return c.cache.redisClient.Del(ctx, c.getPreAuthCodeCacheKeyName()).Err()
}
// MonitorPreAuthCode 监控预授权码
func (app *App) MonitorPreAuthCode() string {
func (c *Client) MonitorPreAuthCode(ctx context.Context) (string, error) {
// 查询
preAuthCode := app.GetPreAuthCode()
preAuthCode := c.GetPreAuthCode(ctx)
// 判断
if preAuthCode != "" {
return preAuthCode
return preAuthCode, nil
}
// 重新获取
return app.SetPreAuthCode(app.CgiBinComponentApiCreatePreAuthCoden().Result.PreAuthCode)
resp, err := c.CgiBinComponentApiCreatePreAuthCoden(ctx)
return c.SetPreAuthCode(ctx, resp.Result.PreAuthCode), err
}

@ -0,0 +1,40 @@
package wechatopen
import (
"context"
"go.dtapp.net/gorequest"
)
func (c *Client) request(ctx context.Context, url string, params map[string]interface{}, method string) (resp gorequest.Response, err error) {
// 创建请求
client := c.requestClient
// 设置请求地址
client.SetUri(url)
// 设置方式
client.SetMethod(method)
// 设置格式
client.SetContentTypeJson()
// 设置用户代理
client.SetUserAgent(gorequest.GetRandomUserAgentSystem())
// 设置参数
client.SetParams(params)
// 发起请求
request, err := client.Request(ctx)
if err != nil {
return gorequest.Response{}, err
}
// 记录日志
if c.log.status {
go c.log.client.Middleware(ctx, request, Version)
}
return request, err
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"go.dtapp.net/gorequest"
"log"
"os"
@ -11,7 +12,7 @@ type SaveImgResponse struct {
Name string
}
func (app *App) SaveImg(resp gorequest.Response, dir, saveName string) SaveImgResponse {
func (c *Client) SaveImg(ctx context.Context, resp gorequest.Response, dir, saveName string) SaveImgResponse {
// 返回是二进制图片或者json错误
if resp.ResponseHeader.Get("Content-Type") == "image/jpeg" || resp.ResponseHeader.Get("Content-Type") == "image/png" {
// 保存在output目录

@ -1,13 +1,13 @@
package wechatopen
import (
"context"
"errors"
"net/http"
"strconv"
)
// ServeHttpAuthorizerAppid 授权跳转
func (app *App) ServeHttpAuthorizerAppid(r *http.Request) (resp CgiBinComponentApiQueryAuthResponse, agentUserId string, err error) {
func (c *Client) ServeHttpAuthorizerAppid(ctx context.Context, r *http.Request) (resp CgiBinComponentApiQueryAuthResponse, agentUserId string, err error) {
var (
query = r.URL.Query()
@ -25,34 +25,13 @@ func (app *App) ServeHttpAuthorizerAppid(r *http.Request) (resp CgiBinComponentA
return resp, agentUserId, errors.New("找不到过期时间参数")
}
info := app.CgiBinComponentApiQueryAuth(authCode)
info, err := c.CgiBinComponentApiQueryAuth(ctx, authCode)
if err != nil {
return resp, agentUserId, err
}
if info.Result.AuthorizationInfo.AuthorizerAppid == "" {
return resp, agentUserId, errors.New("获取失败")
}
return info.Result, agentUserId, nil
}
// ToFloat64 string到float64
func ToFloat64(s string) float64 {
i, _ := strconv.ParseFloat(s, 64)
return i
}
// ToInt64 string到int64
func ToInt64(s string) int64 {
i, err := strconv.ParseInt(s, 10, 64)
if err == nil {
return i
}
return int64(ToFloat64(s))
}
// ToUint string到uint64
func ToUint(s string) uint {
i, err := strconv.ParseUint(s, 10, 64)
if err == nil {
return uint(i)
}
return 0
}

@ -0,0 +1,41 @@
package wechatopen
import (
"context"
"github.com/gin-gonic/gin"
)
// ResponseServeHttpGin 推送信息
type ResponseServeHttpGin struct {
MsgSignature string // 签名串,对应 URL 参数的msg_signature
Timestamp string // 时间戳,对应 URL 参数的timestamp
Nonce string // 随机串,对应 URL 参数的nonce
Signature string
EncryptType string // 加密类型
AppId string // 第三方平台 appid
Encrypt string // 加密内容
}
// ServeHttpGin 验证票据推送
func (c *Client) ServeHttpGin(ctx context.Context, ginCtx *gin.Context) (ResponseServeHttpGin, error) {
query := ginCtx.Request.URL.Query()
// 声明接收的变量
var validateJson struct {
AppId string `form:"AppId" json:"AppId" xml:"AppId" uri:"AppId" binding:"omitempty"` // 第三方平台 appid
Encrypt string `form:"Encrypt" json:"Encrypt" xml:"Encrypt" uri:"Encrypt" binding:"omitempty"` // 加密内容
}
err := ginCtx.ShouldBind(&validateJson)
return ResponseServeHttpGin{
MsgSignature: query.Get("msg_signature"),
Timestamp: query.Get("timestamp"),
Nonce: query.Get("nonce"),
Signature: query.Get("signature"),
EncryptType: query.Get("encrypt_type"),
AppId: validateJson.AppId,
Encrypt: validateJson.Encrypt,
}, err
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/base64"
"encoding/xml"
"errors"
@ -26,7 +27,7 @@ type cipherRequestHttpBody struct {
}
// ServeHttpVerifyTicket 验证票据推送
func (app *App) ServeHttpVerifyTicket(r *http.Request) (resp *ResponseServeHttpVerifyTicket, err error) {
func (c *Client) ServeHttpVerifyTicket(ctx context.Context, r *http.Request) (resp *ResponseServeHttpVerifyTicket, err error) {
var (
query = r.URL.Query()
@ -57,7 +58,7 @@ func (app *App) ServeHttpVerifyTicket(r *http.Request) (resp *ResponseServeHttpV
return resp, errors.New("未找到随机数参数")
}
wantSignature = Sign(app.messageToken, timestamp, nonce)
wantSignature = Sign(c.GetMessageToken(), timestamp, nonce)
if haveSignature != wantSignature {
return resp, errors.New("签名错误")
}
@ -96,7 +97,7 @@ func (app *App) ServeHttpVerifyTicket(r *http.Request) (resp *ResponseServeHttpV
return resp, errors.New(fmt.Sprintf("Encrypt 解码字符串错误:%v", err))
}
AesKey, err := base64.StdEncoding.DecodeString(app.messageKey + "=")
AesKey, err := base64.StdEncoding.DecodeString(c.GetMessageKey() + "=")
if err != nil {
return resp, errors.New(fmt.Sprintf("messageKey 解码字符串错误:%v", err))
}

@ -1,7 +0,0 @@
package wechatopen
// SetAuthorizerAppid 设置代理商小程序
func (app *App) SetAuthorizerAppid(authorizerAppid string) {
app.authorizerAppid = authorizerAppid
return
}

@ -0,0 +1,82 @@
package wechatopen
import (
"context"
"encoding/base64"
"encoding/xml"
"errors"
"fmt"
"strings"
)
// SignDecrypt 解密
// ctx 上下文
// params 入参
// strXml 反射结构体
// resp 加密数据
// err 错误信息
func (c *Client) SignDecrypt(ctx context.Context, params SignDecryptParams, strXml interface{}) (resp []byte, err error) {
if params.Signature == "" {
return nil, errors.New("找不到签名参数")
}
if params.Timestamp == "" {
return nil, errors.New("找不到时间戳参数")
}
if params.Nonce == "" {
return nil, errors.New("未找到随机数参数")
}
wantSignature := Sign(c.GetMessageToken(), params.Timestamp, params.Nonce)
if params.Signature != wantSignature {
return nil, errors.New("签名错误")
}
// 进入事件执行
if params.EncryptType != "aes" {
return nil, errors.New("未知的加密类型: " + params.EncryptType)
}
if params.Encrypt == "" {
return nil, errors.New("找不到签名参数")
}
cipherData, err := base64.StdEncoding.DecodeString(params.Encrypt)
if err != nil {
return nil, errors.New(fmt.Sprintf("Encrypt 解码字符串错误:%v", err))
}
AesKey, err := base64.StdEncoding.DecodeString(c.GetMessageKey() + "=")
if err != nil {
return nil, errors.New(fmt.Sprintf("messageKey 解码字符串错误:%v", err))
}
msg, err := AesDecrypt(cipherData, AesKey)
if err != nil {
return nil, errors.New(fmt.Sprintf("AES解密错误%v", err))
}
str := string(msg)
left := strings.Index(str, "<xml>")
if left <= 0 {
return nil, errors.New(fmt.Sprintf("匹配不到<xml>%v", left))
}
right := strings.Index(str, "</xml>")
if right <= 0 {
return nil, errors.New(fmt.Sprintf("匹配不到</xml>%v", right))
}
msgStr := str[left:right]
if len(msgStr) == 0 {
return nil, errors.New(fmt.Sprintf("提取错误:%v", msgStr))
}
strByte := []byte(msgStr + "</xml>")
err = xml.Unmarshal(strByte, strXml)
if err != nil {
return nil, errors.New(fmt.Sprintf("解析错误:%v", err))
}
return strByte, nil
}

@ -0,0 +1,12 @@
package wechatopen
// SignDecryptParams 入参
type SignDecryptParams struct {
Signature string // 签名串,对应 URL 参数的msg_signature
Timestamp string // 时间戳,对应 URL 参数的timestamp
Nonce string // 随机串,对应 URL 参数的nonce
EncryptType string // 加密类型
MsgSignature string
AppId string // 第三方平台 appid
Encrypt string // 加密内容
}

@ -0,0 +1,129 @@
package wechatopen
import "encoding/xml"
// SignDecryptComponentVerifyTicket 验证票据
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/Before_Develop/component_verify_ticket.html
type SignDecryptComponentVerifyTicket struct {
XMLName xml.Name
AppId string `xml:"appId,omitempty"` // 第三方平台 appid
CreateTime int64 `xml:"CreateTime,omitempty"` // 时间戳单位s
InfoType string `xml:"InfoType,omitempty"` // 固定为:"component_verify_ticket"
ComponentVerifyTicket string `xml:"ComponentVerifyTicket,omitempty"` // Ticket 内容
}
// SignDecryptAuthorizeEvent 授权变更通知推送
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/Before_Develop/authorize_event.html
type SignDecryptAuthorizeEvent struct {
XMLName xml.Name
AppId string `xml:"appId,omitempty"` // 第三方平台 appid
CreateTime int64 `xml:"CreateTime,omitempty"` // 时间戳单位s
InfoType string `xml:"InfoType,omitempty"` // 通知类型 unauthorized=取消授权 updateauthorized=更新授权 authorized=授权成功
AuthorizerAppid string `xml:"AuthorizerAppid,omitempty"` // 公众号或小程序的 appid
AuthorizationCode string `xml:"AuthorizationCode,omitempty"` // 授权码,可用于获取授权信息
AuthorizationCodeExpiredTime string `xml:"AuthorizationCodeExpiredTime,omitempty"` // 授权码过期时间 单位秒
PreAuthCode string `xml:"PreAuthCode,omitempty"` // 预授权码
}
// SignDecryptNotifyThirdFasteRegister 快速注册企业/个人小程序
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/Register_Mini_Programs/Fast_Registration_Interface_document.html
// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/register-management/fast-registration-ind/fastRegisterPersonalMp.html
type SignDecryptNotifyThirdFasteRegister struct {
XMLName xml.Name
AppId string `xml:"AppId,omitempty"` // 第三方平台 appid
CreateTime int64 `xml:"CreateTime,omitempty"` // 时间戳单位s
InfoType string `xml:"InfoType,omitempty"` // 类型
Appid string `xml:"appid,omitempty"` // 创建小程序appid
Status int64 `xml:"status,omitempty"` // 状态
AuthCode string `xml:"auth_code,omitempty"` // 第三方授权码
Msg string `xml:"msg,omitempty"` // 信息
Info struct {
Name string `xml:"name,omitempty"` // 企业名称
Code string `xml:"code,omitempty"` // 企业代码
CodeType string `xml:"code_type,omitempty"`
LegalPersonaWechat string `xml:"legal_persona_wechat,omitempty"` // (企业)法人微信号
LegalPersonaName string `xml:"legal_persona_name,omitempty"` // (企业)法人姓名
ComponentPhone string `xml:"component_phone,omitempty"` // (企业/个人)第三方联系电话
Wxuser string `xml:"wxuser"` // (个人)用户微信号
Idname string `xml:"idname"` // (个人)用户姓名
} `xml:"info,omitempty"`
}
// SignDecryptNotifyThirdFastRegisterBetaApp 注册试用小程序
// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/register-management/fast-regist-beta/registerBetaMiniprogram.html
type SignDecryptNotifyThirdFastRegisterBetaApp struct {
XMLName xml.Name
AppId string `xml:"AppId,omitempty"` // 第三方平台 appid
CreateTime int64 `xml:"CreateTime,omitempty"` // 时间戳单位s
InfoType string `xml:"InfoType,omitempty"` // 类型
Appid string `xml:"appid,omitempty"` // 创建小程序appid
Status int64 `xml:"status,omitempty"` // 状态
Msg string `xml:"msg,omitempty"` // 信息
Info struct {
UniqueId string `xml:"unique_id,omitempty"`
Name string `xml:"name,omitempty"` // 小程序名称
} `xml:"info,omitempty"`
}
// SignDecryptNotifyThirdFastVerifyBetaApp 试用小程序快速认证
// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/register-management/fast-regist-beta/verfifyBetaMiniprogram.html
type SignDecryptNotifyThirdFastVerifyBetaApp struct {
XMLName xml.Name
AppId string `xml:"AppId,omitempty"` // 第三方平台 appid
CreateTime int64 `xml:"CreateTime,omitempty"` // 时间戳单位s
InfoType string `xml:"InfoType,omitempty"` // 类型
Appid string `xml:"appid,omitempty"` // 创建小程序appid
Status int64 `xml:"status,omitempty"` // 状态
Msg string `xml:"msg,omitempty"` // 信息
Info struct {
Name string `xml:"name,omitempty"` // 企业名称
Code string `xml:"code,omitempty"` // 企业代码
CodeType string `xml:"code_type,omitempty"`
LegalPersonaWechat string `xml:"legal_persona_wechat,omitempty"` // 法人微信号
LegalPersonaName string `xml:"legal_persona_name,omitempty"` // 法人姓名
ComponentPhone string `xml:"component_phone,omitempty"` // 第三方联系电话
} `xml:"info,omitempty"`
}
// SignDecryptWxaNicknameAudit 名称审核结果事件推送
// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/basic-info-management/setNickName.html
type SignDecryptWxaNicknameAudit struct {
XMLName xml.Name
ToUserName string `xml:"ToUserName,omitempty"` // 小程序的原始 ID
FromUserName string `xml:"FromUserName,omitempty"` // 发送方帐号(一个 OpenID此时发送方是系统帐号
CreateTime int64 `xml:"CreateTime,omitempty"` // 消息创建时间 (整型),时间戳
MsgType string `xml:"MsgType,omitempty"` // 消息类型 event
Event string `xml:"Event,omitempty"` // 事件类型
Ret string `xml:"ret,omitempty"` // 审核结果 2失败3成功
Nickname string `xml:"nickname,omitempty"` // 需要更改的昵称
Reason string `xml:"reason,omitempty"` // 审核失败的驳回原因
}
// SignDecryptWeAppAudit 代码审核结果推送
// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/code-management/submitAudit.html
type SignDecryptWeAppAudit struct {
XMLName xml.Name
ToUserName string `xml:"ToUserName,omitempty"` // 小程序的原始 ID
FromUserName string `xml:"FromUserName,omitempty"` // 发送方帐号(一个 OpenID此时发送方是系统帐号
CreateTime int64 `xml:"CreateTime,omitempty"` // 消息创建时间 (整型),时间戳
MsgType string `xml:"MsgType,omitempty"` // 消息类型 event
Event string `xml:"Event,omitempty"` // 事件类型 weapp_audit_success=审核通过 weapp_audit_fail=审核不通过 weapp_audit_delay=审核延后
SuccTime int64 `xml:"SuccTime,omitempty"` // 审核成功时的时间戳
FailTime int64 `xml:"FailTime,omitempty"` // 审核不通过的时间戳
DelayTime int64 `xml:"DelayTime,omitempty"` // 审核延后时的时间戳
Reason string `xml:"reason,omitempty"` // 审核不通过的原因
ScreenShot string `xml:"ScreenShot,omitempty"` // 审核不通过的截图示例。用 | 分隔的 media_id 的列表,可通过获取永久素材接口拉取截图内容
}
// SignDecryptWxaSecurityApplySetOrderPathInfo 申请设置订单页 path 信息
// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/basic-info-management/applySetOrderPathInfo.html
type SignDecryptWxaSecurityApplySetOrderPathInfo struct {
XMLName xml.Name
List string `xml:"List,omitempty"` // 申请结果列表
Appid string `xml:"Appid,omitempty"` // 申请的appid
AuditId string `xml:"AuditId,omitempty"` // 审核单id
Status string `xml:"Status,omitempty"` // 订单页 path 状态
ApplyTime int64 `xml:"ApplyTime,omitempty"` // 申请时间
AuditTime int64 `xml:"AuditTime,omitempty"` // 审核时间
Reason string `xml:"Reason,omitempty"` // 审核原因
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
@ -21,29 +22,43 @@ type SnsComponentJsCode2sessionResult struct {
Result SnsComponentJsCode2sessionResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewSnsComponentJsCode2sessionResult(result SnsComponentJsCode2sessionResponse, body []byte, http gorequest.Response, err error) *SnsComponentJsCode2sessionResult {
return &SnsComponentJsCode2sessionResult{Result: result, Body: body, Http: http, Err: err}
func newSnsComponentJsCode2sessionResult(result SnsComponentJsCode2sessionResponse, body []byte, http gorequest.Response) *SnsComponentJsCode2sessionResult {
return &SnsComponentJsCode2sessionResult{Result: result, Body: body, Http: http}
}
// SnsComponentJsCode2session 小程序登录
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/others/WeChat_login.html
func (app *App) SnsComponentJsCode2session(jsCode string) *SnsComponentJsCode2sessionResult {
func (c *Client) SnsComponentJsCode2session(ctx context.Context, jsCode string) (*SnsComponentJsCode2sessionResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := NewParams()
params["appid"] = app.authorizerAppid // 小程序的 appId
params["js_code"] = jsCode // wx.login 获取的 code
params["grant_type"] = "authorization_code" // 填 authorization_code
params["component_appid"] = app.componentAppId // 第三方平台 appid
params["component_access_token"] = app.GetComponentAccessToken() // 第三方平台的component_access_token
params := gorequest.NewParams()
params["appid"] = c.GetAuthorizerAppid() // 小程序的 appId
params["js_code"] = jsCode // wx.login 获取的 code
params["grant_type"] = "authorization_code" // 填 authorization_code
params["component_appid"] = c.GetComponentAppId() // 第三方平台 appid
params["component_access_token"] = c.GetComponentAccessToken(ctx) // 第三方平台的component_access_token
// 请求
request, err := app.request("https://api.weixin.qq.com/sns/component/jscode2session", params, http.MethodGet)
request, err := c.request(ctx, apiUrl+"/sns/component/jscode2session", params, http.MethodGet)
if err != nil {
return nil, err
}
// 定义
var response SnsComponentJsCode2sessionResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewSnsComponentJsCode2sessionResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newSnsComponentJsCode2sessionResult(response, request.ResponseBody, request), nil
}
type UserInfo struct {
@ -71,8 +86,8 @@ type UserInfoResult struct {
Err error // 错误
}
func NewUserInfoResult(result UserInfoResponse, err error) *UserInfoResult {
return &UserInfoResult{Result: result, Err: err}
func newUserInfoResult(result UserInfoResponse, err error) *UserInfoResult {
return &UserInfoResult{Result: result}
}
// UserInfo 解密用户信息
@ -80,35 +95,39 @@ func (r *SnsComponentJsCode2sessionResult) UserInfo(param UserInfo) *UserInfoRes
var response UserInfoResponse
aesKey, err := base64.StdEncoding.DecodeString(r.Result.SessionKey)
if err != nil {
return NewUserInfoResult(response, err)
return newUserInfoResult(response, err)
}
cipherText, err := base64.StdEncoding.DecodeString(param.EncryptedData)
if err != nil {
return NewUserInfoResult(response, err)
return newUserInfoResult(response, err)
}
ivBytes, err := base64.StdEncoding.DecodeString(param.Iv)
if err != nil {
return NewUserInfoResult(response, err)
return newUserInfoResult(response, err)
}
block, err := aes.NewCipher(aesKey)
if err != nil {
return NewUserInfoResult(response, err)
return newUserInfoResult(response, err)
}
mode := cipher.NewCBCDecrypter(block, ivBytes)
mode.CryptBlocks(cipherText, cipherText)
cipherText, err = r.pkcs7Unpaid(cipherText, block.BlockSize())
if err != nil {
return NewUserInfoResult(response, err)
return newUserInfoResult(response, err)
}
err = json.Unmarshal(cipherText, &response)
if err != nil {
return NewUserInfoResult(response, err)
return newUserInfoResult(response, err)
}
return NewUserInfoResult(response, err)
return newUserInfoResult(response, err)
}
func (u *UserInfoResponse) UserInfoAvatarUrlReal() string {
return strings.Replace(u.AvatarUrl, "/132", "/0", -1)
return UserInfoAvatarUrlReal(u.AvatarUrl)
}
func UserInfoAvatarUrlReal(avatarUrl string) string {
return strings.Replace(avatarUrl, "/132", "/0", -1)
}
func (r *SnsComponentJsCode2sessionResult) pkcs7Unpaid(data []byte, blockSize int) ([]byte, error) {

@ -0,0 +1,67 @@
package wechatopen
import (
"context"
"encoding/json"
"go.dtapp.net/gorequest"
"net/http"
)
type TckWxPayListResponse struct {
Errcode int `json:"errcode"`
Errmsg string `json:"errmsg"`
List []struct {
MerchantCode string `json:"merchant_code"`
MerchantName string `json:"merchant_name"`
CompanyName string `json:"company_name"`
MchRelationState string `json:"mch_relation_state"`
JsapiAuthState string `json:"jsapi_auth_state"`
RefundAuthState string `json:"refund_auth_state"`
} `json:"list"`
}
type TckWxPayListResult struct {
Result TckWxPayListResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
}
func newTckWxPayListResult(result TckWxPayListResponse, body []byte, http gorequest.Response) *TckWxPayListResult {
return &TckWxPayListResult{Result: result, Body: body, Http: http}
}
// TckWxPayList 获取授权绑定的商户号列表
// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/cloudbase-common/wechatpay/getWechatPayList.html
func (c *Client) TckWxPayList(ctx context.Context) (*TckWxPayListResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
// 参数
params := gorequest.NewParams()
// 请求
request, err := c.request(ctx, apiUrl+"/tcb/wxpaylist?access_token="+c.GetComponentAccessToken(ctx), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response TckWxPayListResponse
err = json.Unmarshal(request.ResponseBody, &response)
if err != nil {
return nil, err
}
return newTckWxPayListResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述
func (resp *TckWxPayListResult) ErrcodeInfo() string {
switch resp.Result.Errcode {
case 85064:
return "找不到草稿"
case 85065:
return "模板库已满"
}
return "系统繁忙"
}

@ -1,3 +0,0 @@
package wechatopen
const Version = "1.0.0"

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -16,26 +17,36 @@ type WxaAddToTemplateResult struct {
Result WxaAddToTemplateResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaAddToTemplateResult(result WxaAddToTemplateResponse, body []byte, http gorequest.Response, err error) *WxaAddToTemplateResult {
return &WxaAddToTemplateResult{Result: result, Body: body, Http: http, Err: err}
func newWxaAddToTemplateResult(result WxaAddToTemplateResponse, body []byte, http gorequest.Response) *WxaAddToTemplateResult {
return &WxaAddToTemplateResult{Result: result, Body: body, Http: http}
}
// WxaAddToTemplate 将草稿添加到代码模板库
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/code_template/addtotemplate.html
func (app *App) WxaAddToTemplate(draftId string, templateType int) *WxaAddToTemplateResult {
func (c *Client) WxaAddToTemplate(ctx context.Context, draftId string, templateType int) (*WxaAddToTemplateResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := NewParams()
params := gorequest.NewParams()
params["draft_id"] = draftId
params["template_type"] = templateType
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/addtotemplate?access_token=%s", app.GetComponentAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/addtotemplate?access_token=%s", c.GetComponentAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaAddToTemplateResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaAddToTemplateResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaAddToTemplateResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -17,25 +18,39 @@ type WxaBindTesterResult struct {
Result WxaBindTesterResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaBindTesterResult(result WxaBindTesterResponse, body []byte, http gorequest.Response, err error) *WxaBindTesterResult {
return &WxaBindTesterResult{Result: result, Body: body, Http: http, Err: err}
func newWxaBindTesterResult(result WxaBindTesterResponse, body []byte, http gorequest.Response) *WxaBindTesterResult {
return &WxaBindTesterResult{Result: result, Body: body, Http: http}
}
// WxaBindTester 绑定微信用户为体验者
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/Mini_Program_AdminManagement/Admin.html
func (app *App) WxaBindTester(wechatid string) *WxaBindTesterResult {
func (c *Client) WxaBindTester(ctx context.Context, wechatid string) (*WxaBindTesterResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := NewParams()
params := gorequest.NewParams()
params["wechatid"] = wechatid
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/bind_tester?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/bind_tester?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaBindTesterResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaBindTesterResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaBindTesterResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -13,7 +14,7 @@ type WxaBusinessGetUserPhoneNumberResponse struct {
PhoneInfo struct {
PhoneNumber string `json:"phoneNumber"` // 用户绑定的手机号(国外手机号会有区号)
PurePhoneNumber string `json:"purePhoneNumber"` // 没有区号的手机号
CountryCode int `json:"countryCode"` // 区号
CountryCode string `json:"countryCode"` // 区号
Watermark struct {
Timestamp int `json:"timestamp"` // 用户获取手机号操作的时间戳
Appid string `json:"appid"` // 小程序appid
@ -25,25 +26,39 @@ type WxaBusinessGetUserPhoneNumberResult struct {
Result WxaBusinessGetUserPhoneNumberResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaBusinessGetUserPhoneNumberResult(result WxaBusinessGetUserPhoneNumberResponse, body []byte, http gorequest.Response, err error) *WxaBusinessGetUserPhoneNumberResult {
return &WxaBusinessGetUserPhoneNumberResult{Result: result, Body: body, Http: http, Err: err}
func newWxaBusinessGetUserPhoneNumberResult(result WxaBusinessGetUserPhoneNumberResponse, body []byte, http gorequest.Response) *WxaBusinessGetUserPhoneNumberResult {
return &WxaBusinessGetUserPhoneNumberResult{Result: result, Body: body, Http: http}
}
// WxaBusinessGetUserPhoneNumber code换取用户手机号。 每个 code 只能使用一次code的有效期为5min
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/phonenumber/phonenumber.getPhoneNumber.html
func (app *App) WxaBusinessGetUserPhoneNumber(code string) *WxaBusinessGetUserPhoneNumberResult {
func (c *Client) WxaBusinessGetUserPhoneNumber(ctx context.Context, code string) (*WxaBusinessGetUserPhoneNumberResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParams()
params.Set("code", code)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/business/getuserphonenumber?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaBusinessGetUserPhoneNumberResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaBusinessGetUserPhoneNumberResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaBusinessGetUserPhoneNumberResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -16,24 +17,38 @@ type WxaCommitResult struct {
Result WxaCommitResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaCommitResult(result WxaCommitResponse, body []byte, http gorequest.Response, err error) *WxaCommitResult {
return &WxaCommitResult{Result: result, Body: body, Http: http, Err: err}
func newWxaCommitResult(result WxaCommitResponse, body []byte, http gorequest.Response) *WxaCommitResult {
return &WxaCommitResult{Result: result, Body: body, Http: http}
}
// WxaCommit 上传小程序代码并生成体验版
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/commit.html
func (app *App) WxaCommit(notMustParams ...gorequest.Params) *WxaCommitResult {
func (c *Client) WxaCommit(ctx context.Context, notMustParams ...gorequest.Params) (*WxaCommitResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/commit?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/commit?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaCommitResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaCommitResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaCommitResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -16,25 +17,35 @@ type WxaDeleteTemplateResult struct {
Result WxaDeleteTemplateResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaDeleteTemplateResult(result WxaDeleteTemplateResponse, body []byte, http gorequest.Response, err error) *WxaDeleteTemplateResult {
return &WxaDeleteTemplateResult{Result: result, Body: body, Http: http, Err: err}
func newWxaDeleteTemplateResult(result WxaDeleteTemplateResponse, body []byte, http gorequest.Response) *WxaDeleteTemplateResult {
return &WxaDeleteTemplateResult{Result: result, Body: body, Http: http}
}
// WxaDeleteTemplate 删除指定代码模板
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/code_template/deletetemplate.html
func (app *App) WxaDeleteTemplate(templateId string) *WxaDeleteTemplateResult {
func (c *Client) WxaDeleteTemplate(ctx context.Context, templateId string) (*WxaDeleteTemplateResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := NewParams()
params := gorequest.NewParams()
params.Set("template_id", templateId)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/deletetemplate?access_token=%s", app.GetComponentAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/deletetemplate?access_token=%s", c.GetComponentAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaDeleteTemplateResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaDeleteTemplateResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaDeleteTemplateResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -20,25 +21,39 @@ type WxaGetAuditStatusResult struct {
Result WxaGetAuditStatusResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaGetAuditStatusResult(result WxaGetAuditStatusResponse, body []byte, http gorequest.Response, err error) *WxaGetAuditStatusResult {
return &WxaGetAuditStatusResult{Result: result, Body: body, Http: http, Err: err}
func newWxaGetAuditStatusResult(result WxaGetAuditStatusResponse, body []byte, http gorequest.Response) *WxaGetAuditStatusResult {
return &WxaGetAuditStatusResult{Result: result, Body: body, Http: http}
}
// WxaGetAuditStatus 查询指定发布审核单的审核状态
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/get_auditstatus.html
func (app *App) WxaGetAuditStatus(auditid int64) *WxaGetAuditStatusResult {
func (c *Client) WxaGetAuditStatus(ctx context.Context, auditid int64) (*WxaGetAuditStatusResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := app.NewParamsWith()
params := gorequest.NewParams()
params.Set("auditid", auditid)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/get_auditstatus?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/get_auditstatus?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaGetAuditStatusResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaGetAuditStatusResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaGetAuditStatusResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -24,20 +25,36 @@ type WxaGetCategoryResult struct {
Result WxaGetCategoryResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaGetCategoryResult(result WxaGetCategoryResponse, body []byte, http gorequest.Response, err error) *WxaGetCategoryResult {
return &WxaGetCategoryResult{Result: result, Body: body, Http: http, Err: err}
func newWxaGetCategoryResult(result WxaGetCategoryResponse, body []byte, http gorequest.Response) *WxaGetCategoryResult {
return &WxaGetCategoryResult{Result: result, Body: body, Http: http}
}
// WxaGetCategory 获取审核时可填写的类目信息
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/category/get_category.html
func (app *App) WxaGetCategory() *WxaGetCategoryResult {
func (c *Client) WxaGetCategory(ctx context.Context) (*WxaGetCategoryResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParams()
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/get_category?access_token=%s", app.GetAuthorizerAccessToken()), map[string]interface{}{}, http.MethodGet)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/get_category?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodGet)
if err != nil {
return nil, err
}
// 定义
var response WxaGetCategoryResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaGetCategoryResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaGetCategoryResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -40,22 +41,36 @@ type WxaGetEffectiveDomainResult struct {
Result WxaGetEffectiveDomainResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaGetEffectiveDomainResult(result WxaGetEffectiveDomainResponse, body []byte, http gorequest.Response, err error) *WxaGetEffectiveDomainResult {
return &WxaGetEffectiveDomainResult{Result: result, Body: body, Http: http, Err: err}
func newWxaGetEffectiveDomainResult(result WxaGetEffectiveDomainResponse, body []byte, http gorequest.Response) *WxaGetEffectiveDomainResult {
return &WxaGetEffectiveDomainResult{Result: result, Body: body, Http: http}
}
// WxaGetEffectiveDomain 获取发布后生效服务器域名列表
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/Mini_Program_Basic_Info/get_effective_domain.html
func (app *App) WxaGetEffectiveDomain(notMustParams ...Params) *WxaGetEffectiveDomainResult {
func (c *Client) WxaGetEffectiveDomain(ctx context.Context, notMustParams ...gorequest.Params) (*WxaGetEffectiveDomainResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := app.NewParamsWith(notMustParams...)
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/get_effective_domain?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/get_effective_domain?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaGetEffectiveDomainResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaGetEffectiveDomainResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaGetEffectiveDomainResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -20,22 +21,38 @@ type WxaGetLatestAuditStatusResult struct {
Result WxaGetLatestAuditStatusResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaGetLatestAuditStatusResult(result WxaGetLatestAuditStatusResponse, body []byte, http gorequest.Response, err error) *WxaGetLatestAuditStatusResult {
return &WxaGetLatestAuditStatusResult{Result: result, Body: body, Http: http, Err: err}
func newWxaGetLatestAuditStatusResult(result WxaGetLatestAuditStatusResponse, body []byte, http gorequest.Response) *WxaGetLatestAuditStatusResult {
return &WxaGetLatestAuditStatusResult{Result: result, Body: body, Http: http}
}
// WxaGetLatestAuditStatus 查询最新一次提交的审核状态
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/get_auditstatus.html
func (app *App) WxaGetLatestAuditStatus() *WxaGetLatestAuditStatusResult {
func (c *Client) WxaGetLatestAuditStatus(ctx context.Context) (*WxaGetLatestAuditStatusResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParams()
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/get_latest_auditstatus?access_token=%s", app.GetAuthorizerAccessToken()), map[string]interface{}{}, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/get_latest_auditstatus?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaGetLatestAuditStatusResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaGetLatestAuditStatusResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaGetLatestAuditStatusResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -17,20 +18,36 @@ type WxaGetPageResult struct {
Result WxaGetPageResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaGetPageResult(result WxaGetPageResponse, body []byte, http gorequest.Response, err error) *WxaGetPageResult {
return &WxaGetPageResult{Result: result, Body: body, Http: http, Err: err}
func newWxaGetPageResult(result WxaGetPageResponse, body []byte, http gorequest.Response) *WxaGetPageResult {
return &WxaGetPageResult{Result: result, Body: body, Http: http}
}
// WxaGetPage 获取已上传的代码的页面列表
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/get_page.html
func (app *App) WxaGetPage() *WxaGetPageResult {
func (c *Client) WxaGetPage(ctx context.Context) (*WxaGetPageResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParams()
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/get_page?access_token=%s", app.GetAuthorizerAccessToken()), map[string]interface{}{}, http.MethodGet)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/get_page?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodGet)
if err != nil {
return nil, err
}
// 定义
var response WxaGetPageResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaGetPageResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaGetPageResult(response, request.ResponseBody, request), nil
}

@ -0,0 +1 @@
package wechatopen

@ -1,9 +1,12 @@
package wechatopen
import (
"bytes"
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
"go.dtapp.net/gostorage"
"net/http"
)
@ -16,25 +19,55 @@ type WxaGetQrcodeResult struct {
Result WxaGetQrcodeResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaGetQrcodeResult(result WxaGetQrcodeResponse, body []byte, http gorequest.Response, err error) *WxaGetQrcodeResult {
return &WxaGetQrcodeResult{Result: result, Body: body, Http: http, Err: err}
func newWxaGetQrcodeResult(result WxaGetQrcodeResponse, body []byte, http gorequest.Response) *WxaGetQrcodeResult {
return &WxaGetQrcodeResult{Result: result, Body: body, Http: http}
}
// WxaGetQrcode 获取体验版二维码
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/get_qrcode.html
func (app *App) WxaGetQrcode(path string) *WxaGetQrcodeResult {
func (c *Client) WxaGetQrcode(ctx context.Context, path string) (*WxaGetQrcodeResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := NewParams()
params := gorequest.NewParams()
if path != "" {
params["path"] = path // 指定二维码扫码后直接进入指定页面并可同时带上参数)
}
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/get_qrcode?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodGet)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/get_qrcode?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodGet)
if err != nil {
return nil, err
}
// 定义
var response WxaGetQrcodeResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaGetQrcodeResult(response, request.ResponseBody, request, err)
// 判断内容是否为图片
if request.HeaderIsImg() {
} else {
err = json.Unmarshal(request.ResponseBody, &response)
if err != nil {
return nil, err
}
}
return newWxaGetQrcodeResult(response, request.ResponseBody, request), nil
}
func (cr *WxaGetQrcodeResult) SaveImg(db *gostorage.AliYun, fileName, filePath string) error {
if cr.Result.Errcode != 0 {
panic(fmt.Sprintf("接口状态错误:%s", cr.Body))
}
// 上传
_, err := db.PutObject(bytes.NewReader(cr.Body), filePath, fileName)
if err != nil {
return err
}
return nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -26,22 +27,34 @@ type WxaGetTemplateDraftListResult struct {
Result WxaGetTemplateDraftListResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaGetTemplateDraftListResult(result WxaGetTemplateDraftListResponse, body []byte, http gorequest.Response, err error) *WxaGetTemplateDraftListResult {
return &WxaGetTemplateDraftListResult{Result: result, Body: body, Http: http, Err: err}
func newWxaGetTemplateDraftListResult(result WxaGetTemplateDraftListResponse, body []byte, http gorequest.Response) *WxaGetTemplateDraftListResult {
return &WxaGetTemplateDraftListResult{Result: result, Body: body, Http: http}
}
// WxaGetTemplateDraftList 获取代码草稿列表
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/code_template/gettemplatedraftlist.html
func (app *App) WxaGetTemplateDraftList() *WxaGetTemplateDraftListResult {
func (c *Client) WxaGetTemplateDraftList(ctx context.Context) (*WxaGetTemplateDraftListResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParams()
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/gettemplatedraftlist?access_token=%s", app.GetComponentAccessToken()), map[string]interface{}{}, http.MethodGet)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/gettemplatedraftlist?access_token=%s", c.GetComponentAccessToken(ctx)), params, http.MethodGet)
if err != nil {
return nil, err
}
// 定义
var response WxaGetTemplateDraftListResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaGetTemplateDraftListResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaGetTemplateDraftListResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -27,22 +28,34 @@ type WxaGetTemplateListResult struct {
Result WxaGetTemplateListResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaGetTemplateListResult(result WxaGetTemplateListResponse, body []byte, http gorequest.Response, err error) *WxaGetTemplateListResult {
return &WxaGetTemplateListResult{Result: result, Body: body, Http: http, Err: err}
func newWxaGetTemplateListResult(result WxaGetTemplateListResponse, body []byte, http gorequest.Response) *WxaGetTemplateListResult {
return &WxaGetTemplateListResult{Result: result, Body: body, Http: http}
}
// WxaGetTemplateList 获取代码模板列表
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/ThirdParty/code_template/gettemplatelist.html
func (app *App) WxaGetTemplateList() *WxaGetTemplateListResult {
func (c *Client) WxaGetTemplateList(ctx context.Context) (*WxaGetTemplateListResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParams()
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/gettemplatelist?access_token=%s", app.GetComponentAccessToken()), map[string]interface{}{}, http.MethodGet)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/gettemplatelist?access_token=%s", c.GetComponentAccessToken(ctx)), params, http.MethodGet)
if err != nil {
return nil, err
}
// 定义
var response WxaGetTemplateListResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaGetTemplateListResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaGetTemplateListResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -1,8 +1,8 @@
package wechatopen
import (
"context"
"encoding/json"
"errors"
"fmt"
"go.dtapp.net/gorequest"
"net/http"
@ -27,24 +27,36 @@ type WxaGetVersionInfoResult struct {
Result WxaGetVersionInfoResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaGetVersionInfoResult(result WxaGetVersionInfoResponse, body []byte, http gorequest.Response, err error) *WxaGetVersionInfoResult {
return &WxaGetVersionInfoResult{Result: result, Body: body, Http: http, Err: err}
func newWxaGetVersionInfoResult(result WxaGetVersionInfoResponse, body []byte, http gorequest.Response) *WxaGetVersionInfoResult {
return &WxaGetVersionInfoResult{Result: result, Body: body, Http: http}
}
// WxaGetVersionInfo 查询小程序版本信息
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/get_versioninfo.html
func (app *App) WxaGetVersionInfo() *WxaGetVersionInfoResult {
accessToken := app.GetAuthorizerAccessToken()
if accessToken == "" {
return NewWxaGetVersionInfoResult(WxaGetVersionInfoResponse{}, nil, gorequest.Response{}, errors.New("访问令牌为空"))
func (c *Client) WxaGetVersionInfo(ctx context.Context) (*WxaGetVersionInfoResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParams()
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/getversioninfo?access_token=%s", accessToken), map[string]interface{}{}, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/getversioninfo?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaGetVersionInfoResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaGetVersionInfoResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaGetVersionInfoResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -18,24 +19,42 @@ type WxaGetWxaCodeUnLimitResult struct {
Result WxaGetWxaCodeUnLimitResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaGetWxaCodeUnLimitResult(result WxaGetWxaCodeUnLimitResponse, body []byte, http gorequest.Response, err error) *WxaGetWxaCodeUnLimitResult {
return &WxaGetWxaCodeUnLimitResult{Result: result, Body: body, Http: http, Err: err}
func newWxaGetWxaCodeUnLimitResult(result WxaGetWxaCodeUnLimitResponse, body []byte, http gorequest.Response) *WxaGetWxaCodeUnLimitResult {
return &WxaGetWxaCodeUnLimitResult{Result: result, Body: body, Http: http}
}
// WxaGetWxaCodeUnLimit 获取小程序码,适用于需要的码数量极多的业务场景。通过该接口生成的小程序码,永久有效,数量暂无限制
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimited.html
func (app *App) WxaGetWxaCodeUnLimit(notMustParams ...Params) *WxaGetWxaCodeUnLimitResult {
func (c *Client) WxaGetWxaCodeUnLimit(ctx context.Context, notMustParams ...gorequest.Params) (*WxaGetWxaCodeUnLimitResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := app.NewParamsWith(notMustParams...)
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/getwxacodeunlimit?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaGetWxaCodeUnLimitResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaGetWxaCodeUnLimitResult(response, request.ResponseBody, request, err)
// 判断内容是否为图片
if request.HeaderIsImg() {
} else {
err = json.Unmarshal(request.ResponseBody, &response)
if err != nil {
return nil, err
}
}
return newWxaGetWxaCodeUnLimitResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -1,8 +1,8 @@
package wechatopen
import (
"context"
"encoding/json"
"errors"
"fmt"
"go.dtapp.net/gorequest"
"net/http"
@ -20,27 +20,37 @@ type WxaMemberAuthResult struct {
Result WxaMemberAuthResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaMemberAuthResult(result WxaMemberAuthResponse, body []byte, http gorequest.Response, err error) *WxaMemberAuthResult {
return &WxaMemberAuthResult{Result: result, Body: body, Http: http, Err: err}
func newWxaMemberAuthResult(result WxaMemberAuthResponse, body []byte, http gorequest.Response) *WxaMemberAuthResult {
return &WxaMemberAuthResult{Result: result, Body: body, Http: http}
}
// WxaMemberAuth 获取体验者列表
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/Mini_Program_AdminManagement/memberauth.html
func (app *App) WxaMemberAuth() *WxaMemberAuthResult {
accessToken := app.GetAuthorizerAccessToken()
if accessToken == "" {
return NewWxaMemberAuthResult(WxaMemberAuthResponse{}, nil, gorequest.Response{}, errors.New("访问令牌为空"))
func (c *Client) WxaMemberAuth(ctx context.Context) (*WxaMemberAuthResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := NewParams()
params := gorequest.NewParams()
params["action"] = "get_experiencer"
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/memberauth?access_token=%s", accessToken), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/memberauth?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaMemberAuthResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaMemberAuthResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaMemberAuthResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -29,24 +30,34 @@ type WxaModifyDomainResult struct {
Result WxaModifyDomainResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaModifyDomainResult(result WxaModifyDomainResponse, body []byte, http gorequest.Response, err error) *WxaModifyDomainResult {
return &WxaModifyDomainResult{Result: result, Body: body, Http: http, Err: err}
func newWxaModifyDomainResult(result WxaModifyDomainResponse, body []byte, http gorequest.Response) *WxaModifyDomainResult {
return &WxaModifyDomainResult{Result: result, Body: body, Http: http}
}
// WxaModifyDomain 设置服务器域名
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/Mini_Program_Basic_Info/Server_Address_Configuration.html
func (app *App) WxaModifyDomain(notMustParams ...Params) *WxaModifyDomainResult {
// WxaModifyDomain 配置小程序服务器域名
// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/domain-management/modifyServerDomain.html
func (c *Client) WxaModifyDomain(ctx context.Context, notMustParams ...gorequest.Params) (*WxaModifyDomainResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := app.NewParamsWith(notMustParams...)
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/modify_domain?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/modify_domain?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaModifyDomainResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaModifyDomainResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaModifyDomainResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -8,32 +9,55 @@ import (
)
type WxaModifyDomainDirectlyResponse struct {
Errcode int `json:"errcode"` // 错误码
Errmsg string `json:"errmsg"` // 错误信息
Errcode int `json:"errcode"` // 错误码
Errmsg string `json:"errmsg"` // 错误信息
Requestdomain []string `json:"requestdomain"` // request 合法域名
Wsrequestdomain []string `json:"wsrequestdomain"` // socket 合法域名
Uploaddomain []string `json:"uploaddomain"` // uploadFile 合法域名
Downloaddomain []string `json:"downloaddomain"` // downloadFile 合法域名
Udpdomain []string `json:"udpdomain"` // udp 合法域名
Tcpdomain []string `json:"tcpdomain"` // tcp 合法域名
InvalidRequestdomain []string `json:"invalid_requestdomain"` // request 不合法域名
InvalidWsrequestdomain []string `json:"invalid_wsrequestdomain"` // socket 不合法域名
InvalidUploaddomain []string `json:"invalid_uploaddomain"` // uploadFile 不合法域名
InvalidDownloaddomain []string `json:"invalid_downloaddomain"` // downloadFile 不合法域名
InvalidUdpdomain []string `json:"invalid_udpdomain"` // udp 不合法域名
InvalidTcpdomain []string `json:"invalid_tcpdomain"` // tcp 不合法域名
NoIcpDomain []string `json:"no_icp_domain"` // 没有经过icp备案的域名
}
type WxaModifyDomainDirectlyResult struct {
Result WxaModifyDomainDirectlyResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaModifyDomainDirectlyResult(result WxaModifyDomainDirectlyResponse, body []byte, http gorequest.Response, err error) *WxaModifyDomainDirectlyResult {
return &WxaModifyDomainDirectlyResult{Result: result, Body: body, Http: http, Err: err}
func newWxaModifyDomainDirectlyResult(result WxaModifyDomainDirectlyResponse, body []byte, http gorequest.Response) *WxaModifyDomainDirectlyResult {
return &WxaModifyDomainDirectlyResult{Result: result, Body: body, Http: http}
}
// WxaModifyDomainDirectly 快速设置小程序服务器域名
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/Mini_Program_Basic_Info/modify_domain_directly.html
func (app *App) WxaModifyDomainDirectly(notMustParams ...Params) *WxaModifyDomainDirectlyResult {
// WxaModifyDomainDirectly 快速配置小程序服务器域名
// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/domain-management/modifyServerDomainDirectly.html
func (c *Client) WxaModifyDomainDirectly(ctx context.Context, notMustParams ...gorequest.Params) (*WxaModifyDomainDirectlyResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := app.NewParamsWith(notMustParams...)
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/modify_domain_directly?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/modify_domain_directly?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaModifyDomainDirectlyResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaModifyDomainDirectlyResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaModifyDomainDirectlyResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -16,24 +17,38 @@ type WxaReleaseResult struct {
Result WxaReleaseResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaReleaseResult(result WxaReleaseResponse, body []byte, http gorequest.Response, err error) *WxaReleaseResult {
return &WxaReleaseResult{Result: result, Body: body, Http: http, Err: err}
func newWxaReleaseResult(result WxaReleaseResponse, body []byte, http gorequest.Response) *WxaReleaseResult {
return &WxaReleaseResult{Result: result, Body: body, Http: http}
}
// WxaRelease 发布已通过审核的小程序
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/release.html
func (app *App) WxaRelease() *WxaReleaseResult {
func (c *Client) WxaRelease(ctx context.Context) (*WxaReleaseResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
err = c.checkAuthorizerIsConfig()
if err != nil {
return nil, err
}
// 参数
params := NewParams()
params := gorequest.NewParams()
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/release?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/release?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaReleaseResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaReleaseResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaReleaseResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -17,24 +18,34 @@ type WxaSecurityApplyPrivacyInterfaceResult struct {
Result WxaSecurityApplyPrivacyInterfaceResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaSecurityApplyPrivacyInterfaceResult(result WxaSecurityApplyPrivacyInterfaceResponse, body []byte, http gorequest.Response, err error) *WxaSecurityApplyPrivacyInterfaceResult {
return &WxaSecurityApplyPrivacyInterfaceResult{Result: result, Body: body, Http: http, Err: err}
func newWxaSecurityApplyPrivacyInterfaceResult(result WxaSecurityApplyPrivacyInterfaceResponse, body []byte, http gorequest.Response) *WxaSecurityApplyPrivacyInterfaceResult {
return &WxaSecurityApplyPrivacyInterfaceResult{Result: result, Body: body, Http: http}
}
// WxaSecurityApplyPrivacyInterface 申请接口
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/apply_api/apply_privacy_interface.html
func (app *App) WxaSecurityApplyPrivacyInterface(notMustParams ...Params) *WxaSecurityApplyPrivacyInterfaceResult {
func (c *Client) WxaSecurityApplyPrivacyInterface(ctx context.Context, notMustParams ...gorequest.Params) (*WxaSecurityApplyPrivacyInterfaceResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := app.NewParamsWith(notMustParams...)
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/security/apply_privacy_interface?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/security/apply_privacy_interface?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaSecurityApplyPrivacyInterfaceResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaSecurityApplyPrivacyInterfaceResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaSecurityApplyPrivacyInterfaceResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -0,0 +1,61 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
"net/http"
)
type WxaSecurityApplySetOrderPathInfoResponse struct {
Errcode int `json:"errcode"` // 返回码
Errmsg string `json:"errmsg"` // 返回码信息
}
type WxaSecurityApplySetOrderPathInfoResult struct {
Result WxaSecurityApplySetOrderPathInfoResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
}
func newWxaSecurityApplySetOrderPathInfoResult(result WxaSecurityApplySetOrderPathInfoResponse, body []byte, http gorequest.Response) *WxaSecurityApplySetOrderPathInfoResult {
return &WxaSecurityApplySetOrderPathInfoResult{Result: result, Body: body, Http: http}
}
// WxaSecurityApplySetOrderPathInfo 申请设置订单页 path 信息
// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/basic-info-management/applySetOrderPathInfo.html
func (c *Client) WxaSecurityApplySetOrderPathInfo(ctx context.Context, notMustParams ...gorequest.Params) (*WxaSecurityApplySetOrderPathInfoResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/security/applysetorderpathinfo?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaSecurityApplySetOrderPathInfoResponse
err = json.Unmarshal(request.ResponseBody, &response)
if err != nil {
return nil, err
}
return newWxaSecurityApplySetOrderPathInfoResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述
func (resp *WxaSecurityApplySetOrderPathInfoResult) ErrcodeInfo() string {
switch resp.Result.Errcode {
case 61042:
return "批量提交超过最大数量,一次提交的 appid 数量不超过100个"
case 61043:
return "参数填写错误"
case 61044:
return "path填写不规范"
}
return "系统繁忙"
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -15,7 +16,7 @@ type WxaSecurityGetPrivacyInterfaceResponse struct {
ApiChName string `json:"api_ch_name"` // api 中文名
ApiDesc string `json:"api_desc"` // api描述
ApplyTime int64 `json:"apply_time,omitempty"` // 申请时间 ,该字段发起申请后才会有
Status int `json:"status"` // 接口状态,该字段发起申请后才会有
Status int `json:"status,omitempty"` // 接口状态,该字段发起申请后才会有 1待申请开通 2无权限 3申请中 4申请失败 5已开通
AuditId int `json:"audit_id,omitempty"` // 申请单号,该字段发起申请后才会有
FailReason string `json:"fail_reason,omitempty"` // 申请被驳回原因或者无权限,该字段申请驳回时才会有
ApiLink string `json:"api_link"` // api文档链接
@ -27,24 +28,34 @@ type WxaSecurityGetPrivacyInterfaceResult struct {
Result WxaSecurityGetPrivacyInterfaceResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaSecurityGetPrivacyInterfaceResult(result WxaSecurityGetPrivacyInterfaceResponse, body []byte, http gorequest.Response, err error) *WxaSecurityGetPrivacyInterfaceResult {
return &WxaSecurityGetPrivacyInterfaceResult{Result: result, Body: body, Http: http, Err: err}
func newWxaSecurityGetPrivacyInterfaceResult(result WxaSecurityGetPrivacyInterfaceResponse, body []byte, http gorequest.Response) *WxaSecurityGetPrivacyInterfaceResult {
return &WxaSecurityGetPrivacyInterfaceResult{Result: result, Body: body, Http: http}
}
// WxaSecurityGetPrivacyInterface 获取接口列表
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/apply_api/get_privacy_interface.html
func (app *App) WxaSecurityGetPrivacyInterface() *WxaSecurityGetPrivacyInterfaceResult {
func (c *Client) WxaSecurityGetPrivacyInterface(ctx context.Context) (*WxaSecurityGetPrivacyInterfaceResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := NewParams()
params := gorequest.NewParams()
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/security/get_privacy_interface?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodGet)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/security/get_privacy_interface?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodGet)
if err != nil {
return nil, err
}
// 定义
var response WxaSecurityGetPrivacyInterfaceResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaSecurityGetPrivacyInterfaceResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaSecurityGetPrivacyInterfaceResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述

@ -0,0 +1,68 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
"net/http"
)
type WxaSecurityGetOrderPathInfoResponse struct {
Errcode int `json:"errcode"` // 返回码
Errmsg string `json:"errmsg"` // 返回码信息
msg struct {
Path string `json:"path"`
ImgList []string `json:"img_list"`
Video string `json:"video"`
TestAccount string `json:"test_account"`
TestPwd string `json:"test_pwd"`
TestRemark string `json:"test_remark"`
Status int `json:"status"`
ApplyTime int64 `json:"apply_time"`
} `json:"msg"`
}
type WxaSecurityGetOrderPathInfoResult struct {
Result WxaSecurityGetOrderPathInfoResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
}
func newWxaSecurityGetOrderPathInfoResult(result WxaSecurityGetOrderPathInfoResponse, body []byte, http gorequest.Response) *WxaSecurityGetOrderPathInfoResult {
return &WxaSecurityGetOrderPathInfoResult{Result: result, Body: body, Http: http}
}
// WxaSecurityGetOrderPathInfo 获取订单页 path 信息
// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/basic-info-management/getOrderPathInfo.html
func (c *Client) WxaSecurityGetOrderPathInfo(ctx context.Context, infoType int) (*WxaSecurityGetOrderPathInfoResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParams()
params.Set("info_type", infoType)
// 请求
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/security/getorderpathinfo?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaSecurityGetOrderPathInfoResponse
err = json.Unmarshal(request.ResponseBody, &response)
if err != nil {
return nil, err
}
return newWxaSecurityGetOrderPathInfoResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述
func (resp *WxaSecurityGetOrderPathInfoResult) ErrcodeInfo() string {
switch resp.Result.Errcode {
case 61041:
return "订单页 path 未设置"
}
return "系统繁忙"
}

@ -0,0 +1 @@
package wechatopen

@ -0,0 +1,67 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
"net/http"
)
type WxaSetWebViewDoMainResponse struct {
Errcode int `json:"errcode"` // 错误码
Errmsg string `json:"errmsg"` // 错误信息
}
type WxaSetWebViewDoMainResult struct {
Result WxaSetWebViewDoMainResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
}
func newWxaSetWebViewDoMainResult(result WxaSetWebViewDoMainResponse, body []byte, http gorequest.Response) *WxaSetWebViewDoMainResult {
return &WxaSetWebViewDoMainResult{Result: result, Body: body, Http: http}
}
// WxaSetWebViewDoMain 配置小程序业务域名
// https://developers.weixin.qq.com/doc/oplatform/openApi/OpenApiDoc/miniprogram-management/domain-management/modifyJumpDomain.html
func (c *Client) WxaSetWebViewDoMain(ctx context.Context, notMustParams ...gorequest.Params) (*WxaSetWebViewDoMainResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/setwebviewdomain?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaSetWebViewDoMainResponse
err = json.Unmarshal(request.ResponseBody, &response)
if err != nil {
return nil, err
}
return newWxaSetWebViewDoMainResult(response, request.ResponseBody, request), nil
}
// ErrcodeInfo 错误描述
func (resp *WxaSetWebViewDoMainResult) ErrcodeInfo() string {
switch resp.Result.Errcode {
case 40001:
return "获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口"
case 89019:
return "业务域名无更改,无需重复设置"
case 89020:
return "尚未设置小程序业务域名,请先在第三方平台中设置小程序业务域名后在调用本接口"
case 89021:
return "请求保存的域名不是第三方平台中已设置的小程序业务域名或子域名"
case 89029:
return "业务域名数量超过限制最多可以添加100个业务域名"
case 89231:
return "个人小程序不支持调用 setwebviewdomain 接口"
}
return "系统繁忙"
}

@ -0,0 +1 @@
package wechatopen

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -17,22 +18,32 @@ type WxaSubmitAuditResult struct {
Result WxaSubmitAuditResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaSubmitAuditResult(result WxaSubmitAuditResponse, body []byte, http gorequest.Response, err error) *WxaSubmitAuditResult {
return &WxaSubmitAuditResult{Result: result, Body: body, Http: http, Err: err}
func newWxaSubmitAuditResult(result WxaSubmitAuditResponse, body []byte, http gorequest.Response) *WxaSubmitAuditResult {
return &WxaSubmitAuditResult{Result: result, Body: body, Http: http}
}
// WxaSubmitAudit 提交审核
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/submit_audit.html
func (app *App) WxaSubmitAudit(notMustParams ...Params) *WxaSubmitAuditResult {
func (c *Client) WxaSubmitAudit(ctx context.Context, notMustParams ...gorequest.Params) (*WxaSubmitAuditResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := app.NewParamsWith(notMustParams...)
params := gorequest.NewParamsWith(notMustParams...)
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/submit_audit?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/submit_audit?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaSubmitAuditResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaSubmitAuditResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaSubmitAuditResult(response, request.ResponseBody, request), nil
}

@ -1,6 +1,7 @@
package wechatopen
import (
"context"
"encoding/json"
"fmt"
"go.dtapp.net/gorequest"
@ -16,26 +17,36 @@ type WxaUnbindTesterResult struct {
Result WxaUnbindTesterResponse // 结果
Body []byte // 内容
Http gorequest.Response // 请求
Err error // 错误
}
func NewWxaUnbindTesterResult(result WxaUnbindTesterResponse, body []byte, http gorequest.Response, err error) *WxaUnbindTesterResult {
return &WxaUnbindTesterResult{Result: result, Body: body, Http: http, Err: err}
func newWxaUnbindTesterResult(result WxaUnbindTesterResponse, body []byte, http gorequest.Response) *WxaUnbindTesterResult {
return &WxaUnbindTesterResult{Result: result, Body: body, Http: http}
}
// WxaUnbindTester 解除绑定体验者
// https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/Mini_Program_AdminManagement/unbind_tester.html
func (app *App) WxaUnbindTester(wechatid, userstr string) *WxaUnbindTesterResult {
func (c *Client) WxaUnbindTester(ctx context.Context, wechatid, userstr string) (*WxaUnbindTesterResult, error) {
// 检查
err := c.checkComponentIsConfig()
if err != nil {
return nil, err
}
// 参数
params := NewParams()
params := gorequest.NewParams()
if wechatid != "" {
params["wechatid"] = wechatid
}
params["userstr"] = userstr
// 请求
request, err := app.request(fmt.Sprintf("https://api.weixin.qq.com/wxa/unbind_tester?access_token=%s", app.GetAuthorizerAccessToken()), params, http.MethodPost)
request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/wxa/unbind_tester?access_token=%s", c.GetAuthorizerAccessToken(ctx)), params, http.MethodPost)
if err != nil {
return nil, err
}
// 定义
var response WxaUnbindTesterResponse
err = json.Unmarshal(request.ResponseBody, &response)
return NewWxaUnbindTesterResult(response, request.ResponseBody, request, err)
if err != nil {
return nil, err
}
return newWxaUnbindTesterResult(response, request.ResponseBody, request), nil
}

Loading…
Cancel
Save