博文 > 第三方登录包(整合微信、QQ、微博、支付宝、GitHub、Facebook、Twitter、Line、Google)

第三方登录包(整合微信、QQ、微博、支付宝、GitHub、Facebook、Twitter、Line、Google)

Php 10002018-07-05 00:00:00

Integrating many third party login interfaces, including qq-login、wx-login、sina-login、github-login、alipay-login and so on

通用第三方登录说明文档

  • 微信
  • QQ
  • 微博
  • 支付宝
  • GitHub
  • Facebook
  • Twitter
  • Line
  • Google

安装

  1. composer require tinymeng/oauth:~1.0.2 -vvv

类库使用的命名空间为\\tinymeng\\oauth

目录结构

  1. .
  2. ├── example 代码源文件目录
  3. └── wx_proxy.php 微信多域名代理文件
  4. ├── src 代码源文件目录
  5. ├── Connector
  6. ├── Gateway.php 必须继承的抽象类
  7. └── GatewayInterface.php 必须实现的接口
  8. ├── Gateways
  9. ├── Alipay.php
  10. ├── Facebook.php
  11. ├── Github.php
  12. ├── Google.php
  13. ├── Line.php
  14. ├── Qq.php
  15. ├── Twitter.php
  16. ├── Weibo.php
  17. └── Weixin.php
  18. ├── Helper
  19. ├── ConstCode.php 公共常量
  20. └── Str.php 字符串辅助类
  21. └── OAuth.php 抽象实例类
  22. ├── composer.json composer文件
  23. ├── LICENSE MIT License
  24. └── README.md 说明文件

公共方法

在接口文件中,定义了4个方法,是每个第三方基类都必须实现的,用于相关的第三方登录操作和获取数据。方法名如下:

  1. /**
  2. * Description: 得到跳转地址
  3. * @author: JiaMeng <666@majiameng.com>
  4. * Updater:
  5. * @return mixed
  6. */
  7. public function getRedirectUrl();
  8. /**
  9. * Description: 获取当前授权用户的openid标识
  10. * @author: JiaMeng <666@majiameng.com>
  11. * Updater:
  12. * @return mixed
  13. */
  14. public function openid();
  15. /**
  16. * Description: 获取格式化后的用户信息
  17. * @author: JiaMeng <666@majiameng.com>
  18. * Updater:
  19. * @return mixed
  20. */
  21. public function userInfo();
  22. /**
  23. * Description: 获取原始接口返回的用户信息
  24. * @author: JiaMeng <666@majiameng.com>
  25. * Updater:
  26. * @return mixed
  27. */
  28. public function getUserInfo();

微信有一个额外的方法,用于获取代理请求的地址

  1. /**
  2. * 获取中转代理地址
  3. */
  4. public function getProxyURL();
  1. /**
  2. * 回调中如果是App登录
  3. */
  4. $userInfo = OAuth::$name($this->config)->setIsApp()->userInfo();

典型用法

以ThinkPHP5为例

  1. <?php
  2. namespace app\index\controller;
  3. use think\Config;
  4. use tinymeng\OAuth2\OAuth;
  5. use tinymeng\tools\Tool;
  6. class Login extends Common
  7. {
  8. protected $config;
  9. /**
  10. * Description: 登录
  11. * @author: JiaMeng <666@majiameng.com>
  12. * Updater:
  13. * @param $name
  14. * @return mixed
  15. */
  16. public function index($name)
  17. {
  18. if (empty(input('get.'))) {
  19. /** 登录 */
  20. $result = $this->login($name);
  21. $this->redirect($result);
  22. }
  23. /** 登录回调 */
  24. $this->callback($name);
  25. return $this->fetch('index');
  26. }
  27. /**
  28. * Description: 获取配置文件
  29. * @author: JiaMeng <666@majiameng.com>
  30. * Updater:
  31. * @param $name
  32. */
  33. public function getConfig($name){
  34. //可以设置代理服务器,一般用于调试国外平台
  35. //$this->config['proxy'] = 'http://127.0.0.1:1080';
  36. $this->config = Config::get($name);
  37. if($name == 'weixin'){
  38. if(!Tool::isMobile()){
  39. $this->config = $this->config['pc'];//微信pc扫码登录
  40. }elseif(Tool::isWeiXin()){
  41. $this->config = $this->config['mobile'];//微信浏览器中打开
  42. }else{
  43. echo '请使用微信打开!';exit();//手机浏览器打开
  44. }
  45. $this->config['state'] = 'https://www.majiameng.com/login/weixin';
  46. }
  47. }
  48. /**
  49. * Description: 登录链接分配,执行跳转操作
  50. * Author: JiaMeng <666@majiameng.com>
  51. * Updater:
  52. */
  53. public function login($name){
  54. /** 获取配置 */
  55. $this->getConfig($name);
  56. /**
  57. * 如果需要微信代理登录,则需要:
  58. * 1.将wx_proxy.php放置在微信公众号设定的回调域名某个地址,如 http://www.abc.com/proxy/wx_proxy.php
  59. * 2.config中加入配置参数proxy_url,地址为 http://www.abc.com/proxy/wx_proxy.php
  60. * 然后获取跳转地址方法是getProxyURL,如下所示
  61. */
  62. //$this->config['proxy_url'] = 'http://www.abc.com/proxy/wx_proxy.php';
  63. $oauth = OAuth::$name($this->config);
  64. if(Tool::isMobile() || Tool::isWeiXin()){
  65. /**
  66. * 对于微博,如果登录界面要适用于手机,则需要设定->setDisplay('mobile')
  67. * 对于微信,如果是公众号登录,则需要设定->setDisplay('mobile'),否则是WEB网站扫码登录
  68. * 其他登录渠道的这个设置没有任何影响,为了统一,可以都写上
  69. */
  70. $oauth->setDisplay('mobile');
  71. }
  72. return $oauth->getRedirectUrl();
  73. }
  74. /**
  75. * Description: 登录回调
  76. * @author: JiaMeng <666@majiameng.com>
  77. * Updater:
  78. * @param $name
  79. * @return bool
  80. */
  81. public function callback($name)
  82. {
  83. /** 获取配置 */
  84. $this->getConfig($name);
  85. /** 获取第三方用户信息 */
  86. $userInfo = OAuth::$name($this->config)->userInfo();
  87. /**
  88. * 如果是App登录
  89. * $userInfo = OAuth::$name($this->config)->setIsApp()->userInfo();
  90. */
  91. //获取登录类型
  92. $userInfo['type'] = \tinymeng\OAuth2\Helper\ConstCode::getType($userInfo['channel']);
  93. var_dump($userInfo);die;
  94. }
  95. }

通过系统自动设置state,如有需要请自行处理验证,state也放入config里即可
Line和Facebook强制要求传递state,如果你没有设置,则会传递随机值
如果要验证state,则在获取用户信息的时候要加上->mustCheckState()方法。

  1. $snsInfo = OAuth::$name($this->config)->mustCheckState()->userinfo();

注意,不是所有的平台都支持传递state,请自行阅读官方文档链接,各个文档在实现类里有说明.

配置文件样例

1.微信

微信会返回特有的unionid字段

  1. 'weixin'=>[
  2. 'pc'=>[
  3. 'app_id' => 'wx52e2b2464*****',
  4. 'app_secret' => 'd5dad705a1159d*********',
  5. 'callback' => 'http://i.959.cn/qq-login.php',
  6. 'scope' => 'snsapi_login',//扫码登录
  7. ],
  8. 'mobile'=>[
  9. 'app_id' => 'wx6ca7410f8******',
  10. 'app_secret' => '30a206b87b7689b19f11******',
  11. 'callback' => 'http://i.959.cn/qq-login.php',
  12. 'scope' => 'snsapi_userinfo',//静默授权=>snsapi_base;获取用户信息=>snsapi_userinfo
  13. ],
  14. ]

2.QQ

  1. 'qq'=>[
  2. 'app_id' => '1014*****',
  3. 'app_secret' => '8a2b322610d7a0d****',
  4. 'scope' => 'get_user_info',
  5. 'callback' => 'http://majiameng.com/login/qq',
  6. 'withUnionid' => true //已申请unioid打通
  7. ]

QQ现在可以获取unionid了,详见: http://wiki.connect.qq.com/unionid%E4%BB%8B%E7%BB%8D
只需要配置参数$config['withUnionid'] = true,默认不会请求获取Unionid

3.微博

  1. 'app_id' => '78734****',
  2. 'app_secret' => 'd8a00617469018d61c**********',
  3. 'scope' => 'all',

4.GitHub

  1. 'application_name' => '佳萌驿站',
  2. 'app_id' => 'a56b04a5********',
  3. 'app_secret' => '93ae7e5b137c6228e******************',
  4. 'callback' => 'http://majiameng.com/app/github',

5.支付宝

  1. 'app_id' => '2016052*******',
  2. 'scope' => 'auth_user',
  3. 'pem_private' => Env::get('ROOT_PATH') . 'pem/private.pem', // 你的私钥
  4. 'pem_public' => Env::get('ROOT_PATH') . 'pem/public.pem', // 支付宝公钥

6.Facebook

  1. 'app_id' => '2774925********',
  2. 'app_secret' => '99bfc8ad35544d7***********',
  3. 'scope' => 'public_profile,user_gender',//user_gender需要审核,所以不一定能获取到

facebook有个特殊的配置$config['field'],默认是'id,name,gender,picture.width(400)',你可以根据需求参考官方文档自行选择要获取的用户信息

7.Twitter

  1. 'app_id' => '3nHCxZgcK1WpYV**********',
  2. 'app_secret' => '2byVAPayMrG8LISjopwIMcJGy***************',

8.Line

  1. 'app_id' => '159******',
  2. 'app_secret' => '1f19c98a61d148f2************',
  3. 'scope' => 'profile',

9.Google

  1. 'app_id' => '7682717*******************.apps.googleusercontent.com',
  2. 'app_secret' => 'w0Kq-aYA***************',
  3. 'scope' => 'https://www.googleapis.com/auth/userinfo.profile',

返回样例

  1. Array
  2. (
  3. [openid] => 1047776979*******
  4. [channel] => 1; //登录类型请查看 \tinymeng\OAuth2\Helper\ConstCode
  5. [nickname] => 'Tinymeng' //昵称
  6. [gender] => 1; //0=>未知 1=>男 2=>女 twitter和line不会返回性别,所以这里是0,Facebook根据你的权限,可能也不会返回,所以也可能是0
  7. [avatar] => http://thirdqq.qlogo.cn/qqapp/101426434/50D523803F5B51AAC01616105161C7B1/100 //头像
  8. )

大家如果有问题要交流,就发在这里吧: OAuth2 交流 或发邮件 666@majiameng.com