先说一下我们实现的结果,先是由后端获取到二维码,然后返回给前端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开发小程序也可以联系我们奕玖可以,我们可以根据您的实际要求做专业的定制。