使用golang快速開發微信公眾平台(八):擷取使用者二維碼

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

今天終於解決了之前提到的支付url地址無效問題甚是高興,來把二維碼也寫寫。
二維碼文檔寫的簡單明了,但是沒有寫咋個實際展示,我試了好久,連base64解碼都考慮了。。。最終發現,還是簡單粗暴的方法適合我。
業務情境如下:進入頁面,根據擷取到的使用者openId,顯示該使用者的二維碼。

都閃開,我要放代碼了:

/**顯示使用者二維碼*/type WXShowUserQrController struct {    beego.Controller}type WxQrGet struct {    ActionName string          `json:"action_name"`    AInfo      *WxQrActionInfo `json:"action_info"`}type WxQrActionInfo struct {    Sc *Scene `json:"scene"`}type Scene struct {    SceneId int `json:"scene_id"`}type QrBody struct {    Ticket        string `json:"ticket"`    ExpireSeconds string `json:"expire_seconds"`    Url           string `json:"url"`}func (c *WXShowUserQrController) Get() {        ...        //此處uid就是openID        wxUser := models.WxUser{WxId: uid}        if ticket, err := getQrFromWx(&wxUser, &at); err == nil {                //這裡粗暴的直接拼出使用者的二維碼地址,然後在頁面上顯示出來                c.Data["ticket"] = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + ticket            }        c.TplName = "wx_show_user_qr.html"}func getQrFromWx(wxUser *models.WxUser, at *models.WxAccessToken) (string, error) {    ticker := ""    scence := Scene{SceneId: wxUser.Id}    wxQrActionInfo := WxQrActionInfo{Sc: &scence}    wxQrGet := WxQrGet{ActionName: "QR_LIMIT_SCENE", AInfo: &wxQrActionInfo}    if jsonBytes, err := json.Marshal(wxQrGet); err == nil {        //fmt.Println("at.AccessToken---------", at.AccessToken)        //fmt.Println("jsonBytes---------", string(jsonBytes))        postReq, err := http.NewRequest("POST",            strings.Join([]string{`https://api.weixin.qq.com/cgi-bin/qrcode/create`, "?access_token=", at.AccessToken}, ""),            //bytes.NewReader([]byte(`{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}`)))            bytes.NewReader(jsonBytes))        if err != nil {            fmt.Println("向發送 qr建立 請求失敗", err)            logUtils.GetLog().Error("向發送 qr建立 請求失敗", err)            return ticker, err        }        postReq.Header.Set("Content-Type", "application/json; encoding=utf-8")        client := &http.Client{}        resp, err := client.Do(postReq)        if err != nil {            fmt.Println("client向發送 qr建立 請求失敗", err)            logUtils.GetLog().Error("client向發送 qr建立 請求失敗", err)            return ticker, err        } else {            //fmt.Printf("向發送 qr建立 請求成功----準備讀取resp%+v\n", resp)            body, err := ioutil.ReadAll(resp.Body)            if err != nil {                fmt.Println("發送get請求擷取 wxUserInfo 讀取返回body錯誤", err)                logUtils.GetLog().Error("發送get請求擷取 wxUserInfo 讀取返回body錯誤", err)                return ticker, err            } else {                //fmt.Println("解析body----->", string(body))                qrBody := new(QrBody)                if err := json.Unmarshal(body, qrBody); err == nil {                    fmt.Printf("qrbody-----%+v\n", qrBody)                    ticker = qrBody.Ticket                } else {                    fmt.Println("json轉換錯誤", err)                    logUtils.GetLog().Error("json轉換錯誤", err)                    return ticker, err                }            }        }        defer resp.Body.Close()    } else {        fmt.Println("json轉換錯誤", err)        logUtils.GetLog().Error("json轉換錯誤", err)        return ticker, err    }    return ticker, nil}

搞定收工

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.