主要用來推廣並統計數據,當用戶掃描帶參數二維碼時,微信會推送消息到我們的服務器,此時可以根據參數了解到用戶是從哪個渠道關注的。話不多少,先來代碼:
1 #region 生成二維碼 2 3 /// <summary> 4 /// 獲取Ticket 5 /// </summary> 6 /// <returns></returns> 7 private static string CreateTicket(string scene_id) 8 { 9 var token = AccessToken.Instance; 10 11 if (string.IsNullOrEmpty(token.Access_Token)) 12 throw new ArgumentNullException("Access_Token"); 13 14 string url = string.Format(WeiXinConst.WeiXin_Ticket_CreateUrl, token.Access_Token); 15 string postData = WeiXinConst.WeiXin_QrCodeTicket_Create_JsonString.Replace("{0}", scene_id); 16 17 string result = HttpClientHelper.PostResponse(url, postData); 18 Ticket ticket = JsonConvert.DeserializeObject<Ticket>(result); //HttpClientHelper.PostResponse<Ticket>(url, postData); 19 20 if (ticket == null || string.IsNullOrEmpty(ticket.ticket)) 21 { 22 ErrorMessage msg = JsonConvert.DeserializeObject<ErrorMessage>(result); 23 if (msg.TokenExpired) 24 return CreateTicketByNewAccessToken(scene_id); 25 } 26 return ticket.ticket; 27 } 28 29 /// <summary> 30 /// 當AccessToken過期時 調用此方法 31 /// </summary> 32 /// <param name="scene_id"></param> 33 /// <returns></returns> 34 private static string CreateTicketByNewAccessToken(string scene_id) 35 { 36 var token = AccessToken.NewInstance; 37 38 if (string.IsNullOrEmpty(token.Access_Token)) 39 throw new ArgumentNullException("Access_Token"); 40 41 string url = string.Format(WeiXinConst.WeiXin_Ticket_CreateUrl, token.Access_Token); 42 string postData = WeiXinConst.WeiXin_QrCodeTicket_Create_JsonString.Replace("{0}", scene_id); 43 44 Ticket ticket = HttpClientHelper.PostResponse<Ticket>(url, postData); 45 46 if (ticket == null || string.IsNullOrEmpty(ticket.ticket)) 47 throw new Exception("Ticket為Null,AccessToken:" + token.Access_Token); 48 return ticket.ticket; 49 } 50 51 52 /// <summary> 53 /// 根據Ticket獲取二維碼圖片保存在本地 54 /// </summary> 55 /// <param name="scene_id">二維碼場景id</param> 56 /// <param name="imgPath">圖片存儲路徑</param> 57 public static void SaveQrCodeImage(string scene_id, string imgPath) 58 { 59 string Ticket = CreateTicket(scene_id); 60 61 if (Ticket == null) 62 throw new ArgumentNullException("Ticket"); 63 64 //ticket需 urlEncode 65 string stUrl = string.Format(WeiXinConst.WeiXin_QrCode_GetUrl, HttpUtility.UrlEncode(Ticket)); 66 67 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(stUrl); 68 69 req.Method = "GET"; 70 71 using (WebResponse wr = req.GetResponse()) 72 { 73 HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse(); 74 string strpath = myResponse.ResponseUri.ToString(); 75 76 WebClient mywebclient = new WebClient(); 77 78 try 79 { 80 mywebclient.DownloadFile(strpath, imgPath); 81 } 82 catch (Exception) 83 { 84 throw new Exception("獲取二維碼圖片失敗!"); 85 } 86 } 87 } 88 89 /// <summary> 90 /// 根據SceneId 獲取 二維碼圖片流 91 /// </summary> 92 /// <param name="scene_id"></param> 93 /// <returns></returns> 94 public static Stream GetQrCodeImageStream(string scene_id) 95 { 96 string Ticket = CreateTicket(scene_id); 97 98 if (Ticket == null) 99 throw new ArgumentNullException("Ticket"); 100 101 //ticket需 urlEncode 102 string strUrl = string.Format(WeiXinConst.WeiXin_QrCode_GetUrl, HttpUtility.UrlEncode(Ticket)); 103 try 104 { 105 System.Net.Http.HttpClient client = new System.Net.Http.HttpClient(); 106 Byte[] bytes = client.GetByteArrayAsync(strUrl).Result; 107 return new MemoryStream(bytes); 108 } 109 catch 110 { 111 throw new Exception("獲取二維碼圖片失敗!"); 112 } 113 } 114 115 #endregion
生成帶參數的二維碼,需要先獲取Ticket(內置 token過期處理),再根據Ticket獲取二維碼(兩個方法:保存到本地 以及 返回Stream)。
下面是調用代碼:
1 string scene_id = "1";//場景Id,掃描生產的二維碼 會帶這個id,可以做推廣、統計用 2 3 //獲取二維碼流 4 System.IO.Stream stream = WeiXinHelper.GetQrCodeImageStream(scene_id); 5 6 //二維碼圖片存儲路徑 7 string path = Server.MapPath("~/Document/QrCode/" + scene_id + ".jpg"); 8 //直接保存二維碼到本地 9 WeiXinHelper.SaveQrCodeImage("1", path);