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  }