使用uView UI+UniApp開發微信小程序--微信授權綁定和一鍵登錄系統


在前面隨筆《使用uView UI+UniApp開發微信小程序》和《使用uView UI+UniApp開發微信小程序--判斷用戶是否登錄並跳轉》介紹了微信小程序的常規登錄處理和驗證碼登錄處理的一些經驗,本篇隨筆繼續介紹第三種登錄方式,微信授權登錄。微信授權登錄是系統用戶表綁定了微信小程序OpenID后,通過前端發起微信的登錄授權,順利獲得微信授權后獲得code,並在我們自己的服務后台接口通過code解析出用戶的OpenId,然后獲得對應用戶的身份token信息返回給前端,前端完成登錄后的跳轉處理。

 1、微信授權登錄界面

我們前面介紹過常規的賬號密碼登錄處理和驗證碼登錄處理,第三種登錄方式微信授權登錄也是很常見的,因此整合在系統中方便使用,界面效果如下所示。

這個界面很簡單,只需要提供一個按鈕觸發授權登錄即可。

不過,授權登錄需要用戶登錄系統后綁定微信才能進行一鍵登錄,否則是無法識別用戶的openid,也就無法一鍵登錄了。

 一旦綁定微信,也就是建立了用戶和小程序OpenId 之間的關聯,也就可以實現微信授權登錄了。授權綁定需要獲取用戶信息,因此需要發起用戶授權的確認操作,如下界面所示。

 如果需要取消,那么隨時取消授權也可以,系統提供入口處理即可,一般在同一界面中根據狀態綁定或者解綁。

  以上就是大概的界面處理流程,剩下的就是我們需要編碼實現相應的邏輯即可。

 

2、微信授權綁定和一鍵登錄系統處理

用戶授權綁定或者解綁,我們通過狀態來識別提供相關的功能即可,如下界面代碼所示。

<view class="bottom">
    <u-button v-if="!vuex_user.openid" shape="circle" type="success" @click="authLogin">授權綁定</u-button>
    <u-button v-else shape="circle" type="error" @click="cancelBind">取消綁定</u-button>
    <u-gap height="20"></u-gap>
    <u-button shape="circle" @click="gotoMyInfo">返回我的頁面</u-button>
</view>

微信授權登錄的綁定微信操作代碼如下所示。

 首先先通過uni.getUserProfile獲得用戶信息,返回的信息,不包括openid信息,只是一些基礎的昵稱,頭像等信息,如下所示

 

不過它本身的加密信息,是我們可以通過它來在服務器后端解析出來openid的。注意,前端在正式發布后,騰信API是不在授權名單中,因此不能通過純前端的方式解析openid,除非通過定義雲函數方式調用(也就是離不開服務器)。

我們這里通過服務器端進行解析,因此服務端的域名是在授權Https列表中的

一般服務器端的接口順利獲取openid等數據,就直接resolve執行成功的回調操作

服務端直接通過jscode2session的處理即可獲取對應的數據了

        public JSCode2SessionResult JSCode2Session(string appid, string secret, string js_code, string grant_type = "authorization_code")
        {
            var url = string.Format("https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type={3}", appid, secret, js_code, grant_type);
            
            var result = WeJsonHelper<JSCode2SessionResult>.ConvertJson(url);
            return result;
        }

如果前端通過下面代碼測試非正式的環境,也可以獲得openid,正式環境下,小程序不接受https://api.weixin.qq.com的域名的。

 uni.request({
     url: 'https://api.weixin.qq.com/sns/jscode2session?appid=' +
         data.appid +
         '&secret=' +
         data.secret +
         '&js_code=' +
         loginRes.code +
         '&grant_type=authorization_code',
     success: codeRes => {
         // console.log(codeRes)
         resolve(codeRes.data)
     },
     fail: () => {
         var tips = '獲取 SesssionKey OpenId 失敗'
         vm.$u.toast(tips)
         reject(tips)
     },
 })

一般我們獲得用戶的openid等詳細信息,我們可以把這些信息寫入服務器的相關表中,並更新用戶的openid即可

服務端接口接受用戶數據,並寫入或者更新小程序用戶表信息,同時更新系統用戶的openid即可。

一般前端順利獲得結果,就跳轉用戶頁面即可。

	setTimeout(() => {
		uni.switchTab({ url: '/pages/task/login/myinfo' });
	}, 3000);

 而取消用戶綁定,只需要置空服務器端用戶表對應記錄的openId,並置空本地用戶的openid信息即可。

cancelBind() { //取消綁定微信
    var param = {id: this.vuex_user.id}
    this.$u.api.User.CancelBindWechat(param).then(res=> {
        console.log(res)
        if(res.success){
            this.$u.toast('已取消綁定')
            this.$u.vuex('vuex_user.openid', '')
            this.$u.vuex('vuex_user.wechatInfo', null) // 重置微信信息
            this.headimg = '/static/images/wx_ico.png'
        } else {
            this.$u.toast('取消綁定失敗')
        }
    })
},

至此,我們就完成了用戶綁定和解綁微信的相關操作了。剩下的就是我們需要處理登錄界面上一鍵登錄的處理了。

登錄的方法代碼如下所示。

login() {
    let _self = this;
    // 0. 顯示加載的效果
    uni.showLoading({ title: '登錄中...' });

    var data = {}
    _self.$u.api.User.wechatlogin(data) //微信登陸授權
        .then(res => {
            console.log(res);
            uni.hideLoading();
            _self.$u.toast('登錄成功');
 uni.switchTab({ url: '/pages/task/login/myinfo' });
        })
        .catch(error => {
            console.log(error);
            _self.error = error;
        });
}

也就是我們封裝了一個微信授權登錄的邏輯,一旦成功返回,就跳轉到指定頁面上去即可。

其中封裝的Promise函數邏輯代碼如下所示

 

 先在前端發起登錄處理,獲得code提交給服務器進行處理驗證即可。

大概的步驟分為:

1)通過code 換取 session_key

2)從系統中判斷是否存在用戶

3)根據用戶身份生成tokenresult

代碼邏輯如下所示

 

 以上就是微信授權綁定和一鍵登錄系統的相關處理邏輯及代碼,其實無論常規的賬號密碼登陸、短信驗證碼登陸、微信一鍵登錄,大致的處理過程都大同小異,就是先通過直接或者間接的方式確認用戶身份的有效性,然后獲得用戶的信息,構建返回的token令牌信息給前端使用即可。前端則負責處理結果邏輯,是提示用戶還是順利跳轉到默認用戶頁面即可。

相關文章:

使用uView UI+UniApp開發微信小程序

使用uView UI+UniApp開發微信小程序--判斷用戶是否登錄並跳轉

 


免責聲明!

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



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