| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- package js
- import (
- context2 "context"
- "fmt"
- "github.com/silenceper/wechat/v2/credential"
- "github.com/silenceper/wechat/v2/officialaccount/context"
- "github.com/silenceper/wechat/v2/util"
- )
- // Js struct
- type Js struct {
- *context.Context
- credential.JsTicketHandle
- }
- // Config 返回给用户jssdk配置信息
- type Config struct {
- AppID string `json:"app_id"`
- Timestamp int64 `json:"timestamp"`
- NonceStr string `json:"nonce_str"`
- Signature string `json:"signature"`
- }
- // NewJs init
- func NewJs(context *context.Context) *Js {
- js := new(Js)
- js.Context = context
- jsTicketHandle := credential.NewDefaultJsTicket(context.AppID, credential.CacheKeyOfficialAccountPrefix, context.Cache)
- js.SetJsTicketHandle(jsTicketHandle)
- return js
- }
- // SetJsTicketHandle 自定义js ticket取值方式
- func (js *Js) SetJsTicketHandle(ticketHandle credential.JsTicketHandle) {
- js.JsTicketHandle = ticketHandle
- }
- // GetConfig 获取jssdk需要的配置参数
- // uri 为当前网页地址
- func (js *Js) GetConfig(uri string) (config *Config, err error) {
- return js.GetConfigContext(context2.Background(), uri)
- }
- // GetConfigContext 新方法,允许传入上下文,避免协程泄漏
- func (js *Js) GetConfigContext(ctx context2.Context, uri string) (config *Config, err error) {
- var accessToken string
- // 类型断言,如果断言成功,调用安全的 GetAccessTokenContext 方法
- if ctxHandle, ok := js.Context.AccessTokenHandle.(credential.AccessTokenContextHandle); ok {
- accessToken, err = ctxHandle.GetAccessTokenContext(ctx)
- } else {
- // 如果没有实现 AccessTokenContextHandle 接口,调用旧的 GetAccessToken 方法
- accessToken, err = js.Context.GetAccessToken()
- }
- if err != nil {
- return
- }
- var ticketStr string
- // 类型断言 jsTicket
- if ticketCtxHandle, ok := js.JsTicketHandle.(credential.JsTicketContextHandle); ok {
- ticketStr, err = ticketCtxHandle.GetTicketContext(ctx, accessToken)
- } else {
- // 如果没有实现 JsTicketContextHandle 接口,调用旧的 GetTicket 方法
- ticketStr, err = js.GetTicket(accessToken)
- }
- if err != nil {
- return
- }
- nonceStr := util.RandomStr(16)
- timestamp := util.GetCurrTS()
- str := fmt.Sprintf("jsapi_ticket=%s&noncestr=%s×tamp=%d&url=%s", ticketStr, nonceStr, timestamp, uri)
- sigStr := util.Signature(str)
- config = new(Config)
- config.AppID = js.AppID
- config.NonceStr = nonceStr
- config.Timestamp = timestamp
- config.Signature = sigStr
- return
- }
|