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) } }