ufutx.dma/app/Http/Controllers/H5/AuthController.php

406 lines
16 KiB
PHP
Raw Normal View History

2026-03-04 14:42:40 +08:00
<?php
namespace App\Http\Controllers\H5;
use App\Events\OrderServeStartedEvent;
use App\Facades\UploadService;
use App\Facades\UserService;
use App\Facades\WechatService;
use App\Http\Controllers\Controller;
use App\Http\Response\ResponseJson;
use App\Jobs\AddErrorLog;
use App\Models\Collaborator;
use App\Models\ErrorLog;
use App\Models\FinancialStaff;
use App\Models\InviteUser;
use App\Models\Office;
use App\Models\Order;
use App\Models\Partner;
use App\Models\PartnerCommission;
use App\Models\ServiceUser;
use App\Models\Station;
use App\Models\User;
use App\Models\UserIntroduceLog;
use App\Models\Version;
use App\Models\Wechat;
use Carbon\Carbon;
use Exception;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
class AuthController extends Controller
{
use ResponseJson;
//
public function login(Request $request)
{
$wechat_user = session('wechat_user');
$invite_user_id = $request->input('invite_user_id', '');
$from_user_id = $request->input('from_user_id');
$openid = $wechat_user['id'] ?? null;
if (config('app.env') == 'production') {
// if (empty($openid)) return $this->jsonResponse(3,"微信授权失败");
//如果session里面拿不到openid,使用前端传过来的,如果前端也没有,那么返回授权失败
if (empty($openid)) {
$openid = $request->input('open_id');
if (empty($openid))
return $this->jsonResponse(3, "微信授权失败");
$openid = explode("?", $openid)[0];
}
} else {
$openid = 'o1by95wyeY3tBVWbtQSF8yJGCzi8';
}
try {
$this->openidToUser(['openid' => $openid], $invite_user_id, $wechat_user, $from_user_id);
$user = User::with(['wallets', 'service_roles', 'partner:id,name,pic,user_id,birthday,mobile'])
->whereHas('officialWechat', function ($query) use ($openid) {
$query->where('openid', $openid);
})
// ->whereHas('service_roles')
->firstOrFail();
$user->openid = $user->officialWechat->openid;
if (!$user->wallets) {
$user->wallets()->create([
'balance' => 0,
'frozen_amount' => 0,
'withdrawn_amount' => 0,
]);
$user->load('wallets');
}
$user->is_main_coaches = 0;
$user->is_coaches = 0;
$user->is_customer_service_user = 0;
$user->is_partner = 0;
$user->is_chef_user = 0;
$user->collaborator = $user->collaborator()->where('status', Collaborator::STATUS_PASS)->first();
//查询办公室
if (!empty($user->collaborator)) {
$station = Station::where('user_id', $user->id)->first();
if ($station) {
$office = Office::where('id', $station->office_id)->first();
}
$user->collaborator->office_id = $office->id ?? '';
$user->collaborator->office_name = $office->office_name ?? '';
}
$user->is_collaborator = !empty($user->collaborator) ? 1 : 0;
//是否申请主持人
$user->is_moderator = $user->isModerator();
$user->service_roles()->each(function ($service_role) use ($user) {
switch ($service_role->pivot->role_id) {
case 1://主教练
$user->is_main_coaches = 1;
break;
case 2://副教练
$user->is_coaches = 1;
break;
case 3://客服
$user->is_customer_service_user = 1;
break;
case 4://小伙伴
$user->is_partner = 1;
break;
case 6://餐饮人员
$user->is_chef_user = 1;
break;
}
});
$user->is_servier = ($user->is_main_coaches || $user->is_coaches || $user->is_customer_service_user || $user->is_chef_user) ? 1 : 0;
// $user->token = UserService::apiToken($user);
$user->token = UserService::apiJwtToken($user);
//获取邀请二维码
$user->qrcode = $this->getUserInviteQrcode($user);
//经销商
$agent = $user->isAgent();
$user->is_agent = $agent['is_agent'] ?? 0;
$user->can_restaurant = $agent['can_restaurant'] ?? 0;
//没有手机号用户和没有注册批发商的用户需要注册
//经销商是否需要注册
$user->agent_register = ($agent['agent_register'] && $user->mobile && $user->name) ? 1 : 0;
User::where('id', $user->id)->update(['ip' => get_real_ip()]);
return $this->success('ok', $user);
} catch (ModelNotFoundException) {
return $this->jsonResponse(1, '未找到用户信息');
}
}
/**
* 企业微信登录
* @param Request $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
* @throws Exception
*/
public function wechatWorkLogin(Request $request)
{
try {
$first = $request->input('first');
if ($first == 1) {
return $this->jsonResponse(3, "企业微信授权失败");
}
$service_user_id = $request->input('service_user_id');
if (!empty($service_user_id)) {
$work_id = ServiceUser::where('user_id', $service_user_id)->value('work_user_id');
//如果work_id不存在则获取h5用户open_id
if (empty($work_id)) {
$work_id = Wechat::where('user_id', $service_user_id)->where('type', Wechat::TYPE_OFFICIAL)->value('openid');
$user = User::whereHas('officialWechat', function ($query) use ($work_id) {
$query->where('openid', $work_id);
})
->firstOrFail();
} else {
$this->workIdToUser($work_id);
$user = User::whereHas('workWechat', function ($query) use ($work_id) {
$query->where('openid', $work_id);
})
->firstOrFail();
}
} else {
$work_user = session('work_wechat_user');
$work_id = $work_user['raw']['userid'] ?? null;
if (config('app.env') == 'production') {
if (empty($work_id)) {
$work_id = $request->input('work_id');
}
if (empty($work_id))
return $this->jsonResponse(3, "企业微信授权失败");
$work_id = explode("?", $work_id)[0];
} else {
$work_id = 'hankin';
}
$this->workIdToUser($work_id);
$user = User::whereHas('workWechat', function ($query) use ($work_id) {
$query->where('openid', $work_id);
})
->firstOrFail();
}
$url = $request->input('url', config('app.url'));
$work_config = WechatService::workJsSdkConfig($url, 'work');
$app_config = WechatService::workJsSdkConfig($url, 'app');
$version = Version::where('type', Version::TYPE_WECOM)->orderBydesc('id')->value('version');
//如果有服务人员信息,返回信息
$service_user = ServiceUser::where('user_id', $user->id)->first();
if (!empty($service_user)) {
$user->name = $service_user->name;
$user->mobile = $service_user->mobile;
}
$user->work_id = $work_id;
// $user->token = UserService::apiToken($user);
//jwt token
$user->token = UserService::apiJwtToken($user);
User::where('id', $user->id)->update(['ip' => get_real_ip()]);
return $this->success('ok', compact('user', 'work_config', 'app_config', 'version'));
} catch (\Exception $e) {
AddErrorLog::dispatch('wechatWorkLogin file:' . $e->getFile() . ' line:' . $e->getLine() . ' message:' . $e->getMessage())->onQueue('health');
return $this->failure('登录失败');
}
}
public function workIdToUser($work_id)
{
DB::beginTransaction();
try {
//查看是否存在服务人员及用户信息
$service_user = ServiceUser::where('work_user_id', $work_id)->first();
$wechat = Wechat::where('openid', $work_id)->first();
if ($service_user) {
if (!$wechat) {
Wechat::create([
'user_id' => $service_user->user_id,
'openid' => $work_id,
'unionid' => null,
'type' => 'work'
]);
}
} else {
if (!$wechat) {
$wechat = Wechat::create([
'openid' => $work_id,
'unionid' => null,
'type' => 'work'
]);
}
if (!$wechat->user) {
$user = User::create([
'name' => null,
'avatar' => null,
'mobile' => null,
'sex' => null,
'birthday' => null,
'stature' => null,
'source' => User::SOURCE_WORK
]);
ServiceUser::create([
'user_id' => $user->id,
'name' => null,
'mobile' => null,
'work_user_id' => $work_id,
]);
$wechat->user_id = $user->id;
$wechat->save();
}
if ($wechat->user && !$service_user) {
ServiceUser::create([
'user_id' => $wechat->user->id,
'name' => null,
'mobile' => null,
'work_user_id' => $work_id,
]);
}
}
DB::commit();
} catch (Exception $e) {
DB::rollBack();
throw new Exception($e);
}
}
/**
* 获取用户小程序二维码
* @param Request $request
* @return \Illuminate\Http\JsonResponse|void
*/
public function getUserInviteQrcode($user)
{
try {
$url = config('app.url') . '/api/h5/wechat/user/auth?target_path=welcome?invite_user_id=' . $user->id;
$redis = Redis::client();
// $invite_qrcode = $redis->get('invite_qrcode_'.$user->id);
$invite_qrcode = "";
$pic = '';
if ($invite_qrcode) {
$pic = $invite_qrcode;
} else {
$path = storage_path('qrcode/' . $user->id . '_invite_qrcode.svg');
QrCode::generate($url, $path);
if (file_exists($path)) {
$pic = UploadService::uploadFile($path);
$redis->set('invite_qrcode_' . $user->id, $pic);
@unlink($path);
}
}
return $pic;
} catch (\Exception $e) {
return $this->jsonResponse(1, $e->getMessage());
}
}
public function finance(Request $request)
{
$wechat_user = session('wechat_user');
$openid = $wechat_user['id'] ?? null;
if (empty($openid))
return $this->jsonResponse(3, "微信授权失败");
FinancialStaff::where('open_id', $openid)->firstOrCreate([
'open_id' => $openid
]);
return $this->success("ok");
}
public function openidToUser($session, $invite_user_id = '', $wechat_user = [], $from_user_id = '')
{
try {
$inviteModel = new InviteUser();
$wechat = Wechat::where('openid', $session['openid'])->first();
DB::beginTransaction();
if ($wechat) {
if (isset($session['unionid']) && $wechat->unionid !== $session['unionid']) {
$wechat->update(['unionid' => $session['unionid']]);
}
if ($wechat->user) {
//如果存在邀请人用户id,则做以下操作
$inviteModel->insertInviteData($invite_user_id, $wechat->user_id);
DB::commit();
return $wechat->user;
}
} else {
$wechat = Wechat::create([
'openid' => $session['openid'],
'unionid' => $session['unionid'] ?? null,
'type' => 'official'
]);
}
if (!$wechat->user) {
$user = User::create([
'name' => $wechat_user['nickname'] ?? null,
'avatar' => $wechat_user['avatar'] ?? null,
'mobile' => null,
'sex' => null,
'birthday' => null,
'stature' => null,
'source' => User::SOURCE_H5
]);
$wechat->user_id = $user->id;
$wechat->save();
if (request()->from_user_id) {
$user->shareUserLog()->create(['share_user_id' => request()->from_user_id, 'channel' => 'H5']);
}
}
//如果存在邀请人用户id,则做以下操作
$inviteModel->insertInviteData($invite_user_id, $wechat->user_id);
DB::commit();
return $user;
} catch (Exception $e) {
DB::rollBack();
throw new Exception($e);
}
}
public function syncUser()
{
try {
$partners = Partner::has('wechat')->whereNull('user_id')->with('wechat')->get();
foreach ($partners as $partner) {
if ($partner->wechat->user_id) {
$partner->user_id = $partner->wechat->user_id;
$partner->save();
}
}
return $this->success('ok');
} catch (Exception $e) {
return $this->jsonResponse(1, $e->getMessage());
}
}
/**
* 客户端错误上报
* @param Request $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function reportErrorData(Request $request)
{
try {
$data = $request->input('data');
$message = '客户端错误上报 ' . $data;
ErrorLog::create(['message' => $message, 'status' => 0]);
return $this->success('ok');
} catch (\Exception $e) {
Log::error('reportData:' . $e->getMessage());
return $this->failure('上传失败');
}
}
}