小程序獲取用戶信息,首先獲取openid 和session_key來標識用戶,獲取這兩個數需要前端傳一個code。微信公眾號開發的時候,這個code可以自己生成,但是小程序開發的時候不可以。
小程序的用戶信息,是可以直接傳輸到后端的,現在最新版本的需要用戶授權,授權之后前端穿頭像,昵稱,性別等入庫即可),由於小程序不是在瀏覽器里打開的,沒法用cookie,所以也沒法用session,它的每次請求都要經過微信服務器中轉。所以傳輸sessionid是獲取不到session的,要想實現登陸功能,需要把session的信息存到redis等緩存之中,設置保存時間。也可以寫死(安全系數低),會這樣就不用每次登陸了,如果要登陸,也可以加個login_log表,然后根據create_time設置登陸過期時間,也就是一個 偽裝的登陸。
session_start();
if(empty($_SESSION['openid'])){
$data = array(
'appid'=>$this->appid,
'secret'=>$this->AppSecret,
'js_code'=>$_POST['code'],
'grant_type'=>'authorization_code',
);
$appid = $this->appid;
$secret = $this->AppSecret;
$code = trim($_POST['code']);
//獲取openid
$url = 'https://api.weixin.qq.com/sns/jscode2session?appid=wx96fad81880c36&secret=dff3ab417538e67943cb109ef9c9e&js_code='.$code.'&grant_type=authorization_code';
$res = httprequest($url);
//用戶openid跟session_key
$r = json_decode($res,true);
if(empty($r['openid'])){
$msg['status'] = 'error';
$msg['msg'] = '獲取openid錯誤';
echo json_encode($msg);exit();
}
//獲取是否有上級id 分享id
$pid = (int)$_POST['share_user'];
//獲取是否有渠道id
$channel = $_POST['channel'];
//獲取用戶微信信息,包括昵稱,頭像等等
$u = $_POST['data'];
$user = json_decode($u,true);
$data = array(
'mobile'=>'',//手機為空
'password'=>'',//密碼為空
'openid'=>$r['openid'],//用戶唯一標識
'nickname'=>isset($user['nickName'])?$user['nickname']:'',//昵稱
'header'=>isset($user['avatarUrl'])?$user['avatarUrl']:'',//用戶頭像
'gender'=>isset($user['gender'])?$user['gender']:0,//用戶性別,1男2女
);
//保存openid
$_SESSION['openid'] = $r['openid'];
//根據openid去查詢用戶表
$userinfo = $this->USER->getRow('*',array('openid'=>$r['openid']));
if(empty($userinfo)){
//如果是增加的時候,多加幾條信息
$data['create_time'] = time();
$data['channel_id'] = $channel_id;
$data['pid'] = $pid;
$data['share_num'] = 0;
$data['status'] = 1;
//如果沒有信息,則錄入信息
$this->USER->add($data);
}else{
//如果有信息,則更新
$this->USER->update($data,array('openid'=>$r['openid']));
}
//token 是另外開啟一個會話
//由於sessionid每次請求都會變,所以換成opeid
$msg['status'] = 'success';
$msg['data']['token'] = $r['openid'];
echo json_encode($msg);exit();
}