微博登录界面的PHP代码,关于接入微博登录的代码实现

代码实现

我这里没有使用自带的微博 phpsdk

为了可扩展性接入其他支付,我公用了一个配置文件

return [

'log' => [

'file' =>storage_path('logs/login/'.date('Y-m-d') . '.php')

],

'weibo' => [

// 微博登录相关key

'w_key' => ENV('W_KEY',''),

'w_secret' => ENV('W_SECRET',''),

'w_get_code_url' => 'https://api.weibo.com/oauth2/authorize?client_id=%d&response_type=code&redirect_uri=%s',

'w_get_access_token_url' => 'https://api.weibo.com/oauth2/access_token?client_id=%d&client_secret=%s&grant_type=authorization_code&redirect_uri=%s&code=%s',

'w_user_url' => 'https://api.weibo.com/2/users/show.json'

]

];

相关配置url 采用sprintf的方式进行拼接

核心代码如下:

控制器代码 -

namespace App\Http\Controllers\Auth;

use App\Http\Traits\LoginWeiboHandler;

use Illuminate\Http\Request;

class LoginWeiboController extends BaseController

{

use LoginWeiboHandler;

/**

* 微博登录

* 调起微博登录 - 获取code - 携带code请求accessToken - 携带token获取用户信息

*/

public function login(Request $request)

{

$code = $request->code;

if (!$code) {

return $this->getCode();

}

$result = $this->setGetWbAccessToken($code);

$access_token = $result['access_token'];

$uid = $result['uid'];

return $this->user($access_token,$uid);

// 获取用户信息

}

public function user($access_token,$uid)

{

$userInfo = $this->getUserInfo($access_token,$uid);

// 执行登录操作

$this->store($uid,'weibo',$userInfo);

}

}

实现类代码 -

namespace App\Http\Traits;

use GuzzleHttp\Client;

use GuzzleHttp\Exception\ClientException;

use App\Exceptions\LoginException;

/**

* 处理微博登录逻辑

* Class LoginWeiboHandler

* @package App\Http\Traits

*/

trait LoginWeiboHandler

{

private $key;

private $secret;

private $getCodeUrl;

private $getAccessTokenUrl;

private $host;

private $client;

public function __construct()

{

$this->client = new Client();

$this->key = config('login.weibo.w_key');

$this->secret = config('login.weibo.w_secret');

$this->getCodeUrl = config('login.weibo.w_get_code_url');

$this->getAccessTokenUrl = config('login.weibo.w_get_access_token_url');

$this->host = route('login.weibo');

}

/**

* 设置 获取 code的url

* @return string

*/

public function setWbCodeUrl()

{

$url = sprintf($this->getCodeUrl,$this->key,$this->host);

return $url;

}

/**

* @param $code string 授权后取得的code值

*/

public function setGetWbAccessToken($code)

{

if( !$code ) {

throw new LoginException([

'message' => 'CODE不存在'

]);

}

$url = sprintf($this->getAccessTokenUrl,$this->key,$this->secret,$this->host,$code);

try{

$res = $this->client->request('POST',$url)->getBody();

}catch (ClientException $e){

// 处理错误

throw new LoginException([

'message' => 'CODE已经失效'

]);

}

return json_decode($res,true);

}

/**

* 获取code

* @return \Illuminate\Http\RedirectResponse

*/

public function getCode()

{

$getCodeUrl = $this->setWbCodeUrl();

return redirect()->away($getCodeUrl);

}

/**

* 获取用户信息接口

* @param $access_token

* @param $uid

* @return mixed

* @throws LoginException

* @throws \GuzzleHttp\Exception\GuzzleException

*/

public function getUserInfo($access_token,$uid)

{

$arr = [

'access_token' => $access_token,

'uid' => $uid

];

$url = config('login.weibo.w_user_url') . '?' .http_build_query($arr);

$res = $this->client->request('GET',$url);

try{

$res = $this->client->request('GET',$url)->getBody();

}catch (ClientException $e){

// 处理错误

throw new LoginException([

'message' => '请求微博客户端出现问题,请选择更换登录方式'

]);

}

return json_decode($res,true);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值