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