miniprogram.go 3.7 KB

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