帝國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 字段

------------------------------------------------------------------------------------------------------------老陌筆記

相關文章
相關標籤/搜索