微信掃一掃功能實現-附全部代碼


 首先在調用微信的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM