php专区

 首页 > php专区 > PHP应用 > 开放平台 > C#微信开发之旅(六):生成带参数的二维码 - 微信

C#微信开发之旅(六):生成带参数的二维码 - 微信

分享到:
【字体:
导读:
          主要用来推广并统计数据,当用户扫描带参数二维码时,微信会推送消息到我们的服务器,此时可以根据参数了解到用户是从哪个渠道关注的。话不多少,先来代码: 1 region 生成二维码...

主要用来推广并统计数据,当用户扫描带参数二维码时,微信会推送消息到我们的服务器,此时可以根据参数了解到用户是从哪个渠道关注的。话不多少,先来代码:

  1 #region 生成二维码
  2 
  3         /// 
  4         /// 获取Ticket
  5         /// 
  6         /// 
  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(result); //HttpClientHelper.PostResponse(url, postData);
 19 
 20             if (ticket == null || string.IsNullOrEmpty(ticket.ticket))
 21             {
 22                 ErrorMessage msg = JsonConvert.DeserializeObject(result);
 23                 if (msg.TokenExpired)
 24                     return CreateTicketByNewAccessToken(scene_id);
 25             }
 26             return ticket.ticket;
 27         }
 28 
 29         /// 
 30         /// 当AccessToken过期时 调用此方法
 31         /// 
 32         /// 
 33         /// 
 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(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         /// 
 53         /// 根据Ticket获取二维码图片保存在本地
 54         /// 
 55         /// 二维码场景id
 56         /// 图片存储路径
 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         /// 
 90         /// 根据SceneId 获取 二维码图片流
 91         /// 
 92         /// 
 93         /// 
 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#微信开发之旅(七):根据经纬度获取地址...
开发过程中遇到这样的需求,根据用户的地理位置不同,显示不同区域的产品。 这里用到了微信:获取用户地理位置 的功能,(每隔5秒上报 或 进入回话时上报一次),我们根据微信推送过来的经纬度,来转换成实际地址,这里用到的是百度地图Api(要用的话先申请百度ak)。 PS:微信的这个功能很不稳定,靠它不靠谱,经常不推...
C#微信开发之旅(五):操作公众号菜单 - ...
菜单操作类: 1 #region 创建、查询、删除菜单 2 3 /// 4 /// 创建菜单 5 /// 6 /// 菜单字符串 7 /// ReturnMsg.ErrCode为0则创建菜单成功 8 public static ErrorMessage CreateMenu(string menuData) 9 { 10 string url ...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……