来源:自学PHP网 时间:2015-04-14 12:58 作者: 阅读:次
[导读] 主要用来推广并统计数据,当用户扫描带参数二维码时,微信会推送消息到我们的服务器,此时可以根据参数了解到用户是从哪个渠道关注的。话不多少,先来代码: 1 region 生成二维码...
|
主要用来推广并统计数据,当用户扫描带参数二维码时,微信会推送消息到我们的服务器,此时可以根据参数了解到用户是从哪个渠道关注的。话不多少,先来代码:
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);
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com