C#微信開發之旅(六):生成帶參數的二維碼


主要用來推廣並統計數據,當用戶掃描帶參數二維碼時,微信會推送消息到我們的服務器,此時可以根據參數了解到用戶是從哪個渠道關注的。話不多少,先來代碼:

  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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM