微信小程序 登錄實例詳解
微信小程序登錄
一. 小程序不支持cookie會話
1. 通過傳遞與檢驗3rd_session來保持會話
2. 3rd_session可以執(zhí)行‘`head -n 80 /dev/urandom | tr -dc A-Za-z0-9 | head -c 168`該命令生成
3. 使用Redis或者數(shù)據(jù)庫存儲session
4. 生成的3rd_session發(fā)送給客戶端,寫入storage
5. 客戶端的每次請求必須帶上3rd_session
二、加密數(shù)據(jù)解碼
1. $iv,$code是被加密過的數(shù)據(jù),由于請求過程中因為編碼原因+號變成了空格,所以我們需要用下面的方法轉(zhuǎn)換回來
function define_str_replace($data){
return str_replace(' ','+',$data);
}
三、例子:
php
// 微信登錄
public function weixin_login(){
$session_db=D('Session');
$session_id=I('get.sessionid','');
$session=$session_db->getSession($session_id);
if( !empty( $session ) ){
$this->ajaxReturn(['error_code'=>0,'sessionid'=>$session_id]);
}else{
$iv=define_str_replace(I('get.iv')); //把空格轉(zhuǎn)成+
$encryptedData=urldecode(I('get.encryptedData')); //解碼
$code=define_str_replace(I('get.code')); //把空格轉(zhuǎn)成+
$msg=D('Weixin')->getUserInfo($code,$encryptedData,$iv); //獲取微信用戶信息(openid)
if($msg['errCode']==0){
$open_id=$msg['data']->openId;
$users_db=D('Users');
$info=$users_db->getUserInfo($open_id);
if(!$info||empty($info)){
$users_db->addUser(['open_id'=>$open_id,'last_time'=>['exp','now()']]); //用戶信息入庫
$info=$users_db->getUserInfo($open_id); //獲取用戶信息
$session_id=`head -n 80 /dev/urandom | tr -dc A-Za-z0-9 | head -c 168`; //生成3rd_session
$session_db->addSession(['uid'=>$info['id'],'id'=>$session_id]); //保存session
}
if($session_id){
$this->ajaxReturn(['error_code'=>0,'sessionid'=>$session_id]); //把3rd_session返回給客戶端
}else{
$this->ajaxReturn(['error_code'=>0,'sessionid'=>$session_db->getSid($info['id'])]);
}
}else{
$this->ajaxReturn(['error_code'=>'用戶信息獲取失敗!']);
}
}
}
獲取微信信息模型(包括信息解密,官方例子點擊下載)
require_once ABS_APP_PATH.'/Addon/Aes/wxBizDataCrypt.php';
class WeixinModel{
// 獲取微信的用戶信息(openid)
public function getUserInfo($code,$encryptedData,$iv){
$appid=C('appid');
$secret=C('secret');
$grant_type='authorization_code';
$url='https://api.weixin.qq.com/sns/jscode2session';
$url= sprintf("%s?appid=%s&secret=%s&js_code=%s&grant_type=%",$url,$appid,$secret,$code,$grant_type);
$user_data=json_decode(file_get_contents($url));
$session_key= define_str_replace($user_data->session_key);
$data="";
$wxBizDataCrypt=new \WXBizDataCrypt($appid,$session_key);
$errCode=$wxBizDataCrypt->decryptData($encryptedData,$iv,$data);
return ['errCode'=>$errCode,'data'=>json_decode($data),'session_key'=>$session_key];
}
}
javascript
getUserInfo: function(cb) {
var that = this
if (this.globalData.userInfo) {
typeof cb == "function" && cb(this.globalData.userInfo)
} else {
//調(diào)用登錄接口
wx.login({
success: function(r) {
wx.getUserInfo({
success: function(res) {
that.login({
code: r.code,
iv: res.iv,
encryptedData: encodeURIComponent(res.encryptedData),
})
that.globalData.userInfo = res.userInfo
typeof cb == "function" && cb(that.globalData.userInfo)
}
})
}
})
}
},
login: function(param) {
wx.request({
url: this.requestUrl('Index/weixin_login'),
data: param,
header: {
'content-type': "application/json",
},
success: function(res) {
var data = JSON.parse(res.data.trim());
wx.setStorageSync('sessionid', data.sessionid);
}
})
},
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
JavaScript設(shè)計模式之原型模式和適配器模式示例詳解
這篇文章主要為大家介紹了JavaScript 原型模式和適配器模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
JavaScript實際應(yīng)用:innerHTMl和確認(rèn)提示的使用
JavaScript實際應(yīng)用:innerHTMl和確認(rèn)提示的使用...2006-06-06
動態(tài)內(nèi)存分配導(dǎo)致影響Javascript性能的問題
今天小編就為大家分享一篇關(guān)于動態(tài)內(nèi)存分配導(dǎo)致影響Javascript性能的問題,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12

