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

前端之家收集整理的这篇文章主要介绍了使用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
        } 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
}

搞定收工

猜你在找的Go相关文章