72 lines
2.5 KiB
PHP
72 lines
2.5 KiB
PHP
|
|
<?php
|
|||
|
|
|
|||
|
|
namespace App\Service\wx;
|
|||
|
|
|
|||
|
|
use App\BaseApp\BaseWxService;
|
|||
|
|
use App\Models\business\ListModel;
|
|||
|
|
use App\Models\business\WxUserModel;
|
|||
|
|
use App\Service\business\SerialNoService;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 小程序登录
|
|||
|
|
*
|
|||
|
|
* 返回的 token 是服务端自签的(见 WxTokenService),session_key 只写库不外发。
|
|||
|
|
*/
|
|||
|
|
class WxAuthService extends BaseWxService
|
|||
|
|
{
|
|||
|
|
protected bool $needLogin = false;
|
|||
|
|
|
|||
|
|
private const DEFAULT_AVATAR = 'http://qiniu.boerman.top/b_2010f38d40d7d4426787b9131020e2a3.png';
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* code 登录:老用户更新 session_key,新用户建档并送一份默认清单
|
|||
|
|
*/
|
|||
|
|
public function login(array $params): array
|
|||
|
|
{
|
|||
|
|
$code = trim((string) ($params['code'] ?? ''));
|
|||
|
|
if ($code === '') {
|
|||
|
|
$this->utils->errorThrow('缺少 code');
|
|||
|
|
}
|
|||
|
|
$credentials = WxMiniService::getInstance()->jscode2session($code);
|
|||
|
|
$openId = (string) $credentials['openid'];
|
|||
|
|
$now = time();
|
|||
|
|
|
|||
|
|
$user = WxUserModel::where('open_id', $openId)->first();
|
|||
|
|
if (empty($user)) {
|
|||
|
|
$userId = WxUserModel::insertGetId([
|
|||
|
|
'open_id' => $openId,
|
|||
|
|
'session_key' => (string) ($credentials['session_key'] ?? ''),
|
|||
|
|
'avatar' => $params['avatar'] ?? self::DEFAULT_AVATAR,
|
|||
|
|
'nick_name' => $params['nick_name'] ?? '微信用户',
|
|||
|
|
'phone' => '',
|
|||
|
|
'created_at' => $now,
|
|||
|
|
]);
|
|||
|
|
if (empty($userId)) {
|
|||
|
|
$this->utils->errorThrow('用户创建失败');
|
|||
|
|
}
|
|||
|
|
ListModel::insert([
|
|||
|
|
'list_no' => SerialNoService::getInstance()->generate(SerialNoService::PREFIX_LIST, 'list', 'list_no'),
|
|||
|
|
'user_id' => $userId,
|
|||
|
|
'name' => '默认清单',
|
|||
|
|
'remark' => '系统默认生成的清单',
|
|||
|
|
'created_at' => $now,
|
|||
|
|
]);
|
|||
|
|
} else {
|
|||
|
|
$userId = (int) $user['id'];
|
|||
|
|
WxUserModel::where('id', $userId)->update([
|
|||
|
|
'session_key' => (string) ($credentials['session_key'] ?? ''),
|
|||
|
|
'updated_at' => $now,
|
|||
|
|
]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$userInfo = WxUserModel::where('id', $userId)->with('enterprise')->first();
|
|||
|
|
$userInfo = $userInfo ? $userInfo->toArray() : [];
|
|||
|
|
unset($userInfo['session_key']);
|
|||
|
|
|
|||
|
|
return [
|
|||
|
|
'token' => WxTokenService::getInstance()->issue((int) $userId, (string) ($credentials['app_code'] ?? '')),
|
|||
|
|
'user_info' => $userInfo,
|
|||
|
|
];
|
|||
|
|
}
|
|||
|
|
}
|