logger = new Logger('party'); $this->logger->pushHandler(new StreamHandler(storage_path('logs/api.log'), Logger::WARNING)); } /** * 第三方账号登陆、注册 * * @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'); //$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, '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(); $appUsername = $this->buildAppUsername($partyInfo['id'], $partyUserName, $appid); $appUserInfo = $appUserModel->where('app_username',$appUsername)->first(); if(empty($appUserInfo)){ $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'], []); } $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(), ]); }else{ $appUserModel->where('id', $appUserInfo['id'])->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(); //更新额度 $result1 = $partyModel->where('id', $partyInfo['id'])->update(array( 'balance' => $partyInfo['balance'] - $money )); //更新额度 $result2 = $appModel->where('id', $appInfo['id'])->update(array( 'balance' => $appInfo['balance'] - $money )); //记录日志 $result3 = $balanceLogModel = new Models\BalanceLog(); $balanceLogModel->insert([ 'type' => 2, 'money' => $money, 'app_id' => $appInfo['id'], 'app_username' => $appUsername, 'party_id' =>$partyInfo['id'], 'party_username' => $partyUserName, 'billno' => $billno, ]); if($result1 === false || $result2 === false || $result3 === 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); } catch (Exception $e) { $this->logger->addWarning('login out: -200 操作失败,err:'.json_encode($e)); return toJson($code, $msg, []); } }//end login() /** * 组装内容用户名称 * @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; } }