随着微信小程序的火热应用,市面上有关小程序开发的需求也多了起来。近来分析了一项生成有关生成微信小程序码的需求——要求扫码跳转到小程序指定页面(带参数);看了下小程序官方文档,以及网上的例子,未看到多少有价值的采用C#调用小程序接口生成小程序码的例子,于是拾起多年前的代码,略作分析尝试,在此分享给有需要的人,并以此抛砖引玉。

此文以HttpClient方式示例,当然采用老旧的HttpWebRequest也可以,在此不作分析。
生成微信小程序码(二维码)的接口主要有三个:

在此仅针对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
{
/// <summary>
/// 保存接口返回二进制流为文件方法
/// </summary>
/// <param name="requestUri">接口地址</param>
/// <param name="filePath">文件存储路径</param>
/// <param name="jsonString">json数据对象</param>
/// <param name="webapiBaseUrl"></param>
/// <returns></returns>
    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;        var folder = Path.GetDirectoryName(filePath);
       if (!Directory.Exists(folder))
       {
       Directory.CreateDirectory(folder);
       } using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
fs.Write(data, , data.Length);
fs.Flush();
fs.Close();
} result = true; }).Wait(); return result;
}
}
catch
{
return false;
}
}
}

一共4个参数:

  1. requestUri请求的接口URL;
  2. filePath小程序码(二维码)存储的绝对路径;
  3. jsonString提交的json数据对象;
  4. 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 格式的数据;方法里仅对返回二进制流作处理,其他可根据需求自行完善。

关于.NET HttpClient方式获取微信小程序码(二维码)的更多相关文章

  1. 微信小程序通过二维码获取参数运行

    小程序开发过程中会遇到参数id会通过二维码获取,然后执行接口获取数据,但是难免会遇到带过来的参数出现乱码,这样就需要解码,多个参数时就需要进行处理取我们需要的字段值:小程序开发过程中会遇到参数id会通 ...

  2. .NET开发微信小程序-生成二维码

    1.生成小程序二维码功能 直接请求相应的链接.传递相应的参数 以生成商铺的付款码为例: var shopsId = e.ShopsId //付款码的参数 var codeModel = new fun ...

  3. .NET开发微信小程序-生成二维码 - 转

    1.生成小程序二维码功能 直接请求相应的链接.传递相应的参数 以生成商铺的付款码为例: var shopsId = e.ShopsId //付款码的参数 var codeModel = new fun ...

  4. 微信小程序--扫描二维码

    场景---在微信中扫描朋友发来的二维码后进入小程序,其实那个地址是带有参数的,那么如何接收那个参数呢,其实就是进入小程序页面的onLoad生命周期行数的options参数里面.

  5. 又是新动作!微信小程序专属二维码出炉

    又到了晚上,微信又给我们带来了惊喜,并这次不是新的能力,而是把大家再熟悉不过的二维码换了新的造型. 正式揭晓:微信特制的小程序码.扫一扫新二维码 只要你的微信升级到了 6.5.7 版本,就可以扫码或者 ...

  6. 微信小程序- 生成二维码

    wx.request({ // 获取token url: 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential', ...

  7. 用 Python 把微信小程序的二维码转化成图片

    官方文档 import cString import requests from tornado.web import authenticated, RequestHandler URL = 'htt ...

  8. uniapp 微信小程序 生成二维码

    使用 tki-qrcode组件 生成二维码(https://www.npmjs.com/package/tki-qrcode) 1.引入 tki-qrcode 下载组件后引入 import tkiQr ...

  9. tp5生成小程序推广二维码

    //获取用户经销商信息 及生成推广二维码 public function qrcode() { //拿到openid 查找用户表内是否有该用户 没有则拒绝生成二维码 有则查看是否已生成二维码 有生成则 ...

随机推荐

  1. [UWP]占领标题栏

    1. 前言 每一个有理想的UWP应用都会打标题栏的注意,尤其当微软提供 将 Acrylic 扩展到标题栏 这个功能后,大部分Windows 10的原生应用都不乖了,纷纷占领了标题栏的一亩三分地.这篇博 ...

  2. 爬虫——cookie模拟登陆

    cookie适用于抓取需要登录才能访问的页面网站 cookie和session机制 http协议为无连接协议,cookie: 存放在客户端浏览器,session: 存放在Web服务器 人人网登录案例 ...

  3. unicode的编码与解码

  4. python中,一个函数想使用另一个函数中的变量

    问题: 第一个函数中用到了变量a:第二个函数也想使用变量a. 解决方法: 在第一个函数中将变量a定义为全局变量,然后在第二个函数中,也写上global a即可. 示例: def func1(): gl ...

  5. codeforces D. Mahmoud and Ehab and the binary string(二分)

    题目链接:http://codeforces.com/contest/862/submission/30696399 题解:这题一看操作数就知道是二分答案了.然后就是怎么个二分法,有两种思路第一种是找 ...

  6. codeforces 822 D. My pretty girl Noora(dp+素数筛)

    题目链接:http://codeforces.com/contest/822/problem/D 题解:做这题首先要推倒一下f(x)假设第各个阶段分成d1,d2,d3...di组取任意一组来说,如果第 ...

  7. POJ-2236 Wireless Network 顺便讨论时间超限问题

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 26131   Accepted: 108 ...

  8. CF922A Cloning Toys

    A. Cloning Toys time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  9. 前后端分离,获取token,验证登陆是否失效

    maven依赖 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</a ...

  10. 使用dubbo引用和发布服务时出现的异常:HTTP状态500 - 请求处理失败; 嵌套异常是com.alibaba.dubbo.rpc.RpcException:无法在服务cn.e3mall.service.ItemService中调用方法getTbItemById。使用dubbo版本2.5.3在消费者...

    异常情况如下: 从异常看,主要是因为TbItem没有序列化: 分析问题: 表现层调用服务端时返回了一个TbItem对象即Java对象,此时这个对象远程调用拿过来必须进行序列化,要进行网络传输必须先要把 ...