微信公衆號靜默受權註冊及獲取用戶信息

微信登錄包括兩部分:1.經常使用的靜默受權;2.獲取用戶身份信息 
開發環境: 
Thinkphp3.2.3beta+onethink、yershop 
新浪SAE服務器,點此註冊 
認證微信服務號php

靜默受權

微信公衆號受權登錄有兩種,經常使用的一種爲靜默受權snsapi_base。下面講它的實現代碼 
開發文檔:http://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html 
目標:獲取用戶openid 
假設個人微信登錄地址爲 Wap/User/wxlogin()方法html

基礎配置

1.認證微信服務號 
2.接口權限:網頁帳號,填寫本身要使用的域名(www.abc.com這樣的) 
這裏寫圖片描述 
這裏寫圖片描述 
3.服務器後臺添加配置字段:C(‘DOMAIN’) C(‘APPID’) C(‘AppSecret’),在代碼中調用 
C(‘DOMAIN’),在yershop後臺中爲自動獲取的域名地址 
C(‘APPID’),公衆平臺應用ID 
C(‘AppSecret’),公衆平臺密鑰數據庫

獲取code核心代碼

//獲取code代碼
function createOauthUrlForCode($redirectUrl)
    {
        //lifan 
        $param ['appid'] =C('APPID');
        $param ['redirect_uri'] = $redirectUrl. '&getOpenId=1';
        $param ['response_type'] = 'code';
        $param ['scope'] = 'snsapi_base';
        $param ['state'] = 123;
        $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?' . http_build_query ( $param ) . '#wechat_redirect';
        return $url;
    }

獲取openid核心代碼

function getOpenid()
    {
        $urlObj["appid"] = C('APPID');
        $urlObj["secret"] = C('AppSecret');
        $urlObj["code"] = I ( 'code' );
        $urlObj["grant_type"] = "authorization_code";
        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?' . http_build_query ( $urlObj );
        //初始化curl
        $ch = curl_init();
        //設置超時
        curl_setopt($ch, CURLOP_TIMEOUT, 60);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        //運行curl,結果以jason形式返回
        $res = curl_exec($ch);
        curl_close($ch);
        //取出openid
        $data = json_decode($res,true);
        return $data['openid'];
    }

獲取用戶信息

獲取並保存基礎access_token

/**
 * 獲取基礎 accesstoken
 * 7200秒過期
 * sae不可寫,保存於數據庫中
 * at表字段:id,accesstoken,lasttime
 */
function getAccesstoken(){
    $param['grant_type'] = 'client_credential';
    $param['appid'] = C("APPID");
    $param['secret'] = C("SECRET");
    $lastAT = M('at')->find(1);
    $accesstoken = $lastAT['accesstoken'];
    if(!$lastAT){
        M('at') -> add(array('id'=>1,'accesstoken'=>'null','lasttime'=>0));
        $lastAT['lasttime'] = 0;
    }
    $now = NOW_TIME;
    $timecha = $now - $lastAT['lasttime'];
    if($timecha > 7200){
        $url = 'https://api.weixin.qq.com/cgi-bin/token?' . http_build_query ( $param );
        $content = file_get_contents ( $url );
        $content = json_decode ( $content, true );
        $data['accesstoken'] = $content['access_token'];
        $data['lasttime'] = NOW_TIME;
        M('at')->where(array('id'=>1))->save($data);
        $accesstoken = $content['access_token'];
    }
    return $accesstoken;
}

獲取用戶信息

/**
 * 獲取用戶基本信息
 * openid:用戶的openid。用戶與公衆號惟一身份標識
 * 若用戶未關注公衆號,沒法獲取詳細信息
 */
function getWeixinInfo($openid) {
    $isWeixinBrowser = isWeixinBrowser ();
    if(!$isWeixinBrowser){
        return;
    }
    $param['access_token'] = getAccesstoken();
    $param['openid'] = $openid;
    $param['lang'] = 'zh_CN';
    $url = 'https://api.weixin.qq.com/cgi-bin/user/info?' . http_build_query ( $param );
    $content = file_get_contents ( $url );
    $content = json_decode ( $content, true );
    return $content;
}

其它函數

// 判斷是不是在微信瀏覽器裏
function isWeixinBrowser() {
    $agent = $_SERVER ['HTTP_USER_AGENT'];
    if (! strpos ( $agent, "icroMessenger" )) {
        return false;
    }
    return true;
}
/**
 * ? or &
 * @param 原始地址 $urls
 * @param 添加參數 $parm
 * @param 參數值 $value
 * @return 帶? 或 & 的參數
 */
function addurl($urls,$parm,$value=""){
    if(!strstr($urls, '?')){
        $adds = "?".$parm."=".$value;
    }else{
        $adds = "&".$parm."=".$value;
    }
    return $adds;
}

完整的微信登錄註冊流程實現

功能均實如今一個方法裏,請仔細按照序號查看流程json

public function weilogin($url = '') {
/*(1)非微信瀏覽器,退回到普通登錄頁*/
        if(!isWeixinBrowser()){
            redirect ( U ( '/wap/user/login' ) );
        }
        $openid = I('get.openid');
        $Member = D ( "Member" );
/*(2)判斷是否已經獲取到了openid,否第(3)步*/
        if ($openid) {
/*(6)獲取到了openid,判斷member表是否存入用戶的openid。存:非第一次註冊登錄;沒存:第一次註冊登錄*/
            $weiuserinfo = M('member')->where (array('openid' => $openid))->find ();
/*(7)有用戶信息:非第一次註冊登錄*/
            if ($weiuserinfo) {
                if ($Member->login ( $weiuserinfo ['uid'] )) { // 登陸用戶
                  //在登錄前的頁面,設置cookie('api_redirect',U('Index.index'))信息
                  $urls = cookie ( 'api_redirect' );
                  //登陸成功,跳轉返回
                  redirect($urls);
                }else {
                    //登陸異常,回到普通登錄頁面
                    $this->error ( '登陸超時!', U ( "/wap/user/login" ) );
                }
            } else {
/*(8)沒有存入用戶openid:第一次註冊登錄*/
                /*根據openid獲取微信用戶信息*/
                $weiData = getWeixinInfo($openid);
                if (!empty($weiData['nickname'])){
                    //設置用戶名爲用戶微信暱稱
                    $username=$weiData['nickname'];
                }else{
                    /*當用戶未關注沒法拉取用戶信息時,爲用戶起名爲當前時間戳。也能夠提示用戶關注公衆號,不然就普通登錄*/
                    $username=NOW_TIME;
                }
                //進行重名檢測,用戶暱稱若重名,以後數據表也沒法添加用戶信息
                $ischong = M('ucenter_member')->where(array('username'=>$username))->find();
                if($ischong>0){
                    //發現有重複用戶名,命名爲暱稱+時間戳,避免重名
                    $username = $username.NOW_TIME;
                }
                /* 調用註冊接口註冊用戶 */
                $User = new UserApi ();
                // 返回ucentermember數據表用戶主鍵id;設置默認密碼:123456
                $uid = $User->register ( $username, '123456' );
                if (0 < $uid) { // UC登陸成功
                    /* 登陸用戶;D('Member')->login此操做實現向member表新增記錄*/
                    if ($Member->login ( $uid, $_GET ['openid'] )) {
/*(9)登錄成功,回到設置的頁面*/
                        redirect(cookie ( 'api_redirect' ));
                    }
                } else {
                    //ucenter_member表註冊失敗,跳轉到普通登錄頁
                    $this->error ( '登陸超時!', U ( "/wap/user/login" ) );
                }
            }
        } else {
/*(3)實現微信登錄獲取openid*/
            if (! is_login ()) {
            $getopenId = I('get.getOpenId');
            $state = I('get.state');
            //此處組連接必定要細心,不然報redirect_uri錯誤信息。不要用手寫的url
            $urls = C ( 'DOMAIN' ) . U ( "/Wap/User/weilogin" );
/*(4)實現微信登錄第一步獲取code,返回的連接參數含有$getopenId、$state信息*/
            if (!$getopenId){
                $url = substr ( $urls, 0, - 5 );//該操做將去掉.html
                // var_dump($url); //必要時檢驗
                $urlforcode = createOauthUrlForCode($url);
                redirect($urlforcode);
                }elseif($state){
/*(5)實現微信登錄第二步獲取openid,返回openid;從新訪問本函數,帶上openid*/
                 $openid = getOpenId();    
                 redirect ( $urls . addurl($callback, "openid",$openid));        
                }
            }
        }
    }

至此,微信登錄篇完成。 
出處:blog.csdn.NET/afanxingzhou api

相關文章
相關標籤/搜索