tp實現微信受權登錄(附源碼)

官方開發文檔地址 php

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN;android

步驟:json

1.識別瀏覽器,普通瀏覽器跳到登錄頁面;微信打開的話,發起微信網頁受權登錄,微信用戶容許受權第三方應用後,微信會拉起應用或重定向到第三方網站,而且帶上受權臨時票據code參數;api

2.經過code參數加上AppID和AppSecret等,經過API換取access_token;瀏覽器

3.經過access_token進行接口調用,獲取用戶基本數據資源或幫助用戶實現基本操做。微信

 

<?php
namespace Home\Controller;
use Think\Controller;
class CommonController extends Controller {
    /*
    * 自動執行
    */
    public function _initialize(){
        //判斷是否在微信打開
        $ua = $_SERVER['HTTP_USER_AGENT'];
        //MicroMessenger 是android/iphone版微信所帶的
        //Windows Phone 是winphone版微信帶的  (這個標識會誤傷winphone普通瀏覽器的訪問)
        if(strpos($ua, 'MicroMessenger') == false && strpos($ua, 'Windows Phone') == false){
            //普通瀏覽器
            if(!$_SESSION['username']) {
                header('Location:xxx');
            }
        }else{  
            //微信瀏覽器
            $users = M('User');
            $appid = 'xxx';
            $secret = 'xxx';
            if(!$_SESSION['username']) {
                //微信網頁受權
                $redirect_uri = urlencode ('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
                $url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect";
                header("Location:".$url);
                $code = $_GET["code"];
  
                //第一步:取得openid
                $oauth2Url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$secret&code=$code&grant_type=authorization_code";
                $oauth2 = $this->getJson($oauth2Url);
                //第二步:根據全局access_token和openid查詢用戶信息
                $access_token = $oauth2["access_token"];
                $openid = $oauth2['openid'];
                $get_user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN";
                $userinfo = $this->getJson($get_user_info_url);
                //save用戶信息
                if($userinfo['openid']){
                    $username = $userinfo['openid'];
                    $nickname = $userinfo['nickname'];
                    $headimg = $userinfo['headimgurl'];
                    $province = $userinfo['province'];
                    $city = $userinfo['city'];
                    $sex = $userinfo['sex'];
                    $user = $users->where(array('username' => $username))->find();
                    if ($user) {
                        $users->where(array('username' => $username))->save(array('nickname' => $nickname, 'avatar' => $headimg, 'lasttime' => time()));
                    }else{
                        $users->add(array('username' => $username, 'nickname' => $nickname, 'avatar' => $headimg, 'province' => $province, 'city' => $city, 'gender' => $sex, 'regtime' => time(), 'lasttime' => time()));
                        // $data = array('username' => $username, 'nickname' => $nickname, 'avatar' => $headimg, 'province' => $province, 'city' => $city, 'gender' => $sex, 'regtime' => time(), 'lasttime' => time());
                    }
                    $_SESSION['username'] = $username;
                    if($user['tel'] == NULL){
                        //若是用戶手機號爲空的話跳轉到綁定手機號頁面
                        header('Location:xxx'); 
                    }
                }                
            }else{
                $user = D('User')->getUserInfo();  //getUserInfo()是model根據session('username')獲取用戶數據的方法
                if($user['tel'] == NULL){
                    header('Location:xxx');
                }
            }
  
            //獲取接口調用憑證access_token
            $accessurl = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$secret;
            $access_token = S('access_token');
            if(!$access_token){
                $access = $this->getJson($accessurl);
                if(!empty($access['access_token'])){
                    S('access_token',$access['access_token'],$access['expires_in']);
                }
            }
            //分享
            /*$share = new WechatShare($appid, $_SESSION['username']);
            $this->shareScript = $share->getSgin($access_token);
            $this->assign('shareScript', $this->shareScript);
            $this->assign('sharewechaid', $_SESSION['username']);
            if($_GET['sharewechaid']){
                $this->assign('getsharewechaid', $_GET['sharewechaid']);
            }*/ 
        }
     
}
  
    public function getJson($url){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        curl_close($ch);
        return json_decode($output, true);
    }
}

關注回覆MySQL,獲取跟MySQL優化處理方案session

關注回覆workerman,獲取跟workerman相關的全部資料!app

關注回覆wx,可添加我,諮詢你想要的視頻、資料教程等!curl

輕輕關注,將推「心」的不錯經驗和知識!iphone

相關文章
相關標籤/搜索