urlscheme.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package urlscheme
  2. import (
  3. "fmt"
  4. "github.com/silenceper/wechat/v2/miniprogram/context"
  5. "github.com/silenceper/wechat/v2/util"
  6. )
  7. // URLScheme 小程序 URL Scheme
  8. type URLScheme struct {
  9. *context.Context
  10. }
  11. // NewURLScheme 实例化
  12. func NewURLScheme(ctx *context.Context) *URLScheme {
  13. return &URLScheme{Context: ctx}
  14. }
  15. const (
  16. // generateURL 获取加密scheme码
  17. generateURL = "https://api.weixin.qq.com/wxa/generatescheme"
  18. // generateNFCURL 获取 NFC 的小程序 scheme
  19. generateNFCURL = "https://api.weixin.qq.com/wxa/generatenfcscheme?access_token=%s"
  20. )
  21. // TExpireType 失效类型 (指定时间戳/指定间隔)
  22. type TExpireType int
  23. // EnvVersion 要打开的小程序版本
  24. type EnvVersion string
  25. const (
  26. // ExpireTypeTime 指定时间戳后失效
  27. ExpireTypeTime TExpireType = 0
  28. // ExpireTypeInterval 间隔指定天数后失效
  29. ExpireTypeInterval TExpireType = 1
  30. // EnvVersionRelease 正式版为"release"
  31. EnvVersionRelease EnvVersion = "release"
  32. // EnvVersionTrial 体验版为"trial"
  33. EnvVersionTrial EnvVersion = "trial"
  34. // EnvVersionDevelop 开发版为"develop"
  35. EnvVersionDevelop EnvVersion = "develop"
  36. )
  37. // JumpWxa 跳转到的目标小程序信息
  38. type JumpWxa struct {
  39. Path string `json:"path"`
  40. Query string `json:"query"`
  41. // envVersion 要打开的小程序版本。正式版为 "release",体验版为 "trial",开发版为 "develop"
  42. EnvVersion EnvVersion `json:"env_version,omitempty"`
  43. }
  44. // USParams 请求参数
  45. // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-scheme/urlscheme.generate.html#请求参数
  46. type USParams struct {
  47. JumpWxa *JumpWxa `json:"jump_wxa,omitempty"`
  48. ExpireType TExpireType `json:"expire_type,omitempty"`
  49. ExpireTime int64 `json:"expire_time,omitempty"`
  50. ExpireInterval int `json:"expire_interval,omitempty"`
  51. IsExpire bool `json:"is_expire,omitempty"`
  52. ModelID string `json:"model_id,omitempty"`
  53. Sn string `json:"sn,omitempty"`
  54. }
  55. // USResult 返回的结果
  56. // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-scheme/urlscheme.generate.html#返回值
  57. type USResult struct {
  58. util.CommonError
  59. OpenLink string `json:"openlink"`
  60. }
  61. // Generate 生成url link
  62. func (u *URLScheme) Generate(params *USParams) (string, error) {
  63. accessToken, err := u.GetAccessToken()
  64. if err != nil {
  65. return "", err
  66. }
  67. uri := fmt.Sprintf("%s?access_token=%s", generateURL, accessToken)
  68. response, err := util.PostJSON(uri, params)
  69. if err != nil {
  70. return "", err
  71. }
  72. var resp USResult
  73. err = util.DecodeWithError(response, &resp, "URLScheme.Generate")
  74. return resp.OpenLink, err
  75. }
  76. // GenerateNFC 获取 NFC 的小程序 scheme
  77. // see https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/url-scheme/generateNFCScheme.html
  78. func (u *URLScheme) GenerateNFC(params *USParams) (string, error) {
  79. var (
  80. accessToken string
  81. err error
  82. )
  83. if accessToken, err = u.GetAccessToken(); err != nil {
  84. return "", err
  85. }
  86. var response []byte
  87. if response, err = util.PostJSON(fmt.Sprintf(generateNFCURL, accessToken), params); err != nil {
  88. return "", err
  89. }
  90. result := &USResult{}
  91. err = util.DecodeWithError(response, result, "URLScheme.GenerateNFC")
  92. return result.OpenLink, err
  93. }