PHP+TP框架實現微信網頁授權,獲取使用者資訊
阿新 • • 發佈:2019-02-14
一.準備工作.
1.將需要使用到的微信配置放在config.php配置檔案中方便獲取.(我使用的是微信測試號)
return array(
//'配置項'=>'配置值'
'appID'=>'wxf58**********f2e',
'appSecret'=>'2dd3de4141aadd088**********6264b'
);
2.更改網頁授權的回撥域名為我們當前專案的域名。(注意這個域名要是能線上訪問的)
準備工作完成.
二.驗證使用者是否進行過微信登陸.
1.新建微信授權類AuthController,該類用於完成微信授權,將使用者的資訊儲存在資料庫,將每個使用者在資料庫中的唯一標識user_id儲存在session 中.
2.新建驗證使用者是否進行過微信授權的基類BaseController,該類是每個控制器的基類,除認證類外.
3.使用基類BaseController驗證使用者是否進行過微信授權,如果沒有,則進行微信授權.
class BaseController extends Controller{ //使用tp框架提供的建構函式驗證session中是否有使用者的資訊的唯一標識user_id public function _initialize(){ $user_id = session('user_id'); if(!$user_id){ //獲取當前網頁,授權後跳回 $path = $_SERVER['REQUEST_URI']; //跳轉到微信授權 header('Location:/home/auth/index?path='.$path); } } }
三.網頁授權,獲取使用者的基本資訊.授權在AuthController類中。
1.使用者授權,獲取code.
//使用者授權獲取code public function index(){ //授權完跳轉的網址 $path = $_REQUEST['path']; //使用者同意授權後回撥的網址.必須使用url對回撥網址進行編碼,我們也將授權完跳轉對網址, $redirect_uri = urlencode('http://'.$_SERVER['HTTP_HOST'].'/home/auth/callback'); header('Location:https://open.weixin.qq.com/connect/oauth2/authorize?appid=' .C('appID').'&redirect_uri='.$redirect_uri.'&response_type=code&scope=snsapi_userinfo&state='.$path. '#wechat_redirect'); }
注意:redirect_uri 回撥網址需要使用urlencode進行編碼,scope引數值為snsapi_userinfo時是使用者確實授權才能獲取到使用者到基本資訊,當回撥的時候會帶上code引數和state引數,所以這裡我將state引數值設定為授權完成後跳轉到原網頁到網址。
2.使用者授權跳轉到回撥網址後,我們根據獲取到code換取網頁授權access_token,獲取網頁授權access_token和openid獲取使用者的基本資訊,儲存在資料庫中。
//獲取code後的回撥函式
public function callBack(){
//獲取到的code
$code = $_REQUEST['code'];
//授權結束後的回撥網址
$path = $_REQUEST['state'];
//獲取access_token
$curl = curl_init();
curl_setopt($curl,CURLOPT_URL,'https://api.weixin.qq.com/sns/oauth2/access_token?appid='
.C('appID').'&secret='.C('appSecret').'&code='.$code.'&grant_type=authorization_code ');
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
//獲取access_token和openid,轉換為陣列
$data = json_decode(curl_exec($curl),true);
//如果獲取成功,根據access_token和openid獲取使用者的基本資訊
if($data != null && $data['access_token']){
//獲取使用者的基本資訊,並將使用者的唯一標識儲存在session中
curl_setopt($curl,CURLOPT_URL,'https://api.weixin.qq.com/sns/userinfo?access_token='
.$data['access_token'].'&openid='.$data['openid'].'&lang=zh_CN');
$user_data = json_decode(curl_exec($curl),true);
if($user_data != null && $user_data['openid']){
curl_close($curl);
//將使用者資訊存在資料庫中,同時將使用者在資料庫中唯一的標識儲存在session中
$array = [];
$array['openid'] = $user_data['openid'];
$array['nickname'] = $user_data['nickname'];
$array['headimgurl'] = $user_data['headimgurl'];
//我這裡只儲存了使用者的openid,nickname,headimgurl
$model = M('user');
//先判斷使用者資料是不是已經儲存了,如果儲存了獲取使用者在資料庫中的唯一標識
$user_id = $model->where(['openid'=>$array['openid']])->getField('user_id');
if($user_id){
session('user_id',$user_id);
}else{
$user_id = $model->add($array);
//將使用者在資料庫中的唯一表示儲存在session中
session('user_id',$user_id);
}
//跳轉網頁
header('Location:'.$path);
}else{
curl_close($curl);
exit('獲取使用者資訊失敗!');
}
}else{
curl_close($curl);
exit('微信授權失敗');
}
}
以上是微信網頁授權的整個流程。同時保持了使用者一直在授權後的登入狀態。
如果有錯誤,請大家指出,謝謝