附近小店
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

qr_code.go 3.7 KiB

1 kuukausi sitten
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package weapp
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "net/http"
  6. "strings"
  7. )
  8. const (
  9. apiGetQrCode = "/wxa/getwxacode"
  10. apiGetUnlimitedQRCode = "/wxa/getwxacodeunlimit"
  11. apiCreateQRCode = "/cgi-bin/wxaapp/createwxaqrcode"
  12. )
  13. // Color QRCode color
  14. type Color struct {
  15. R string `json:"r"`
  16. G string `json:"g"`
  17. B string `json:"b"`
  18. }
  19. // QRCode 小程序码参数
  20. type QRCode struct {
  21. Path string `json:"path"`
  22. Width int `json:"width,omitempty"`
  23. AutoColor bool `json:"auto_color,omitempty"`
  24. LineColor Color `json:"line_color,omitempty"`
  25. IsHyaline bool `json:"is_hyaline,omitempty"`
  26. }
  27. // Get 获取小程序码
  28. // 可接受path参数较长 生成个数受限 永久有效 适用于需要的码数量较少的业务场景
  29. //
  30. // token 微信access_token
  31. func (code *QRCode) Get(token string) (*http.Response, *CommonError, error) {
  32. api := baseURL + apiGetQrCode
  33. return code.get(api, token)
  34. }
  35. func (code *QRCode) get(api, token string) (*http.Response, *CommonError, error) {
  36. return qrCodeRequest(api, token, code)
  37. }
  38. // UnlimitedQRCode 小程序码参数
  39. type UnlimitedQRCode struct {
  40. Scene string `json:"scene"`
  41. Page string `json:"page,omitempty"`
  42. Width int `json:"width,omitempty"`
  43. AutoColor bool `json:"auto_color,omitempty"`
  44. LineColor Color `json:"line_color,omitempty"`
  45. IsHyaline bool `json:"is_hyaline,omitempty"`
  46. }
  47. // Get 获取小程序码
  48. // 可接受页面参数较短 生成个数不受限 适用于需要的码数量极多的业务场景
  49. // 根路径前不要填加'/' 不能携带参数(参数请放在scene字段里)
  50. //
  51. // token 微信access_token
  52. func (code *UnlimitedQRCode) Get(token string) (*http.Response, *CommonError, error) {
  53. api := baseURL + apiGetUnlimitedQRCode
  54. return code.get(api, token)
  55. }
  56. func (code *UnlimitedQRCode) get(api, token string) (*http.Response, *CommonError, error) {
  57. return qrCodeRequest(api, token, code)
  58. }
  59. // QRCodeCreator 二维码创建器
  60. type QRCodeCreator struct {
  61. Path string `json:"path"` // 扫码进入的小程序页面路径,最大长度 128 字节,不能为空;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar",即可在 wx.getLaunchOptionsSync 接口中的 query 参数获取到 {foo:"bar"}。
  62. Width int `json:"width,omitempty"` // 二维码的宽度,单位 px。最小 280px,最大 1280px
  63. }
  64. // Create 获取小程序二维码,适用于需要的码数量较少的业务场景。通过该接口生成的小程序码,永久有效,有数量限制
  65. // 通过该接口生成的小程序码,永久有效,有数量限制
  66. //
  67. // token 微信access_token
  68. func (creator *QRCodeCreator) Create(token string) (*http.Response, *CommonError, error) {
  69. api := baseURL + apiCreateQRCode
  70. return creator.create(api, token)
  71. }
  72. func (creator *QRCodeCreator) create(api, token string) (*http.Response, *CommonError, error) {
  73. return qrCodeRequest(api, token, creator)
  74. }
  75. // 向微信服务器获取二维码
  76. // 返回 HTTP 请求实例
  77. func qrCodeRequest(api, token string, params interface{}) (*http.Response, *CommonError, error) {
  78. url, err := tokenAPI(api, token)
  79. if err != nil {
  80. return nil, nil, err
  81. }
  82. res, err := postJSONWithBody(url, params)
  83. if err != nil {
  84. return nil, nil, err
  85. }
  86. response := new(CommonError)
  87. switch header := res.Header.Get("Content-Type"); {
  88. case strings.HasPrefix(header, "application/json"): // 返回错误信息
  89. if err := json.NewDecoder(res.Body).Decode(response); err != nil {
  90. res.Body.Close()
  91. return nil, nil, err
  92. }
  93. return res, response, nil
  94. case strings.HasPrefix(header, "image"): // 返回文件
  95. return res, response, nil
  96. default:
  97. res.Body.Close()
  98. return nil, nil, errors.New("invalid response header: " + header)
  99. }
  100. }