.NET WebAPI 微信網頁授權的實現(一)前端篇

寫在前面

微信網頁授權登陸是微信網頁開發的第一步,由於框架限制需要使用.NET WebAPI的前後端分離模式進行開發,所以經過幾天的摸索,寫了這個簡單的微信網頁授權的實現Demo,本篇文章爲微信公衆號的配置與前端頁面的實現,後端部分在下一篇文章中,鏈接也在文章底部。特別說明,本文章適用於微信內網頁應用的授權登陸,不適用於普通網站的掃碼授權登錄,將在後續文章中進行論述。

後端篇https://blog.csdn.net/weixin_42550800/article/details/94983616

正式開始

首先,我們需要對微信網頁授權的機制有所瞭解,許多場景下,我們只需要獲取微信用戶的相關信息,包括暱稱、頭像、OpenId等信息。(OpenID是用戶在訪問公衆號應用時分配的唯一標識,要注意的是,同一個用戶在不同的微信公衆號的OpenID不同)。

在確定了這個需求後,就要了解微信的授權機制。首先用戶在微信中訪問對應的網頁應用,當應用檢測到沒有對應的用戶信息時就會跳轉到授權頁面,用戶選擇同意或者不同意後返回到要跳轉的頁面(回調頁面)。在回調頁面中對微信的授權服務器進行請求,則可以順利獲取用戶的相關信息。在請求過程中需要攜帶相關參數在正文中進行論述。

配置公衆號

(相關操作需要認證後的服務號,如果沒有認證服務號在左側菜單底部選擇開發者工具->公衆平臺測試賬號進行相關配置)

正常配置如下:

1.登陸微信公衆平臺後進入功能設置

2. 配置授權域名

配置步驟不進行贅述,參見配置過程中的官方提示。值得注意的是這裏只能配置兩個域名,而且不能帶端口,如果需要使用多個域名或端口則需使用Ngnix或其它的代理。所有前端頁面必須在該域名下才能進行授權,不然會報錯。

 3.獲取AppId和Secret

開發->基本配置  ,配置完成後開始網頁編寫 

前端實現

目標:實現授權登陸並獲取頭像、暱稱、所在省份城市

首先需要引入JQ <script src="http://code.jquery.com/jquery-3.4.1.min.js"></script>

Js代碼分爲Common與Center兩個類

Common中包含:getUrlParameter方法在Url中拆分對應參數

                             getWxUserInfo方法連接後臺代碼,獲取用戶信息,存入localStorage

Center中包含:    Init方法用來初始化界面

                             enterWxAuthor方法判斷是否存儲了登陸狀態,如果沒有則跳轉至授權界面

代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 如果添加此標籤將把所有跨域請求轉化爲https請求 -->
    <!-- <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> -->
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
        <img id="headimgurl" src="">
        <br />
        歡迎,<span id="nickname"></span><br />
        <span id="province"></span>,
        <span id="city"></span>
        <script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
        <script src="http://code.jquery.com/jquery-3.4.1.min.js"></script>
        <script>
            //替換爲獲取的APPID
            var WX_APPID = 'XXXXXXXX';
            //服務端地址
            var WX_ROOT = 'http://xxxx/api/';
            //一般工具類
            var common = {
                getUrlParameter:function(name) {//封裝方法
                        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //構造一個含有目標參數的正則表達式對象
                        var r = window.location.search.substr(1).match(reg); //匹配目標參數
                        if (r != null) return unescape(r[2]);
                        return null; //返回參數值
                },
                /*** 授權後獲取用戶的基本信息*/
                getWxUserInfo:function(par){
                    
                    var code = common.getUrlParameter("code");
                    if (par) code = par;
                    $.ajax({
                        async: false,
                        data: {code:code},
                        type : "GET",
                        dataType:"json",
                        url : WX_ROOT + "Wechat/GetUserInfo",
                        
                        success : function(json) {
                            
                            if (json){
                                console.log(json);
                                try {
                                    //保證寫入的wxUserInfo是正確的
                                    if (json.Accesstoken.openid) {
                                        var str_jsonData = JSON.stringify(json);
                                        localStorage.setItem('wxUserInfo',str_jsonData);//寫緩存--微信用戶信息
                                    }
                                } catch (e) {
                                    // TODO: handle exception
                                }
                            }
                        }
                    });
                }
            }
            //頁面邏輯控制類
            var center = {
                init: function(){
                    
                    var getLocalData = localStorage.getItem('wxUserInfo');
                    var wxUserInfo = JSON.parse(getLocalData);
                    
                    $('#nickname').html ( wxUserInfo.Accesstoken.nickname);
                    $('#province').html ( wxUserInfo.Accesstoken.province);
                    $('#city').html ( wxUserInfo.Accesstoken.city);
                    $("#headimgurl").attr("src",wxUserInfo.Accesstoken.headimgurl);
                },
                enterWxAuthor: function(){
                    
                    var wxUserInfo = localStorage.getItem("wxUserInfo");
                    if (!wxUserInfo) {
                        var code = common.getUrlParameter('code');
                        if (code) {
                            common.getWxUserInfo();
                            center.init();
                        }else{
                            //沒有微信用戶信息,沒有授權-->> 需要授權,跳轉授權頁面
                            window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='+ WX_APPID +'&redirect_uri='+ 'http://shop.qimeng.group' +'&response_type=code&scope=snsapi_userinfo#wechat_redirect';
                        }
                    }else{
                        center.init();
                    }
                }
            }
            //頁面函數入口
            $(function() { 
                center.enterWxAuthor();
            });
        </script>
</body>
</html>

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章