关于.NET HttpClient方式获取微信小程序码(二维码)
随着微信小程序的火热应用,市面上有关小程序开发的需求也多了起来。近来分析了一项生成有关生成微信小程序码的需求——要求扫码跳转到小程序指定页面(带参数);看了下小程序官方文档,以及网上的例子,未看到多少有价值的采用C#调用小程序接口生成小程序码的例子,于是拾起多年前的代码,略作分析尝试,在此分享给有需要的人,并以此抛砖引玉。
此文以HttpClient方式示例,当然采用老旧的HttpWebRequest也可以,在此不作分析。
生成微信小程序码(二维码)的接口主要有三个:
- https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.createQRCode.html
- https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.get.html
- https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimited.html
在此仅针对createwxaqrcode(二维码)和get(小程序码/葵花码)讲解,getUnlimited原理同;
两者的接口地址分别如下:
https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=ACCESS_TOKEN
https://api.weixin.qq.com/wxa/getwxacode?access_token=ACCESS_TOKEN
由于请求小程序接口,其返回的是图片二进制流,采用HttpClient方式时务必针对二进制数据进行处理;不多说,直接上关键代码,简要示例如下:
public class HttpClientHelper { public static bool DownloadBufferImage(string requestUri, /*HttpContent httpContent,*/string filePath, string jsonString, string webapiBaseUrl = "") { try { HttpContent httpContent = new StringContent(jsonString); httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); using (HttpClient httpClient = new HttpClient()) { if (!string.IsNullOrWhiteSpace(webapiBaseUrl)) { httpClient.BaseAddress = new Uri(webapiBaseUrl); } bool result = false; httpClient.PostAsync(requestUri, httpContent).ContinueWith( (requestTask) => { HttpResponseMessage response = requestTask.Result; response.EnsureSuccessStatusCode(); var data = response.Content.ReadAsByteArrayAsync().Result; using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { fs.Write(data, 0, data.Length); fs.Flush(); fs.Close(); } result = true; }).Wait(30000); return result; } } catch { return false; } } }
一共4个参数:
- requestUri请求的接口URL;
- filePath小程序码(二维码)存储的绝对路径;
- jsonString提交的json数据对象;
- webapiBaseUrl接口根路径(可忽略)
由于腾讯接口要求,提交数据必须json对象,因此httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"),此处尤为重要,不能像提交form表单一样以字典方式提交;其次,处理二进制数据流采用以下形式处理并保存图片;此处不赘述。
var data = response.Content.ReadAsByteArrayAsync().Result; using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { fs.Write(data, 0, data.Length); fs.Flush(); fs.Close(); }
简要封装及调用示例如下:
public bool GetQrCode(string filePath, string path = "pages/default/default", int width = 430) { string postUrl = string.Format("https://api.weixin.qq.com/wxa/getwxacode?access_token={0}", AccessToken); var data = new { path = path, width = width }; var result = HttpClientHelper.DownloadBufferImage(postUrl, filePath, Newtonsoft.Json.JsonConvert.SerializeObject(data)); return result; }
new NameSpace.GetQrCode(@"D:\QrCode.jpg", path: "pages/index/index");
filePath为保存小程序码(二维码)图片的绝对路径,如Server.MapPath(savePath);path(小程序页面地址)和width(二维码宽度,默认430)均为可选参数,具体参见接口文档;AccessToken为接口调用凭证;
注:由于腾讯限制,如果接口调用成功,会直接返回图片二进制内容,如果请求失败,会返回 JSON 格式的数据;方法里仅对返回二进制流作处理,其他可根据需求自行完善。
- 微信小程序新的授权方式,获取用户信息
- 微信小程序----获取二维码
- 微信小程序扫描二维码获取信息实例详解
- 微信小程序学习之路——API获取二维码
- 获取微信小程序页面带参二维码全流程
- 关于微信小程序获取用户openid的问题
- php请求微信小程序 post 获取小程序二维码 返回结果为 null 请大神帮忙
- 微信小程序之扫描普通二维码获取二维码参数
- .NET开发微信小程序-生成二维码 - 转
- 暗潮:微信小程序第三弹:关于微信小程序吸粉方式的可行性分析
- 获取微信小程序二维码/小程序码 PHP
- 使用express获取微信小程序二维码小记
- 关于微信小程序获取小程序码并接受buffer流保存为图片的方法
- 关于微信小程序中链接使用canvas实时生成二维码使用保存至相册
- 关于.net编译过后的程序增加功能的一种实现方式_也可以说是.net exe注入,插件机制_开发记录
- 获取微信小程序二维码是乱码
- 微信小程序获取普通二维码
- 使用nodejs获取微信小程序带参数二维码
- 微信小程序-java后台如何调用微信公共接口获取openId的方式
- 微信小程序 获取小程序码和二维码java接口开发