PHP微信公众平台oauth2.0网页授权登录类的封装demo
一、微信授权使用的是OAuth2.0授权的方式。主要有以下简略步骤:
第一步:用户同意授权,获取code
第二步:通过code换取网页授权access_token
第三步:拉取用户信息(需scope为 snsapi_userinfo)
微信网页授权开发文档请看官网:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
二、我这里直接出代码了,一共2个文件。
//其它文件调用UserInfo.php的时候注意namespace。
use wx\userInfo\UserInfo; include 'UserInfo.php'; $wx = new UserInfo(); $data = $wx->get_user_all();
1配置文件config.php
1 <?php 2 namespace wx\wxConfig; 3 /** 4 * 微信请求相关配置类 5 */ 6 class ConfigTool{ 7 /** 8 * 微信配置参数 9 * @return array 配置参数 10 */ 11 public function Config(){ 12 // appID 13 $config['appid'] = ''; 14 // appSecret 15 $config['appsecret'] = ''; 16 // 微信回调链接地址(本页) 17 $config['redirect_uri'] = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; 18 // 用户授权并获取code的url地址 19 $config['authorize_url'] = 'https://open.weixin.qq.com/connect/oauth2/authorize'; 20 // 获取openid和access_toke的url地址 21 $config['access_token_url'] = 'https://api.weixin.qq.com/sns/oauth2/access_token'; 22 // 获取拉取用户信息(需scope为 snsapi_userinfo)的url地址 23 $config['userinfo_url'] = 'https://api.weixin.qq.com/sns/userinfo'; 24 // 本文件夹所在的url路径 25 $config['self_path'] = 'http://'.dirname($_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']); 26 27 return $config; 28 } 29 } 30 ?>
2.获取用户信息文件UserInfo.php
1 <?php 2 namespace wx\userInfo; 3 use wx\wxConfig\ConfigTool; 4 include 'config.php'; 5 /** 6 * 获取微信用户信息 7 * $wx = new UserInfo(); 8 * $data = $wx->get_user_all(); 9 */ 10 class UserInfo{ 11 12 private $weixin_config = array(); 13 public function __construct() { 14 $re = new ConfigTool; 15 $this->weixin_config = $re->Config(); //载入配置文件 16 } 17 /** 18 * 获取微信用户信息 19 * @return array 微信用户信息数组 20 */ 21 public function get_user_all(){ 22 if (!isset($_GET['code'])){//没有code,去微信接口获取code码 23 $callback = $this->weixin_config['redirect_uri'];//服务器返回url,这里是本页url 24 $this->get_code($callback); 25 } else {//获取code后跳转回来到这里了 26 $code = $_GET['code']; 27 $data = $this->get_access_token($code);//获取网页授权access_token和用户openid 28 $data_all = $this->get_user_info($data['access_token'],$data['openid']);//获取微信用户信息 29 return $data_all; 30 } 31 } 32 33 /** 34 * 1、用户授权并获取code 35 * @param string $callback 微信服务器回调链接url 36 */ 37 private function get_code($callback){ 38 $appid = $this->weixin_config['appid']; 39 $scope = 'snsapi_userinfo';//snsapi_base只能获取access_token和openID,snsapi_userinfo可以获取更详细的用户资料,比如头像、昵称、性别等 40 $state = md5(uniqid(rand(), TRUE));//唯一ID标识符绝对不会重复 41 $url = $this->weixin_config['authorize_url'].'?appid=' . $appid . '&redirect_uri=' . urlencode($callback) . '&response_type=code&scope=' . $scope . '&state=' . $state . '#wechat_redirect'; 42 header("Location:$url"); 43 } 44 45 /** 46 * 2、使用code换取access_token 47 * @param string 用于换取access_token的code,微信提供 48 * @return array access_token和用户openid数组 49 */ 50 private function get_access_token($code){ 51 $appid = $this->weixin_config['appid']; 52 $appsecret = $this->weixin_config['appsecret']; 53 $url = $this->weixin_config['access_token_url'].'?appid=' . $appid . '&secret=' . $appsecret . '&code=' . $code . '&grant_type=authorization_code'; 54 $user = json_decode(file_get_contents($url)); 55 if (isset($user->errcode)) { 56 echo 'error:' . $user->errcode.'<hr>msg :' . $user->errmsg; 57 exit; 58 } 59 $data = json_decode(json_encode($user),true);//返回的json数组转换成array数组 60 return $data; 61 } 62 63 /** 64 * 3、使用access_token获取用户信息 65 * @param string access_token 66 * @param string 用户的open id 67 * @return array 用户信息数组 68 */ 69 private function get_user_info($access_token,$openid){ 70 $url = $this->weixin_config['userinfo_url'].'?access_token=' . $access_token . '&openid=' . $openid . '&lang=zh_CN'; 71 $user = json_decode(file_get_contents($url)); 72 if (isset($user->errcode)) { 73 echo 'error:' . $user->errcode.'<hr>msg :' . $user->errmsg; 74 exit; 75 } 76 $data = json_decode(json_encode($user),true);//返回的json数组转换成array数组 77 return $data; 78 } 79 80 81 } 82 83 ?>
三、觉得两个文件多,也可以用一个文件类封装。场景不同,喜欢哪个用哪个。