406 lines
16 KiB
PHP
406 lines
16 KiB
PHP
|
|
<?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('上传失败');
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|