69 lines
2.5 KiB
PHP
69 lines
2.5 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace app\api\logic;
|
||
|
|
||
|
use app\common\logic\BaseLogic;
|
||
|
use app\common\model\user\User;
|
||
|
use app\common\model\user\WechatUser;
|
||
|
use support\auth\Weixin;
|
||
|
use support\exception\BusinessException;
|
||
|
use think\facade\Db;
|
||
|
use Tinywan\Jwt\JwtToken;
|
||
|
|
||
|
class WechatUserLogic extends BaseLogic
|
||
|
{
|
||
|
|
||
|
public function findOrCreate($code)
|
||
|
{
|
||
|
$handler = new Weixin();
|
||
|
$appId = $handler->appId();
|
||
|
$res = $handler->login($code);
|
||
|
Db::startTrans();
|
||
|
try {
|
||
|
$wechatUser = WechatUser::withTrashed()->where('app_id', $appId)->where('routine_openid', $res['openid'])->find();
|
||
|
if (empty($wechatUser)) {
|
||
|
$wechatUser = new WechatUser();
|
||
|
$wechatUser->app_id = $appId;
|
||
|
$wechatUser->unionid = $res['union_id'] ?? $res['unionid'] ?? '';
|
||
|
$wechatUser->routine_openid = $res['openid'];
|
||
|
$wechatUser->nickname = !empty($this->nickname) ? $this->nickname : $handler->nickname();
|
||
|
$wechatUser->headimgurl = $handler->avatar();
|
||
|
if (!$wechatUser->save()) {
|
||
|
throw new \Exception('三方登录信息保存出错', 500);
|
||
|
}
|
||
|
}
|
||
|
$user = User::withTrashed()->where('wechat_user_id', $wechatUser->id)->field('id,nickname,avatar')->find();
|
||
|
if (!empty($user['delete_time'])) {
|
||
|
throw new BusinessException('账号已注销', 500);
|
||
|
}
|
||
|
if (empty($user)) {
|
||
|
$user = new User();
|
||
|
$user->wechat_user_id = $wechatUser->id;
|
||
|
$user->real_name = '';
|
||
|
$user->nickname = $wechatUser->nickname;
|
||
|
$user->avatar = $wechatUser->headimgurl;
|
||
|
}
|
||
|
$user->last_time = date('Y-m-d H:i:s');
|
||
|
if (!$user->save()) {
|
||
|
throw new \Exception('用户信息保存出错', 500);
|
||
|
}
|
||
|
Db::commit();
|
||
|
} catch (\Exception $exception) {
|
||
|
Db::rollback();
|
||
|
throw new \Exception($exception->getMessage(), $exception->getCode());
|
||
|
}
|
||
|
$tokenParam = [
|
||
|
'id' => $user->id,
|
||
|
'nickname' => $user->nickname,
|
||
|
'avatar' => $user->avatar,
|
||
|
'code' => $user->code,
|
||
|
];
|
||
|
$token = JwtToken::generateToken(['id' => $user->id]);
|
||
|
$token['expires_in'] = $token['expires_in'] + time();
|
||
|
$token['refresh_token_expire'] = time() + config('plugin.tinywan.jwt.app.jwt.refresh_exp');
|
||
|
$tokenParam['token'] = $token;
|
||
|
return $tokenParam;
|
||
|
}
|
||
|
|
||
|
}
|