- update request

master v1.0.2
李光春 2 years ago
parent 7a8ef7d812
commit 0036756b5d

@ -1,6 +1,7 @@
package wechatoffice package wechatoffice
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"go.dtapp.net/gorequest" "go.dtapp.net/gorequest"
@ -27,9 +28,9 @@ func newCgiBinTicketGetTicketResult(result CgiBinTicketGetTicketResponse, body [
// CgiBinTicketGetTicket 获取api_ticket // CgiBinTicketGetTicket 获取api_ticket
// https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html // https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html
func (c *Client) CgiBinTicketGetTicket(Type string) *CgiBinTicketGetTicketResult { func (c *Client) CgiBinTicketGetTicket(ctx context.Context, Type string) *CgiBinTicketGetTicketResult {
// request // request
request, err := c.request(fmt.Sprintf(apiUrl+"/cgi-bin/ticket/getticket?access_token=%s&type=%s", c.getAccessToken(), Type), map[string]interface{}{}, http.MethodGet) request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/ticket/getticket?access_token=%s&type=%s", c.getAccessToken(ctx), Type), map[string]interface{}{}, http.MethodGet)
// 定义 // 定义
var response CgiBinTicketGetTicketResponse var response CgiBinTicketGetTicketResponse
err = json.Unmarshal(request.ResponseBody, &response) err = json.Unmarshal(request.ResponseBody, &response)

@ -7,16 +7,16 @@ import (
) )
// GetJsapiTicketMonitor 监控api_ticket // GetJsapiTicketMonitor 监控api_ticket
func (c *Client) GetJsapiTicketMonitor() (string, error) { func (c *Client) GetJsapiTicketMonitor(ctx context.Context) (string, error) {
if c.config.RedisClient.Db == nil { if c.config.RedisClient.Db == nil {
return "", errors.New("驱动没有初始化") return "", errors.New("驱动没有初始化")
} }
result := c.DebugCgiBinTicketCheck() result := c.DebugCgiBinTicketCheck(ctx)
if result.Result.Errcode == 0 { if result.Result.Errcode == 0 {
return c.config.JsapiTicket, nil return c.config.JsapiTicket, nil
} }
c.config.AccessToken = c.GetAccessToken() c.config.AccessToken = c.GetAccessToken(ctx)
token := c.CgiBinTicketGetTicket("jsapi") token := c.CgiBinTicketGetTicket(ctx, "jsapi")
c.config.RedisClient.Db.Set(context.Background(), c.getJsapiTicketCacheKeyName(), token.Result.Ticket, time.Second*7000) c.config.RedisClient.Db.Set(context.Background(), c.getJsapiTicketCacheKeyName(), token.Result.Ticket, time.Second*7000)
return token.Result.Ticket, nil return token.Result.Ticket, nil
} }

@ -1,18 +1,19 @@
package wechatoffice package wechatoffice
import ( import (
"context"
"fmt" "fmt"
"time" "time"
) )
// GetJsapiTicket 获取api_ticket // GetJsapiTicket 获取api_ticket
func (c *Client) GetJsapiTicket() string { func (c *Client) GetJsapiTicket(ctx context.Context) string {
if c.config.RedisClient.Db == nil { if c.config.RedisClient.Db == nil {
return c.config.JsapiTicket return c.config.JsapiTicket
} }
newCache := c.config.RedisClient.NewSimpleStringCache(c.config.RedisClient.NewStringOperation(), time.Second*7000) newCache := c.config.RedisClient.NewSimpleStringCache(c.config.RedisClient.NewStringOperation(), time.Second*7000)
newCache.DBGetter = func() string { newCache.DBGetter = func() string {
token := c.CgiBinTicketGetTicket("jsapi") token := c.CgiBinTicketGetTicket(ctx, "jsapi")
return token.Result.Ticket return token.Result.Ticket
} }
return newCache.GetCache(c.getJsapiTicketCacheKeyName()) return newCache.GetCache(c.getJsapiTicketCacheKeyName())

@ -1,6 +1,7 @@
package wechatoffice package wechatoffice
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"go.dtapp.net/gorequest" "go.dtapp.net/gorequest"
@ -28,9 +29,9 @@ func newCgiBinTokenResult(result CgiBinTokenResponse, body []byte, http goreques
// CgiBinToken // CgiBinToken
// 接口调用凭证 // 接口调用凭证
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html
func (c *Client) CgiBinToken() *CgiBinTokenResult { func (c *Client) CgiBinToken(ctx context.Context) *CgiBinTokenResult {
// request // request
request, err := c.request(fmt.Sprintf(apiUrl+"/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", c.GetAppId(), c.GetAppSecret()), map[string]interface{}{}, http.MethodGet) request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", c.GetAppId(), c.GetAppSecret()), map[string]interface{}{}, http.MethodGet)
// 定义 // 定义
var response CgiBinTokenResponse var response CgiBinTokenResponse
err = json.Unmarshal(request.ResponseBody, &response) err = json.Unmarshal(request.ResponseBody, &response)

@ -6,15 +6,15 @@ import (
"time" "time"
) )
func (c *Client) GetAccessTokenMonitor() (string, error) { func (c *Client) GetAccessTokenMonitor(ctx context.Context) (string, error) {
if c.config.RedisClient.Db == nil { if c.config.RedisClient.Db == nil {
return "", errors.New("驱动没有初始化") return "", errors.New("驱动没有初始化")
} }
result := c.GetCallBackIp() result := c.GetCallBackIp(ctx)
if len(result.Result.IpList) > 0 { if len(result.Result.IpList) > 0 {
return c.config.AccessToken, nil return c.config.AccessToken, nil
} }
token := c.CgiBinToken() token := c.CgiBinToken(ctx)
c.config.RedisClient.Db.Set(context.Background(), c.getAccessTokenCacheKeyName(), token.Result.AccessToken, time.Second*7000) c.config.RedisClient.Db.Set(context.Background(), c.getAccessTokenCacheKeyName(), token.Result.AccessToken, time.Second*7000)
return token.Result.AccessToken, nil return token.Result.AccessToken, nil
} }

@ -1,17 +1,18 @@
package wechatoffice package wechatoffice
import ( import (
"context"
"fmt" "fmt"
"time" "time"
) )
func (c *Client) GetAccessToken() string { func (c *Client) GetAccessToken(ctx context.Context) string {
if c.config.RedisClient.Db == nil { if c.config.RedisClient.Db == nil {
return c.config.AccessToken return c.config.AccessToken
} }
newCache := c.config.RedisClient.NewSimpleStringCache(c.config.RedisClient.NewStringOperation(), time.Second*7000) newCache := c.config.RedisClient.NewSimpleStringCache(c.config.RedisClient.NewStringOperation(), time.Second*7000)
newCache.DBGetter = func() string { newCache.DBGetter = func() string {
token := c.CgiBinToken() token := c.CgiBinToken(ctx)
return token.Result.AccessToken return token.Result.AccessToken
} }
return newCache.GetCache(c.getAccessTokenCacheKeyName()) return newCache.GetCache(c.getAccessTokenCacheKeyName())

@ -1,6 +1,7 @@
package wechatoffice package wechatoffice
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"go.dtapp.net/gorequest" "go.dtapp.net/gorequest"
@ -29,9 +30,9 @@ func newCgiBinUserGetResult(result CgiBinUserGetResponse, body []byte, http gore
// CgiBinUserGet 获取用户列表 // CgiBinUserGet 获取用户列表
// https://developers.weixin.qq.com/doc/offiaccount/User_Management/Getting_a_User_List.html // https://developers.weixin.qq.com/doc/offiaccount/User_Management/Getting_a_User_List.html
func (c *Client) CgiBinUserGet(nextOpenid string) *CgiBinUserGetResult { func (c *Client) CgiBinUserGet(ctx context.Context, nextOpenid string) *CgiBinUserGetResult {
// 请求 // 请求
request, err := c.request(fmt.Sprintf(apiUrl+"/cgi-bin/user/get?access_token=%s&next_openid=%s", c.getAccessToken(), nextOpenid), map[string]interface{}{}, http.MethodGet) request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/user/get?access_token=%s&next_openid=%s", c.getAccessToken(ctx), nextOpenid), map[string]interface{}{}, http.MethodGet)
// 定义 // 定义
var response CgiBinUserGetResponse var response CgiBinUserGetResponse
err = json.Unmarshal(request.ResponseBody, &response) err = json.Unmarshal(request.ResponseBody, &response)

@ -1,6 +1,7 @@
package wechatoffice package wechatoffice
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"go.dtapp.net/gorequest" "go.dtapp.net/gorequest"
@ -39,9 +40,9 @@ func newCgiBinUserInfoResult(result CgiBinUserInfoResponse, body []byte, http go
// CgiBinUserInfo 获取用户基本信息(UnionID机制) // CgiBinUserInfo 获取用户基本信息(UnionID机制)
// https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId // https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId
func (c *Client) CgiBinUserInfo(openid string) *CgiBinUserInfoResult { func (c *Client) CgiBinUserInfo(ctx context.Context, openid string) *CgiBinUserInfoResult {
// 请求 // 请求
request, err := c.request(fmt.Sprintf(apiUrl+"/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN", c.getAccessToken(), openid), map[string]interface{}{}, http.MethodGet) request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN", c.getAccessToken(ctx), openid), map[string]interface{}{}, http.MethodGet)
// 定义 // 定义
var response CgiBinUserInfoResponse var response CgiBinUserInfoResponse
err = json.Unmarshal(request.ResponseBody, &response) err = json.Unmarshal(request.ResponseBody, &response)

@ -8,4 +8,4 @@ const (
logTable = "wechatoffice" logTable = "wechatoffice"
) )
const Version = "1.0.1" const Version = "1.0.2"

@ -1,6 +1,7 @@
package wechatoffice package wechatoffice
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"go.dtapp.net/gorequest" "go.dtapp.net/gorequest"
@ -25,9 +26,9 @@ func newDebugCgiBinTicketCheckResult(result DebugCgiBinTicketCheckResponse, body
// DebugCgiBinTicketCheck 判断ticket是否合法 // DebugCgiBinTicketCheck 判断ticket是否合法
// https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign // https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
func (c *Client) DebugCgiBinTicketCheck() *DebugCgiBinTicketCheckResult { func (c *Client) DebugCgiBinTicketCheck(ctx context.Context) *DebugCgiBinTicketCheckResult {
// 请求 // 请求
request, err := c.request(fmt.Sprintf("https://mp.weixin.qq.com/debug/cgi-bin/ticket/check?ticket=%s", c.getJsapiTicket()), map[string]interface{}{}, http.MethodGet) request, err := c.request(ctx, fmt.Sprintf("https://mp.weixin.qq.com/debug/cgi-bin/ticket/check?ticket=%s", c.getJsapiTicket(ctx)), map[string]interface{}{}, http.MethodGet)
// 定义 // 定义
var response DebugCgiBinTicketCheckResponse var response DebugCgiBinTicketCheckResponse
err = json.Unmarshal(request.ResponseBody, &response) err = json.Unmarshal(request.ResponseBody, &response)

@ -1,5 +1,7 @@
package wechatoffice package wechatoffice
import "context"
func (c *Client) GetAppId() string { func (c *Client) GetAppId() string {
return c.config.AppId return c.config.AppId
} }
@ -8,12 +10,12 @@ func (c *Client) GetAppSecret() string {
return c.config.AppSecret return c.config.AppSecret
} }
func (c *Client) getAccessToken() string { func (c *Client) getAccessToken(ctx context.Context) string {
c.config.AccessToken = c.GetAccessToken() c.config.AccessToken = c.GetAccessToken(ctx)
return c.config.AccessToken return c.config.AccessToken
} }
func (c *Client) getJsapiTicket() string { func (c *Client) getJsapiTicket(ctx context.Context) string {
c.config.JsapiTicket = c.GetJsapiTicket() c.config.JsapiTicket = c.GetJsapiTicket(ctx)
return c.config.JsapiTicket return c.config.JsapiTicket
} }

@ -1,6 +1,7 @@
package wechatoffice package wechatoffice
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"go.dtapp.net/gorequest" "go.dtapp.net/gorequest"
@ -25,9 +26,9 @@ func newGetCallBackIpResult(result GetCallBackIpResponse, body []byte, http gore
// GetCallBackIp 获取微信callback IP地址 // GetCallBackIp 获取微信callback IP地址
// callback IP即微信调用开发者服务器所使用的出口IP。 // callback IP即微信调用开发者服务器所使用的出口IP。
// https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html#2.%20%E8%8E%B7%E5%8F%96%E5%BE%AE%E4%BF%A1callback%20IP%E5%9C%B0%E5%9D%80 // https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html#2.%20%E8%8E%B7%E5%8F%96%E5%BE%AE%E4%BF%A1callback%20IP%E5%9C%B0%E5%9D%80
func (c *Client) GetCallBackIp() *GetCallBackIpResult { func (c *Client) GetCallBackIp(ctx context.Context) *GetCallBackIpResult {
// 请求 // 请求
request, err := c.request(fmt.Sprintf(apiUrl+"/cgi-bin/getcallbackip?access_token=%s", c.getAccessToken()), map[string]interface{}{}, http.MethodGet) request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/getcallbackip?access_token=%s", c.getAccessToken(ctx)), map[string]interface{}{}, http.MethodGet)
// 定义 // 定义
var response GetCallBackIpResponse var response GetCallBackIpResponse
err = json.Unmarshal(request.ResponseBody, &response) err = json.Unmarshal(request.ResponseBody, &response)

@ -3,8 +3,8 @@ module go.dtapp.net/wechatoffice
go 1.19 go 1.19
require ( require (
go.dtapp.net/dorm v1.0.14 go.dtapp.net/dorm v1.0.17
go.dtapp.net/golog v1.0.21 go.dtapp.net/golog v1.0.22
go.dtapp.net/gorandom v1.0.1 go.dtapp.net/gorandom v1.0.1
go.dtapp.net/gorequest v1.0.24 go.dtapp.net/gorequest v1.0.24
gorm.io/gorm v1.23.8 gorm.io/gorm v1.23.8
@ -69,14 +69,14 @@ require (
go.dtapp.net/gotime v1.0.5 // indirect go.dtapp.net/gotime v1.0.5 // indirect
go.dtapp.net/goxml v1.0.1 // indirect go.dtapp.net/goxml v1.0.1 // indirect
go.mongodb.org/mongo-driver v1.10.1 // indirect go.mongodb.org/mongo-driver v1.10.1 // indirect
go.uber.org/atomic v1.9.0 // indirect go.uber.org/atomic v1.10.0 // indirect
go.uber.org/multierr v1.8.0 // indirect go.uber.org/multierr v1.8.0 // indirect
go.uber.org/zap v1.22.0 // indirect go.uber.org/zap v1.22.0 // indirect
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
golang.org/x/net v0.0.0-20220809184613-07c6da5e1ced // indirect golang.org/x/net v0.0.0-20220811182439-13a9a731de15 // indirect
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect
golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664 // indirect golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect
golang.org/x/text v0.3.7 // indirect golang.org/x/text v0.3.7 // indirect
google.golang.org/protobuf v1.28.1 // indirect google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect

@ -500,14 +500,14 @@ github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
go.dtapp.net/dorm v1.0.14 h1:HDsaMwKGlKFKt59Y3hPI9aVnSjfXOyjoHw2uoXErKEo= go.dtapp.net/dorm v1.0.17 h1:3VQKUl05CDxFg3T1c/M8wYf2I+H+oVGBDh4NCV30nn0=
go.dtapp.net/dorm v1.0.14/go.mod h1:bHG7BmgeLaAlc56myYF63lwZAIuMeWRAqHBb/L84dLM= go.dtapp.net/dorm v1.0.17/go.mod h1:bHG7BmgeLaAlc56myYF63lwZAIuMeWRAqHBb/L84dLM=
go.dtapp.net/goip v1.0.24 h1:62k3xt9I/YLUwA5tLp7YC8XPskkswc4RJrvxRRxjwIY= go.dtapp.net/goip v1.0.24 h1:62k3xt9I/YLUwA5tLp7YC8XPskkswc4RJrvxRRxjwIY=
go.dtapp.net/goip v1.0.24/go.mod h1:tps0yoq5kSykLGDb01vuai47hzAQ6nYUPFWLdlQA2Oo= go.dtapp.net/goip v1.0.24/go.mod h1:tps0yoq5kSykLGDb01vuai47hzAQ6nYUPFWLdlQA2Oo=
go.dtapp.net/gojson v1.0.1 h1:MHeSGlq1KxzL7rCkm18fhwW4GNORHohdDMmxY5PupKY= go.dtapp.net/gojson v1.0.1 h1:MHeSGlq1KxzL7rCkm18fhwW4GNORHohdDMmxY5PupKY=
go.dtapp.net/gojson v1.0.1/go.mod h1:TkkpTNxHBKxul0e7gC5MrL1K4ICFB9mQ7wHzjBah3/k= go.dtapp.net/gojson v1.0.1/go.mod h1:TkkpTNxHBKxul0e7gC5MrL1K4ICFB9mQ7wHzjBah3/k=
go.dtapp.net/golog v1.0.21 h1:pSGmDz3SJTH7M/NvVLZb+YJd8uNl5g18aORibuaY2JU= go.dtapp.net/golog v1.0.22 h1:sOJr5f/iLk/6irT/RuwTQSTwvL2DR8SIhzMsKdHo0Ic=
go.dtapp.net/golog v1.0.21/go.mod h1:Wxm2Kh77JN5zFDZ72el9E9c/YkoJnOvHVusB7SqvoC8= go.dtapp.net/golog v1.0.22/go.mod h1:sbn2WQXmlukcZ4T3Kz9iWOSznL8H3RCkD+1nicZHMfI=
go.dtapp.net/gorandom v1.0.1 h1:IWfMClh1ECPvyUjlqD7MwLq4mZdUusD1qAwAdsvEJBs= go.dtapp.net/gorandom v1.0.1 h1:IWfMClh1ECPvyUjlqD7MwLq4mZdUusD1qAwAdsvEJBs=
go.dtapp.net/gorandom v1.0.1/go.mod h1:ZPdgalKpvFV/ATQqR0k4ns/F/IpITAZpx6WkWirr5Y8= go.dtapp.net/gorandom v1.0.1/go.mod h1:ZPdgalKpvFV/ATQqR0k4ns/F/IpITAZpx6WkWirr5Y8=
go.dtapp.net/gorequest v1.0.24 h1:N2RJOpCXPWbsjfQ8iYJI1EYC2se3I4QhK1l94DSJsuE= go.dtapp.net/gorequest v1.0.24 h1:N2RJOpCXPWbsjfQ8iYJI1EYC2se3I4QhK1l94DSJsuE=
@ -530,8 +530,8 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
@ -602,8 +602,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220809184613-07c6da5e1ced h1:3dYNDff0VT5xj+mbj2XucFst9WKk6PdGOrb9n+SbIvw= golang.org/x/net v0.0.0-20220811182439-13a9a731de15 h1:cik0bxZUSJVDyaHf1hZPSDsU8SZHGQZQMeueXCE7yBQ=
golang.org/x/net v0.0.0-20220809184613-07c6da5e1ced/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20220811182439-13a9a731de15/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -648,8 +648,8 @@ golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664 h1:v1W7bwXHsnLLloWYTVEdvGvA7BHMeBYsPcF0GLDxIRs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU=
golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

@ -1,6 +1,7 @@
package wechatoffice package wechatoffice
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"go.dtapp.net/gorequest" "go.dtapp.net/gorequest"
@ -26,11 +27,11 @@ func newMessageTemplateSendResult(result MessageTemplateSendResponse, body []byt
// MessageTemplateSend 模板消息 // MessageTemplateSend 模板消息
// https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html // https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html
func (c *Client) MessageTemplateSend(notMustParams ...gorequest.Params) *MessageTemplateSendResult { func (c *Client) MessageTemplateSend(ctx context.Context, notMustParams ...gorequest.Params) *MessageTemplateSendResult {
// 参数 // 参数
params := gorequest.NewParamsWith(notMustParams...) params := gorequest.NewParamsWith(notMustParams...)
// 请求 // 请求
request, err := c.request(fmt.Sprintf(apiUrl+"/cgi-bin/message/template/send?access_token=%s", c.getAccessToken()), params, http.MethodPost) request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/cgi-bin/message/template/send?access_token=%s", c.getAccessToken(ctx)), params, http.MethodPost)
// 定义 // 定义
var response MessageTemplateSendResponse var response MessageTemplateSendResponse
err = json.Unmarshal(request.ResponseBody, &response) err = json.Unmarshal(request.ResponseBody, &response)

@ -1,13 +1,14 @@
package wechatoffice package wechatoffice
import ( import (
"context"
"fmt" "fmt"
"net/url" "net/url"
) )
// Oauth2 用户同意授权获取code // Oauth2 用户同意授权获取code
// https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#0 // https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#0
func (c *Client) Oauth2(redirectUri, state string) string { func (c *Client) Oauth2(ctx context.Context, redirectUri, state string) string {
param := url.Values{} param := url.Values{}
param.Add("appid", c.GetAppId()) // 公众号的唯一标识 param.Add("appid", c.GetAppId()) // 公众号的唯一标识
param.Add("redirect_uri", redirectUri) // 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理 param.Add("redirect_uri", redirectUri) // 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理

@ -1,9 +1,12 @@
package wechatoffice package wechatoffice
import "go.dtapp.net/gorequest" import (
"context"
"go.dtapp.net/gorequest"
)
// 请求接口 // 请求接口
func (c *Client) request(url string, params map[string]interface{}, method string) (gorequest.Response, error) { func (c *Client) request(ctx context.Context, url string, params map[string]interface{}, method string) (gorequest.Response, error) {
// 创建请求 // 创建请求
client := c.client client := c.client
@ -28,7 +31,7 @@ func (c *Client) request(url string, params map[string]interface{}, method strin
// 日志 // 日志
if c.config.PgsqlDb != nil { if c.config.PgsqlDb != nil {
go c.log.GormMiddleware(request, Version) go c.log.GormMiddleware(ctx, request, Version)
} }
if c.config.MongoDb != nil { if c.config.MongoDb != nil {
go c.log.MongoMiddleware(request) go c.log.MongoMiddleware(request)

@ -1,6 +1,7 @@
package wechatoffice package wechatoffice
import ( import (
"context"
"crypto/sha1" "crypto/sha1"
"fmt" "fmt"
"go.dtapp.net/gorandom" "go.dtapp.net/gorandom"
@ -26,9 +27,9 @@ func newShareResult(result ShareResponse, err error) *ShareResult {
return &ShareResult{Result: result, Err: err} return &ShareResult{Result: result, Err: err}
} }
func (c *Client) Share(url string) *ShareResult { func (c *Client) Share(ctx context.Context, url string) *ShareResult {
c.getAccessToken() c.getAccessToken(ctx)
c.config.JsapiTicket = c.GetJsapiTicket() c.config.JsapiTicket = c.GetJsapiTicket(ctx)
var response ShareResponse var response ShareResponse
response.AppId = c.GetAppId() response.AppId = c.GetAppId()
response.NonceStr = gorandom.Alphanumeric(32) response.NonceStr = gorandom.Alphanumeric(32)

@ -1,6 +1,7 @@
package wechatoffice package wechatoffice
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"go.dtapp.net/gorequest" "go.dtapp.net/gorequest"
@ -26,9 +27,9 @@ func newSnsJsCode2sessionResult(result SnsJsCode2sessionResponse, body []byte, h
return &SnsJsCode2sessionResult{Result: result, Body: body, Http: http, Err: err} return &SnsJsCode2sessionResult{Result: result, Body: body, Http: http, Err: err}
} }
func (c *Client) SnsJsCode2session(jsCode string) *SnsJsCode2sessionResult { func (c *Client) SnsJsCode2session(ctx context.Context, jsCode string) *SnsJsCode2sessionResult {
// 请求 // 请求
request, err := c.request(fmt.Sprintf(apiUrl+"/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", c.GetAppId(), c.GetAppSecret(), jsCode), map[string]interface{}{}, http.MethodGet) request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", c.GetAppId(), c.GetAppSecret(), jsCode), map[string]interface{}{}, http.MethodGet)
// 定义 // 定义
var response SnsJsCode2sessionResponse var response SnsJsCode2sessionResponse
err = json.Unmarshal(request.ResponseBody, &response) err = json.Unmarshal(request.ResponseBody, &response)

@ -1,6 +1,7 @@
package wechatoffice package wechatoffice
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"go.dtapp.net/gorequest" "go.dtapp.net/gorequest"
@ -28,9 +29,9 @@ func newSnsOauth2AccessTokenResult(result SnsOauth2AccessTokenResponse, body []b
// SnsOauth2AccessToken 通过code换取网页授权access_token // SnsOauth2AccessToken 通过code换取网页授权access_token
// https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#0 // https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#0
func (c *Client) SnsOauth2AccessToken(code string) *SnsOauth2AccessTokenResult { func (c *Client) SnsOauth2AccessToken(ctx context.Context, code string) *SnsOauth2AccessTokenResult {
// 请求 // 请求
request, err := c.request(fmt.Sprintf(apiUrl+"/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code", c.GetAppId(), c.GetAppSecret(), code), map[string]interface{}{}, http.MethodGet) request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code", c.GetAppId(), c.GetAppSecret(), code), map[string]interface{}{}, http.MethodGet)
// 定义 // 定义
var response SnsOauth2AccessTokenResponse var response SnsOauth2AccessTokenResponse
err = json.Unmarshal(request.ResponseBody, &response) err = json.Unmarshal(request.ResponseBody, &response)

@ -1,6 +1,7 @@
package wechatoffice package wechatoffice
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"go.dtapp.net/gorequest" "go.dtapp.net/gorequest"
@ -32,9 +33,9 @@ func newSnsUserinfoResult(result SnsUserinfoResponse, body []byte, http goreques
// SnsUserinfo 拉取用户信息(需scope为 snsapi_userinfo) // SnsUserinfo 拉取用户信息(需scope为 snsapi_userinfo)
// https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#0 // https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#0
func (c *Client) SnsUserinfo(accessToken, openid string) *SnsUserinfoResult { func (c *Client) SnsUserinfo(ctx context.Context, accessToken, openid string) *SnsUserinfoResult {
// 请求 // 请求
request, err := c.request(fmt.Sprintf(apiUrl+"/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN", accessToken, openid), map[string]interface{}{}, http.MethodGet) request, err := c.request(ctx, fmt.Sprintf(apiUrl+"/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN", accessToken, openid), map[string]interface{}{}, http.MethodGet)
// 定义 // 定义
var response SnsUserinfoResponse var response SnsUserinfoResponse
err = json.Unmarshal(request.ResponseBody, &response) err = json.Unmarshal(request.ResponseBody, &response)

Loading…
Cancel
Save