qrcode.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package account
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "github.com/chanxuehong/wechat/mp"
  6. "github.com/yaotian/gowechat/mp/base"
  7. "github.com/yaotian/gowechat/wxcontext"
  8. )
  9. const (
  10. qrcodeURL = "https://api.weixin.qq.com/cgi-bin/qrcode/create"
  11. )
  12. //Qrcode 带参数的二维码
  13. type Qrcode struct {
  14. base.MpBase
  15. }
  16. //NewQrcode 实例化
  17. func NewQrcode(context *wxcontext.Context) *Qrcode {
  18. qrcode := new(Qrcode)
  19. qrcode.Context = context
  20. return qrcode
  21. }
  22. const (
  23. //TemporaryQRCodeExpireSecondsLimit 临时二维码 expire_seconds 限制
  24. TemporaryQRCodeExpireSecondsLimit = 604800
  25. //PermanentQRCodeSceneIDLimit 永久二维码 scene_id 限制
  26. PermanentQRCodeSceneIDLimit = 100000
  27. )
  28. //PermanentQRCode 永久二维码
  29. type PermanentQRCode struct {
  30. // 下面两个字段同时只有一个有效, 非zero值表示有效.
  31. SceneID uint32 `json:"scene_id,omitempty"` // 场景值ID, 临时二维码时为32位非0整型, 永久二维码时最大值为100000(目前参数只支持1--100000)
  32. SceneString string `json:"scene_str,omitempty"` // 场景值ID(字符串形式的ID), 字符串类型, 长度限制为1到64, 仅永久二维码支持此字段
  33. Ticket string `json:"ticket"` // 获取的二维码ticket, 凭借此ticket可以在有效时间内换取二维码.
  34. URL string `json:"url"` // 二维码图片解析后的地址, 开发者可根据该地址自行生成需要的二维码图片
  35. }
  36. //TemporaryQRCode 临时二维码
  37. type TemporaryQRCode struct {
  38. ExpireSeconds int `json:"expire_seconds,omitempty"` // 二维码的有效时间, 以秒为单位. 最大不超过 604800.
  39. PermanentQRCode
  40. }
  41. //CreateTemporaryQRCode 创建临时二维码
  42. // SceneId: 场景值ID, 为32位非0整型
  43. // ExpireSeconds: 二维码有效时间, 以秒为单位. 最大不超过 604800.
  44. func (c *Qrcode) CreateTemporaryQRCode(SceneID uint32, ExpireSeconds int) (qrcode *TemporaryQRCode, err error) {
  45. if SceneID == 0 {
  46. err = errors.New("SceneId should be greater than 0")
  47. return
  48. }
  49. if ExpireSeconds <= 0 {
  50. err = errors.New("ExpireSeconds should be greater than 0")
  51. return
  52. }
  53. var request struct {
  54. ExpireSeconds int `json:"expire_seconds"`
  55. ActionName string `json:"action_name"`
  56. ActionInfo struct {
  57. Scene struct {
  58. SceneID uint32 `json:"scene_id"`
  59. } `json:"scene"`
  60. } `json:"action_info"`
  61. }
  62. request.ExpireSeconds = ExpireSeconds
  63. request.ActionName = "QR_SCENE"
  64. request.ActionInfo.Scene.SceneID = SceneID
  65. var result struct {
  66. mp.Error
  67. TemporaryQRCode
  68. }
  69. response, err := c.HTTPPostJSONWithAccessToken(qrcodeURL, &request)
  70. if err != nil {
  71. return nil, err
  72. }
  73. err = json.Unmarshal(response, &result)
  74. if err != nil {
  75. return
  76. }
  77. result.TemporaryQRCode.SceneID = SceneID
  78. qrcode = &result.TemporaryQRCode
  79. return
  80. }
  81. //CreatePermanentQRCode 创建永久二维码
  82. // SceneId: 场景值ID, 目前参数只支持1--100000
  83. func (c *Qrcode) CreatePermanentQRCode(sceneID uint32) (qrcode *PermanentQRCode, err error) {
  84. if sceneID == 0 {
  85. err = errors.New("SceneId should be greater than 0")
  86. return
  87. }
  88. var request struct {
  89. ActionName string `json:"action_name"`
  90. ActionInfo struct {
  91. Scene struct {
  92. SceneID uint32 `json:"scene_id"`
  93. } `json:"scene"`
  94. } `json:"action_info"`
  95. }
  96. request.ActionName = "QR_LIMIT_SCENE"
  97. request.ActionInfo.Scene.SceneID = sceneID
  98. var result struct {
  99. mp.Error
  100. PermanentQRCode
  101. }
  102. response, err := c.HTTPPostJSONWithAccessToken(qrcodeURL, &request)
  103. if err != nil {
  104. return nil, err
  105. }
  106. err = json.Unmarshal(response, &result)
  107. if err != nil {
  108. return
  109. }
  110. result.PermanentQRCode.SceneID = sceneID
  111. qrcode = &result.PermanentQRCode
  112. return
  113. }
  114. //CreatePermanentQRCodeWithSceneString 创建永久二维码
  115. // SceneString: 场景值ID(字符串形式的ID), 字符串类型, 长度限制为1到64
  116. func (c *Qrcode) CreatePermanentQRCodeWithSceneString(SceneString string) (qrcode *PermanentQRCode, err error) {
  117. if SceneString == "" {
  118. err = errors.New("SceneString should not be empty")
  119. return
  120. }
  121. var request struct {
  122. ActionName string `json:"action_name"`
  123. ActionInfo struct {
  124. Scene struct {
  125. SceneString string `json:"scene_str"`
  126. } `json:"scene"`
  127. } `json:"action_info"`
  128. }
  129. request.ActionName = "QR_LIMIT_STR_SCENE"
  130. request.ActionInfo.Scene.SceneString = SceneString
  131. var result struct {
  132. mp.Error
  133. PermanentQRCode
  134. }
  135. response, err := c.HTTPPostJSONWithAccessToken(qrcodeURL, &request)
  136. if err != nil {
  137. return nil, err
  138. }
  139. err = json.Unmarshal(response, &result)
  140. if err != nil {
  141. return
  142. }
  143. result.PermanentQRCode.SceneString = SceneString
  144. qrcode = &result.PermanentQRCode
  145. return
  146. }