微信公衆號開發文檔連接:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432php
微信公衆號受權登陸分爲兩種:git
一、以snsapi_base爲scope發起的網頁受權,是用來獲取進入頁面的用戶的openid的,而且是靜默受權並自動跳轉到回調頁的。用戶感知的就是直接進入了回調頁(每每是業務頁面)github
二、以snsapi_userinfo爲scope發起的網頁受權,是用來獲取用戶的基本信息的。但這種受權須要用戶手動贊成,而且因爲用戶贊成過,因此無須關注,就可在受權後獲取該用戶的基本信息。數據庫
如下說作受權的思路api
明確思路後,開始動手吧緩存
有一個很好用的微信開發SDK,裏面集合了微信公衆號、微信支付、阿里支付的功能微信
SDK項目相關地址
GITHUB源碼地址:https://github.com/zoujingli/wechat-php-sdk
OSChina源碼地址:http://git.oschina.net/zoujingli/wechat-php-sdk
Composer包名稱:zoujingli/wechat-php-sdk
在線文檔地址:http://www.kancloud.cn/zoujingli/wechat-php-sdksession
這裏推薦使用composer來管理SDK,composer安裝微信開發
composer require zoujingli/wechat-developer
安裝完SDK後即可以開始寫本身的代碼了app
在config裏app.php寫下微信公衆號相關信息
// 公衆號配置 'wechat' => [ 'token' => 'test', 'appid' => '你的微信公衆號appid', 'appsecret' => '你的微信公衆號appsecret', 'encodingaeskey' => '', // 配置商戶支付參數(可選,在使用支付功能時須要) 'mch_id' => "你的商戶平臺mch_id", 'mch_key' => '你的商戶平臺mch_key', // 配置商戶支付雙向證書目錄(可選,在使用退款|打款|紅包時須要) 'ssl_key' => '', 'ssl_cer' => '', // 緩存目錄配置(可選,需擁有讀寫權限) 'cache_path' => '', ]
而後是控制器代碼
$config = config('wechat');//微信配置 $oauth = new Oauth($config); $thisUrl = $this -> get_url();//當前地址 $code = $this -> request -> param('code'); if( !Session::has('user_id') ){//沒有session保存的user_id if( !Session::has('isEmpty') ){//靜默獲取openid $oauth -> getOauthRedirect($thisUrl,'','snsapi_base');//靜默受權換取code $data = $oauth -> getOauthAccessToken($code);//經過 code 獲取 AccessToken 和 openid Session::set('openid',$data['openid']); //經過Open搜索數據庫是否有該用戶 $user = new \app\api\model\User(); $userId = $user -> getUserId($data['openid']); if(!$userId){//未註冊 Session::set('isEmpty',1); $thisUrl = str_replace(strchr($thisUrl, "code"), '', $thisUrl);//清除code header('location:'.$thisUrl);//從新訪問當前網址 }else{ Session::set('isEmpty',2); Session::set('userId',$userId); } }else if(Session::get('isEmpty') == 1){//註冊會員 $oauth -> getOauthRedirect($thisUrl);//用戶受權換取code Session::delete('isEmpty');//刪除判斷用的session $data = $oauth -> getOauthAccessToken($code);//經過 code 獲取 AccessToken 和 openid $userInfo = $oauth -> getUserInfo($data['access_token'],$data['openid']); $wxUser = new User($config); $wxUserInfo = $wxUser -> getUserInfo(Session::get('openid')); // dump($wxUserInfo); $userInfo['subscribe_time'] = $wxUserInfo['subscribe'] ? $wxUserInfo['subscribe_time'] : ''; $userInfo['subscribe'] = $wxUserInfo['subscribe'] ? 1 : 0; // dump($userInfo);exit; $user = new \app\api\model\User(); $userId = $user -> addUserInfo($userInfo); Session('userId',$userId); } }else{//實時更新用戶數據,實時監測用戶是否關注 $wxUser = new User($config); $wxUserInfo = $wxUser -> getUserInfo(Session::get('openid')); if(!empty($wxUserInfo)){ $user = new \app\api\model\User(); $user -> updateUserInfo($wxUserInfo); } }
以上