在我們開發(fā)小程序的時(shí)候郎仆,需要通過授權(quán)獲取用戶的信息映跟。
第一種使用wx.getUserInfo直接獲取微信頭像畅卓,昵稱
// 必須是在用戶已經(jīng)授權(quán)的情況下調(diào)用
wx.getUserInfo({
success: function(res) {
var userInfo = res.userInfo
var nickName = userInfo.nickName
var avatarUrl = userInfo.avatarUrl
var gender = userInfo.gender //性別 0:未知尉咕、1:男、2:女
var province = userInfo.province
var city = userInfo.city
var country = userInfo.country
}
})
第二種方式使用wx.login()
這種方式即將被放棄毕匀,目前使用比較多的是的wx.login()铸鹰。因?yàn)橹苯邮褂脀x.getUserInfo是不能獲取更多的信息的,如微信用戶的openid皂岔。 官方提示掉奄,需要發(fā)送獲取到的code進(jìn)行請(qǐng)求到微信的后端API。根據(jù)文檔凤薛,只需要進(jìn)行一個(gè)get請(qǐng)求到如下地址即可:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_codeappid和secret在微信小程序后臺(tái)可以看到姓建,
js_code為使用wx.login登錄時(shí)獲取到的code參數(shù)數(shù)據(jù),grant_type這個(gè)不用改動(dòng)缤苫。
官方推薦
在login獲取到code速兔,然后發(fā)送到開發(fā)者后端,后端再通過接口去微信后端換取到openid和sessionKey之后活玲,然后把session返回給前端涣狗,就已經(jīng)完成登錄行為。而login行為是靜默舒憾,不必授權(quán)的镀钓,不會(huì)對(duì)用戶造成騷擾。getUserInfo只是為了提供更優(yōu)質(zhì)的服務(wù)而存在镀迂,比如展示頭像昵稱丁溅,判斷性別,通過unionId和其他公眾號(hào)上已有的用戶畫像結(jié)合起來提供歷史數(shù)據(jù)探遵。所以不必在剛剛進(jìn)入小程序的時(shí)候就強(qiáng)制要求授權(quán)窟赏。相關(guān)代碼如下所示妓柜。
JS代碼
var userInfo= (wx.getStorageSync('userInfo'))
if (userInfo) {
wx.getUserInfo({
success: function (res) {
that.setData({
nickName: res.userInfo.nickName,
avatarUrl: res.userInfo.avatarUrl,
})
},
fail: function () {
console.log("獲取失敗涯穷!")
},
complete: function () {
console.log("獲取用戶信息完成棍掐!")
}
})
} else {
wx.login({
success: function (res) {
console.log(res.code)
if (res.code) {
wx.getUserInfo({
withCredentials: true,
success: function (res_user) {
wx.request({
//后臺(tái)接口地址
url: 'https://xxxx.com/wx/login',
data: {
code: res.code
},
method: 'GET',
header: {
'content-type': 'application/json'
},
success: function (res) {
that.setData({
userInfo: res.errMsg.userInfo
})
wx.setStorageSync('userInfo', res.data.userInfo);
}
})
}, fail: function () {
wx.showModal({
title: '警告通知',
content: '您點(diǎn)擊了拒絕授權(quán),將無法正常顯示個(gè)人信息,點(diǎn)擊確定重新獲取授權(quán)。',
success: function (res) {
if (res.confirm) {
wx.openSetting({
success: (res) => {
if (res.authSetting["scope.userInfo"]) {////如果用戶重新同意了授權(quán)登錄
wx.login({
success: function (res_login) {
if (res_login.code) {
wx.getUserInfo({
withCredentials: true,
success: function (res_user) {
wx.request({
url: 'https://xxxx.com/wx/login',
data: {
code: res_login.code
},
method: 'GET',
header: {
'content-type': 'application/json'
},
success: function (res) {
that.setData({
userInfo: res.errMsg.userInfo
})
wx.setStorageSync('userInfo', res.errMsg.userInfo);
}
})
}
})
}
}
});
}
}, fail: function (res) {
}
})
}
}
})
}, complete: function (res) {
}
})
}
}
})
}
},
//globalData建議放在app.js拷况,方便統(tǒng)一管理
globalData: {
userInfo: null
}
后端代碼
由于我的后端是PHP寫的作煌,用的是thinkphp5框架,框架地址:https://www.kancloud.cn/manual/thinkphp5/118003
/**
* 小程序登錄
* @return array
*/
public function login() {
$code = input('post.code'); //這是從前端傳過來的code
$userInfo = input('post.userInfo');
$info = json_decode($userInfo, true);
$user = $info['userInfo'];
$memberModel = model('Member');
$appid = "小程序的appid"; //一定要是小程序的appid,不是微信公眾號(hào)的appid
$secret = "小程序的secret";
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=". $appid."&secret=".$secret."&js_code=" . $code . "&grant_type=authorization_code";
//初始化curl
$ch = curl_init($url);
//3.設(shè)置參數(shù)
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//跳過證書驗(yàn)證
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 從證書中檢查SSL加密算法是否存在
$res = curl_exec($ch);
if(curl_errno($ch)){
var_dump(curl_error($ch));
}
$resArr = json_decode($res,1);
$data = array();
curl_close($ch);
$mapData = array();
//這里我把用戶的信息保存起來赚瘦,方便下次調(diào)用粟誓,數(shù)據(jù)庫(kù)結(jié)構(gòu)我們?cè)谙旅鏁?huì)介紹
if (!empty($resArr['openid'])) {
$res = $memberModel->checkMember($resArr['openid']);
Log::write('用戶信息:' . $memberModel->getLastSql());
if ($res) {
$mapData['userInfo'] = $res;
$mapData['session_key'] = $resArr['session_key'];
return $this->resMap(200, $mapData, $mapData);
} else {
$data['nickName'] = $user['nickName'];
$data['avatarUrl'] = $user['avatarUrl'];
$data['m_province'] = $user['province'];
$data['m_city'] = $user['city'];
$data['m_gender'] = $user['gender'];
$data['m_language'] = $user['language'];
$data['signature'] = $info['signature'];
$data['iv'] = $info['iv'];
$data['m_uuid'] = showUuid();
$data['m_openid'] = $resArr['openid'];
$data['m_country'] = $resArr['country'];
$data['m_ip'] = GetIP();
$data['m_createtime'] = getDateTime(1);
$memberModel->addOne($data);
$mapData['userInfo'] = $data;
$mapData['session_key'] = $resArr['session_key'];
return $this->resMap(200, $mapData, $mapData);
}
} else {
return $this->resMap(4002, '登錄失敗', '登錄失敗');
}
}
/**
* 返回提示信息
* @param $code string 錯(cuò)誤碼 4001 空值 4002 格式不正確 4003 長(zhǎng)度 4004 提示 200正確放回 ,0失敗
* @param $msg string 錯(cuò)誤描述
* @param $data string 返回值
* @return array
*/
public function resMap($code, $msg, $data)
{
$map = array();
$map['errMsg'] = $msg;
$map['data'] = $data;
$map['errCode'] = $code;
return json($map);
}
以上就是核心代碼,希望對(duì)大家有用蚤告。在上面努酸,我們需要保存用戶的信息服爷,因此我們需要數(shù)據(jù)庫(kù)表杜恰,下面就談到表的設(shè)計(jì)。
用戶表的設(shè)計(jì)
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `system_member`
-- ----------------------------
DROP TABLE IF EXISTS `system_member`;
CREATE TABLE `system_member` (
`m_id` INT(11) NOT NULL AUTO_INCREMENT,
`nickName` VARCHAR(50) DEFAULT NULL COMMENT '用戶昵稱',
`avatarUrl` VARCHAR(255) DEFAULT NULL COMMENT '頭像',
`m_province` VARCHAR(40) DEFAULT NULL COMMENT '省份',
`m_city` VARCHAR(50) DEFAULT NULL COMMENT '城市',
`m_name` VARCHAR(30) DEFAULT NULL COMMENT '真實(shí)姓名',
`m_gender` TINYINT(1) DEFAULT '3' COMMENT '用戶性別(1仍源、男 2心褐、女 3、未知)',
`m_createtime` DATETIME DEFAULT NULL COMMENT '創(chuàng)建時(shí)間',
`m_country` VARCHAR(100) DEFAULT NULL COMMENT '國(guó)家',
`m_language` VARCHAR(50) DEFAULT NULL COMMENT '語(yǔ)言',
`m_openid` VARCHAR(50) DEFAULT NULL COMMENT 'openID',
`m_ip` VARCHAR(15) DEFAULT NULL COMMENT 'IP',
`m_mobile` VARCHAR(20) DEFAULT NULL COMMENT '手機(jī)號(hào)碼',
`m_uuid` VARCHAR(50) DEFAULT NULL,
`m_username` VARCHAR(50) DEFAULT NULL COMMENT '用戶名',
`m_pwd` VARCHAR(50) DEFAULT NULL COMMENT '密碼',
`session_key` VARCHAR(255) DEFAULT NULL COMMENT '會(huì)話密鑰',
`unionid` VARCHAR(255) DEFAULT NULL COMMENT '用戶在開放平臺(tái)的唯一標(biāo)識(shí)符',
`signature` VARCHAR(255) DEFAULT NULL,
`iv` VARCHAR(255) DEFAULT NULL,
`k_id` VARCHAR(50) DEFAULT NULL,
`k_openid` VARCHAR(80) DEFAULT NULL,
PRIMARY KEY (`m_id`)
) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='獲取用戶小程序信息';
以上就是獲取用戶信息的完整流程笼踩,下面我們附上一張用戶登錄的流程圖逗爹。
以上就是全部?jī)?nèi)容,希望對(duì)大家有用嚎于,謝謝大家(__) 嘻嘻……