先说一下我们实现的结果,先是由后端获取到二维码,然后返回给前端base64图片地址,最终效果图如下
实现方法
获取AccessToken凭证
首先我们需要获取到AccessToken凭证,然后缓存7200秒也就是2个小时代码如下
/// <summary> /// 获取AccessToken凭证 /// </summary> /// <returns></returns> public AccessToken? QRCode_AccessToken() { Var s = GetCachedString() ?? AccessToken().Result; return My.Parse<AccessToken>(s); } /// <summary> /// 获取AccessToken /// </summary> /// <returns></returns> private Async Task<string> AccessToken() { string url = $"https://Api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&Appid={appid}&secret={secret}"; var httpClient = http.CreateClient(); var httpResponseMessage = Await httpClient.GetAsync(url); var g = ""; if (httpResponseMessage.IsSuccessStatusCode) { g = await httpResponseMessage.Content.ReadAsStringAsync(); SetCachedString(g); } return g; } /// <summary> /// 设置缓存 /// </summary> /// <param name="db"></param> /// <returns></returns> private string SetCachedString(string db) { string cacheKey = "AccessToken"; string? cachedValue = _cache.Get<string>(cacheKey); // 尝试从缓存中获取值 if (cachedValue == null) { // 如果缓存中没有,生成新的字符串 var cachedString = db; // 设置缓存选项,过期时间为7200秒 var cacheEntryOptions = new MemoryCacheEntryOptions() .SetAbsoluteExpiration(TimeSpan.FromSeconds(7100)); // 设置绝对过期时间为7200秒 // 将字符串放入缓存 _cache.Set(cacheKey, cachedString, cacheEntryOptions); } return cachedValue??db; } /// <summary> /// 获得缓存 /// </summary> /// <returns></returns> private string? GetCachedString() { return _cache.Get<string>("AccessToken"); }
原理:先通过get方式通过API获取到数据,然后缓存起来,下次需要的就可以直接通过缓存来获取AccessToken。
获取二维码
在获得AccessToken后就可以直接通过POST参数到API获取到二维码了啊,代码如下
/// <summary> /// 获取小程序特定页面二维码 /// </summary> public async Task<ApiResuit> GetUnlimitedQRCode(int sid) { if (sid == 0) { return new ApiResuit { State = 500, Msg = "请传入商家Id" }; } var at = QRCode_AccessToken(); if (at == null) { return new ApiResuit { State = 500, Msg = "请求参数错误" }; } else { string url = "{\"width\":630,\"page\":\"pages/index/index\",\"scene\":\"sid=" + sid+"\"}"; var httpClient = http.CreateClient(); var content = new StringContent(url, Encoding.UTF8, "application/x-www-form-urlencoded"); var httpResponseMessage = await httpClient.PostAsync($"https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={at.access_token}", content); if (httpResponseMessage.IsSuccessStatusCode) { var gs = await httpResponseMessage.Content.ReadAsByteArrayAsync(); var b = "data:image/png;base64," + Convert.ToBase64String(gs); return new ApiResuit { Data = b, }; } return new ApiResuit { State = 500, Msg = "请求失败" }; }; }
这里要注意一下获得的字节数组是没有data前缀的,所以我们要手动附加data:image/png;base64,以上就是实现的方法,怎么样是否帮助到您?如果您需要使用Asp.Net开发小程序也可以联系我们奕玖可以,我们可以根据您的实际要求做专业的定制。