github.com/chanxuehong/wechat@v0.0.0-20230222024006-36f0325263cd/mp/qrcode/download.go (about) 1 package qrcode 2 3 import ( 4 "fmt" 5 "io" 6 "net/http" 7 "net/url" 8 "os" 9 10 "github.com/chanxuehong/wechat/internal/debug/api" 11 "github.com/chanxuehong/wechat/util" 12 ) 13 14 // 二维码图片的URL, 可以通过此URL下载二维码 或者 在线显示此二维码. 15 func QrcodePicURL(ticket string) string { 16 return "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + url.QueryEscape(ticket) 17 } 18 19 // Download 通过ticket换取二维码, 写入到 filepath 路径的文件. 20 // 21 // 如果 clt == nil 则默认用 util.DefaultHttpClient. 22 func Download(ticket, filepath string, clt *http.Client) (written int64, err error) { 23 file, err := os.Create(filepath) 24 if err != nil { 25 return 26 } 27 defer func() { 28 file.Close() 29 if err != nil { 30 os.Remove(filepath) 31 } 32 }() 33 34 return DownloadToWriter(ticket, file, clt) 35 } 36 37 // DownloadToWriter 通过ticket换取二维码, 写入到 writer. 38 // 39 // 如果 clt == nil 则默认用 util.DefaultHttpClient. 40 func DownloadToWriter(ticket string, writer io.Writer, clt *http.Client) (written int64, err error) { 41 if clt == nil { 42 clt = util.DefaultHttpClient 43 } 44 45 url := QrcodePicURL(ticket) 46 api.DebugPrintGetRequest(url) 47 httpResp, err := clt.Get(url) 48 if err != nil { 49 return 50 } 51 defer httpResp.Body.Close() 52 53 if httpResp.StatusCode != http.StatusOK { 54 err = fmt.Errorf("http.Status: %s", httpResp.Status) 55 return 56 } 57 58 return io.Copy(writer, httpResp.Body) 59 }