miniprogram.go 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package miniprogram
  2. import (
  3. "fmt"
  4. "github.com/silenceper/wechat/v2/credential"
  5. "github.com/silenceper/wechat/v2/miniprogram"
  6. miniConfig "github.com/silenceper/wechat/v2/miniprogram/config"
  7. miniContext "github.com/silenceper/wechat/v2/miniprogram/context"
  8. "github.com/silenceper/wechat/v2/miniprogram/urllink"
  9. openContext "github.com/silenceper/wechat/v2/openplatform/context"
  10. "github.com/silenceper/wechat/v2/openplatform/miniprogram/basic"
  11. "github.com/silenceper/wechat/v2/openplatform/miniprogram/component"
  12. )
  13. // MiniProgram 代小程序实现业务
  14. type MiniProgram struct {
  15. AppID string
  16. openContext *openContext.Context
  17. *miniprogram.MiniProgram
  18. authorizerRefreshToken string
  19. }
  20. // GetAccessToken 获取 ak
  21. func (miniProgram *MiniProgram) GetAccessToken() (string, error) {
  22. ak, akErr := miniProgram.openContext.GetAuthrAccessToken(miniProgram.AppID)
  23. if akErr == nil {
  24. return ak, nil
  25. }
  26. if miniProgram.authorizerRefreshToken == "" {
  27. return "", fmt.Errorf("please set the authorizer_refresh_token first")
  28. }
  29. akRes, akResErr := miniProgram.GetComponent().RefreshAuthrToken(miniProgram.AppID, miniProgram.authorizerRefreshToken)
  30. if akResErr != nil {
  31. return "", akResErr
  32. }
  33. return akRes.AccessToken, nil
  34. }
  35. // SetAuthorizerRefreshToken 设置代执操作业务授权账号 authorizer_refresh_token
  36. func (miniProgram *MiniProgram) SetAuthorizerRefreshToken(authorizerRefreshToken string) *MiniProgram {
  37. miniProgram.authorizerRefreshToken = authorizerRefreshToken
  38. return miniProgram
  39. }
  40. // NewMiniProgram 实例化
  41. func NewMiniProgram(opCtx *openContext.Context, appID string) *MiniProgram {
  42. miniProgram := miniprogram.NewMiniProgram(&miniConfig.Config{
  43. AppID: opCtx.AppID,
  44. Cache: opCtx.Cache,
  45. })
  46. // 设置获取 access_token 的函数
  47. miniProgram.SetAccessTokenHandle(NewDefaultAuthrAccessToken(opCtx, appID))
  48. return &MiniProgram{AppID: appID, MiniProgram: miniProgram, openContext: opCtx}
  49. }
  50. // GetComponent get component
  51. // 快速注册小程序相关
  52. func (miniProgram *MiniProgram) GetComponent() *component.Component {
  53. return component.NewComponent(miniProgram.openContext)
  54. }
  55. // GetBasic 基础信息设置
  56. func (miniProgram *MiniProgram) GetBasic() *basic.Basic {
  57. return basic.NewBasic(miniProgram.openContext, miniProgram.AppID)
  58. }
  59. // GetURLLink 小程序 URL Link 接口 调用前需确认已调用 SetAuthorizerRefreshToken 避免由于缓存中 authorizer_access_token 过期执行中断
  60. func (miniProgram *MiniProgram) GetURLLink() *urllink.URLLink {
  61. return urllink.NewURLLink(&miniContext.Context{
  62. AccessTokenHandle: miniProgram,
  63. })
  64. }
  65. // DefaultAuthrAccessToken 默认获取授权 ak 的方法
  66. type DefaultAuthrAccessToken struct {
  67. opCtx *openContext.Context
  68. appID string
  69. }
  70. // NewDefaultAuthrAccessToken 设置 access_token
  71. func NewDefaultAuthrAccessToken(opCtx *openContext.Context, appID string) credential.AccessTokenHandle {
  72. return &DefaultAuthrAccessToken{
  73. opCtx: opCtx,
  74. appID: appID,
  75. }
  76. }
  77. // GetAccessToken 获取 ak
  78. func (ak *DefaultAuthrAccessToken) GetAccessToken() (string, error) {
  79. return ak.opCtx.GetAuthrAccessToken(ak.appID)
  80. }