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.
 
 
 

542 lines
18 KiB

<?php
namespace App\Http\Controllers\Appapi\V1;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Services\UserService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class UserSecurityController extends ApiController
{
// 用户账号安全
protected $userService;
public function __construct(UserService $userService)
{
$this->userService = $userService;
}
//账号安全信息
public function home()
{
$user = $this->current_user();
$user = User::query()->find($user['user_id']);
$user = $user->makeVisible(['google_token'])->toArray();
$data = array_only($user, ['user_id', 'country_code', 'phone', 'phone_status', 'email', 'email_status', 'google_token', 'google_status']);
return $this->successWithData($data);
}
//交易密码开关
public function switchTradeVerify()
{
$user = $this->current_user();
$trade_verify = $user->trade_verify;
$user->trade_verify = $trade_verify == 1 ? 0 : 1;
$user->save();
return $this->successWithData(['trade_verify' => $user['trade_verify']]);
}
//用户登录状态 发送code
public function getCode(Request $request)
{
if ($vr = $this->verifyField($request->all(), [
'type' => 'integer|in:1,2', //
])) return $vr;
$user = $this->current_user();
$type = $request->input('type', 1);
if ($type == 1) {
//手机
if (blank($user['phone'])) return $this->error(0, '手机未绑定');
$sendResult = sendCodeSMS($user->phone, '', $user->country_code);
} else {
//邮箱
if (blank($user['email'])) return $this->error(0, '邮箱未绑定');
$sendResult = sendEmailCode($user->email);
}
if ($sendResult === true) {
return $this->success('发送成功');
}
return $this->error(0, $sendResult);
}
//设置或重置交易密码
public function setOrResetPaypwd(Request $request)
{
if ($res = $this->verifyField($request->all(), [
'sms_code' => '',
'email_code' => '',
'google_code' => '',
'payword' => 'required|digits:6|confirmed:payword_confirmation',
'payword_confirmation' => 'required|digits:6',
])) return $res;
$user = $this->current_user();
//验证code
$codes = $request->only(['sms_code', 'email_code', 'google_code']);
$checkResult = $this->userService->verifySecurityCode($user, $codes);
if ($checkResult !== true) return $this->error(4001, $checkResult);
$user->payword = $user->passwordHash($request->payword);
$user->save();
return $this->success();
}
//修改登录密码
public function updatePassword(Request $request)
{
if ($res = $this->verifyField($request->all(), [
'sms_code' => '',
'email_code' => '',
'google_code' => '',
'password' => 'required|confirmed:password_confirmation',
'password_confirmation' => 'required',
])) return $res;
$user = $this->current_user();
//验证code
$codes = $request->only(['sms_code', 'email_code', 'google_code']);
$checkResult = $this->userService->verifySecurityCode($user, $codes);
if ($checkResult !== true) return $this->error(4001, $checkResult);
$user->password = $user->passwordHash($request->password);
$user->save();
return $this->success();
}
//绑定手机
public function bindPhone(Request $request)
{
if ($res = $this->verifyField($request->all(), [
'phone' => 'required',
'country_code' => 'required',
'sms_code' => 'required',
'email_code' => '',
'google_code' => '',
])) return $res;
$user = $this->current_user();
$phone = $request->input('phone');
//验证code
$codes = $request->only(['sms_code', 'email_code', 'google_code']);
$checkResult = $this->userService->verifySecurityCode($user, $codes);
if ($checkResult !== true) return $this->error(4001, $checkResult);
//验证绑定账号
if (!blank(User::query()->where(['phone' => $phone, 'country_code' => $request->country_code])->first())) return $this->error(4001, '账号已存在');
$checkResult2 = checkSMSCode($phone, $request->sms_code, 'bind_phone', $request->country_code);
if ($checkResult2 !== true) return $this->error(4001, $checkResult2);
$user->country_id = $request->input('country_id');
$user->country_code = $request->country_code;
$user->phone = $phone;
$user->phone_status = 1;
$user->save();
return $this->success();
}
//换绑手机
public function changePhone(Request $request)
{
if ($res = $this->verifyField($request->all(), [
'country_code' => 'required',
'new_phone' => 'required',
'new_phone_code' => 'required',
'sms_code' => '',
'email_code' => '',
'google_code' => '',
])) return $res;
$user = $this->current_user();
$phone = $request->input('new_phone');
//验证code
$codes = $request->only(['sms_code', 'email_code', 'google_code']);
$checkResult = $this->userService->verifySecurityCode($user, $codes);
if ($checkResult !== true) return $this->error(4001, $checkResult);
//验证绑定账号
if (!blank(User::query()->where(['phone' => $phone, 'country_code' => $request->country_code])->first())) return $this->error(4001, '账号已存在');
$checkResult2 = checkSMSCode($phone, $request->new_phone_code, 'bind_phone', $request->country_code);
if ($checkResult2 !== true) return $this->error(4001, $checkResult2);
$user->country_id = $request->input('country_id');
$user->country_code = $request->country_code;
$user->phone = $phone;
$user->phone_status = 1;
$user->save();
return $this->success();
}
//发送绑定手机短信验证码
public function sendBindSmsCode(Request $request, User $user)
{
if ($vr = $this->verifyField($request->all(), [
'country_code' => 'required|string', //国家代码
'phone' => 'required|string',
'type' => 'integer|in:2',
])) return $vr;
$account = $request->input('phone');
$type = $request->input('type', 2);
if ($type == 2) {
//绑定验证码
if ($user->getUserByPhone($account)) return $this->error(0, '账号已被占用');
}
$sendResult = sendCodeSMS($account, 'bind_phone', $request->country_code);
if ($sendResult === true) {
return $this->success();
}
return $this->error(4001, $sendResult);
}
//发送绑定邮箱验证码
public function sendBindEmailCode(Request $request, User $user)
{
if ($vr = $this->verifyField($request->all(), [
'email' => 'required|string',
'type' => 'integer|in:2',
])) return $vr;
$account = $request->input('email');
$type = $request->input('type', 2);
if ($type == 2) {
//绑定验证码
if ($user->getUserByEmail($account)) return $this->error(0, '账号已被占用');
}
$sendResult = sendEmailCode($account, 'bind_email');
if ($sendResult === true) {
return $this->success();
}
return $this->error(4001, $sendResult);
}
//绑定邮箱
public function bindEmail(Request $request)
{
if ($res = $this->verifyField($request->all(), [
'email' => 'required',
'email_code' => 'required',
'sms_code' => '',
'google_code' => '',
])) return $res;
$user = $this->current_user();
$email = $request->input('email');
//验证code
$codes = $request->only(['sms_code', 'email_code', 'google_code']);
$checkResult = $this->userService->verifySecurityCode($user, $codes);
if ($checkResult !== true) return $this->error(4001, $checkResult);
//验证绑定账号
if (!blank(User::query()->where('email', $email)->first())) return $this->error(4001, '账号已存在');
$checkResult2 = checkEmailCode($email, $request->email_code, 'bind_email');
if ($checkResult2 !== true) return $this->error(4001, $checkResult2);
$user->email = $email;
$user->email_status = 1;
$user->save();
return $this->success();
}
//换绑邮箱
public function changeEmail(Request $request)
{
if ($res = $this->verifyField($request->all(), [
'new_email' => 'required',
'new_email_code' => 'required',
'email_code' => '',
'sms_code' => '',
'google_code' => '',
])) return $res;
$user = $this->current_user();
$new_email = $request->input('new_email');
//验证code
$codes = $request->only(['sms_code', 'email_code', 'google_code']);
$checkResult = $this->userService->verifySecurityCode($user, $codes);
if ($checkResult !== true) return $this->error(4001, $checkResult);
//验证换绑账号
if (!blank(User::query()->where('email', $new_email)->first())) return $this->error(4001, '账号已存在');
$checkResult2 = checkEmailCode($new_email, $request->new_email_code, 'bind_email');
if ($checkResult2 !== true) return $this->error(4001, $checkResult2);
$user->email = $new_email;
$user->email_status = 1;
$user->save();
return $this->success();
}
//解绑邮箱
public function unbindEmail(Request $request)
{
if ($res = $this->verifyField($request->all(), [
'sms_code' => '',
'email_code' => '',
'google_code' => '',
])) return $res;
$user = $this->current_user();
if (blank($user['email'])) return $this->error();
if ($user['account_type'] == 2) return $this->error(0, '主账号不能解绑');
//验证code
$codes = $request->only(['sms_code', 'email_code', 'google_code']);
$checkResult = $this->userService->verifySecurityCode($user, $codes);
if ($checkResult !== true) return $this->error(4001, $checkResult);
$user->email = '';
$user->email_status = 0;
$user->save();
return $this->success();
}
//解绑手机
public function unbindPhone(Request $request)
{
if ($res = $this->verifyField($request->all(), [
'sms_code' => '',
'email_code' => '',
'google_code' => '',
])) return $res;
$user = $this->current_user();
if (blank($user['phone'])) return $this->error();
if ($user['account_type'] == 1) return $this->error(0, '主账号不能解绑');
//验证code
$codes = $request->only(['sms_code', 'email_code', 'google_code']);
$checkResult = $this->userService->verifySecurityCode($user, $codes);
if ($checkResult !== true) return $this->error(4001, $checkResult);
$user->phone = '';
$user->phone_status = 0;
$user->save();
return $this->success();
}
//发送忘记密码短信验证码
public function sendSmsCodeForgetPassword(Request $request, User $user)
{
if ($vr = $this->verifyField($request->all(), [
'country_code' => 'required|string', //国家代码
'phone' => 'required|string',
])) return $vr;
$account = $request->input('phone');
$sendResult = sendCodeSMS($account, '', $request->country_code);
if ($sendResult === true) {
return $this->success();
}
return $this->error(4001, $sendResult);
}
//发送忘记密码邮箱验证码
public function sendEmailCodeForgetPassword(Request $request, User $user)
{
if ($vr = $this->verifyField($request->all(), [
'email' => 'required|string',
])) return $vr;
$account = $request->input('email');
$sendResult = sendEmailCode($account);
if ($sendResult === true) {
return $this->success();
}
return $this->error(4001, $sendResult);
}
//忘记登录密码尝试
public function forgetPasswordAttempt(Request $request)
{
if ($res = $this->verifyField($request->all(), [
'account' => 'required',
])) return $res;
$account = $request->input('account');
$user = User::query()->where('phone', $account)->orWhere('email', $account)->first();
if (blank($user)) return $this->error(0, '用户不存在');
$user = $user->toArray();
$verify_data = array_only($user, ['country_code', 'phone', 'phone_status', 'email', 'email_status', 'google_status']);
return $this->successWithData($verify_data);
}
//忘记登录密码
public function forgetPassword(Request $request)
{
if ($res = $this->verifyField($request->all(), [
'account' => 'required',
'sms_code' => '',
'email_code' => '',
'google_code' => '',
'password' => 'required|confirmed:password_confirmation',
'password_confirmation' => 'required',
])) return $res;
$account = $request->input('account');
$user = User::query()->where('phone', $account)->orWhere('email', $account)->first();
if (blank($user)) return $this->error(0, '用户不存在');
$codes = $request->only(['sms_code', 'email_code', 'google_code']);
$checkResult = $this->userService->verifySecurityCode($user, $codes);
if ($checkResult !== true) return $this->error(4001, $checkResult);
$user->password = $user->passwordHash($request->password);
$user->save();
return $this->success();
}
public function disableSmsEmailGoogle(Request $request)
{
if ($vr = $this->verifyField($request->all(), [
'type' => 'required|integer|in:1,2,3', //1手机 2邮箱 3谷歌
'sms_code' => '',
'email_code' => '',
'google_code' => '',
])) return $vr;
$user = $this->current_user();
$codes = $request->only(['sms_code', 'email_code', 'google_code']);
$checkResult = $this->userService->verifySecurityCode($user, $codes);
if ($checkResult !== true) return $this->error(4001, $checkResult);
DB::beginTransaction();
$type = $request->input('type');
if ($type == 1) {
$user->phone_status = 0;
} elseif ($type == 2) {
$user->email_status = 0;
} else {
$user->google_status = 0;
}
$user->save();
if ($user['phone_status'] == 0 && $user['email_status'] == 0 && $user['google_status'] == 0) {
DB::rollBack();
return $this->error(0, '至少开启一种验证');
} else {
DB::commit();
return $this->success();
}
}
public function enableSmsEmailGoogle(Request $request)
{
if ($vr = $this->verifyField($request->all(), [
'type' => 'required|integer|in:1,2,3',
'sms_code' => '',
'email_code' => '',
'google_code' => '',
])) return $vr;
$user = $this->current_user();
$codes = $request->only(['sms_code', 'email_code', 'google_code']);
$checkResult = $this->userService->verifySecurityCode($user, $codes);
if ($checkResult !== true) return $this->error(4001, $checkResult);
$type = $request->input('type');
if ($type == 1) {
if (blank($user['phone'])) return $this->error(0, '手机未绑定');
$user->phone_status = 1;
} elseif ($type == 2) {
if (blank($user['email'])) return $this->error(0, '邮箱未绑定');
$user->email_status = 1;
} else {
if (blank($user['google_token'])) return $this->error(0, '谷歌验证未绑定');
$user->google_status = 1;
}
$user->save();
return $this->success();
}
public function changePurchaseCode(Request $request)
{
if ($vr = $this->verifyField($request->all(), [
'purchase_code' => 'required|numeric',
])) return $vr;
$current_user = $this->current_user();
$purchase_code = $request->purchase_code;
DB::beginTransaction();
# 获取用户,锁行
$user = DB::table('users')
->where('user_id', $current_user['user_id'])
->lockForUpdate()
->first();
# 已填写申购码,不允许再次填写
if (!empty($user->purchase_code)) {
//DB::rollBack();
//# 您已设置申购码,不需要再次设置
//return $this->error(4001, 'You have set the subscription code, do not need to set it again');
}
# 申购码不能是自己的
if ($user->invite_code === $purchase_code) {
# 申购码不正确
//return $this->error(4001, 'Incorrect purchase code');
}
# 申购码对应用户不存在
$purchaseCodeUser = DB::table('users')
->where('invite_code', $purchase_code)
->where('is_agency', 1)
->lockForUpdate()
->first();
if ($purchaseCodeUser == null) {
//DB::rollBack();
//# 申购码不正确
//return $this->error(4001, 'Incorrect purchase code');
}
# 更新
DB::table('users')
->where('user_id', $current_user['user_id'])
->update([
'purchase_code' => $purchase_code,
'pid' => $purchaseCodeUser->user_id,
'referrer' => $purchaseCodeUser->user_id
]);
DB::commit();
return $this->success('modify successfully');
}
}