微信小程序之微信登入
以下代碼基于uni-app編寫 如果沒有appid,那么uni-login是受限制的
https://open.weixin.qq.com/ 認證商戶()
微信登入
不同的應用對于微信登入會做不同的處理,即微信服務器(微信官方的)返回發送的OpenId是不相同的(后面會解釋OpenId是干嘛用的,它涉及到數據庫)。因此也有
UnionID
UnionID 機制說明
如果開發者擁有多個移動應用、網站應用、和公眾帳號(包括小程序),可通過 UnionID 來區分用戶的唯一性,因為只要是同一個微信開放平臺帳號下的移動應用、網站應用和公眾帳號(包括小程序),用戶的 UnionID 是唯一的。換句話說,同一用戶,對同一個微信開放平臺下的不同應用,UnionID是相同的
本站后端服務后一部分(已經獲取到OpenId,UnionID或者請求,暫時叫身份標識VID)
當客戶端已經發送帶有VID的東西時,可以存入數據庫表(
user表,有id, VID, name, avatarUrl等字段
)
,注意,獲取到VID先查詢是否存在,不存在則插入新增一條記錄,否則檢驗name和VID是否匹配(其實可以只檢查VID),檢驗成功則表示登入成功(這里可以使用正常的前后端登入邏輯,如token等),返回數據給客戶端。
App端
AppSDK配置里的微信登入appid和appsecret需要填寫,開發時暫時可以隨便寫,如果上線要申請微信的(微信開發者平臺)
app端可以直接通過接口獲取第三方接口:通過發送發送自帶的login請求,再響應成功后,獲取到VID,再次請求getUserInfo,響應成功獲取用戶微信已有信息,向本站服務器發起登入請求,攜帶VID(一般還有頭像和名稱)
export default {data() {return {};},//生命周期onLoad:function(){//app 端微信登錄// 手冊位置 https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo// #ifdef APP-PLUS 判斷環境uni.login({success: (res) => {// res 對象格式//{"code":"***",//"authResult":{//"openid":"***",//"scope":"snsapi_userinfo",//"refresh_token":"**",//"code":"****",//"unionid":"***",//"access_token":"***",//"expires_in":7200//},//"errMsg":"login:ok"}uni.getUserInfo({success: (info) => {// info 對象格式// {"errMsg":"getUserInfo:ok",// "rawData":"...// "userInfo":{//"openId":"***",//"nickName":"***",//"gender":1,// "city":"Xi'an",// "province":"Shaanxi",// "country":"China",// "avatarUrl":"頭像",// "unionId":"oU5Yyt_agt547zWyA0v0eLfFPqxo"//},"signature":""}// 與服務器交互將數據提交到服務端數據庫},fail: () => {uni.showToast({title:"微信登錄授權失敗"});}})},fail: () => {uni.showToast({title:"微信登錄授權失敗"});}})// #endif} }小程序端
進入小程序后臺管理,點擊開發 => 開發設置 可以看到id和serect,注意改變manifest.json配置即可,后端也是需要這些數據的,下面會講到
<template><view><!-- #ifdef MP-WEIXIN --><button type="primary" open-type="getUserInfo" @getuserinfo="getUserInfo">使用微信登錄</button><!-- #endif --></view> </template> var _self, pageOptions, session_key, openid; export default {data() {return {};},methods:{// #ifdef MP-WEIXINgetUserInfo : (info) => {info = info.mp.detail.userInfo;//userInfo {"nickName":"深海","gender":1,...avatarUrl":"https://7tdPvkPaJlkaLFFbLAffGVApluZdanLkDVplNlAhq1EJA/132"}// 與服務器交互將數據提交到服務端數據庫uni.request({url: _self.apiServer+'member&m=login',method: 'POST',header: {'content-type' : "application/x-www-form-urlencoded"},data: {openid : openid,name : info.nickName,face : info.avatarUrl,},success: res => {console.log(res);res = res.data;// 登錄成功 記錄會員信息到本地if(res.status == 'ok'){uni.showToast({title:"登錄成功"});uni.setStorageSync('SUID' , res.data.u_id + '');uni.setStorageSync('SRAND', res.data.u_random + '');uni.setStorageSync('SNAME', res.data.u_name + '');uni.setStorageSync('SFACE', res.data.u_face + '');// 跳轉if(pageOptions.backtype == 1){uni.redirectTo({url:pageOptions.backpage});}else{uni.switchTab({url:pageOptions.backpage});}}else{uni.showToast({title:res.data});}},fail: (e) => {console.log(JSON.stringify(e));}});},// #endif},onLoad:function(options){_self = this;pageOptions = options;// #ifdef MP-WEIXIN// 調用 微信 login 獲取 codeuni.login({success: (res) => {uni.request({url:_self.apiServer+'member&m=codeToSession&code='+res.code,success: (sessions) => {// sessions.date 數據格式// expires_in:7200// openid:"oS6of0V0rdp9nY_BuvCnQUasOHYc"// session_key:"87sE2oDD8lc+aDJj0tB6+g=="// 獲取 unionIdsession_key = sessions.data.session_key;openid = sessions.data.openid;},});}});} }客戶端先調用uni.login獲取,微信平臺服務器返回的code、session_key,再向本站服務器訪問提交code、session_key,后端拿到這些值進行向微信服務器接口請求帶參數
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + APP_ID + "&secret=" + APP_SERECT +"&js_code=" + ctx.request.body['code'] +"&grant_type=authorization_code"; //Get方式 發送請求 返回數據 數據包含OpenId $weixin = request($url) ctx.body = {$weixin }后端返回OpenId后,當前端點擊登入按鈕,觸發微信的getUserInfo事件(微信只能通過按鈕實現),再用獲取到的OpenId去完成后面的邏輯
UnionID
(主要是要給錢,注冊企業賬號)
暫時不想用它,就不搞了,但是其實差不多的:
可以在getUserInFo獲取加密信息,將加密數據傳給后端,后端通過對于的js解密(官方給出解密函數),解密就能獲取
用戶信息和VID了
總結
以上是生活随笔為你收集整理的微信小程序之微信登入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分页实现起始页算法
- 下一篇: 产品经理——关于版式设计!!