C#调用微信程序扫一扫
还是照旧废话不多说,直接上重点
相信大家都搜到了这篇文章,那么肯定也不是啥也不会,因此在以下文章中省略一些基础部分;
先简单说一下步骤【这是调用微信官方api的步骤】:
1.首先拿到appId与AppSecret。
2.获取token
3.根据token获取ticket
4.通过以上信息生成签名,正确的配置完签名才能调用微信api,签名格式如下:
const config = {
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名,见附录1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
}
wx.config(config);
接下来就是以上步骤的实现,不多说,直接上代码:
请求接口:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=xxx&secret=xxx
appid与secret填进去即可;
先写一下HttpClientHelper.cs
用来发送请求的静态辅助类:
public static T GetResponse<T>(string url)
where T : class, new()
{
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
var response = httpClient.GetAsync(url).Result;
var result = default(T);
if (response.IsSuccessStatusCode)
{
var t = response.Content.ReadAsStringAsync();
var s = t.Result;
result = JsonConvert.DeserializeObject<T>(s);
}
return result;
}
ok工具类有了,还需要实体来接收微信api返回的信息:
public class wechatResquert
{
//签名需要当前调用接口的页面地址,哪个页面调用扫一扫,穿哪个页面完整url进来
public string src { get; set; }
}
public class wechatResposen
{
public bool debug { get; set; }
public string appId { get; set; }
public string timestamp { get; set; }
public string nonceStr { get; set; }
public string signature { get; set; }
public string jsApid { get; set; }
public string ticket { get; set; }
public string string1 { get; set; }
}
public class wechatData
{
public string expires_in { get; set; }
public string access_token { get; set; }
public string errcode { get; set; }
public string ticket { get; set; }
public string errmsg { get; set; }
}
public class chatData
{
public bool succcess { get; set; }
public string msg { get; set; }
public string src { get; set; }
public wechatResposen data { get; set; } = new wechatResposen();//生成的签名
}
接下来就是缺一个生成签名的方法了,新建一个方法GetWeChatConfig
:
public ApiResult GetWeChatConfig(wechatResquert resquert){
chatData result = new chatData();
//记录当前是哪个页面,方便调试
result.src = resquert.src;
//获取token
wechatData data = HttpClientHelper.GetResponse<wechatData>("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={secret}");
if (data.errcode != "" && data.errcode != null)
{//失败就直接返回
result.succcess = false;
result.msg = data.errmsg;
return Success(result);
}
//获取ticket
wechatData ticket = HttpClientHelper.GetResponse<wechatData>($"https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={data.access_token}&type=jsapi");
if (ticket.errcode != "0" && ticket.errcode != null)
{//失败就直接返回
result.succcess = false;
result.msg = data.errmsg;
return Success(result);
}
//获取时间戳,生成随机字符,拼凑string1,将string1 Sha1加密生成signature
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
string timestamp = Convert.ToInt64(ts.TotalMilliseconds / 1000).ToString();//微信默认处理时间戳是10位数,所以在这里除以1000
string noncestr = Guid.NewGuid().ToString();
string string1 = $"jsapi_ticket={ticket.ticket}&noncestr={noncestr}×tamp={timestamp}&url={resquert.src}";//顺序不能改
using (SHA1 sha1 = SHA1.Create())
{
// 将输入字符串转换为字节数组
byte[] inputBytes = Encoding.UTF8.GetBytes(string1);
// 计算哈希值
byte[] hashBytes = sha1.ComputeHash(inputBytes);
// 将字节数组转换为十六进制字符串
StringBuilder sb = new StringBuilder();
foreach (byte b in hashBytes)
{
sb.Append(b.ToString("x2")); // "x2" 表示将字节转换为两位十六进制
}
result.succcess = true;
result.msg = "ok";
result.data.appId = "xxx";
result.data.debug = false;
result.data.jsApid = "scanQRCode";
result.data.nonceStr = noncestr;
result.data.timestamp = timestamp;
result.data.signature = sb.ToString();
result.data.ticket = ticket.ticket;
result.data.string1 = string1;
return Success(result);
}
}
ok后端代码层面就这么简单,data中就是生成的签名
前端引入<script src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
:
// 配置微信 JS-SDK,加入你已经通过后端GetWeChatConfig获取了配置信息_data
wx.config({
debug: false, // 调试模式,true 时会弹出调试信息
appId: _data.data.appId,
timestamp: _data.data.timestamp,
nonceStr: _data.data.nonceStr,
signature: _data.data.signature,
jsApiList: [_data.data.jsApid] // 需要使用的JS接口列表
});
// 配置完成后调用
wx.ready(function () {
console.log("微信 JS-SDK 配置完成");
wx.scanQRCode({
needResult: 1, // 默认为0,扫描结果由微信处理;1则直接返回扫描结果
scanType: ["qrCode"], // 可以指定扫二维码还是条形码
success: function (res) {
debugger
const result = res.resultStr; // 扫码结果
alert(result);
},
fail: function (err) {
alert("扫码失败: ", err);
}
});
});
// 处理配置失败
wx.error(function (err) {
console.error("微信 JS-SDK 配置失败: ", err);
});
将以上这段js代码写入你需要触发扫码的事件中,效果如图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构