js.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package js
  2. import (
  3. "fmt"
  4. "github.com/silenceper/wechat/v2/credential"
  5. "github.com/silenceper/wechat/v2/officialaccount/context"
  6. "github.com/silenceper/wechat/v2/util"
  7. )
  8. // Js struct
  9. type Js struct {
  10. *context.Context
  11. credential.JsTicketHandle
  12. }
  13. // Config 返回给用户jssdk配置信息
  14. type Config struct {
  15. AppID string `json:"app_id"`
  16. Timestamp int64 `json:"timestamp"`
  17. NonceStr string `json:"nonce_str"`
  18. Signature string `json:"signature"`
  19. }
  20. //NewJs init
  21. func NewJs(context *context.Context) *Js {
  22. js := new(Js)
  23. js.Context = context
  24. jsTicketHandle := credential.NewDefaultJsTicket(context.AppID, credential.CacheKeyOfficialAccountPrefix, context.Cache)
  25. js.SetJsTicketHandle(jsTicketHandle)
  26. return js
  27. }
  28. //SetJsTicketHandle 自定义js ticket取值方式
  29. func (js *Js) SetJsTicketHandle(ticketHandle credential.JsTicketHandle) {
  30. js.JsTicketHandle = ticketHandle
  31. }
  32. //GetConfig 获取jssdk需要的配置参数
  33. //uri 为当前网页地址
  34. func (js *Js) GetConfig(uri string) (config *Config, err error) {
  35. config = new(Config)
  36. var accessToken string
  37. accessToken, err = js.GetAccessToken()
  38. if err != nil {
  39. return
  40. }
  41. var ticketStr string
  42. ticketStr, err = js.GetTicket(accessToken)
  43. if err != nil {
  44. return
  45. }
  46. nonceStr := util.RandomStr(16)
  47. timestamp := util.GetCurrTS()
  48. str := fmt.Sprintf("jsapi_ticket=%s&noncestr=%s&timestamp=%d&url=%s", ticketStr, nonceStr, timestamp, uri)
  49. sigStr := util.Signature(str)
  50. config.AppID = js.AppID
  51. config.NonceStr = nonceStr
  52. config.Timestamp = timestamp
  53. config.Signature = sigStr
  54. return
  55. }