微信公眾號授權(quán)登陸PHP

申請微信測試號:微信測試號申請
參考微信網(wǎng)頁授權(quán)官方文檔

!!需要注意的幾點
請注意,這里填寫的是域名(是一個字符串),而不是URL,因此請勿加 http:// 等協(xié)議頭

在微信公眾號請求用戶網(wǎng)頁授權(quán)之前,要先到公眾平臺官網(wǎng)中修改授權(quán)回調(diào)域名
正式公眾號:開發(fā) - 接口權(quán)限 - 網(wǎng)頁服務(wù) - 網(wǎng)頁帳號 - 網(wǎng)頁授權(quán)獲取用戶基本信息修改授權(quán)回調(diào)域名
測試公眾號:直接在首頁 - 功能服務(wù) - 網(wǎng)頁賬號中修改回調(diào)域名

關(guān)于網(wǎng)頁授權(quán)的兩種scope的區(qū)別說明

1、以snsapi_base為scope發(fā)起的網(wǎng)頁授權(quán),是用來獲取進入頁面的用戶的openid的,并且是靜默授權(quán)并自動跳轉(zhuǎn)到回調(diào)頁的。用戶感知的就是直接進入了回調(diào)頁(往往是業(yè)務(wù)頁面)
2、以snsapi_userinfo為scope發(fā)起的網(wǎng)頁授權(quán),是用來獲取用戶的基本信息的。但這種授權(quán)需要用戶手動同意,并且由于用戶同意過,所以無須關(guān)注,就可在授權(quán)后獲取該用戶的基本信息。

整體思路分析

微信授權(quán)登陸官方分為四步
1.引導(dǎo)用戶同意授權(quán)(獲取code)
2.通過code換取accessToken
3.刷新token(非必須)
4.通過token和openid獲取用戶信息
根據(jù)微信官方文檔的介紹,在具體實現(xiàn)中我的思路是這樣的

拋開微信授權(quán)登陸,我們只看業(yè)務(wù)層面(假設(shè)已經(jīng)授權(quán)成功)

1.微信登陸后,用戶信息會存儲在session中,在用戶登陸網(wǎng)頁時,判斷session信息是否匹配,不匹配的話會讓用戶重新進行登陸授權(quán);
2.微信授權(quán)登陸成功,session中與存在用戶信息,這時對比數(shù)據(jù)庫的openid,如果是老用戶,返回用戶信息,如果是新用戶,先添加用戶信息再返回新用戶信息

        //微信appid&secret
        $wxAppId=$this->config->item('WeChat')['APPID'];
        //授權(quán)后重定向的回調(diào)鏈接地址, 請使用 urlEncode 對鏈接進行處理
        $codeBackUrl=urlencode('http://starwalker.asesspace.com/home/getToken');

        if(isset($_SESSION['starWalkWxUserInfo'])){//session中有信息
            $swWxOpenId=$_SESSION['starWalkWxUserInfo']['starWxOpenId'];
            $swWxName=$_SESSION['starWalkWxUserInfo']['starWxName'];
            $swWxSex=$_SESSION['starWalkWxUserInfo']['starWxSex'];
            $swWxIcon=$_SESSION['starWalkWxUserInfo']['starWxIcon'];
            //查詢微信用戶比對信息
            $result = $this->User_model->getUserByOpen($swWxOpenId);
            if(isset($result)){//老用戶
                $data['wx_userinfo']=$result;
            }else{//新用戶
                //插入新增微信用戶
                $data = array();
                $data['u_wechatopenid'] = $swWxOpenId;
                $data['u_wechatnick'] = $swWxName;
                $data['u_gender'] = $swWxSex;
                $data['u_wechaticon'] = $swWxIcon;
                $addResult = $this->User_model->addUser($data); 
                $result = $this->User_model->getUserByOpen($swWxOpenId);
                $data['wx_userinfo']=$result;
            }     
           
        }else{//session中沒有信息
            $this->wxAuthUrl($wxAppId,$codeBackUrl);
        }
思路清晰了 開始擼代碼
1.定義wxAuthUrl方法引導(dǎo)用戶授權(quán)登陸
//引導(dǎo)用戶授權(quán)
public function wxAuthUrl($wxAppId,$codeBackUrl){
    $url='https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$wxAppId.'&redirect_uri='.$codeBackUrl.'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect';
    header("Location:" . $url);
}

**參數(shù)appid和回調(diào)url的準確書寫
**回調(diào)url需要進行urlencode處理才能正常被解析


2.用戶確認授權(quán)后進入回調(diào)getToken的方法中
//獲取用戶授權(quán)code 
public function getToken(){
    $wxAppId=$this->config->item('WeChat')['APPID'];
    $wxAppSecret=$this->config->item('WeChat')['APPSECRET'];
    $code=$_GET['code'];
    //通過code換取網(wǎng)頁授權(quán)access_token
    $codeUrl='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$wxAppId.'&secret='.$wxAppSecret.'&code='.$code.'&grant_type=authorization_code';
    //初始化curl
    $ch = curl_init();
    //需要獲取的URL地址
    curl_setopt($ch,CURLOPT_URL, $codeUrl);
    //設(shè)置header
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $TokenData = curl_exec($ch);
    curl_close($ch);
    $TokenArr=json_decode($TokenData);
    $tokenAccess=$TokenArr->access_token;
    $tokenOpenid=$TokenArr->openid;
    $lang='zh_CN';
    $this->getWxInfo($tokenAccess,$tokenOpenid,$lang);
}

**在回調(diào)中拿到code和state,我這個項目中沒有用到state,所以就不拿state了
**通過拿到的code換取accesstoken傳入正確的參數(shù),appid、appsecret、code

3.刷新token沒有用到,直接獲取用戶信息
//獲取用戶信息
public function getWxInfo($tokenAccess,$tokenOpenid,$lang){
    $userUrl='https://api.weixin.qq.com/sns/userinfo?access_token='.$tokenAccess.'&openid='.$tokenOpenid.'&lang='.$lang.'';
    //初始化curl
    $ch = curl_init();
    //需要獲取的URL地址
    curl_setopt($ch,CURLOPT_URL, $userUrl);
    //設(shè)置header
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $data = curl_exec($ch);
    curl_close($ch);
    if($data){
        $wx_info=json_decode($data);
        // var_dump($wx_info->openid);
        $starWalkWx=array(
            'starWxOpenId'=>$wx_info->openid,
            'starWxName'=>$wx_info->nickname,
            'starWxSex'=>$wx_info->sex,
            'starWxIcon'=>$wx_info->headimgurl,
            // 'starWxlanguage'=>$wx_info->language,//語言
            // 'starWxcity'=>$wx_info->city,//城市
            // 'starWxprovince'=>$wx_info->province,//省份
            // 'starWxcountry'=>$wx_info->country,//國家
            // 'starWxprivilege'=>$wx_info->privilege,//用戶特權(quán)信息
            // 'starWxunionid'=>$wx_info->unionid,//只有在用戶將公眾號綁定到微信開放平臺帳號后,才會出現(xiàn)該字段。
            );
        $this->session->set_userdata('starWalkWxUserInfo', $starWalkWx);
        //登陸成功
        $starwalkUrl='http://starwalker.asesspace.com/home/test';
        header("Location:" . $starwalkUrl);
    }
}

**通過token和openid拿到用戶信息存入session,公司項目只需要四個參數(shù),其他的數(shù)據(jù)注釋了,以備需要的時候直接釋放出來
**到這里授權(quán)登陸就成功了,把頁面指向項目的首頁


成功拿到微信用戶信息
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容