qr.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package basic
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "reflect"
  6. "time"
  7. "github.com/silenceper/wechat/v2/util"
  8. )
  9. const (
  10. qrCreateURL = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=%s"
  11. getQRImgURL = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s"
  12. )
  13. const (
  14. actionID = "QR_SCENE"
  15. actionStr = "QR_STR_SCENE"
  16. actionLimitID = "QR_LIMIT_SCENE"
  17. actionLimitStr = "QR_LIMIT_STR_SCENE"
  18. )
  19. // Request 临时二维码
  20. type Request struct {
  21. ExpireSeconds int64 `json:"expire_seconds,omitempty"`
  22. ActionName string `json:"action_name"`
  23. ActionInfo struct {
  24. Scene struct {
  25. SceneStr string `json:"scene_str,omitempty"`
  26. SceneID int `json:"scene_id,omitempty"`
  27. } `json:"scene"`
  28. } `json:"action_info"`
  29. }
  30. // Ticket 二维码ticket
  31. type Ticket struct {
  32. util.CommonError `json:",inline"`
  33. Ticket string `json:"ticket"`
  34. ExpireSeconds int64 `json:"expire_seconds"`
  35. URL string `json:"url"`
  36. }
  37. // GetQRTicket 获取二维码 Ticket
  38. func (basic *Basic) GetQRTicket(tq *Request) (t *Ticket, err error) {
  39. accessToken, err := basic.GetAccessToken()
  40. if err != nil {
  41. return
  42. }
  43. uri := fmt.Sprintf(qrCreateURL, accessToken)
  44. response, err := util.PostJSON(uri, tq)
  45. if err != nil {
  46. err = fmt.Errorf("get qr ticket failed, %s", err)
  47. return
  48. }
  49. t = new(Ticket)
  50. err = json.Unmarshal(response, &t)
  51. if err != nil {
  52. return
  53. }
  54. return
  55. }
  56. // ShowQRCode 通过ticket换取二维码
  57. func ShowQRCode(tk *Ticket) string {
  58. return fmt.Sprintf(getQRImgURL, tk.Ticket)
  59. }
  60. // NewTmpQrRequest 新建临时二维码请求实例
  61. func NewTmpQrRequest(exp time.Duration, scene interface{}) *Request {
  62. tq := &Request{
  63. ExpireSeconds: int64(exp.Seconds()),
  64. }
  65. switch reflect.ValueOf(scene).Kind() {
  66. case reflect.String:
  67. tq.ActionName = actionStr
  68. tq.ActionInfo.Scene.SceneStr = scene.(string)
  69. case reflect.Int, reflect.Int8, reflect.Int16,
  70. reflect.Int32, reflect.Int64,
  71. reflect.Uint, reflect.Uint8, reflect.Uint16,
  72. reflect.Uint32, reflect.Uint64:
  73. tq.ActionName = actionID
  74. tq.ActionInfo.Scene.SceneID = scene.(int)
  75. }
  76. return tq
  77. }
  78. // NewLimitQrRequest 新建永久二维码请求实例
  79. func NewLimitQrRequest(scene interface{}) *Request {
  80. tq := &Request{}
  81. switch reflect.ValueOf(scene).Kind() {
  82. case reflect.String:
  83. tq.ActionName = actionLimitStr
  84. tq.ActionInfo.Scene.SceneStr = scene.(string)
  85. case reflect.Int, reflect.Int8, reflect.Int16,
  86. reflect.Int32, reflect.Int64,
  87. reflect.Uint, reflect.Uint8, reflect.Uint16,
  88. reflect.Uint32, reflect.Uint64:
  89. tq.ActionName = actionLimitID
  90. tq.ActionInfo.Scene.SceneID = scene.(int)
  91. }
  92. return tq
  93. }