C#위챗 개발 여정(6): 매개 변수가 있는 QR 코드 생성

10843 단어
주로 데이터를 보급하고 통계하는 데 쓰인다. 사용자가 파라미터가 있는 QR코드를 스캔할 때 위챗은 메시지를 우리 서버에 전송할 것이다. 이때 파라미터에 따라 사용자가 어느 경로에서 관심을 가지는지 알 수 있다.말이 많지 않으니 먼저 코드를 눌러라.
  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

매개 변수가 있는 QR코드를 생성하려면 먼저 Ticket(내장 token 만료 처리)을 가져오고 Ticket에 따라 QR코드를 가져와야 합니다(두 가지 방법: 로컬에 저장하고 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);

좋은 웹페이지 즐겨찾기