mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-04 12:52:27 +08:00
rebase release-2.0
This commit is contained in:
3
go.mod
3
go.mod
@@ -4,6 +4,9 @@ go 1.14
|
||||
|
||||
require (
|
||||
github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/gomodule/redigo v1.8.1
|
||||
github.com/kr/pretty v0.1.0 // indirect
|
||||
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
|
||||
)
|
||||
|
||||
7
go.sum
7
go.sum
@@ -2,8 +2,13 @@ github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b h1:L/QXpzIa3pO
|
||||
github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA=
|
||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/gomodule/redigo v1.8.1 h1:Abmo0bI7Xf0IhdIPc7HZQzZcShdnmxeoVuDDtIQp8N8=
|
||||
github.com/gomodule/redigo v1.8.1/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
@@ -18,5 +23,7 @@ golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
|
||||
@@ -2,4 +2,7 @@
|
||||
|
||||
[官方文档](https://developers.weixin.qq.com/minigame/dev/api-backend/)
|
||||
|
||||
## 快速入门
|
||||
## 快速入门
|
||||
```go
|
||||
|
||||
```
|
||||
@@ -2,4 +2,19 @@
|
||||
|
||||
[官方文档](https://developers.weixin.qq.com/miniprogram/dev/framework/)
|
||||
|
||||
|
||||
## 包说明
|
||||
- analysis 数据分析相关API
|
||||
|
||||
## 快速入门
|
||||
```go
|
||||
wc := wechat.NewWechat()
|
||||
memory := cache.NewMemory()
|
||||
cfg := &miniConfig.Config{
|
||||
AppID: "xxx",
|
||||
AppSecret: "xxx",
|
||||
Cache: memory,
|
||||
}
|
||||
miniprogram := wc.GetMiniProgram(cfg)
|
||||
miniprogram.GetAnalysis().GetAnalysisDailyRetain()
|
||||
```
|
||||
@@ -72,6 +72,7 @@ const (
|
||||
)
|
||||
|
||||
const (
|
||||
//微信开放平台需要用到
|
||||
// InfoTypeVerifyTicket 返回ticket
|
||||
InfoTypeVerifyTicket InfoType = "component_verify_ticket"
|
||||
// InfoTypeAuthorized 授权
|
||||
|
||||
@@ -24,9 +24,9 @@ type OfficialAccount struct {
|
||||
|
||||
//NewOfficialAccount 实例化公众号API
|
||||
func NewOfficialAccount(cfg *config.Config) *OfficialAccount {
|
||||
if cfg.Cache == nil {
|
||||
panic("cache未设置")
|
||||
}
|
||||
//if cfg.Cache == nil {
|
||||
// panic("cache未设置")
|
||||
//}
|
||||
ctx := &context.Context{
|
||||
Config: cfg,
|
||||
}
|
||||
|
||||
@@ -1,5 +1,55 @@
|
||||
# 微信开放平台
|
||||
|
||||
状态:开发中
|
||||
|
||||
[官方文档](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Third_party_platform_appid.html)
|
||||
|
||||
## 快速入门
|
||||
## 快速入门
|
||||
|
||||
```go
|
||||
wc := wechat.NewWechat()
|
||||
memory := cache.NewMemory()
|
||||
cfg := &openplatform.Config{
|
||||
AppID: "xxx",
|
||||
AppSecret: "xxx",
|
||||
Token: "xxx",
|
||||
EncodingAESKey: "xxx",
|
||||
Cache: memory,
|
||||
}
|
||||
|
||||
//授权的第三方公众号的appID
|
||||
appID := "xxx"
|
||||
openPlatform := wc.GetOpenPlatform(cfg)
|
||||
officialAccount := openPlatform.GetOfficialAccount(appID)
|
||||
|
||||
// 传入request和responseWriter
|
||||
server := officialAccount.GetServer(req, rw)
|
||||
//设置接收消息的处理方法
|
||||
server.SetMessageHandler(func(msg message.MixMessage) *message.Reply {
|
||||
if msg.InfoType == message.InfoTypeVerifyTicket {
|
||||
componentVerifyTicket, err := openPlatform.SetComponentAccessToken(msg.ComponentVerifyTicket)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return nil
|
||||
}
|
||||
//debug
|
||||
fmt.Println(componentVerifyTicket)
|
||||
rw.Write([]byte("success"))
|
||||
return nil
|
||||
}
|
||||
//handle other message
|
||||
//
|
||||
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
//处理消息接收以及回复
|
||||
err := server.Serve()
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
//发送回复的消息
|
||||
server.Send()
|
||||
```
|
||||
14
openplatform/config/config.go
Normal file
14
openplatform/config/config.go
Normal file
@@ -0,0 +1,14 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"github.com/silenceper/wechat/v2/cache"
|
||||
)
|
||||
|
||||
//Config config for 微信开放平台
|
||||
type Config struct {
|
||||
AppID string `json:"app_id"` //appid
|
||||
AppSecret string `json:"app_secret"` //appsecret
|
||||
Token string `json:"token"` //token
|
||||
EncodingAESKey string `json:"encoding_aes_key"` //EncodingAESKey
|
||||
Cache cache.Cache
|
||||
}
|
||||
224
openplatform/context/accessToken.go
Normal file
224
openplatform/context/accessToken.go
Normal file
@@ -0,0 +1,224 @@
|
||||
package context
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/silenceper/wechat/v2/util"
|
||||
)
|
||||
|
||||
const (
|
||||
componentAccessTokenURL = "https://api.weixin.qq.com/cgi-bin/component/api_component_token"
|
||||
getPreCodeURL = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=%s"
|
||||
queryAuthURL = "https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=%s"
|
||||
refreshTokenURL = "https://api.weixin.qq.com/cgi-bin/component/api_authorizer_token?component_access_token=%s"
|
||||
getComponentInfoURL = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token=%s"
|
||||
getComponentConfigURL = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_option?component_access_token=%s"
|
||||
)
|
||||
|
||||
// ComponentAccessToken 第三方平台
|
||||
type ComponentAccessToken struct {
|
||||
AccessToken string `json:"component_access_token"`
|
||||
ExpiresIn int64 `json:"expires_in"`
|
||||
}
|
||||
|
||||
// GetComponentAccessToken 获取 ComponentAccessToken
|
||||
func (ctx *Context) GetComponentAccessToken() (string, error) {
|
||||
accessTokenCacheKey := fmt.Sprintf("component_access_token_%s", ctx.AppID)
|
||||
val := ctx.Cache.Get(accessTokenCacheKey)
|
||||
if val == nil {
|
||||
return "", fmt.Errorf("cann't get component access token")
|
||||
}
|
||||
return val.(string), nil
|
||||
}
|
||||
|
||||
// SetComponentAccessToken 通过component_verify_ticket 获取 ComponentAccessToken
|
||||
func (ctx *Context) SetComponentAccessToken(verifyTicket string) (*ComponentAccessToken, error) {
|
||||
body := map[string]string{
|
||||
"component_appid": ctx.AppID,
|
||||
"component_appsecret": ctx.AppSecret,
|
||||
"component_verify_ticket": verifyTicket,
|
||||
}
|
||||
respBody, err := util.PostJSON(componentAccessTokenURL, body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
at := &ComponentAccessToken{}
|
||||
if err := json.Unmarshal(respBody, at); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
accessTokenCacheKey := fmt.Sprintf("component_access_token_%s", ctx.AppID)
|
||||
expires := at.ExpiresIn - 1500
|
||||
if err := ctx.Cache.Set(accessTokenCacheKey, at.AccessToken, time.Duration(expires)*time.Second); err != nil {
|
||||
return nil, nil
|
||||
}
|
||||
return at, nil
|
||||
}
|
||||
|
||||
// GetPreCode 获取预授权码
|
||||
func (ctx *Context) GetPreCode() (string, error) {
|
||||
cat, err := ctx.GetComponentAccessToken()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
req := map[string]string{
|
||||
"component_appid": ctx.AppID,
|
||||
}
|
||||
uri := fmt.Sprintf(getPreCodeURL, cat)
|
||||
body, err := util.PostJSON(uri, req)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
var ret struct {
|
||||
PreCode string `json:"pre_auth_code"`
|
||||
}
|
||||
if err := json.Unmarshal(body, &ret); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return ret.PreCode, nil
|
||||
}
|
||||
|
||||
// ID 微信返回接口中各种类型字段
|
||||
type ID struct {
|
||||
ID int `json:"id"`
|
||||
}
|
||||
|
||||
// AuthBaseInfo 授权的基本信息
|
||||
type AuthBaseInfo struct {
|
||||
AuthrAccessToken
|
||||
FuncInfo []AuthFuncInfo `json:"func_info"`
|
||||
}
|
||||
|
||||
// AuthFuncInfo 授权的接口内容
|
||||
type AuthFuncInfo struct {
|
||||
FuncscopeCategory ID `json:"funcscope_category"`
|
||||
}
|
||||
|
||||
// AuthrAccessToken 授权方AccessToken
|
||||
type AuthrAccessToken struct {
|
||||
Appid string `json:"authorizer_appid"`
|
||||
AccessToken string `json:"authorizer_access_token"`
|
||||
ExpiresIn int64 `json:"expires_in"`
|
||||
RefreshToken string `json:"authorizer_refresh_token"`
|
||||
}
|
||||
|
||||
// QueryAuthCode 使用授权码换取公众号或小程序的接口调用凭据和授权信息
|
||||
func (ctx *Context) QueryAuthCode(authCode string) (*AuthBaseInfo, error) {
|
||||
cat, err := ctx.GetComponentAccessToken()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
req := map[string]string{
|
||||
"component_appid": ctx.AppID,
|
||||
"authorization_code": authCode,
|
||||
}
|
||||
uri := fmt.Sprintf(queryAuthURL, cat)
|
||||
body, err := util.PostJSON(uri, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var ret struct {
|
||||
Info *AuthBaseInfo `json:"authorization_info"`
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(body, &ret); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return ret.Info, nil
|
||||
}
|
||||
|
||||
// RefreshAuthrToken 获取(刷新)授权公众号或小程序的接口调用凭据(令牌)
|
||||
func (ctx *Context) RefreshAuthrToken(appid, refreshToken string) (*AuthrAccessToken, error) {
|
||||
cat, err := ctx.GetComponentAccessToken()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
req := map[string]string{
|
||||
"component_appid": ctx.AppID,
|
||||
"authorizer_appid": appid,
|
||||
"authorizer_refresh_token": refreshToken,
|
||||
}
|
||||
uri := fmt.Sprintf(refreshTokenURL, cat)
|
||||
body, err := util.PostJSON(uri, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ret := &AuthrAccessToken{}
|
||||
if err := json.Unmarshal(body, ret); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
authrTokenKey := "authorizer_access_token_" + appid
|
||||
if err := ctx.Cache.Set(authrTokenKey, ret.AccessToken, time.Minute*80); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
// GetAuthrAccessToken 获取授权方AccessToken
|
||||
func (ctx *Context) GetAuthrAccessToken(appid string) (string, error) {
|
||||
authrTokenKey := "authorizer_access_token_" + appid
|
||||
val := ctx.Cache.Get(authrTokenKey)
|
||||
if val == nil {
|
||||
return "", fmt.Errorf("cannot get authorizer %s access token", appid)
|
||||
}
|
||||
return val.(string), nil
|
||||
}
|
||||
|
||||
// AuthorizerInfo 授权方详细信息
|
||||
type AuthorizerInfo struct {
|
||||
NickName string `json:"nick_name"`
|
||||
HeadImg string `json:"head_img"`
|
||||
ServiceTypeInfo ID `json:"service_type_info"`
|
||||
VerifyTypeInfo ID `json:"verify_type_info"`
|
||||
UserName string `json:"user_name"`
|
||||
PrincipalName string `json:"principal_name"`
|
||||
BusinessInfo struct {
|
||||
OpenStore string `json:"open_store"`
|
||||
OpenScan string `json:"open_scan"`
|
||||
OpenPay string `json:"open_pay"`
|
||||
OpenCard string `json:"open_card"`
|
||||
OpenShake string `json:"open_shake"`
|
||||
}
|
||||
Alias string `json:"alias"`
|
||||
QrcodeURL string `json:"qrcode_url"`
|
||||
}
|
||||
|
||||
// GetAuthrInfo 获取授权方的帐号基本信息
|
||||
func (ctx *Context) GetAuthrInfo(appid string) (*AuthorizerInfo, *AuthBaseInfo, error) {
|
||||
cat, err := ctx.GetComponentAccessToken()
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
req := map[string]string{
|
||||
"component_appid": ctx.AppID,
|
||||
"authorizer_appid": appid,
|
||||
}
|
||||
|
||||
uri := fmt.Sprintf(getComponentInfoURL, cat)
|
||||
body, err := util.PostJSON(uri, req)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
var ret struct {
|
||||
AuthorizerInfo *AuthorizerInfo `json:"authorizer_info"`
|
||||
AuthorizationInfo *AuthBaseInfo `json:"authorization_info"`
|
||||
}
|
||||
if err := json.Unmarshal(body, &ret); err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
return ret.AuthorizerInfo, ret.AuthorizationInfo, nil
|
||||
}
|
||||
10
openplatform/context/context.go
Normal file
10
openplatform/context/context.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package context
|
||||
|
||||
import (
|
||||
"github.com/silenceper/wechat/v2/openplatform/config"
|
||||
)
|
||||
|
||||
// Context struct
|
||||
type Context struct {
|
||||
*config.Config
|
||||
}
|
||||
32
openplatform/officialaccount/officialaccount.go
Normal file
32
openplatform/officialaccount/officialaccount.go
Normal file
@@ -0,0 +1,32 @@
|
||||
package officialaccount
|
||||
|
||||
import (
|
||||
"github.com/silenceper/wechat/v2/officialaccount"
|
||||
offConfig "github.com/silenceper/wechat/v2/officialaccount/config"
|
||||
offContext "github.com/silenceper/wechat/v2/officialaccount/context"
|
||||
opContext "github.com/silenceper/wechat/v2/openplatform/context"
|
||||
)
|
||||
|
||||
type OfficialAccount struct {
|
||||
//授权的公众号的appID
|
||||
appID string
|
||||
*officialaccount.OfficialAccount
|
||||
opContext *opContext.Context
|
||||
}
|
||||
|
||||
//NewOfficialAccount 实例化
|
||||
//appID :为授权方公众号 APPID,非开放平台第三方平台 APPID
|
||||
func NewOfficialAccount(opCtx *opContext.Context, appID string) *OfficialAccount {
|
||||
officialAccount := officialaccount.NewOfficialAccount(&offConfig.Config{
|
||||
AppID: opCtx.AppID,
|
||||
EncodingAESKey: opCtx.EncodingAESKey,
|
||||
Token: opCtx.Token,
|
||||
Cache: opCtx.Cache,
|
||||
})
|
||||
//设置获取access_token的函数
|
||||
officialAccount.GetContext().SetGetAccessTokenFunc(func(offCtx *offContext.Context) (accessToken string, err error) {
|
||||
// 获取授权方的access_token
|
||||
return opCtx.GetAuthrAccessToken(appID)
|
||||
})
|
||||
return &OfficialAccount{appID: appID, OfficialAccount: officialAccount}
|
||||
}
|
||||
28
openplatform/openplatform.go
Normal file
28
openplatform/openplatform.go
Normal file
@@ -0,0 +1,28 @@
|
||||
package openplatform
|
||||
|
||||
import (
|
||||
"github.com/silenceper/wechat/v2/openplatform/config"
|
||||
"github.com/silenceper/wechat/v2/openplatform/context"
|
||||
"github.com/silenceper/wechat/v2/openplatform/officialaccount"
|
||||
)
|
||||
|
||||
//OpenPlatform 微信开放平台相关api
|
||||
type OpenPlatform struct {
|
||||
*context.Context
|
||||
}
|
||||
|
||||
//NewOpenPlatform new openplatform
|
||||
func NewOpenPlatform(cfg *config.Config) *OpenPlatform {
|
||||
if cfg.Cache == nil {
|
||||
panic("cache 未设置")
|
||||
}
|
||||
ctx := &context.Context{
|
||||
Config: cfg,
|
||||
}
|
||||
return &OpenPlatform{ctx}
|
||||
}
|
||||
|
||||
//GetOfficialAccount 公众号代处理
|
||||
func (openPlatform *OpenPlatform) GetOfficialAccount(appID string) *officialaccount.OfficialAccount {
|
||||
return officialaccount.NewOfficialAccount(openPlatform.Context, appID)
|
||||
}
|
||||
30
wechat.go
30
wechat.go
@@ -1,24 +1,20 @@
|
||||
package wechat
|
||||
|
||||
import (
|
||||
"github.com/silenceper/wechat/v2/cache"
|
||||
"github.com/silenceper/wechat/v2/miniprogram"
|
||||
miniConfig "github.com/silenceper/wechat/v2/miniprogram/config"
|
||||
payConfig "github.com/silenceper/wechat/v2/pay/config"
|
||||
|
||||
"github.com/silenceper/wechat/v2/officialaccount"
|
||||
offConfig "github.com/silenceper/wechat/v2/officialaccount/config"
|
||||
"github.com/silenceper/wechat/v2/openplatform"
|
||||
openConfig "github.com/silenceper/wechat/v2/openplatform/config"
|
||||
"github.com/silenceper/wechat/v2/pay"
|
||||
payConfig "github.com/silenceper/wechat/v2/pay/config"
|
||||
)
|
||||
|
||||
// Wechat struct
|
||||
type Wechat struct {
|
||||
}
|
||||
|
||||
// Config for user
|
||||
type Config struct {
|
||||
PayMchID string //支付 - 商户 ID
|
||||
PayNotifyURL string //支付 - 接受微信支付结果通知的接口地址
|
||||
PayKey string //支付 - 商户后台设置的支付 key
|
||||
cache cache.Cache
|
||||
}
|
||||
|
||||
// NewWechat init
|
||||
@@ -26,13 +22,24 @@ func NewWechat() *Wechat {
|
||||
return &Wechat{}
|
||||
}
|
||||
|
||||
//SetCache 设置cache
|
||||
func (wc *Wechat) SetCache(cahce cache.Cache) {
|
||||
wc.cache = cahce
|
||||
}
|
||||
|
||||
//GetOfficialAccount 获取微信公众号实例
|
||||
func (wc *Wechat) GetOfficialAccount(cfg *offConfig.Config) *officialaccount.OfficialAccount {
|
||||
if cfg.Cache == nil {
|
||||
cfg.Cache = wc.cache
|
||||
}
|
||||
return officialaccount.NewOfficialAccount(cfg)
|
||||
}
|
||||
|
||||
// GetMiniProgram 获取小程序的实例
|
||||
func (wc *Wechat) GetMiniProgram(cfg *miniConfig.Config) *miniprogram.MiniProgram {
|
||||
if cfg.Cache == nil {
|
||||
cfg.Cache = wc.cache
|
||||
}
|
||||
return miniprogram.NewMiniProgram(cfg)
|
||||
}
|
||||
|
||||
@@ -40,3 +47,8 @@ func (wc *Wechat) GetMiniProgram(cfg *miniConfig.Config) *miniprogram.MiniProgra
|
||||
func (wc *Wechat) GetPay(cfg *payConfig.Config) *pay.Pay {
|
||||
return pay.NewPay(cfg)
|
||||
}
|
||||
|
||||
// GetOpenPlatform 获取微信开放平台的实例
|
||||
func (wc *Wechat) GetOpenPlatform(cfg *openConfig.Config) *openplatform.OpenPlatform {
|
||||
return openplatform.NewOpenPlatform(cfg)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user