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