array( 'code' => '-110', 'msg' => '找不到此用户' ), ); /** * 构造函数 * * @access public * @param mixed $req 数据传输 * @return array JsonString */ public function __construct() { $this->logger = new Logger('party'); $this->logger->pushHandler(new StreamHandler(storage_path('logs/api.log'), Logger::WARNING)); } public function toError($err){ return toJson($err['code'], $err['msg']); } /** * 第三方账号登陆、注册 * * @access public * @param mixed $req 数据传输 * @return array JsonString */ public function login(Request $req) { $reqArr = $req->input(); $this->logger->addWarning('login get:'.json_encode($reqArr)); $code = -200; $msg = '操作失败'; try { $check = $this->checkLoginArg($req); if($check['code'] != 1){ return toJson($check['code'], $check['msg'], []); } $partyModel = new Models\Party; $key = $req->input('key'); $appid = $req->input('appid'); $partyUsername = $req->input('username'); $partyNickName = $req->input('nickname'); //$partyInfo = \App\Models\Party::where('key', $key)->first(); $partyInfo = $partyModel->where('key', $key)->first(); $money = $req->input('money'); if($partyInfo['balance'] < $money){ $this->logger->addError('login out: status:-100;您的余额不足'); return toJson(-100, '您的余额不足', []); } $appModel = new Models\App; $appInfo = $appModel->where('id', $appid)->first(); if($appInfo['balance'] < $money){ $this->logger->addError('login out: status:-101;我在应用的余额不足'); return toJson(-101, '系统繁忙,请稍后重试', []); //我的余额不足 } //查询该用户是否已在系统 $partyUserModel = new Models\PartyUser(); $partyUserInfo = $partyUserModel->where([ ['party_id', '=', $partyInfo['id']], ['party_username', '=', $partyUsername], ])->first(); if(empty($partyUserInfo)){ $partyUserModel->insert([ 'party_id' => $partyInfo['id'], 'party_username' => $partyUsername, 'nickname' => $partyNickName, 'password' => $req->input('password'), 'login_time' => now(), 'login_ip' => $this->get_real_ip(), ]); }else{ $partyUserModel->where('id', $partyUserInfo['id'])->update([ 'login_time' => now(), 'login_ip' => $this->get_real_ip(), ]); } $adapter = new Adapter(); //查询是否已创建对于应用的用户 $appUserModel = new Models\AppUser(); $info = $this->findAppUsername($partyInfo['id'], $partyUsername, $appid); if($info == false){ $appUsername = $this->buildAppUsername($partyInfo['id'], $partyUsername, $appid); $result = $adapter->syncUser($appid, $appUsername, $req->input('password')); //检测用户并创建用户 if($result['code'] != 1){ $this->logger->addError('login out: status:-102;创建应用用户失败; '.json_encode($result)); return toJson(-102, $result['msg'], []); } $appUserId = $appUserModel->insert([ 'app_id' => $appInfo['id'], 'party_username' => $partyUsername, 'app_username' => $appUsername, 'password' => $req->input('password'), 'login_time' => now(), 'login_ip' => $this->get_real_ip(), ]); $UserMapModel = new Models\PartyAppUserMap(); $UserMapModel->insert([ 'party_id' => $partyInfo['id'], 'party_username' => $partyUsername, 'app_id' => $appInfo['id'], 'app_username' => $appUsername, 'app_user_id' => $appUserId, ]); }else{ $appUsername = $info['appUsername']; $appUserId = $info['appUserId']; $appUserModel->where('id', $appUserId)->update([ 'login_time' => now(), 'login_ip' => $this->get_real_ip(), ]); } //调用内容方的登陆接口 $billno = date('YmdHis', time()).rand(10000, 99999); $appResult = $adapter->login($appid, $appUsername, $req->input('password'), $money, $billno); if($appResult['code'] != 1){ $this->logger->addError('login out: status:-103;调用应用登陆接口失败'.json_encode($appResult)); return toJson(-103, $appResult['msg'], []); } DB::beginTransaction(); //更新额度 $partyBalance = $partyInfo['balance'] - $money; $result1 = $partyModel->where('id', $partyInfo['id'])->update(array( 'balance' => $partyBalance )); //更新额度 $appBalance = $appInfo['balance'] - $money; $result2 = $appModel->where('id', $appInfo['id'])->update(array( 'balance' => $appBalance )); //记录第三方日志 $balanceLogModel = new Models\BalanceLog(); $result3 = $balanceLogModel->insert([ 'type' => 2, 'money' => $money, 'app_id' => $appInfo['id'], 'app_username' => $appUsername, 'party_id' =>$partyInfo['id'], 'party_username' => $partyUsername, 'billno' => $billno, 'balance' => $partyBalance, 'created_at' => date('Y-m-d H:i:s') ]); //记录平台日志 $appBalanceLogModel = new Models\AppBalanceLog(); $result4 = $appBalanceLogModel->insert([ 'type' => 2, 'money' => $money, 'app_id' => $appInfo['id'], 'app_username' => $appUsername, 'party_id' =>$partyInfo['id'], 'party_username' => $partyUsername, 'billno' => $billno, 'balance' => $appBalance, 'created_at' => date('Y-m-d H:i:s') ]); if($result1 === false || $result2 === false || $result3 === false || $result4 === false){ DB::rollBack(); $this->logger->addError('login out: status:-104;更新数据库失败'); return toJson(-104, '系统繁忙', []); } DB::commit(); $msg = '成功'; $code = 1; $this->logger->addWarning('login out: 成功,$appResult:'.json_encode($appResult)); return toJson($code, $msg, $appResult['data']); } catch (Exception $e) { $this->logger->addWarning('login out: -200 操作失败,err:'.json_encode($e)); return toJson($code, $msg, []); } }//end login() private function findAppUsername($partyId, $partyUsername, $appid){ $UserMapModel = new Models\PartyAppUserMap(); $info = $UserMapModel->where([ ['party_id',$partyId], ['party_username',$partyUsername], ['app_id', $appid] ])->first(); if(empty($info)){ return false; } return array('appUsername' => $info['app_username'], 'appUserId' => $info['app_user_id']); } /** * 组装内容用户名称 * @param $partyId * @param $partyUsername * @param $appid * @return string */ public function buildAppUsername($partyId, $partyUsername, $appid){ return 't'.$partyId.'_'.$partyUsername.'_a'.$appid; } private function checkLoginArg($req){ $arr = array('code'=>-100, 'msg'=>''); if(empty($req->input('username'))){ $arr['msg'] = '请输入用户名'; return $arr; } if(empty($req->input('password'))){ $arr['msg'] = '请输入密码'; return $arr; } if(empty($req->input('appid'))){ $arr['msg'] = '请输入appid'; return $arr; } if(!preg_match('/^[0-9]{1,8}(.[0-9]{1,2})?$/', $req->input('money'))){ $arr['msg'] = '请输入正确的金额'; return $arr; } $arr['code'] = 1; return $arr; } private function checkBackBalanceArg($req){ $arr = array('code'=>-100, 'msg'=>''); if(empty($req->input('username'))){ $arr['msg'] = '请输入用户名'; return $arr; } if(empty((int)$req->input('appid'))){ $arr['msg'] = '请输入appid'; return $arr; } if(!preg_match('/^[0-9]{1,8}(.[0-9]{1,2})?$/', $req->input('money'))){ $arr['msg'] = '请输入正确的金额'; return $arr; } $arr['code'] = 1; return $arr; } /** * 查询用户在平台的余额 * @param Request $req * @return \Illuminate\Http\JsonResponse */ public function balance(Request $req) { $reqArr = $req->input(); $this->logger->addWarning('balance get:'.json_encode($reqArr)); $code = -200; $msg = '操作失败'; try { $check = $this->checkBalanceArg($req); if($check['code'] != 1){ return toJson($check['code'], $check['msg'], []); } $partyModel = new Models\Party; $key = $req->input('key'); $appid = $req->input('appid'); $partyUsername = $req->input('username'); $partyInfo = $partyModel->where('key', $key)->first(); //查询该用户是否已在系统 $partyUserModel = new Models\PartyUser(); $partyUserInfo = $partyUserModel->where([ ['party_id', '=', $partyInfo['id']], ['party_username', '=', $partyUsername], ])->first(); if(empty($partyUserInfo)){ return $this->toError($this->errCode['USER_NOT_EXIT']); } if(empty($appid)){ $lastAppInfo = $this->getLastAppInfo($partyInfo['id'], $partyUsername); $appid = $lastAppInfo['app_id']; $appUsername = $lastAppInfo['app_username']; }else{ $findInfo = $this->findAppUsername($partyInfo['id'], $partyUsername, $appid); $appUsername = $findInfo['appUsername']; } $password = $this->getAppUserPasswordByUsername($appUsername, $appid); $adapter = new Adapter(); //调用内容方的登陆接口 $billno = date('YmdHis', time()).rand(10000, 99999); $appResult = $adapter->balance($appid, $appUsername, $password); if($appResult['code'] != 1){ $this->logger->addError('balance out: status:-103;调用应用登陆接口失败'.json_encode($appResult)); return toJson(-103, $appResult['msg'], []); } $msg = '成功'; $code = 1; $this->logger->addWarning('balance out: 成功,$appResult:'.json_encode($appResult)); return toJson($code, $msg, $appResult['data']); } catch (Exception $e) { $this->logger->addWarning('balance out: -200 操作失败,err:'.json_encode($e)); return toJson($code, $msg, []); } }//end login() /** * 转回用户在平台的余额 * @param Request $req * @return \Illuminate\Http\JsonResponse */ public function backBalance(Request $req) { $reqArr = $req->input(); $this->logger->addWarning('backBalance get:'.json_encode($reqArr)); $code = -200; $msg = '操作失败'; try { $check = $this->checkBackBalanceArg($req); if($check['code'] != 1){ return toJson($check['code'], $check['msg'], []); } $partyModel = new Models\Party; $key = $req->input('key'); $appid = (int)$req->input('appid'); $money = $req->input('money'); $partyUsername = $req->input('username'); $partyInfo = $partyModel->where('key', $key)->first(); //查询该用户是否已在系统 $partyUserModel = new Models\PartyUser(); $partyUserInfo = $partyUserModel->where([ ['party_id', '=', $partyInfo['id']], ['party_username', '=', $partyUsername], ])->first(); if(empty($partyUserInfo)){ return $this->toError($this->errCode['USER_NOT_EXIT']); } $findInfo = $this->findAppUsername($partyInfo['id'], $partyUsername, $appid); $appUsername = $findInfo['appUsername']; $password = $this->getAppUserPasswordByUsername($appUsername, $appid); $adapter = new Adapter(); //调用内容方的登陆接口 $billno = date('YmdHis', time()).rand(10000, 99999); $appResult = $adapter->backBalance($appid, $appUsername, $password, $money, $billno); if($appResult['code'] != 1){ $this->logger->addError('login out: status:-103;调用应用登陆接口失败'.json_encode($appResult)); return toJson(-103, $appResult['msg'], []); } $appModel = new Models\App; $appInfo = $appModel->where('id', $appid)->first(); DB::beginTransaction(); //更新额度 $partyBalance = $partyInfo['balance'] + $money; $result1 = $partyModel->where('id', $partyInfo['id'])->update(array( 'balance' => $partyBalance )); //更新额度 $appBalance = $appInfo['balance'] + $money; $result2 = $appModel->where('id', $appInfo['id'])->update(array( 'balance' => $appBalance )); //记录第三方日志 $balanceLogModel = new Models\BalanceLog(); $result3 = $balanceLogModel->insert([ 'type' => 1, 'money' => $money, 'app_id' => $appInfo['id'], 'app_username' => $appUsername, 'party_id' =>$partyInfo['id'], 'party_username' => $partyUsername, 'billno' => $billno, 'balance' => $partyBalance, 'created_at' => date('Y-m-d H:i:s') ]); //记录平台日志 $appBalanceLogModel = new Models\AppBalanceLog(); $result4 = $appBalanceLogModel->insert([ 'type' => 1, 'money' => $money, 'app_id' => $appInfo['id'], 'app_username' => $appUsername, 'party_id' =>$partyInfo['id'], 'party_username' => $partyUsername, 'billno' => $billno, 'balance' => $appBalance, 'created_at' => date('Y-m-d H:i:s') ]); if($result1 === false || $result2 === false || $result3 === false || $result4 === false){ DB::rollBack(); $this->logger->addError('login out: status:-104;更新数据库失败'); return toJson(-104, '系统繁忙', []); } DB::commit(); $msg = '成功'; $code = 1; $this->logger->addWarning('login out: 成功,$appResult:'.json_encode($appResult)); return toJson($code, $msg, $appResult['data']); } catch (Exception $e) { $this->logger->addWarning('login out: -200 操作失败,err:'.json_encode($e)); return toJson($code, $msg, []); } }//end login() /** * 获取用户登陆的最后一个平台的信息 * @param $partyId * @param $partyUsername * @return array */ private function getLastAppInfo($partyId, $partyUsername){ $model = new Models\BalanceLog(); $info = $model->where([ ['party_id', '=', $partyId], ['party_username', '=', $partyUsername], ])->orderBy('id', 'desc')->first(); return array('app_username'=>$info['app_username'], 'app_id'=>$info['app_id']); } /** * 通过平台用户名返回平台用户密码 * @param $appUsername * @param $appid * @return mixed */ private function getAppUserPasswordByUsername($appUsername, $appid){ $model = new Models\AppUser(); $info = $model->where([ ['app_id', '=', $appid], ['app_username', '=', $appUsername], ])->first(); return $info['password']; } private function checkBalanceArg($req){ $arr = array('code'=>-100, 'msg'=>''); if(empty($req->input('username'))){ $arr['msg'] = '请输入用户名'; return $arr; } /*if(empty($req->input('appid'))){ $arr['msg'] = '请输入appid'; return $arr; }*/ $arr['code'] = 1; return $arr; } }