香洲二院小程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
mini_xzey/app/Http/Logics/Auth/AuthLogic.php

98 lines
2.7 KiB

<?php
declare(strict_types=1);
namespace App\Http\Logics\Auth;
use App\Exceptions\GeneralException;
use App\Models\User;
use App\Utils\Traits\Logger;
use Carbon\Carbon;
use Exception;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Redis;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\HttpClient\Exception\ExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\HttpExceptionInterface;
class AuthLogic
{
use Logger;
/**
* AuthLogic Construct
*/
public function __construct()
{
$this->setChannel('genera');
}
/**
* 小程序登录
* @throws GeneralException
*/
public function login(string $code): array
{
$session_info = $this->miniProgramLogin($code);
$token_info = $this->userLogin($session_info['open_id'], $session_info['session_key']);
Redis::setex($token_info['access_token'], 86400 * 7, json_encode($session_info, JSON_UNESCAPED_UNICODE));
return $token_info;
}
/**
* 用户登录
* @param string $open_id
* @param string $session_key
* @return array
*/
protected function userLogin(string $open_id, string $session_key): array
{
$user = User::firstOrCreate([
'email' => $open_id
], [
'name' => $open_id,
'password' => bcrypt($open_id)
]);
// 撤销之前正在使用的所有token
$user->tokens()->delete();
// 获取新token
$expire_time = Carbon::now()->addDays(7);
$token_str = $user->createToken(bcrypt($session_key), ['*'], $expire_time)->plainTextToken;
[$id, $token] = explode('|', $token_str, 2);
return [
'access_token' => $token ?: '',
'token_type' => 'Bearer',
];
}
/**
* 小程序登录
* @param string $code
* @return array
* @throws GeneralException
*/
protected function miniProgramLogin(string $code): array
{
try {
$mini = getWeChatMiniProgramApp();
$response = $mini->getUtils()->codeToSession($code);
return [
'open_id' => $response['openid'],
'session_key' => $response['session_key'],
'union_id' => $response['unionid'] ?? ''
];
} catch (HttpExceptionInterface|ExceptionInterface|Exception $e) {
//service error
$message = $e->getMessage() . ' in ' . $e->getFile() . ':' . $e->getLine();
$this->error('授权登录接口报错', [$message]);
throw new GeneralException('授权登录失败,请稍后再试!', Response::HTTP_BAD_REQUEST);
}
}
}