您的位置:首页 > 移动开发 > 微信开发

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

2016-11-01 16:17 639 查看
今天终于解决了之前提到的支付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
}


搞定收工
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  golang 微信 二维码