qrcode.go 4.8 KB

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