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