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}&timestamp={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代码写入你需要触发扫码的事件中,效果如图:

posted @   hadxs  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示