代码实现
我这里没有使用自带的微博 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);
}
}