微信小程序之微信登入
以下代碼基于uni-app編寫(xiě) 如果沒(méi)有appid,那么uni-login是受限制的
https://open.weixin.qq.com/ 認(rèn)證商戶()
微信登入
不同的應(yīng)用對(duì)于微信登入會(huì)做不同的處理,即微信服務(wù)器(微信官方的)返回發(fā)送的OpenId是不相同的(后面會(huì)解釋OpenId是干嘛用的,它涉及到數(shù)據(jù)庫(kù))。因此也有
UnionID
UnionID 機(jī)制說(shuō)明
如果開(kāi)發(fā)者擁有多個(gè)移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用、和公眾帳號(hào)(包括小程序),可通過(guò) UnionID 來(lái)區(qū)分用戶的唯一性,因?yàn)橹灰峭粋€(gè)微信開(kāi)放平臺(tái)帳號(hào)下的移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(hào)(包括小程序),用戶的 UnionID 是唯一的。換句話說(shuō),同一用戶,對(duì)同一個(gè)微信開(kāi)放平臺(tái)下的不同應(yīng)用,UnionID是相同的
本站后端服務(wù)后一部分(已經(jīng)獲取到OpenId,UnionID或者請(qǐng)求,暫時(shí)叫身份標(biāo)識(shí)VID)
當(dāng)客戶端已經(jīng)發(fā)送帶有VID的東西時(shí),可以存入數(shù)據(jù)庫(kù)表(
user表,有id, VID, name, avatarUrl等字段
)
,注意,獲取到VID先查詢是否存在,不存在則插入新增一條記錄,否則檢驗(yàn)name和VID是否匹配(其實(shí)可以只檢查VID),檢驗(yàn)成功則表示登入成功(這里可以使用正常的前后端登入邏輯,如token等),返回?cái)?shù)據(jù)給客戶端。
App端
AppSDK配置里的微信登入appid和appsecret需要填寫(xiě),開(kāi)發(fā)時(shí)暫時(shí)可以隨便寫(xiě),如果上線要申請(qǐng)微信的(微信開(kāi)發(fā)者平臺(tái))
app端可以直接通過(guò)接口獲取第三方接口:通過(guò)發(fā)送發(fā)送自帶的login請(qǐng)求,再響應(yīng)成功后,獲取到VID,再次請(qǐng)求getUserInfo,響應(yīng)成功獲取用戶微信已有信息,向本站服務(wù)器發(fā)起登入請(qǐng)求,攜帶VID(一般還有頭像和名稱)
export default {data() {return {};},//生命周期onLoad:function(){//app 端微信登錄// 手冊(cè)位置 https://uniapp.dcloud.io/api/plugins/login?id=getuserinfo// #ifdef APP-PLUS 判斷環(huán)境uni.login({success: (res) => {// res 對(duì)象格式//{"code":"***",//"authResult":{//"openid":"***",//"scope":"snsapi_userinfo",//"refresh_token":"**",//"code":"****",//"unionid":"***",//"access_token":"***",//"expires_in":7200//},//"errMsg":"login:ok"}uni.getUserInfo({success: (info) => {// info 對(duì)象格式// {"errMsg":"getUserInfo:ok",// "rawData":"...// "userInfo":{//"openId":"***",//"nickName":"***",//"gender":1,// "city":"Xi'an",// "province":"Shaanxi",// "country":"China",// "avatarUrl":"頭像",// "unionId":"oU5Yyt_agt547zWyA0v0eLfFPqxo"//},"signature":""}// 與服務(wù)器交互將數(shù)據(jù)提交到服務(wù)端數(shù)據(jù)庫(kù)},fail: () => {uni.showToast({title:"微信登錄授權(quán)失敗"});}})},fail: () => {uni.showToast({title:"微信登錄授權(quán)失敗"});}})// #endif} }小程序端
進(jìn)入小程序后臺(tái)管理,點(diǎn)擊開(kāi)發(fā) => 開(kāi)發(fā)設(shè)置 可以看到id和serect,注意改變manifest.json配置即可,后端也是需要這些數(shù)據(jù)的,下面會(huì)講到
<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"}// 與服務(wù)器交互將數(shù)據(jù)提交到服務(wù)端數(shù)據(jù)庫(kù)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;// 登錄成功 記錄會(huì)員信息到本地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 + '');// 跳轉(zhuǎn)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// 調(diào)用 微信 login 獲取 codeuni.login({success: (res) => {uni.request({url:_self.apiServer+'member&m=codeToSession&code='+res.code,success: (sessions) => {// sessions.date 數(shù)據(jù)格式// expires_in:7200// openid:"oS6of0V0rdp9nY_BuvCnQUasOHYc"// session_key:"87sE2oDD8lc+aDJj0tB6+g=="// 獲取 unionIdsession_key = sessions.data.session_key;openid = sessions.data.openid;},});}});} }客戶端先調(diào)用uni.login獲取,微信平臺(tái)服務(wù)器返回的code、session_key,再向本站服務(wù)器訪問(wèn)提交code、session_key,后端拿到這些值進(jìn)行向微信服務(wù)器接口請(qǐng)求帶參數(shù)
$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方式 發(fā)送請(qǐng)求 返回?cái)?shù)據(jù) 數(shù)據(jù)包含OpenId $weixin = request($url) ctx.body = {$weixin }后端返回OpenId后,當(dāng)前端點(diǎn)擊登入按鈕,觸發(fā)微信的getUserInfo事件(微信只能通過(guò)按鈕實(shí)現(xiàn)),再用獲取到的OpenId去完成后面的邏輯
UnionID
(主要是要給錢(qián),注冊(cè)企業(yè)賬號(hào))
暫時(shí)不想用它,就不搞了,但是其實(shí)差不多的:
可以在getUserInFo獲取加密信息,將加密數(shù)據(jù)傳給后端,后端通過(guò)對(duì)于的js解密(官方給出解密函數(shù)),解密就能獲取
用戶信息和VID了
總結(jié)
以上是生活随笔為你收集整理的微信小程序之微信登入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 分页实现起始页算法
- 下一篇: 产品经理——关于版式设计!!