帝国cms微信扫码登陆-QQ - 微博 - 支付宝 - Facebook - Twitter - Line - Google插件

我这里说一下微信扫码登陆的思路,扫码后有一个回调,经过回调触发注册登陆php

这些东西都须要本身去申请的。 步骤1、 1,获取:AppID,AppSecret 。记住微信开放平台的AppID,AppSecret 和微信公众平台的AppID,AppSecret 彻底是两码事。咱们扫码登陆须要的是微信开放平台的(open.weixin.qq.com)。html

2,到微信开放平台注册帐号并建立应用,建立应用提交材料。应用申请经过之后你会得到AppID,AppSecretweb

3,开发者认证:还须要开发者认证(认证费300/年)。若是不认证是不可使用的,你会获得以下提示: Scope 参数错误或没有 Scope 权限json

步骤2、应用建立完成并认证开发者。api

开始安装插件服务器

1,将名称为weixin的文件夹放到 /e/memberconnect目录下微信

2,访问安装文件http://域名/e/memberconnect/weixin/install/index.php,选择安装。安装完成 3,在后台配置数据markdown

步骤3、前台连接调用地址http://域名/e/memberconnect/?apptype=weixin,便可扫码登陆app

这里是整合源文件(点击下载)微信公众平台

通用第三方登陆说明文档

2.0 版本全新发布,目前支持的登陆平台包括:

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

安装

composer require anerg2046/sns_auth
复制代码

类库使用的命名空间为\\anerg\\OAuth2

目录结构

.
├── README.md                        说明文件
├── composer.json                    composer文件
├── src                              代码源文件目录
│   ├── Connector
│   │   ├── Gateway.php              必须继承的抽象类
│   │   └── GatewayInterface.php     必须实现的接口
│   ├── Gateways
│   │   ├── Alipay.php
│   │   ├── Facebook.php
│   │   ├── Google.php
│   │   ├── Line.php
│   │   ├── Qq.php
│   │   ├── Twitter.php
│   │   ├── Weibo.php
│   │   └── Weixin.php
│   ├── Helper
│   │   └── Str.php                  字符串辅助类
│   └── OAuth.php                    抽象实例类
└── wx_proxy.php                     微信多域名代理文件
复制代码

公共方法

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

    /**
 * 获得跳转地址
 */
    public function getRedirectUrl();

    /**
 * 获取当前受权用户的openid标识
 */
    public function openid();

    /**
 * 获取格式化后的用户信息
 */
    public function userinfo();

    /**
 * 获取原始接口返回的用户信息
 */
    public function userinfoRaw();

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

    /**
 * 获取中转代理地址
 */
    public function getProxyURL();

典型用法

以 ThinkPHP5 为例

<?php

namespace app\mobile\controller;

use anerg\OAuth2\OAuth;
use think\facade\Config;

class Sns
{
    private $config;

    /**
 * 第三方登陆,执行跳转操做
 *
 * @param string $name 第三方渠道名称,目前可用的为:weixin,qq,weibo,alipay,facebook,twitter,line,google
 */
    public function login($name)
    {
        //获取配置
        $this->config = Config::get('sns.' . $name);

        //设置回跳地址
        $this->config['callback'] = $this->makeCallback($name);

        //能够设置代理服务器,通常用于调试国外平台
        $this->config['proxy'] = 'http://127.0.0.1:1080';

        /**
 * 对于微博,若是登陆界面要适用于手机,则须要设定->setDisplay('mobile')
 *
 * 对于微信,若是是公众号登陆,则须要设定->setDisplay('mobile'),不然是WEB网站扫码登陆
 *
 * 其余登陆渠道的这个设置没有任何影响,为了统一,能够都写上
 */
        return redirect(OAuth::$name($this->config)->setDisplay('mobile')->getRedirectUrl());

        /**
 * 若是须要微信代理登陆,则须要:
 *
 * 1.将wx_proxy.php放置在微信公众号设定的回调域名某个地址,如 http://www.abc.com/proxy/wx_proxy.php
 * 2.config中加入配置参数proxy_url,地址为 http://www.abc.com/proxy/wx_proxy.php
 *
 * 而后获取跳转地址方法是getProxyURL,以下所示
 */
        $this->config['proxy_url'] = 'http://www.abc.com/proxy/wx_proxy.php';
        return redirect(OAuth::$name($this->config)->setDisplay('mobile')->getProxyURL());
    }

    public function callback($name)
    {
        //获取配置
        $this->config = Config::get('sns.' . $name);

        //设置回跳地址
        $this->config['callback'] = $this->makeCallback($name);

        //获取格式化后的第三方用户信息
        $snsInfo = OAuth::$name($this->config)->userinfo();

        //获取第三方返回的原始用户信息
        $snsInfoRaw = OAuth::$name($this->config)->userinfoRaw();

        //获取第三方openid
        $openid = OAuth::$name($this->config)->openid();
    }

    /**
 * 生成回跳地址
 *
 * @return string
 */
    private function makeCallback($name)
    {
        //注意须要生成完整的带http的地址
        return url('/sns/callback/' . $name, '', 'html', true);
    }
}

2.0 版本再也不经过系统自动设置 state,若有须要请自行处理验证,state 也放入 config 里便可

Line 和 Facebook 强制要求传递 state,若是你没有设置,则会传递随机值

若是要验证 state,则在获取用户信息的时候要加上->mustCheckState()方法。

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

注意,不是全部的平台都支持传递 state,请自行阅读官方文档

客户端登陆

    public function sns()
    {
        $platform = $this->request->param('sns_platform');

        //获取本站的第三方登陆配置
        $config = Config::get($platform . '.' . Config::get($platform));
        // $config['proxy'] = 'http://127.0.0.1:1080';
        //QQ,Facebook,Line,要求客户端传递access_token便可
        $config['access_token'] = $this->request->param('access_token', '');
        //Twitter须要传递下面四个参数
        $config['oauth_token']        = $this->request->param('oauth_token', '');
        $config['oauth_token_secret'] = $this->request->param('oauth_token_secret', '');
        $config['user_id']            = $this->request->param('user_id', '');
        $config['screen_name']        = $this->request->param('screen_name', '');
        //其余和web登陆同样,要求客户端传递code过来便可,能够是post也能够是get方式

        $snsInfo = OAuth::$platform($config)->userinfo();
        print_r($snsInfo);
    }

配置文件样例

1.微信

'app_id'     => 'wxbc4113c******',
'app_secret' => '4749970d284217d0a**********',
'scope'      => 'snsapi_userinfo',//若是须要静默受权,这里改为snsapi_base,扫码登陆系统会自动改成snsapi_login
复制代码

2.QQ

'app_id'        => '1013****',
'app_secret'    => '67c52bc284b32e7**********',
'scope'         => 'get_user_info',
复制代码

QQ 如今能够获取unionid了,详见: wiki.connect.qq.com/unionid%E4%… 只须要配置参数$config['withUnionid'] = true,默认不会请求获取 Unionid

3.微博

'app_id'     => '78734****',
'app_secret' => 'd8a00617469018d61c**********',
'scope'      => 'all',
复制代码

4.支付宝

'app_id'      => '2016052*******',
'scope'       => 'auth_user',
'pem_private' => Env::get('ROOT_PATH') . 'pem/private.pem', // 你的私钥
'pem_public'  => Env::get('ROOT_PATH') . 'pem/public.pem', // 支付宝公钥
复制代码

5.Facebook

'app_id'     => '2774925********',
'app_secret' => '99bfc8ad35544d7***********',
'scope'      => 'public_profile,user_gender',//user_gender须要审核,因此不必定能获取到
复制代码

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

6.Twitter

'app_id'     => '3nHCxZgcK1WpYV**********',
'app_secret' => '2byVAPayMrG8LISjopwIMcJGy***************',
复制代码

7.Line

'app_id'     => '159******',
'app_secret' => '1f19c98a61d148f2************',
'scope'      => 'profile',
复制代码

8.Google

'app_id'     => '7682717*******************.apps.googleusercontent.com',
'app_secret' => 'w0Kq-aYA***************',
'scope'      => 'https://www.googleapis.com/auth/userinfo.profile',
复制代码

返回样例

Array
(
    [openid] => 1047776979*******
    [channel] => google
    [nick] => Coeus Rowe
    [gender] => m //twitter和line不会返回性别,因此这里是n,Facebook根据你的权限,可能也不会返回,因此也多是n
    [avatar] => https://lh6.googleusercontent.com/-iLps1iAjL8Q/AAAAAAAAAAI/AAAAAAAAAAA/Bu5l0EIquF0/photo.jpg
)
复制代码

微信会返回特有的 unionid 字段

------------------------------------------------------------------------------------------------------------老陌笔记

相关文章
相关标签/搜索