zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    笛卡尔树学习笔记
    图论基础(自认为很全)
    我的博客在这里
    C++学习资料
    test
    个人介绍
    CF1153F Serval and Bonus Problem
    【ZJOI2020】抽卡
    【LOJ】小 Q 的序列
    我的个人博客:https://xyix.github.io
  • 原文地址:https://www.cnblogs.com/hetring/p/4054546.html
Copyright © 2011-2022 走看看