本次主要分享的是3個免費的二維碼接口的對接代碼和測試得出的注意點及差別,有更好處理方式多多交流,互相促進進步;最近在學習JavsScript的擴充TypeScript,感覺文法糖很甜,大部分與C#更為類似,可能都是微軟項目的原因吧,有興趣的朋友可以多多互相交流下;
以上是個人的看法,下面來正式分享今天的文章吧:
. Google的Api二維碼生成接口
. 2d-code的Api二維碼生成接口
. topscan的Api二維碼生成接口
. 使用面向對象+加載程式集建立對象合并以上接口封裝成二維碼生成工廠
下面一步一個腳印的來分享:
首先,這裡給出Google接口文檔的連結
qr_codes文檔,熱情的朋友馬上就會打開此連結吧,詳細看下裡面的參數這就不做截圖了,大緻通常用到的參數是:api位址,内容參數,生成圖檔的高寬這3個參數,其他的幾個參數都采用預設的吧,不同需要大家可以更詳細的看下;其實第一次看到文檔裡面的參數,感覺少了一些東西,比如怎麼不能傳遞二維碼中間那個圖示的圖檔位址和掃描二維碼過後怎麼跳轉到我想重定向的url連結呢,帶着這個疑問我進行了多次的嘗試;下面給出自己嘗試的結果說明:
1. 接口關鍵參數是:cht(固定值qr),chl(内容參數),chs(生成出來二維碼圖檔尺寸,格式如:200x200,這裡是xyz的x不是*)
2. api接口隻會生成一個二維碼的圖檔流,如果需要把圖檔儲存到本地需要通過浏覽器直接get通路接口或者通過程式下載下傳這個二維碼
3. 内容參數如果傳遞文本資訊,在生成出來的二維碼圖檔中間不會顯示文本内容,隻有用手機掃描二維碼才能在手機上顯示傳遞的文本資訊
4. 内容參數如果傳遞單純的http://格式的連結位址,那麼手機掃描後會自動重定向到改http://連結位址上(這個掃描重定向可以用來做一些商品或者文章的檢視)
5. google接口暫未研究出此Logo圖示位址參數(希望有朋友研究出來後與我分享,謝謝)
6. 由于api位址是國外的,調用接口響應不是那麼快速
其次,上面是個人的一些總結,下面我們來看下封裝的請求接口方法和下載下傳二維碼圖檔方法:
1 #region 生成二維碼
2
3 /// <summary>
4 /// 生成二維碼
5 /// </summary>
6 /// <param name="content">展示内容(文本内容 或者 掃描後的跳轉http://格式的位址)</param>
7 /// <param name="savePath">儲存二維碼的磁盤路徑(預設程式跟目錄+QRCode)</param>
8 /// <param name="logoUrl"> Logo圖示位址(格式:http://),(注:google接口暫未研究出此參數)</param>
9 /// <param name="apiUrl">接口位址(内置預設api位址)</param>
10 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,預設200)</param>
11 /// <returns></returns>
12 public virtual string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null)
13 {
14 var qrName = string.Empty;
15
16 #region 參數初始化
17
18 ApiUrl = apiUrl ?? ApiUrl;
19 Content = content ?? Content;
20 SaveQRPath = savePath ?? SaveQRPath;
21 LogoUrl = logoUrl ?? LogoUrl;
22 WAndH = wAndh ?? WAndH;
23 #endregion
24
25 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; }
26
27 ApiUrl = string.Format("{0}?cht=qr&chl={1}&chs={2}x{2}",
28 ApiUrl,
29 HttpUtility.UrlEncode(Content),
30 WAndH);
31
32 qrName = DownImg(ApiUrl, SaveQRPath, ImageFormat.Jpeg);
33 return qrName;
34 }
35 #endregion
下載下傳二維碼圖檔儲存到程式根目錄:
1 #region 下載下傳圖檔
2
3 /// <summary>
4 /// 下載下傳圖檔
5 /// </summary>
6 /// <param name="url">圖檔下載下傳位址</param>
7 /// <param name="savePath">儲存路徑預設:Img檔案夾</param>
8 /// <param name="format">預設:Jpeg</param>
9 /// <returns>新圖檔名稱</returns>
10 public virtual string DownImg(string url, string savePath = "QRCode", ImageFormat format = null)
11 {
12 var qrName = string.Empty;
13 try
14 {
15 format = format ?? ImageFormat.Jpeg;
16
17 HttpClient http = new HttpClient();
18 http.Timeout = new TimeSpan(0, 1, 0);
19 using (var stream = http.GetStreamAsync(url).Result)
20 {
21
22 if (!Directory.Exists(SaveQRPath)) { Directory.CreateDirectory(SaveQRPath); }
23 qrName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + format;
24 var path = Path.Combine(savePath, qrName);
25 using (Image img = Image.FromStream(stream))
26 {
27 img.Save(path, format);
28 }
29 }
30 }
31 catch (Exception ex)
32 {
33 qrName = string.Empty;
34 }
35 return qrName;
36 }
37 #endregion
上面兩個方法使用的是虛方法,因為我這裡是吧google接口當做預設的二維碼生成器來使用,後面要講的另外兩個接口都是重寫與此;下載下傳圖檔的方法都是公用的,暫不需要重寫;這裡需要提到的是調用api接口時有一個固定的參數cht=qr,這個參數表示采用QR方法生成二維碼,因為這個api接口還有生成圖示的功能,是以隻想要生成二維碼這裡就固定,更多的生成圖示功能不在本章分享中,謝謝。
首先,該接口需要通過他們官網注冊一個key,然後從背景擷取到這個key後才能調用接口位址,當然注冊後有個功能是,凡是您通過api接口生成的二維碼,除了自己通過流下載下傳,還能通過他們背景一起下載下傳所有生成的圖檔,本人暫時沒有去關注是否生成量大了會收費哈哈,下面列舉下接口參數說明和測試得出的注意點:
1. 接口關鍵參數是:key(注冊擷取),text(文本參數),url(掃描後重定向位址),logo(Logo圖示位址),size(二維碼正方形,高寬)
2. 接口的文本參數隻能傳遞文本,不能當做掃描後重定向的位址參數使用和Google等接口有點不一樣
3. 掃描後重定向位址和Logo圖示位址都是可通路的http://格式的位址連結
4. Logo圖示位址,官方說不建議使用png格式,測試隻有jpg成功(可能是測試不夠多這裡隻單純介紹我的結果)
5. 生成速度比較快,而且還有一個藝術字的生成接口,挺不錯
6. api接口隻會生成一個二維碼的圖檔流,如果需要把圖檔儲存到本地需要通過浏覽器直接get通路接口或者通過程式下載下傳這個二維碼
其次,下面給出封裝的代碼,由于下載下傳和上面介紹的代碼一樣是公用的這裡就不做陳述:

1 public QR_2dCode()
2 {
3
4 ApiUrl = "http://www.2d-code.cn/2dcode/api.php";
5 }
6
7 #region 生成二維碼
8
9 /// <summary>
10 /// 生成二維碼
11 /// </summary>
12 /// <param name="content">展示内容(文本内容 或者 掃描後的跳轉http://格式的位址)</param>
13 /// <param name="savePath">儲存二維碼的磁盤路徑(預設程式跟目錄+QRCode)</param>
14 /// <param name="logoUrl"> Logo圖示位址(格式:http://),官方不建議使用png格式,測試隻有jpg成功</param>
15 /// <param name="directUrl">掃描後重定向位址(http://)</param>
16 /// <param name="apiUrl">接口位址(内置預設api位址)</param>
17 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,預設200)</param>
18 /// <returns></returns>
19 public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null)
20 {
21 var qrName = string.Empty;
22
23 #region 參數初始化
24
25 ApiUrl = apiUrl ?? ApiUrl;
26 Content = content ?? Content;
27 SaveQRPath = savePath ?? SaveQRPath;
28 LogoUrl = logoUrl ?? LogoUrl;
29 WAndH = wAndh ?? WAndH;
30 #endregion
31
32 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; }
33
34 ApiUrl = string.Format("{0}?key=c_d800OBbu6hDzJtXPE2Yd02IMtmpuK9VdCqHe6vrtar4&text={1}&url={2}&logo={3}&size={4}",
35 ApiUrl,
36 HttpUtility.UrlEncode(Content.Contains("http") ? "" : Content),
37 HttpUtility.UrlEncode(Content),
38 HttpUtility.UrlEncode(LogoUrl),
39 WAndH);
40
41 qrName = DownImg(ApiUrl, SaveQRPath);
42 return qrName;
43 }
44 #endregion
View Code
首先,該接口肯定是免費的,參數描述和google的差不多,不同處在于可以傳遞Logo圖示位址(當然可能我還沒發現google的可以傳遞logo的參數,故此朋友們可以忽略);下面列舉下接口參數說明和測試得出的注意點:
1. 接口關鍵參數是:text(内容參數),logo(Logo圖示位址),w(生成出來二維碼圖檔尺寸,格式如:200x200,這裡是xyz的x不是*)
5. Logo圖示位址(格式:http://),jpg,png測試通過
6. 測試得出有時候請求生成二維碼不傳回資料,有可能是我網路問題吧,正常生成二維碼的速度還是挺快

1 public QR_TopScan()
2 {
3
4 ApiUrl = "http://qr.topscan.com/api.php";
5 }
6
7 #region 生成二維碼
8
9 /// <summary>
10 /// 生成二維碼
11 /// </summary>
12 /// <param name="content">展示内容(文本内容 或者 掃描後的跳轉http://格式的位址)</param>
13 /// <param name="savePath">儲存二維碼的磁盤路徑(預設程式跟目錄+QRCode)</param>
14 /// <param name="logoUrl"> Logo圖示位址(格式:http://),jpg,png測試通過,測試得出有不能成功的,原因不知是否和位址有關</param>
15 /// <param name="apiUrl">接口位址(内置預設api位址)</param>
16 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,預設200)</param>
17 /// <returns></returns>
18 public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null)
19 {
20 var qrName = string.Empty;
21
22 #region 參數初始化
23
24 ApiUrl = apiUrl ?? ApiUrl;
25 Content = content ?? Content;
26 SaveQRPath = savePath ?? SaveQRPath;
27 LogoUrl = logoUrl ?? LogoUrl;
28 WAndH = wAndh ?? WAndH;
29 #endregion
30
31 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; }
32
33 ApiUrl = string.Format("{0}?text={1}&logo={2}&w={3}",
34 ApiUrl,
35 HttpUtility.UrlEncode(Content),
36 HttpUtility.UrlEncode(LogoUrl),
37 WAndH);
38
39 qrName = DownImg(ApiUrl, SaveQRPath);
40 return qrName;
41 }
42 #endregion
首先,分析上面3個接口的參數可以看出,都需要固定的參數:接口api,内容(文本或跳轉http位址),Logo圖檔位址(google暫時除外),寬度和高度等這幾個參數,這樣一來咋們可以定義個統一參數類,來傳遞該參數資訊,這裡還要提下由于這幾個接口都是從别人接口擷取圖檔流,如果想要吧圖檔在執行程式時候直接儲存在我們的程式本地,都需要下載下傳,是以又多一個參數: 儲存二維碼的磁盤路徑,是以才有了一下公共的屬性:
1 #region 基礎配置資訊
2
3 /// <summary>
4 /// 接口位址(必填)
5 /// </summary>
6 protected string ApiUrl = "https://chart.googleapis.com/chart";
7
8 /// <summary>
9 /// 展示内容(文本内容),google文本參數直接傳遞http位址直接重定向
10 /// </summary>
11 protected string Content = "http://www.cnblogs.com/wangrudong003/";
12
13 /// <summary>
14 /// 儲存二維碼的磁盤路徑(預設程式跟目錄+QRCode)
15 /// </summary>
16 protected string SaveQRPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "QRCode");
17
18 /// <summary>
19 /// Logo圖檔位址(http://)
20 /// </summary>
21 protected string LogoUrl = "http://a.hiphotos.baidu.com/baike/w%3D268%3Bg%3D0/sign=9a34e44d8bd4b31cf03c93bdbfed4042/2cf5e0fe9925bc318cb9fe965edf8db1ca1370dc.jpg";
22
23 /// <summary>
24 /// 寬度和高度(二維碼正方形的,高寬一至,預設200)
25 /// </summary>
26 protected int WAndH = 200;
27
28 #endregion
然後,這裡我不想每個接口都手動new一次來建立對象,是以用了加載程式集的子產品的方式來建立所需要的對象,是以有了工廠類的入口:
1 /// <summary>
2 /// 二維碼生成工廠
3 /// </summary>
4 public class QRCodeReposity
5 {
6
7 public static BaseQRCode Current(QREmType qrEmType = QREmType.BaseQRCode)
8 {
9
10 var nspace = typeof(BaseQRCode);
11 var fullName = nspace.FullName;
12 var nowspace = fullName.Substring(0, fullName.LastIndexOf('.') + 1);
13
14 return Assembly.GetExecutingAssembly().CreateInstance(nowspace + qrEmType.ToString(), true) as BaseQRCode;
15 }
16 }
這裡和之前的緩存工廠文章設計差不多,可以查閱下之前的分享篇,也多多點贊,謝謝;下面在給出說有的代碼如下:

1 /// <summary>
2 /// 工廠子產品定義
3 /// </summary>
4 public enum QREmType
5 {
6 /// <summary>
7 /// google接口
8 /// </summary>
9 BaseQRCode,
10
11 /// <summary>
12 /// 2d-code接口
13 /// </summary>
14 QR_2dCode,
15
16 /// <summary>
17 /// topscan接口
18 /// </summary>
19 QR_TopScan
20 }
21
22 /// <summary>
23 /// 二維碼生成工廠
24 /// </summary>
25 public class QRCodeReposity
26 {
27
28 public static BaseQRCode Current(QREmType qrEmType = QREmType.BaseQRCode)
29 {
30
31 var nspace = typeof(BaseQRCode);
32 var fullName = nspace.FullName;
33 var nowspace = fullName.Substring(0, fullName.LastIndexOf('.') + 1);
34
35 return Assembly.GetExecutingAssembly().CreateInstance(nowspace + qrEmType.ToString(), true) as BaseQRCode;
36 }
37 }
38
39 /// <summary>
40 /// 基類使用Google提供Api:https://developers.google.com/chart/infographics/docs/qr_codes ,由于是國外位址,相對來說有點慢
41 /// </summary>
42 public class BaseQRCode
43 {
44
45 #region 基礎配置資訊
46
47 /// <summary>
48 /// 接口位址(必填)
49 /// </summary>
50 protected string ApiUrl = "https://chart.googleapis.com/chart";
51
52 /// <summary>
53 /// 展示内容(文本内容),google文本參數直接傳遞http位址直接重定向
54 /// </summary>
55 protected string Content = "http://www.cnblogs.com/wangrudong003/";
56
57 /// <summary>
58 /// 儲存二維碼的磁盤路徑(預設程式跟目錄+QRCode)
59 /// </summary>
60 protected string SaveQRPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "QRCode");
61
62 /// <summary>
63 /// Logo圖檔位址(http://)
64 /// </summary>
65 protected string LogoUrl = "http://a.hiphotos.baidu.com/baike/w%3D268%3Bg%3D0/sign=9a34e44d8bd4b31cf03c93bdbfed4042/2cf5e0fe9925bc318cb9fe965edf8db1ca1370dc.jpg";
66
67 /// <summary>
68 /// 寬度和高度(二維碼正方形的,高寬一至,預設200)
69 /// </summary>
70 protected int WAndH = 200;
71
72 #endregion
73
74 #region 方法
75
76 #region 生成二維碼
77
78 /// <summary>
79 /// 生成二維碼
80 /// </summary>
81 /// <param name="content">展示内容(文本内容 或者 掃描後的跳轉http://格式的位址)</param>
82 /// <param name="savePath">儲存二維碼的磁盤路徑(預設程式跟目錄+QRCode)</param>
83 /// <param name="logoUrl"> Logo圖示位址(格式:http://),(注:google接口暫未研究出此參數)</param>
84 /// <param name="apiUrl">接口位址(内置預設api位址)</param>
85 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,預設200)</param>
86 /// <returns></returns>
87 public virtual string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null)
88 {
89 var qrName = string.Empty;
90
91 #region 參數初始化
92
93 ApiUrl = apiUrl ?? ApiUrl;
94 Content = content ?? Content;
95 SaveQRPath = savePath ?? SaveQRPath;
96 LogoUrl = logoUrl ?? LogoUrl;
97 WAndH = wAndh ?? WAndH;
98 #endregion
99
100 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; }
101
102 ApiUrl = string.Format("{0}?cht=qr&chl={1}&chs={2}x{2}",
103 ApiUrl,
104 HttpUtility.UrlEncode(Content),
105 WAndH);
106
107 qrName = DownImg(ApiUrl, SaveQRPath, ImageFormat.Jpeg);
108 return qrName;
109 }
110 #endregion
111
112 #region 下載下傳圖檔
113
114 /// <summary>
115 /// 下載下傳圖檔
116 /// </summary>
117 /// <param name="url">圖檔下載下傳位址</param>
118 /// <param name="savePath">儲存路徑預設:Img檔案夾</param>
119 /// <param name="format">預設:Jpeg</param>
120 /// <returns>新圖檔名稱</returns>
121 public virtual string DownImg(string url, string savePath = "QRCode", ImageFormat format = null)
122 {
123 var qrName = string.Empty;
124 try
125 {
126 format = format ?? ImageFormat.Jpeg;
127
128 HttpClient http = new HttpClient();
129 http.Timeout = new TimeSpan(0, 1, 0);
130 using (var stream = http.GetStreamAsync(url).Result)
131 {
132
133 if (!Directory.Exists(SaveQRPath)) { Directory.CreateDirectory(SaveQRPath); }
134 qrName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + format;
135 var path = Path.Combine(savePath, qrName);
136 using (Image img = Image.FromStream(stream))
137 {
138 img.Save(path, format);
139 }
140 }
141 }
142 catch (Exception ex)
143 {
144 qrName = string.Empty;
145 }
146 return qrName;
147 }
148 #endregion
149
150 #endregion
151 }
152
153 /// <summary>
154 /// 使用2d-code提供Api,需要去官網注冊擷取Key
155 /// </summary>
156 public class QR_2dCode : BaseQRCode
157 {
158
159 public QR_2dCode()
160 {
161
162 ApiUrl = "http://www.2d-code.cn/2dcode/api.php";
163 }
164
165 #region 生成二維碼
166
167 /// <summary>
168 /// 生成二維碼
169 /// </summary>
170 /// <param name="content">展示内容(文本内容 或者 掃描後的跳轉http://格式的位址)</param>
171 /// <param name="savePath">儲存二維碼的磁盤路徑(預設程式跟目錄+QRCode)</param>
172 /// <param name="logoUrl"> Logo圖示位址(格式:http://),官方不建議使用png格式,測試隻有jpg成功</param>
173 /// <param name="directUrl">掃描後重定向位址(http://)</param>
174 /// <param name="apiUrl">接口位址(内置預設api位址)</param>
175 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,預設200)</param>
176 /// <returns></returns>
177 public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null)
178 {
179 var qrName = string.Empty;
180
181 #region 參數初始化
182
183 ApiUrl = apiUrl ?? ApiUrl;
184 Content = content ?? Content;
185 SaveQRPath = savePath ?? SaveQRPath;
186 LogoUrl = logoUrl ?? LogoUrl;
187 WAndH = wAndh ?? WAndH;
188 #endregion
189
190 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; }
191
192 ApiUrl = string.Format("{0}?key=c_d800OBbu6hDzJtXPE2Yd02IMtmpuK9VdCqHe6vrtar4&text={1}&url={2}&logo={3}&size={4}",
193 ApiUrl,
194 HttpUtility.UrlEncode(Content.Contains("http") ? "" : Content),
195 HttpUtility.UrlEncode(Content),
196 HttpUtility.UrlEncode(LogoUrl),
197 WAndH);
198
199 qrName = DownImg(ApiUrl, SaveQRPath);
200 return qrName;
201 }
202 #endregion
203 }
204
205 /// <summary>
206 /// 使用topscan提供Api
207 /// </summary>
208 public class QR_TopScan : BaseQRCode
209 {
210
211 public QR_TopScan()
212 {
213
214 ApiUrl = "http://qr.topscan.com/api.php";
215 }
216
217 #region 生成二維碼
218
219 /// <summary>
220 /// 生成二維碼
221 /// </summary>
222 /// <param name="content">展示内容(文本内容 或者 掃描後的跳轉http://格式的位址)</param>
223 /// <param name="savePath">儲存二維碼的磁盤路徑(預設程式跟目錄+QRCode)</param>
224 /// <param name="logoUrl"> Logo圖示位址(格式:http://),jpg,png測試通過,測試得出有不能成功的,原因不知是否和位址有關</param>
225 /// <param name="apiUrl">接口位址(内置預設api位址)</param>
226 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,預設200)</param>
227 /// <returns></returns>
228 public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null)
229 {
230 var qrName = string.Empty;
231
232 #region 參數初始化
233
234 ApiUrl = apiUrl ?? ApiUrl;
235 Content = content ?? Content;
236 SaveQRPath = savePath ?? SaveQRPath;
237 LogoUrl = logoUrl ?? LogoUrl;
238 WAndH = wAndh ?? WAndH;
239 #endregion
240
241 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; }
242
243 ApiUrl = string.Format("{0}?text={1}&logo={2}&w={3}",
244 ApiUrl,
245 HttpUtility.UrlEncode(Content),
246 HttpUtility.UrlEncode(LogoUrl),
247 WAndH);
248
249 qrName = DownImg(ApiUrl, SaveQRPath);
250 return qrName;
251 }
252 #endregion
253 }
本篇的分享内容在程式設計方面沒有太多,重點是分裝下這幾個接口和分享下接口的差異,方面朋友們可以拿來主義和正在對接二維碼生成的朋友做下交流,僅此而已;關鍵代碼的備注都在分享代碼裡,有更好或者不清楚的地方歡迎留言,謝謝,放一張效果圖,大家可以掃一掃:
git位址:
https://github.com/shenniubuxing3nuget釋出包:
https://www.nuget.org/profiles/shenniubuxing3