這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
今天終於解決了之前提到的支付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}
搞定收工