PHP+TP框架实现微信网页授权,获取用户信息

一.准备工作.

1.将需要使用到的微信配置放在config.PHP配置文件中方便获取.(我使用的是微信测试号)

return array(
   //'配置项'=>'配置值'
    'appID'=>'wxf58**********f2e',
    'appSecret'=>'2dd3de4141aadd088**********6264b'
);
2.更改网页授权的回调域名为我们当前项目的域名。(注意这个域名要是能线*问的)

PHP+TP框架实现微信网页授权,获取用户信息

准备工作完成.


二.验证用户是否进行过微信登陆.

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('微信授权失败');
    }
}

以上是微信网页授权的整个流程。同时保持了用户一直在授权后的登录状态。


如果有错误,请大家指出,谢谢