在前面隨筆《使用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開發微信小程式--判斷使用者是否登入並跳轉