【.NET】.NET MVC4 微信扫一扫功能实现-附全部代码

写在前面的

   首先在调用微信的JS-SDK接口的时候需要仔细阅读一下官方的注意事项,否则可能事倍功半。这里先大概概述一下主要的流程,首先,使用微信扫一扫需要一个已经通过认证的公众号;其次,需要知道公众号的APPID以及APPSecrect,以便获取Access_Token和Ticket;再有就是需要了解.NET内部的SHA1的加密类;最后引用官方的JS,就可以了。

VIEW代码

需要注意的是,公众号一定要有域名绑定

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"> </script>
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script>
    <script src="~/Script/WxScanQRCode.js"></script>
    <script>
        wx.config({
        debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
        appId: ‘@ViewBag.appid‘, // 必填,公众号的唯一标识
        timestamp: ‘@ViewBag.timestamp‘, // 必填,生成签名的时间戳
        nonceStr: ‘@ViewBag.noncestr‘, // 必填,生成签名的随机串
        signature: ‘@ViewBag.sinature‘,// 必填,签名
        jsApiList: [‘checkJsApi‘,
        //这里的接口在官方文档中都有涉及,我们只需要调用微信扫一扫即可
                    //‘chooseImage‘,
                    //‘previewImage‘,
                    // ‘uploadImage‘,
                    // ‘downloadImage‘,
                    //  ‘getNetworkType‘,//网络状态接口
                    //  ‘openLocation‘,//使用微信内置地图查看地理位置接口
                    //  ‘getLocation‘, //获取地理位置接口
                    //  ‘hideOptionMenu‘,//界面操作接口1
                    //  ‘showOptionMenu‘,//界面操作接口2
                    //  ‘closeWindow‘,  ////界面操作接口3
                    //  ‘hideMenuItems‘,////界面操作接口4
                    //  ‘showMenuItems‘,////界面操作接口5
                    //  ‘hideAllNonBaseMenuItem‘,////界面操作接口6
                    //  ‘showAllNonBaseMenuItem‘,////界面操作接口7
                      ‘scanQRCode‘// 微信扫一扫接口
        ]
        });
        <!--开始扫描-->
        function scan(){
            wx.ready(function () {
                var _scan = document.getElementById("url");
                _scan.value = window.location.href;
                wx.scanQRCode({
                    needResult: 1,
                    desc: ‘scanQRCode desc‘,
                    success: function (res) {
                        alert(JSON.stringify(res));
                    }
                });
            })
        }
    </script>
</head>

<body>
    <div>
        <input type="text" name ="url" id="url">
        <button id="scanbutton" type="button" onclick="scan()">click here to scan</button>
    </div>
</body>
</html>

Controller代码

首先,我们需要根据APPID和APPSecrect来获取Access_Token,之后根据AccessToken来获取jsapi_ticket。最后,在Controller内部生成时间戳,随机字符串,之后将ticket以及前两者根据SHA1加密成签名,并发送给微信服务器,通过认证之后,这样就可以调用扫一扫的接口了。

public ActionResult Index()
        {
            //获取ACCESS_TOKEN
            string _url = Request.Url.ToString();
            //获取Ticket
            string _ticket = Requestjsapi_ticket(Request_Url());
            //获取ticket
            string _finalticket = _ticket;
            //获取noncestr
            string _noncestr = CreatenNonce_str();
            //获取timestamp
            long _timestamp = CreatenTimestamp();
            //获取sinature
            string _sinature = GetSignature(_finalticket, _noncestr, _timestamp, _url).ToLower();

            ViewBag.appid = "这里填写你的APPID";
            ViewBag.timestamp = _timestamp;
            ViewBag.noncestr = _noncestr;
            ViewBag.sinature = _sinature;
            return View();

        }

//获取AccessToken
        public static string Request_Url()
        {
            // 设置参数
            string _appid = "这里写入你的APPID";
            string _appsecret = "这里写入你的APPSecrect";
            string _url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + _appid + "&secret=" + _appsecret;
            string method = "GET";
            HttpWebRequest request = WebRequest.Create(_url) as HttpWebRequest;
            CookieContainer cookieContainer = new CookieContainer();
            request.CookieContainer = cookieContainer;
            request.AllowAutoRedirect = true;
            request.Method = method;
            request.ContentType = "text/html";
            request.Headers.Add("charset", "utf-8");

            //发送请求并获取相应回应数据
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            //直到request.GetResponse()程序才开始向目标网页发送Post请求
            Stream responseStream = response.GetResponseStream();
            StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
            //返回结果网页(html)代码
            string content = sr.ReadToEnd();
            //由于微信服务器返回的JSON串中包含了很多信息,我们只需要将AccessToken获取就可以了,需要将JSON拆分
            String[] str = content.Split(‘"‘);
            content = str[3];
            return content;
        }

 //根据AccessToken来获取jsapi_ticket
        public static string Requestjsapi_ticket(string accesstoken)
        {

            string _accesstoken = accesstoken;
            string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + _accesstoken + "&type=jsapi";
            string method = "GET";
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            CookieContainer cookieContainer = new CookieContainer();
            request.CookieContainer = cookieContainer;
            request.AllowAutoRedirect = true;
            request.Method = method;
            request.ContentType = "text/html";
            request.Headers.Add("charset", "utf-8");
            //发送请求并获取相应回应数据
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            //直到request.GetResponse()程序才开始向目标网页发送Post请求
            Stream responseStream = response.GetResponseStream();
            StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
            //返回结果网页(html)代码
            string content = sr.ReadToEnd();
            //同样,返回的JSON中只要取出ticket的信息即可
            String[] str = content.Split(‘"‘);
            content = str[9];
            return content;
        }

//接下来就是辅助工具类,生成随机字符串
#region 字符串随机 CreatenNonce_str()
        private static string[] strs = new string[]
                                    {
                                    "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
                                    "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
                                    };
        public static string CreatenNonce_str()
        {
            Random r = new Random();
            var sb = new StringBuilder();
            var length = strs.Length;
            for (int i = 0; i < 15; i++)
            {
                sb.Append(strs[r.Next(length - 1)]);
            }
            return sb.ToString();
        }
        #endregion

//生成时间戳,备用
 #region 时间戳生成 CreatenTimestamp()
        public static long CreatenTimestamp()
        {
            return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
        }
        #endregion

//获取签名,这里的三个参数分别为前面生成的ticket,随机字符串以及时间戳
#region 获取签名 GetSignature()
        public static string GetSignature(string jsapi_ticket, string noncestr, long timestamp,string url)
        {

            var string1Builder = new StringBuilder();
            string1Builder.Append("jsapi_ticket=").Append(jsapi_ticket).Append("&")
                          .Append("noncestr=").Append(noncestr).Append("&")
                          .Append("timestamp=").Append(timestamp).Append("&")
                          .Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url);
            return SHA1(string1Builder.ToString());
        }
        #endregion

//最后就是SHA1的加密算法工具
 #region 加密签名算法 SHA1(content)
        //加密签名算法
        public static string SHA1(string content)
        {
            return SHA1(content, Encoding.UTF8);

        }
        //加密签名
        public static string SHA1(string content, Encoding encode)
        {
            try
            {
                SHA1 sha1 = new SHA1CryptoServiceProvider();
                byte[] bytes_in = encode.GetBytes(content);
                byte[] bytes_out = sha1.ComputeHash(bytes_in);
                sha1.Dispose();
                string result = BitConverter.ToString(bytes_out);
                result = result.Replace("-", "");
                return result;
            }
            catch (Exception ex)
            {
                throw new Exception("SHA1加密出错:" + ex.Message);
            }
        }
        #endregion

总结

代码复制即可使用,需要注意的还是公众号的认证,域名的绑定,以及最后加密算法生成的字符串的正确性,少了哪一步,我们都不会得到一个正确的返回结果。

转载:https://blog.csdn.net/SugaryoTT/article/details/78558105

原文地址:https://www.cnblogs.com/niyl/p/9245676.html

时间: 2024-10-01 08:09:36

【.NET】.NET MVC4 微信扫一扫功能实现-附全部代码的相关文章

安卓服务端开发(1) 安卓结合PHP实现连接数据库验证登录功能(附全部代码)

啥都不说了,直接上代码.如果看不懂在下面和我留言. 先看服务端:使用PHP语言,部署在新浪sae服务器(自带数据库) 将一下所有php文件放在同一个目录下: 1.db.php  封装好的用于连接数据库的类 <?php class Db{ static private $_instance; static private $_connectSource; //因为是连接新浪sae服务器所以下面的参数不生效. /*private $_dbConfig=array( 'host'=>'127.0.0

微信扫一扫的扫码功能是本地实现还是联网实现的?

微信扫一扫的扫码功能很弱,速度慢,经常有二维码识别不了.Dynamsoft的同事怀疑微信的扫码不是在本地完成的,而是把数据传输到了server端来解码.如何才能得到答案? 微信扫一扫网速检测 为什么会有人怀疑微信的扫码是需要连接server的,原因在于在断网的情况下,微信扫描是不可用的.那么在联网的情况下怎么可以知道数据传输了没有?我在手机上打开状态栏网速显示. 数值很小,不可能有图像数据传输.扫码应该是本地完成的.再进一步验证下. 窥探微信安装包 手机应用的安装包其实就是一个压缩包,用7zip

C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能

前面介绍了很多篇关于使用C#开发微信门户及应用的文章,基本上把当时微信能做的接口都封装差不多了,微信框架也积累了不少模块和用户,最近发现微信公众平台增加了不少内容,特别是在自定义菜单里面增加了扫一扫.发图片.发地理位置功能,这几个功能模块很重要,想想以前想在微信公众号里面增加一个扫描二维码的功能,都做不了,现在可以了,还可以拍照上传等功能,本文主要介绍基于我前面的框架系列文章,进一步介绍如何集成和使用这些新增功能. 1.微信几个功能的官方介绍 1). 扫码推送事件 用户点击按钮后,微信客户端将调

微信公众号开发纪要(4)-调用微信扫一扫功能

在微信公众号页面中调用微信扫一扫功能,就是调用微信JS-SDK.让JS-SDK完成调用摄像头扫描,然后我们将扫描结果进行业务操作.微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包.通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微信分享.扫一扫.卡券.支付等微信特有的能力,为微信用户提供更优质的网页体验.如何调用微信JS-SDK,在微信公众平台技术文档中的微信网页开发-->微信JS-SDK说明文档中有详细

调用微信扫一扫功能,踩坑&#39;invalid signature&#39;

在vue项目中,调用微信扫一扫功能,在安卓系统下完全正常,ios系统下却报错'invalid signature'的错误,这可能令许多小伙伴困惑,经过查询大量博客相关资料,才找到了解决的方法. 原因:由于在ios和android中,location.href在spa页面的机制不同(不同在于ios是只要不刷新页面,href就不会改变,在vue项目中就会出现类型的问题),所以我们需要借助路由钩子函数,手动改变其页面的url地址,这样ios系统的手机才能正常调起微信扫一扫. beforeRouteEn

微信扫码支付功能(1)---通过谷歌二维码工具生成付款码

生成付款二维码 一.微信网站扫码支付介绍 1.扫码支付文档 微信开发官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5 有关微信支付的流程图微信官方已经说的很清楚了,这里也无需其它解释.这边采用微信支付扫码模式二(不依赖商户平台设置回调url),所以在生成二维码之前 要先调用微信统一下单支付接口,获得code_url,再通过谷歌二维码工具将code_url生成二维码图片. 2.名称理解 在微信扫码支付功能开发之前,

微信扫码支付功能(2)---用户扫码支付成功,微信异步回调商户接口

用户扫码支付成功,微信异步回调商户 上一篇博客完成用户扫码支付功能: https://www.cnblogs.com/qdhxhz/p/9708534.html 当用户扫码支付成功之后,微信会异步回调商户接口,告知用户支付成功.好让商户进行下一步操作. 一.接口说明 1.流程图 这里要做的就是用户支付成功后,微信异步通知商户支付结果,商户收到通知后告知支付通知接收情况. 2.接口说明 有关商户接口应注意以下几点: (1)该链接是通过[统一下单API]中提交的参数notify_url设置,如果链接

最全面的调用微信的扫一扫功能(java 排坑版)

最近碰到了这么一个需求,说是在前端页面调用手机本地的相机,扫描二维码这么一个需求,对于我一个后端来说, 这实在是难,难于上青天,但是决不能说一个不字.我说可以使用微信的扫码工具吗,这样可以方便一点,...(起码有个思路) 看着微信文档,一步一步坑下去.不对,是走下去. 这里我们用测试是公众号,方便测试. 首先配置自己的appID和appsecret,这里的测试帐号直接就给出了 第二步: 验证服务器,这个很简单,按照文档的规则验证就好了 第三步: 直接使用二级域名,不能添加http://前缀,或者

asp微信扫一扫代码,用asp写的实现调用微信扫一扫功能

最近一个客户要求想在他的微信会员卡系统中实现调用微信扫一扫功能,扫描他的会员卡上的条形码,读出会员卡号来,研究了一会,发现并不难,下面上代码: <div id="result"></div><button id="wxscan">调起扫一扫功能</button> <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"><