使用golang快速开发微信公众平台(八):获取用户二维码

今天终于解决了之前提到的支付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
}

搞定收工

阅读更多

没有更多推荐了,返回首页